import z from 'zod'; import { authedServiceRequest, serviceRequest, serviceResponse, } from '../interfaces/common'; import { metadata } from '../interfaces/Metadata'; export const zRoleTypes = z.enum([ 'Owner', 'Member', ]); export const role = z.object({ _id: z.string(), organizationId: z.string(), userId: z.string().nullable(), userEmail: z.string().nullable(), type: zRoleTypes, acceptedAt: z.number().nullable(), meta: metadata, }); export type Role = z.infer; export type RoleTypes = z.infer; export interface RoleService { create(request: CreateRoleRequest): Promise; delete(request: DeleteRoleRequest): Promise; accept(request: AcceptRoleRequest): Promise; assign(request: AssignRolesRequest): Promise; get(request: GetRoleRequest): Promise; list(request: ListRolesRequest): Promise; superAssignOwner(request: SuperAssignOwnerRoleRequest): Promise; } /** ****************************************************************************** * Create Role ******************************************************************************* */ export const createRoleParams = z.object({ userId: z.string().nullable().optional(), userEmail: z.string().nullable().optional(), type: zRoleTypes, }); export const createRoleRequest = authedServiceRequest.merge( z.object({ params: createRoleParams, }), ); export const createRoleResponse = serviceResponse.merge( z.object({ role: role.optional(), user: z.any().optional(), }), ); export type CreateRoleParams = z.infer; export type CreateRoleRequest = z.infer; export type CreateRoleResponse = z.infer; /** ****************************************************************************** * Delete Role ******************************************************************************* */ export const deleteRoleParams = z.object({ _id: z.string(), }); export const deleteRoleRequest = authedServiceRequest.merge( z.object({ params: deleteRoleParams, }), ); export const deleteRoleResponse = serviceResponse.merge( z.object({ _id: z.string().optional(), success: z.boolean().optional(), }), ); export type DeleteRoleParams = z.infer; export type DeleteRoleRequest = z.infer; export type DeleteRoleResponse = z.infer; /** ****************************************************************************** * Accept Role ******************************************************************************* */ export const acceptRoleParams = z.object({ _id: z.string(), accept: z.boolean(), }); export const acceptRoleRequest = authedServiceRequest.merge( z.object({ params: acceptRoleParams, }), ); export const acceptRoleResponse = serviceResponse.merge( z.object({ role: role.nullable().optional(), }), ); export type AcceptRoleParams = z.infer; export type AcceptRoleRequest = z.infer; export type AcceptRoleResponse = z.infer; /** ****************************************************************************** * Assign Roles ******************************************************************************* */ export const assignRolesParams = z.object({ userEmail: z.string(), userId: z.string(), }); export const assignRolesRequest = serviceRequest.merge( z.object({ params: assignRolesParams, }), ); export const assignRolesResponse = serviceResponse.merge( z.object({ roles: z.array(role).optional(), }), ); export type AssignRolesParams = z.infer; export type AssignRolesRequest = z.infer; export type AssignRolesResponse = z.infer; /** ****************************************************************************** * Get Role ******************************************************************************* */ export const getRoleParams = z.object({ roleId: z.string(), }); export const getRoleRequest = serviceRequest.merge( z.object({ params: getRoleParams, }), ); export const getRoleResponse = serviceResponse.merge( z.object({ role: role.nullable().optional(), }), ); export type GetRoleParams = z.infer; export type GetRoleRequest = z.infer; export type GetRoleResponse = z.infer; /** ****************************************************************************** * List Roles ******************************************************************************* */ export const listRolesParams = z.object({}); export const listRolesRequest = authedServiceRequest.merge( z.object({ params: listRolesParams, }), ); export const listRolesResponse = serviceResponse.merge( z.object({ user: z.array(role).optional(), organization: z.array(role).optional(), }), ); export type ListRolesParams = z.infer; export type ListRolesRequest = z.infer; export type ListRolesResponse = z.infer; /** ****************************************************************************** * Super Assign Owner Role ******************************************************************************* */ export const superAssignOwnerRoleParams = z.object({ userId: z.string(), }); export const superAssignOwnerRoleRequest = authedServiceRequest.merge( z.object({ params: superAssignOwnerRoleParams, }), ); export const superAssignOwnerRoleResponse = serviceResponse.merge( z.object({ role: role.optional(), }), ); export type SuperAssignOwnerRoleParams = z.infer; export type SuperAssignOwnerRoleRequest = z.infer; export type SuperAssignOwnerRoleResponse = z.infer;