import { type AcceptInviteRequest, acceptInviteRequest, acceptInviteResponse, type CreateInviteRequest, createInviteRequest, createInviteResponse, type DeleteInviteRequest, deleteInviteRequest, deleteInviteResponse, type GetInviteInfoRequest, type GetInvitesRequest, getInviteInfoRequest, getInviteInfoResponse, getInvitesRequest, getInvitesResponse, type UpdateInviteRequest, updateInviteRequest, updateInviteResponse, } from "@/contracts/types/invites.types"; import { ValidationError } from "@/lib/error"; import { baseApiService } from "./base-api.service"; class InvitesApiService { /** * Create a new invite */ createInvite = async (request: CreateInviteRequest) => { const parsedRequest = createInviteRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.post( `/api/v1/searchspaces/${parsedRequest.data.search_space_id}/invites`, createInviteResponse, { body: parsedRequest.data.data, } ); }; /** * Get all invites for a search space */ getInvites = async (request: GetInvitesRequest) => { const parsedRequest = getInvitesRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.get( `/api/v1/searchspaces/${parsedRequest.data.search_space_id}/invites`, getInvitesResponse ); }; /** * Update an invite */ updateInvite = async (request: UpdateInviteRequest) => { const parsedRequest = updateInviteRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.put( `/api/v1/searchspaces/${parsedRequest.data.search_space_id}/invites/${parsedRequest.data.invite_id}`, updateInviteResponse, { body: parsedRequest.data.data, } ); }; /** * Delete an invite */ deleteInvite = async (request: DeleteInviteRequest) => { const parsedRequest = deleteInviteRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.delete( `/api/v1/searchspaces/${parsedRequest.data.search_space_id}/invites/${parsedRequest.data.invite_id}`, deleteInviteResponse ); }; /** * Get invite info by invite code */ getInviteInfo = async (request: GetInviteInfoRequest) => { const parsedRequest = getInviteInfoRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.get( `/api/v1/invites/${parsedRequest.data.invite_code}/info`, getInviteInfoResponse ); }; /** * Accept an invite */ acceptInvite = async (request: AcceptInviteRequest) => { const parsedRequest = acceptInviteRequest.safeParse(request); if (!parsedRequest.success) { console.error("Invalid request:", parsedRequest.error); const errorMessage = parsedRequest.error.issues.map((issue) => issue.message).join(", "); throw new ValidationError(`Invalid request: ${errorMessage}`); } return baseApiService.post(`/api/v1/invites/accept`, acceptInviteResponse, { body: parsedRequest.data, }); }; } export const invitesApiService = new InvitesApiService();