39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { Errors } from '@/lib/errors';
|
|
import { db } from '@/lib/prisma';
|
|
import { type Result, err, ok } from '@/lib/result';
|
|
import type { CancelComplexInvitationResponse } from '@repo/api-contract';
|
|
import { ensureComplexAdmin } from '../../shared/members-helpers';
|
|
|
|
export async function cancelComplexInvitation(
|
|
userId: string,
|
|
complexId: string,
|
|
invitationId: string
|
|
): Promise<Result<CancelComplexInvitationResponse>> {
|
|
const adminResult = await ensureComplexAdmin(userId, complexId);
|
|
if (!adminResult.ok) return adminResult;
|
|
|
|
const invitation = await db.complexInvitation.findUnique({
|
|
where: { id: invitationId },
|
|
select: { complexId: true, acceptedAt: true, revokedAt: true },
|
|
});
|
|
|
|
if (!invitation || invitation.complexId !== complexId) {
|
|
return err(Errors.notFound('La invitación no existe.'));
|
|
}
|
|
|
|
if (invitation.acceptedAt) {
|
|
return err(Errors.conflict('La invitación ya fue aceptada.'));
|
|
}
|
|
|
|
if (invitation.revokedAt) {
|
|
return ok({ ok: true });
|
|
}
|
|
|
|
await db.complexInvitation.update({
|
|
where: { id: invitationId },
|
|
data: { revokedAt: new Date() },
|
|
});
|
|
|
|
return ok({ ok: true });
|
|
}
|