• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SyTW2526 / Proyecto-E09 / 19927988907

04 Dec 2025 11:50AM UTC coverage: 15.275% (+15.3%) from 0.0%
19927988907

push

github

alu0101539669
Fix: arreglo el package.json añadiendo los test unitarios para que muestre la tabla

153 of 1688 branches covered (9.06%)

Branch coverage included in aggregate %.

403 of 1952 relevant lines covered (20.65%)

0.74 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

75.0
/src/server/models/User.ts
1
/**
2
 * @file User.ts
3
 * @description Modelo de Usuario para la base de datos MongoDB
4
 * 
5
 * Define la estructura de datos para los usuarios de la aplicación
6
 * incluyendo autenticación, configuraciones, amigos y más.
7
 * 
8
 * @requires mongoose - ODM para MongoDB
9
 * @requires validator - Validación de datos (emails, etc)
10
 */
11

12
import mongoose from 'mongoose';
13
import validator from 'validator';
14
const { Schema } = mongoose;
1✔
15

16
/**
17
 * Esquema para solicitudes de amistad
18
 * @typedef {Object} FriendRequest
19
 * @property {ObjectId} from - ID del usuario que envía la solicitud
20
 * @property {Date} createdAt - Fecha de creación de la solicitud
21
 */
22
const friendRequestSchema = new Schema({
1✔
23
  from: { type: Schema.Types.ObjectId, ref: "User", required: true },
24
  createdAt: { type: Date, default: Date.now },
25
});
26

27
/**
28
 * Esquema principal del Usuario
29
 * 
30
 * @typedef {Object} User
31
 * @property {string} username - Nombre de usuario único
32
 * @property {string} email - Email único del usuario (validado)
33
 * @property {string} password - Contraseña hasheada
34
 * @property {string} profileImage - URL de la imagen de perfil
35
 * @property {Object} settings - Configuraciones del usuario
36
 * @property {string} settings.language - Idioma (es/en)
37
 * @property {boolean} settings.darkMode - Modo oscuro habilitado
38
 * @property {Object} settings.notifications - Configuración de notificaciones
39
 * @property {boolean} settings.notifications.trades - Notificaciones de trading
40
 * @property {boolean} settings.notifications.messages - Notificaciones de mensajes
41
 * @property {boolean} settings.notifications.friendRequests - Notificaciones de solicitudes de amistad
42
 * @property {Object} settings.privacy - Configuración de privacidad
43
 * @property {boolean} settings.privacy.showCollection - Mostrar colección al público
44
 * @property {boolean} settings.privacy.showWishlist - Mostrar lista de deseos al público
45
 * @property {number} packTokens - Tokens disponibles para abrir packs
46
 * @property {Date} packLastRefill - Última vez que se rellenaron los tokens
47
 * @property {Array} friends - Lista de IDs de amigos
48
 * @property {Array} blockedUsers - Lista de usuarios bloqueados
49
 * @property {Array} friendRequests - Solicitudes de amistad pendientes
50
 * @property {Date} createdAt - Fecha de creación del usuario
51
 * @property {Date} updatedAt - Fecha de última actualización
52
 */
53
const userSchema = new mongoose.Schema({
1✔
54
  username: {
55
    type: String,
56
    required: true,
57
    unique: true,
58
    trim: true
59
  },
60
  email: {
61
    type: String,
62
    required: true,
63
    unique: true,
64
    lowercase: true,
65
    validate(value: string) {
66
      if (!validator.default.isEmail(value)) {
102!
67
        throw new Error('Email is invalid');
×
68
      }
69
    }
70
  },
71
  password: {
72
    type: String,
73
    required: true
74
  },
75
  profileImage: {
76
    type: String,
77
    default: ''
78
  },
79
  settings: {
80
    language: {
81
      type: String,
82
      default: 'es',
83
      enum: ['es', 'en']
84
    },
85
    darkMode: {
86
      type: Boolean,
87
      default: false
88
    },
89
    notifications: {
90
      trades: { type: Boolean, default: true },
91
      messages: { type: Boolean, default: true },
92
      friendRequests: { type: Boolean, default: true }
93
    },
94
    privacy: {
95
      showCollection: { type: Boolean, default: true },
96
      showWishlist: { type: Boolean, default: true }
97
    }
98
  },
99
  // pack opening token bucket
100
  packTokens: {
101
    type: Number,
102
    default: 2
103
  },
104
  packLastRefill: {
105
    type: Date,
106
    default: Date.now
107
  },
108
  friends: [
109
    { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
110
  ],
111
  blockedUsers: [
112
    { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
113
  ],
114
  friendRequests: [friendRequestSchema],
115
}, {
116
  timestamps: true
117
});
118

119
/**
120
 * Modelo de Usuario exportado
121
 * Usado en toda la aplicación para operaciones con usuarios
122
 * @type {mongoose.Model}
123
 */
124
export const User = mongoose.model('User', userSchema);
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc