apps/newsletters-api/src/app/responses.ts (47 lines of code) (raw):
import { StorageRequestFailureReason } from '@newsletters-nx/newsletters-data-client';
import type {
ApiResponse,
UserPermissions,
UserProfile,
} from '@newsletters-nx/newsletters-data-client';
import { permissionService } from '../services/permissions';
// TODO - make the error response type generic
export const makeErrorResponse = (message: string): ApiResponse => ({
ok: false,
message,
});
export function makeSuccessResponse<T extends object>(data: T): ApiResponse<T> {
return {
ok: true,
total: Array.isArray(data) ? data.length : 1,
data,
};
}
export const mapStorageFailureReasonToStatusCode = (
reason?: StorageRequestFailureReason,
): number => {
switch (reason) {
case StorageRequestFailureReason.InvalidDataInput:
return 400;
case StorageRequestFailureReason.NotFound:
return 404;
case StorageRequestFailureReason.NoCredentials:
return 403;
case StorageRequestFailureReason.DataInStoreNotValid:
return 422;
default:
return 500;
}
};
export const makeAccessDeniedApiResponse = async (
profile: UserProfile | undefined,
permission: keyof UserPermissions,
): Promise<ApiResponse | undefined> => {
if (!profile) {
return makeErrorResponse(`No user profile.`);
}
const permissions = await permissionService.get(profile);
if (!permissions[permission]) {
return makeErrorResponse(`User does not have permission to ${permission}`);
}
return undefined;
};