Toda la validación de entradas se ejecuta del lado del servidor en apps/backend/validators/ antes de cualquier llamada a la base de datos o a un manager. Los errores se lanzan como UserInputError con mensajes traducidos mediante el servicio de traducción.
Campos de usuario
| Campo | Regla |
|---|
username | 3–50 caracteres, regex /^[a-zA-Z0-9_-]+$/ |
email | Regex de correo estándar, máximo 255 caracteres |
password | 8–128 caracteres, debe contener mayúscula, minúscula, dígito y uno de @$!%*?& |
bio | Opcional, máximo 100 caracteres |
dateOfBirth | Edad mínima 13, edad máxima 120 |
gender | male / female / other / prefer_not_to_say |
accountType | personal / creator / business |
phone | 7–15 dígitos (formato E.164, elimina espacios/guiones/paréntesis) |
countryCode | + seguido de 1–3 dígitos |
otp | 4–6 dígitos |
Campos de publicación
| Campo | Regla |
|---|
text | Máximo 5000 caracteres; obligatorio a menos que haya contenido multimedia |
visibility | public (por defecto) / followers / private / subscribers |
limit (paginación) | 1–100, 20 por defecto |
offset (paginación) | ≥ 0, 0 por defecto |
Campos de comentario
| Campo | Regla |
|---|
text | Máximo 2000 caracteres |
limit | 1–100, 20 por defecto |
Campos de mensaje
| Campo | Regla |
|---|
messageText | Máximo 10 000 caracteres |
messageType | text (por defecto) / image / video / audio / file / voice / gif / sticker / location / poll / coin_transfer |
coinPrice | ≥ 0; permitido solo en mensajes de tipo image o video |
limit | 1–100, 50 por defecto |
before (cursor) | Cursor basado en timestamp para paginación por keyset |
Campos de hashtag
| Campo | Regla |
|---|
name | Máximo 100 caracteres, solo alfanumérico y guiones bajos, en minúsculas, se elimina el # inicial |
Campos de transmisión en vivo
| Campo | Regla |
|---|
title | 3–255 caracteres |
description | Opcional, máximo 5000 caracteres |
visibility | public (por defecto) / private / followers_only / close_friends |
scheduledStartTime | Debe ser una fecha futura |
commentText | Máximo 500 caracteres |
interactionType | like / love / wow / haha / sad / angry |
status (actualización) | scheduled / live / ended / cancelled |
Campos de paquete de monedas
| Campo | Regla |
|---|
name | 3–100 caracteres |
coinAmount | Entero, 1–1 000 000 |
bonusCoins | Entero, ≥ 0, máximo 1 000 000 |
price | Decimal, > 0, máximo $10 000, máximo 2 decimales |
currency | USD / EUR / GBP / JPY / MXN (por defecto USD) |
Campos de nivel de suscripción
| Campo | Regla |
|---|
name | 1–100 caracteres |
description | Opcional, máximo 500 caracteres |
coinPrice | Entero, 0–1 000 000; null = nivel gratuito |
benefits | Arreglo de strings |
Campos de reporte de contenido
| Campo | Valores permitidos |
|---|
contentType | post / comment / message / user |
reason | spam / nudity / hate_speech / violence / harassment / false_information / scam / intellectual_property / self_harm / terrorism / other |
details | Opcional, máximo 1000 caracteres |
status (ciclo de vida) | pending → reviewing → resolved / dismissed |
Los errores de validación se devuelven como UserInputError de GraphQL con un string message. Todos los mensajes están internacionalizados mediante el servicio de traducción y respetan el locale del usuario en el contexto de GraphQL.