AdminUser
Overview
services/api/src/models/AdminUser.js defines the Mongoose model used to persist administrative user records in MongoDB. It creates a schema with validation rules, unique constraints, default values, and subscription metadata for legacy admin accounts.
[!IMPORTANT] Este modelo es legado y solo de migración. Ningún flujo activo debe crear, autenticar ni autorizar identidades mediante esta colección.
This file exports the AdminUser model bound to the admin_users collection. The schema also enables automatic timestamps, so MongoDB records track creation and update dates.
How it works
flowchart TB
A[AdminUser.js] --> B[adminUserSchema]
B --> C[Field validation]
B --> D[Default values]
B --> E[admin_users collection]
B --> F[AdminUser model export]
The module builds a Mongoose schema first. That schema defines the allowed shape of each record, including required fields and enum limits. Then mongoose.model('AdminUser', adminUserSchema) produces the exported AdminUser model. Any code that uses this model reads from and writes to the admin_users collection through Mongoose.
Key components
{
"title": "AdminUser",
"content": "Modelo Mongoose exportado para trabajar con la colecci\u00f3n admin_users. Expone la estructura validada de los registros de usuario administrador.",
"type": "class",
"filePath": "services/api/src/models/AdminUser.js",
"badges": [
"public"
]
}
Data & fields
[
{
"name": "name",
"type": "string",
"required": true,
"description": "Nombre visible del usuario. Se recorta con trim y debe tener entre 2 y 120 caracteres."
},
{
"name": "firstName",
"type": "string",
"required": true,
"description": "Nombre propio. Se recorta con trim y debe tener entre 2 y 80 caracteres."
},
{
"name": "lastName",
"type": "string",
"required": true,
"description": "Apellido. Se recorta con trim y debe tener entre 2 y 80 caracteres."
},
{
"name": "email",
"type": "string",
"required": true,
"description": "Correo electrónico único. Se recorta, se normaliza a minúsculas y es obligatorio."
},
{
"name": "phone",
"type": "string",
"required": true,
"description": "Teléfono único. Se recorta y usa índice sparse."
},
{
"name": "username",
"type": "string",
"description": "Nombre de usuario único opcional. Se recorta, se normaliza a minúsculas, admite entre 3 y 30 caracteres y solo permite letras minúsculas, números, punto y guion bajo."
},
{
"name": "passwordHash",
"type": "string",
"required": true,
"description": "Hash de contraseña almacenado para el registro. Es obligatorio."
},
{
"name": "role",
"type": "string",
"description": "Rol operativo. Acepta super_admin, admin o agent. El valor por defecto es admin."
},
{
"name": "accountRole",
"type": "string",
"description": "Rol de cuenta. Acepta creator o seeker. El valor por defecto es creator."
},
{
"name": "plan",
"type": "string",
"description": "Plan asociado a la cuenta. Acepta free, professional, creator o enterprise. El valor por defecto es free. enterprise se conserva por compatibilidad histórica."
},
{
"name": "stripeCustomerId",
"type": "string",
"description": "Identificador del cliente en Stripe. Se recorta y su valor por defecto es una cadena vacía."
},
{
"name": "stripeSubscriptionId",
"type": "string",
"description": "Identificador de la suscripción en Stripe. Se recorta y su valor por defecto es una cadena vacía."
},
{
"name": "subscriptionStatus",
"type": "string",
"description": "Estado de la suscripción. Acepta none, incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid o paused. El valor por defecto es none."
},
{
"name": "currentPeriodEnd",
"type": "Date",
"description": "Fecha de fin del período actual. Su valor por defecto es null."
},
{
"name": "cancelAtPeriodEnd",
"type": "boolean",
"description": "Indica si la cuenta fue cancelada, pero conserva acceso hasta currentPeriodEnd. El valor por defecto es false."
},
{
"name": "bio",
"type": "string",
"description": "Biografía breve. Se recorta, admite hasta 280 caracteres y por defecto es una cadena vacía."
},
{
"name": "photo",
"type": "string",
"description": "URL o referencia de foto de perfil. Se recorta y por defecto es una cadena vacía."
},
{
"name": "coverPhoto",
"type": "string",
"description": "URL o referencia de foto de portada. Se recorta y por defecto es una cadena vacía."
},
{
"name": "website",
"type": "string",
"description": "Sitio web asociado. Se recorta y por defecto es una cadena vacía."
},
{
"name": "location",
"type": "string",
"description": "Ubicación textual. Se recorta, admite hasta 120 caracteres y por defecto es una cadena vacía."
},
{
"name": "seo",
"type": "object",
"description": "Bloque de metadatos SEO."
},
{
"name": "seo.descriptors",
"type": "string",
"description": "Descriptores SEO. Se recorta, admite hasta 500 caracteres y por defecto es una cadena vacía."
},
{
"name": "seo.aiKeywords",
"type": "string",
"description": "Palabras clave SEO asistidas por IA. Se recorta, admite hasta 500 caracteres y por defecto es una cadena vacía."
},
{
"name": "seo.schemaType",
"type": "string",
"description": "Tipo de schema SEO. Se recorta y por defecto es una cadena vacía."
},
{
"name": "passwordResetToken",
"type": "string",
"description": "Token de restablecimiento de contraseña. Usa sparse y no tiene valor por defecto."
},
{
"name": "passwordResetExpires",
"type": "Date",
"description": "Fecha de expiración del token de restablecimiento de contraseña."
},
{
"name": "createdAt",
"type": "Date",
"description": "Marca temporal generada automáticamente por Mongoose cuando timestamps está habilitado."
},
{
"name": "updatedAt",
"type": "Date",
"description": "Marca temporal generada automáticamente por Mongoose cuando timestamps está habilitado."
}
]
Schema metadata
collectionse fija enadmin_users.timestamps: trueactivacreatedAtyupdatedAt.emailes único.phonees único ysparse.usernamees único ysparse.
[!NOTE] El bloque
seoestá anidado dentro del mismo documento. No se declara como colección separada.
Behaviors
adminUserSchema— Define validación, restricciones de unicidad, valores por defecto y estructura del documento.AdminUser— Exporta el modelo de Mongoose creado a partir deadminUserSchemay lo asocia conadmin_users.
[!TIP] No hay métodos personalizados, hooks, virtuals ni middleware definidos en este archivo.
How the schema validates data
flowchart TB
A[Documento AdminUser] --> B[Validacion de campos]
B --> C[Tipos y longitudes]
B --> D[Enums]
B --> E[Valores por defecto]
B --> F[Indices unicos]
Mongoose aplica la validación declarada en el schema antes de persistir un documento. Los campos de texto usan trim en varios casos, y algunos también normalizan a minúsculas. Los enums limitan valores válidos para role, accountRole, plan y subscriptionStatus.
Gotchas & edge cases
[!WARNING]
passwordHashes obligatorio. El modelo no almacena una contraseña en texto plano.
[!WARNING]
planconserva el valorenterprisepor compatibilidad con datos históricos. Ese valor no aparece como nuevo comportamiento funcional en este archivo.
[!CAUTION]
phonecombinarequired: trueconsparse: trueyunique: true. El campo sigue siendo obligatorio en el esquema.
[!IMPORTANT]
subscriptionStatususanonecomo valor por defecto. El comentario del archivo indica que esto representa que el usuario nunca ha suscrito.
Related
This model sits at the persistence boundary for legacy administrative identities. It depends on mongoose for schema definition and model creation, and it stores its documents in the admin_users collection. The schema also carries Stripe subscription identifiers and status fields, which place billing state inside the same legacy record.