import z from 'zod'; import { authedServiceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; import { user } from './UserService'; import { role } from './RoleService'; export const organization = z.object({ _id: z.string(), stripeCustomerId: z.string(), userId: z.string(), name: z.string(), imageFileId: z.string().nullable(), description: z.string().nullable(), meta: metadata, }); export type Organization = z.infer; export interface OrganizationService { create(request: CreateOrganizationRequest): Promise; edit(request: EditOrganizationRequest): Promise; get(request: GetOrganizationRequest): Promise; list(request: ListOrganizationsRequest): Promise; users(request: ListOrganizationUsersRequest): Promise; superList(request: SuperListOrganizationsRequest): Promise; superSetOwner(request: SuperSetOrganizationOwnerRequest): Promise; } /** ****************************************************************************** * Create Organization ******************************************************************************* */ export const createOrganizationParams = z.object({ stripeCustomerId: z.string().optional(), name: z.string(), imageFileId: z.string().nullable(), description: z.string().nullable(), }); export const createOrganizationRequest = authedServiceRequest.merge( z.object({ params: createOrganizationParams, }), ); export const createOrganizationResponse = serviceResponse.merge( z.object({ organization: organization.optional(), }), ); export type CreateOrganizationParams = z.infer; export type CreateOrganizationRequest = z.infer; export type CreateOrganizationResponse = z.infer; /** ****************************************************************************** * Edit Organization ******************************************************************************* */ export const editOrganizationParams = z.object({ _id: z.string(), name: z.string(), imageFileId: z.string().nullable(), description: z.string().nullable(), }); export const editOrganizationRequest = authedServiceRequest.merge( z.object({ params: editOrganizationParams, }), ); export const editOrganizationResponse = serviceResponse.merge( z.object({ organization: organization.optional(), }), ); export type EditOrganizationParams = z.infer; export type EditOrganizationRequest = z.infer; export type EditOrganizationResponse = z.infer; /** ****************************************************************************** * Get Organization ******************************************************************************* */ export const getOrganizationParams = z.object({}); export const getOrganizationRequest = authedServiceRequest.merge( z.object({ params: getOrganizationParams, }), ); export const getOrganizationResponse = serviceResponse.merge( z.object({ organization: organization.optional(), }), ); export type GetOrganizationParams = z.infer; export type GetOrganizationRequest = z.infer; export type GetOrganizationResponse = z.infer; /** ****************************************************************************** * List Organizations ******************************************************************************* */ export const listOrganizationsParams = z.object({ _ids: z.array(z.string()), }); export const listOrganizationsRequest = authedServiceRequest.merge( z.object({ params: listOrganizationsParams, }), ); export const listOrganizationsResponse = serviceResponse.merge( z.object({ organizations: z.array(organization).optional(), }), ); export type ListOrganizationsParams = z.infer; export type ListOrganizationsRequest = z.infer; export type ListOrganizationsResponse = z.infer; /** ****************************************************************************** * List Organization Users ******************************************************************************* */ export const listOrganizationUsersParams = z.object({}); export const listOrganizationUsersRequest = authedServiceRequest.merge( z.object({ params: listOrganizationUsersParams, }), ); export const listOrganizationUsersResponse = serviceResponse.merge( z.object({ users: z.array(user).optional(), }), ); export type ListOrganizationUsersParams = z.infer; export type ListOrganizationUsersRequest = z.infer; export type ListOrganizationUsersResponse = z.infer; /** ****************************************************************************** * Super List Organizations ******************************************************************************* */ export const superListOrganizationsParams = z.object({}); export const superListOrganizationsRequest = authedServiceRequest.merge( z.object({ params: superListOrganizationsParams, }), ); export const superListOrganizationsResponse = serviceResponse.merge( z.object({ organizations: z.array(organization).optional(), }), ); export type SuperListOrganizationsParams = z.infer; export type SuperListOrganizationsRequest = z.infer; export type SuperListOrganizationsResponse = z.infer; /** ****************************************************************************** * Super Set Organization Owner ******************************************************************************* */ export const superSetOrganizationOwnerParams = z.object({ userId: z.string(), }); export const superSetOrganizationOwnerRequest = authedServiceRequest.merge( z.object({ params: superSetOrganizationOwnerParams, }), ); export const superSetOrganizationOwnerResponse = serviceResponse.merge( z.object({ organization: organization.optional(), role: role.optional(), }), ); export type SuperSetOrganizationOwnerParams = z.infer; export type SuperSetOrganizationOwnerRequest = z.infer; export type SuperSetOrganizationOwnerResponse = z.infer;