banatie-service/apps/api-service/src/utils/validators/queryValidator.ts

101 lines
2.2 KiB
TypeScript

import { ERROR_MESSAGES, ERROR_CODES } from '../constants/errors';
import { GENERATION_LIMITS } from '../constants/limits';
export interface ValidationResult {
valid: boolean;
error?: {
message: string;
code: string;
};
}
export const validateUUID = (id: string): ValidationResult => {
const uuidPattern =
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
if (!uuidPattern.test(id)) {
return {
valid: false,
error: {
message: ERROR_MESSAGES.INVALID_UUID,
code: ERROR_CODES.INVALID_UUID,
},
};
}
return { valid: true };
};
export const validateAspectRatio = (aspectRatio: string): ValidationResult => {
if (!GENERATION_LIMITS.ALLOWED_ASPECT_RATIOS.includes(aspectRatio as any)) {
return {
valid: false,
error: {
message: `Invalid aspect ratio. Allowed values: ${GENERATION_LIMITS.ALLOWED_ASPECT_RATIOS.join(', ')}`,
code: ERROR_CODES.INVALID_ASPECT_RATIO,
},
};
}
return { valid: true };
};
export const validateFocalPoint = (focalPoint: {
x: number;
y: number;
}): ValidationResult => {
if (
focalPoint.x < 0 ||
focalPoint.x > 1 ||
focalPoint.y < 0 ||
focalPoint.y > 1
) {
return {
valid: false,
error: {
message: ERROR_MESSAGES.INVALID_FOCAL_POINT,
code: ERROR_CODES.INVALID_FOCAL_POINT,
},
};
}
return { valid: true };
};
export const validateDateRange = (
startDate?: string,
endDate?: string
): ValidationResult => {
if (startDate && isNaN(Date.parse(startDate))) {
return {
valid: false,
error: {
message: 'Invalid start date format',
code: ERROR_CODES.VALIDATION_ERROR,
},
};
}
if (endDate && isNaN(Date.parse(endDate))) {
return {
valid: false,
error: {
message: 'Invalid end date format',
code: ERROR_CODES.VALIDATION_ERROR,
},
};
}
if (startDate && endDate && new Date(startDate) > new Date(endDate)) {
return {
valid: false,
error: {
message: 'Start date must be before end date',
code: ERROR_CODES.VALIDATION_ERROR,
},
};
}
return { valid: true };
};