Files
gruperly/apps/backend/src/http/problem-builders.ts
2026-09-15 15:41:45 -03:00

103 lines
2.6 KiB
TypeScript

import type { ProblemDetails } from '@gruperly/shared';
import { notFoundProblem } from './problem-details';
import { PROBLEM_DOMAIN } from './problem-domain';
export function validationProblem(params: {
detail?: string;
instance?: string;
errors?: Record<string, string[]>;
}): ProblemDetails {
return {
type: `${PROBLEM_DOMAIN}/problems/validation`,
title: 'Bad Request',
status: 400,
detail: params.detail ?? 'Invalid request data',
instance: params.instance,
errors: params.errors,
};
}
export function conflictProblem(params: {
detail: string;
code?: string;
instance?: string;
}): ProblemDetails {
return {
type: `${PROBLEM_DOMAIN}/problems/conflict`,
title: 'Conflict',
status: 409,
detail: params.detail,
instance: params.instance,
code: params.code,
};
}
export function forbiddenProblem(params: {
detail: string;
code?: string;
instance?: string;
}): ProblemDetails {
return {
type: `${PROBLEM_DOMAIN}/problems/forbidden`,
title: 'Forbidden',
status: 403,
detail: params.detail,
instance: params.instance,
code: params.code,
};
}
export function organizationNotFoundProblem(id: string): ProblemDetails {
return {
type: `${PROBLEM_DOMAIN}/problems/organization-not-found`,
title: 'Not Found',
status: 404,
detail: `Organization ${id} was not found.`,
code: 'organization_not_found',
};
}
export function groupOwnerRequiredProblem(): ProblemDetails {
return forbiddenProblem({
detail: 'Only the organization owner can create the group.',
code: 'group_owner_required',
});
}
export function databaseUnavailableProblem(params?: {
instance?: string;
}): ProblemDetails {
return {
type: `${PROBLEM_DOMAIN}/problems/database-unavailable`,
title: 'Service Unavailable',
status: 503,
detail: 'Database health check failed',
instance: params?.instance,
code: 'database_unavailable',
};
}
export function noGroupAccessProblem(): ProblemDetails {
return forbiddenProblem({
detail: 'You do not have access to this group.',
code: 'group_access_denied',
});
}
export function notFoundResourceProblem(resourceName: string, id: string): ProblemDetails {
return notFoundProblem(`${resourceName} ${id}`);
}
export function paymentNotSetupProblem(): ProblemDetails {
return conflictProblem({
detail: 'Vinculá una cuenta de cobro antes de crear tu primer grupo.',
code: 'payment_not_setup',
});
}
export function onboardingAlreadyCompletedProblem(): ProblemDetails {
return conflictProblem({
detail: 'Ya completaste el onboarding de Gruperly.',
code: 'onboarding_already_completed',
});
}