import z from 'zod'; import { authedServiceRequest, authToken, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; import { role } from './RoleService'; import { organization } from './OrganizationService'; export const user = z.object({ _id: z.string(), organizationId: z.string(), email: z.string(), firstName: z.string(), lastName: z.string(), passwordHash: z.string(), meta: metadata, }); export const authenticationResponse = serviceResponse.merge(z.object({ user: user.optional(), organization: organization.optional(), token: authToken.optional(), roles: z.array(role).optional(), })); export type User = z.infer; export type AuthenticationResponse = z.infer; export interface UserService { register(request: RegisterUserRequest): Promise; login(request: LoginUserRequest): Promise; oAuthLogin(request: OAuthLoginUserRequest): Promise; setOrganization(request: SetUserOrganizationRequest): Promise; get(request: GetUserRequest): Promise; byEmail(request: GetUserByEmailRequest): Promise; list(request: ListUsersRequest): Promise; organizations(request: ListUserOrganizationsRequest): Promise; superList(request: SuperListUsersRequest): Promise; } /** ****************************************************************************** * Register User ******************************************************************************* */ export const registerUserParams = z.object({ firstName: z.string(), lastName: z.string(), email: z.string().email(), password: z.string(), }); export const registerUserRequest = serviceRequest.merge( z.object({ params: registerUserParams, }), ); export const registerUserResponse = authenticationResponse; export type RegisterUserParams = z.infer; export type RegisterUserRequest = z.infer; export type RegisterUserResponse = z.infer; /** ****************************************************************************** * Login User ******************************************************************************* */ export const loginUserParams = z.object({ email: z.string().email(), password: z.string(), }); export const loginUserRequest = serviceRequest.merge( z.object({ params: loginUserParams, }), ); export const loginUserResponse = authenticationResponse; export type LoginUserParams = z.infer; export type LoginUserRequest = z.infer; export type LoginUserResponse = z.infer; /** ****************************************************************************** * OAuth Login User ******************************************************************************* */ export const oAuthloginUserParams = z.object({ email: z.string().email(), }); export const oAuthloginUserRequest = serviceRequest.merge( z.object({ params: oAuthloginUserParams, }), ); export const oAuthloginUserResponse = authenticationResponse; export type OAuthLoginUserParams = z.infer; export type OAuthLoginUserRequest = z.infer; export type OAuthLoginUserResponse = z.infer; /** ****************************************************************************** * Set Organization ******************************************************************************* */ export const setUserOrganizationParams = z.object({ organizationId: z.string(), }); export const setUserOrganizationRequest = authedServiceRequest.merge( z.object({ params: setUserOrganizationParams, }), ); export const setUserOrganizationResponse = authenticationResponse; export type SetUserOrganizationParams = z.infer; export type SetUserOrganizationRequest = z.infer; export type SetUserOrganizationResponse = z.infer; /** ****************************************************************************** * Get User ******************************************************************************* */ export const getUserParams = z.object({}); export const getUserRequest = authedServiceRequest.merge( z.object({ params: getUserParams, }), ); export const getUserResponse = serviceResponse.merge( z.object({ user: user.optional(), }), ); export type GetUserParams = z.infer; export type GetUserRequest = z.infer; export type GetUserResponse = z.infer; /** ****************************************************************************** * Get User By Email ******************************************************************************* */ export const getUserByEmailParams = z.object({ userEmail: z.string(), }); export const getUserByEmailRequest = serviceRequest.merge( z.object({ params: getUserByEmailParams, }), ); export const getUserByEmailResponse = serviceResponse.merge( z.object({ user: user.nullable().optional(), }), ); export type GetUserByEmailParams = z.infer; export type GetUserByEmailRequest = z.infer; export type GetUserByEmailResponse = z.infer; /** ****************************************************************************** * List Users ******************************************************************************* */ export const listUsersParams = z.object({ _ids: z.array(z.string()), }); export const listUsersRequest = authedServiceRequest.merge( z.object({ params: listUsersParams, }), ); export const listUsersResponse = serviceResponse.merge( z.object({ users: z.array(user).optional(), }), ); export type ListUsersParams = z.infer; export type ListUsersRequest = z.infer; export type ListUsersResponse = z.infer; /** ****************************************************************************** * List Users ******************************************************************************* */ export const listUserOrganizationsParams = z.object({}); export const listUserOrganizationsRequest = authedServiceRequest.merge( z.object({ params: listUserOrganizationsParams, }), ); export const listUserOrganizationsResponse = serviceResponse.merge( z.object({ organizations: z.array(organization).optional(), }), ); export type ListUserOrganizationsParams = z.infer; export type ListUserOrganizationsRequest = z.infer; export type ListUserOrganizationsResponse = z.infer; /** ****************************************************************************** * Super List Users ******************************************************************************* */ export const superListUsersParams = z.object({}); export const superListUsersRequest = authedServiceRequest.merge( z.object({ params: superListUsersParams, }), ); export const superListUsersResponse = serviceResponse.merge( z.object({ users: z.array(user).optional(), }), ); export type SuperListUsersParams = z.infer; export type SuperListUsersRequest = z.infer; export type SuperListUsersResponse = z.infer;