goldstars-services 1.0.70 → 1.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.updateSuspension = exports.unsuspendUser = exports.suspendUser = exports.getSuspendedUsers = exports.default = exports.checkUserSuspension = void 0;
7
+ var _userModel = _interopRequireDefault(require("../models/user.model.js"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
10
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11
+ /**
12
+ * Suspender un usuario
13
+ * @param {String} userId - ID del usuario a suspender
14
+ * @param {Object} suspensionData - Datos de suspensión
15
+ * @returns {Object} Usuario actualizado
16
+ */
17
+ var suspendUser = exports.suspendUser = /*#__PURE__*/function () {
18
+ var _ref = _asyncToGenerator(function* (userId, suspensionData) {
19
+ try {
20
+ var {
21
+ reason,
22
+ suspendedUntil,
23
+ suspendedBy,
24
+ allowedServices
25
+ } = suspensionData;
26
+ if (!reason || reason.trim() === '') {
27
+ throw new Error('La razón de suspensión es requerida');
28
+ }
29
+ if (!suspendedBy) {
30
+ throw new Error('El ID del administrador que suspende es requerido');
31
+ }
32
+
33
+ // Validar allowedServices si se proporciona
34
+ var validServices = ['bikes', 'gym', 'events'];
35
+ if (allowedServices) {
36
+ for (var service of allowedServices) {
37
+ if (!validServices.includes(service)) {
38
+ throw new Error("Servicio inv\xE1lido: ".concat(service, ". Debe ser: ").concat(validServices.join(', ')));
39
+ }
40
+ }
41
+ }
42
+ var user = yield _userModel.default.findById(userId);
43
+ if (!user) {
44
+ throw new Error('Usuario no encontrado');
45
+ }
46
+
47
+ // Crear objeto de suspensión
48
+ var suspensionStatus = {
49
+ isSuspended: true,
50
+ suspendedAt: new Date(),
51
+ suspendedBy,
52
+ reason: reason.trim(),
53
+ suspendedUntil: suspendedUntil ? new Date(suspendedUntil) : null,
54
+ allowedServices: allowedServices || []
55
+ };
56
+ user.suspensionStatus = suspensionStatus;
57
+ yield user.save();
58
+ return user;
59
+ } catch (error) {
60
+ throw new Error("Error al suspender usuario: ".concat(error.message));
61
+ }
62
+ });
63
+ return function suspendUser(_x, _x2) {
64
+ return _ref.apply(this, arguments);
65
+ };
66
+ }();
67
+
68
+ /**
69
+ * Levantar suspensión de un usuario
70
+ * @param {String} userId - ID del usuario
71
+ * @returns {Object} Usuario actualizado
72
+ */
73
+ var unsuspendUser = exports.unsuspendUser = /*#__PURE__*/function () {
74
+ var _ref2 = _asyncToGenerator(function* (userId) {
75
+ try {
76
+ var user = yield _userModel.default.findById(userId);
77
+ if (!user) {
78
+ throw new Error('Usuario no encontrado');
79
+ }
80
+
81
+ // Resetear suspensión
82
+ user.suspensionStatus = null;
83
+ yield user.save();
84
+ return user;
85
+ } catch (error) {
86
+ throw new Error("Error al levantar suspensi\xF3n: ".concat(error.message));
87
+ }
88
+ });
89
+ return function unsuspendUser(_x3) {
90
+ return _ref2.apply(this, arguments);
91
+ };
92
+ }();
93
+
94
+ /**
95
+ * Verificar si un usuario está suspendido para un servicio
96
+ * Auto-levanta la suspensión si ya expiró
97
+ * @param {String} userId - ID del usuario
98
+ * @param {String} serviceType - Tipo de servicio ('bikes', 'gym', 'events')
99
+ * @returns {Object} { isSuspended: Boolean, reason: String, suspendedUntil: Date }
100
+ */
101
+ var checkUserSuspension = exports.checkUserSuspension = /*#__PURE__*/function () {
102
+ var _ref3 = _asyncToGenerator(function* (userId) {
103
+ var serviceType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'bikes';
104
+ try {
105
+ var user = yield _userModel.default.findById(userId);
106
+ if (!user) {
107
+ throw new Error('Usuario no encontrado');
108
+ }
109
+
110
+ // Si no tiene suspensión, retornar no suspendido
111
+ if (!user.suspensionStatus || !user.suspensionStatus.isSuspended) {
112
+ return {
113
+ isSuspended: false,
114
+ reason: null,
115
+ suspendedUntil: null
116
+ };
117
+ }
118
+ var suspension = user.suspensionStatus;
119
+
120
+ // Verificar si la suspensión ya expiró
121
+ if (suspension.suspendedUntil && new Date() > new Date(suspension.suspendedUntil)) {
122
+ // Auto-levantar suspensión
123
+ user.suspensionStatus = null;
124
+ yield user.save();
125
+ return {
126
+ isSuspended: false,
127
+ reason: null,
128
+ suspendedUntil: null
129
+ };
130
+ }
131
+
132
+ // Verificar si el servicio está en los permitidos
133
+ var isServiceAllowed = suspension.allowedServices && suspension.allowedServices.includes(serviceType);
134
+ if (isServiceAllowed) {
135
+ // Servicio permitido a pesar de suspensión
136
+ return {
137
+ isSuspended: false,
138
+ reason: null,
139
+ suspendedUntil: null
140
+ };
141
+ }
142
+
143
+ // Usuario está suspendido para este servicio
144
+ return {
145
+ isSuspended: true,
146
+ reason: suspension.reason,
147
+ suspendedUntil: suspension.suspendedUntil,
148
+ suspendedAt: suspension.suspendedAt
149
+ };
150
+ } catch (error) {
151
+ throw new Error("Error al verificar suspensi\xF3n: ".concat(error.message));
152
+ }
153
+ });
154
+ return function checkUserSuspension(_x4) {
155
+ return _ref3.apply(this, arguments);
156
+ };
157
+ }();
158
+
159
+ /**
160
+ * Obtener lista de usuarios suspendidos
161
+ * @param {Object} options - Opciones de filtro
162
+ * @returns {Array} Lista de usuarios suspendidos
163
+ */
164
+ var getSuspendedUsers = exports.getSuspendedUsers = /*#__PURE__*/function () {
165
+ var _ref4 = _asyncToGenerator(function* () {
166
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
167
+ try {
168
+ var query = {
169
+ 'suspensionStatus.isSuspended': true
170
+ };
171
+
172
+ // Filtrar por servicio si se proporciona
173
+ if (options.serviceType) {
174
+ query['suspensionStatus.allowedServices'] = {
175
+ $ne: options.serviceType
176
+ };
177
+ }
178
+ var users = yield _userModel.default.find(query).select('firstName lastName email suspensionStatus').populate('suspensionStatus.suspendedBy', 'firstName lastName email').sort({
179
+ 'suspensionStatus.suspendedAt': -1
180
+ });
181
+
182
+ // Filtrar usuarios cuya suspensión ya expiró
183
+ var now = new Date();
184
+ var activelyeSuspended = users.filter(user => {
185
+ if (!user.suspensionStatus.suspendedUntil) {
186
+ return true; // Suspensión indefinida
187
+ }
188
+ return new Date(user.suspensionStatus.suspendedUntil) > now;
189
+ });
190
+ return activelyeSuspended;
191
+ } catch (error) {
192
+ throw new Error("Error al obtener usuarios suspendidos: ".concat(error.message));
193
+ }
194
+ });
195
+ return function getSuspendedUsers() {
196
+ return _ref4.apply(this, arguments);
197
+ };
198
+ }();
199
+
200
+ /**
201
+ * Actualizar datos de suspensión de un usuario
202
+ * @param {String} userId - ID del usuario
203
+ * @param {Object} updateData - Datos a actualizar
204
+ * @returns {Object} Usuario actualizado
205
+ */
206
+ var updateSuspension = exports.updateSuspension = /*#__PURE__*/function () {
207
+ var _ref5 = _asyncToGenerator(function* (userId, updateData) {
208
+ try {
209
+ var user = yield _userModel.default.findById(userId);
210
+ if (!user) {
211
+ throw new Error('Usuario no encontrado');
212
+ }
213
+ if (!user.suspensionStatus || !user.suspensionStatus.isSuspended) {
214
+ throw new Error('El usuario no está suspendido');
215
+ }
216
+
217
+ // Validar allowedServices si se actualiza
218
+ if (updateData.allowedServices) {
219
+ var validServices = ['bikes', 'gym', 'events'];
220
+ for (var service of updateData.allowedServices) {
221
+ if (!validServices.includes(service)) {
222
+ throw new Error("Servicio inv\xE1lido: ".concat(service));
223
+ }
224
+ }
225
+ }
226
+
227
+ // Actualizar campos permitidos
228
+ if (updateData.reason) {
229
+ user.suspensionStatus.reason = updateData.reason;
230
+ }
231
+ if (updateData.suspendedUntil !== undefined) {
232
+ user.suspensionStatus.suspendedUntil = updateData.suspendedUntil ? new Date(updateData.suspendedUntil) : null;
233
+ }
234
+ if (updateData.allowedServices !== undefined) {
235
+ user.suspensionStatus.allowedServices = updateData.allowedServices;
236
+ }
237
+ yield user.save();
238
+ return user;
239
+ } catch (error) {
240
+ throw new Error("Error al actualizar suspensi\xF3n: ".concat(error.message));
241
+ }
242
+ });
243
+ return function updateSuspension(_x5, _x6) {
244
+ return _ref5.apply(this, arguments);
245
+ };
246
+ }();
247
+ var _default = exports.default = {
248
+ suspendUser,
249
+ unsuspendUser,
250
+ checkUserSuspension,
251
+ getSuspendedUsers,
252
+ updateSuspension
253
+ };
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.upsertWeeklySchedule = exports.updateTimeSlots = exports.toggleWeeklyScheduleStatus = exports.getWeeklyScheduleForDay = exports.getWeeklyScheduleByLocation = exports.getAllWeeklySchedules = exports.deleteWeeklySchedule = exports.default = void 0;
7
+ var _weeklyScheduleTemplateModel = _interopRequireDefault(require("../models/weeklyScheduleTemplate.model.js"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
10
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11
+ /**
12
+ * Crear o actualizar un template de horario semanal
13
+ * @param {String} location - Ubicación ('C.C Las Virtudes' | 'Sambil Paraguaná')
14
+ * @param {Number} dayOfWeek - Día de la semana (0-6, Domingo-Sábado)
15
+ * @param {Array} timeSlots - Array de slots [{time: String, isActive: Boolean, maxCapacity: Number}]
16
+ * @returns {Object} Template creado o actualizado
17
+ */
18
+ var upsertWeeklySchedule = exports.upsertWeeklySchedule = /*#__PURE__*/function () {
19
+ var _ref = _asyncToGenerator(function* (location, dayOfWeek, timeSlots) {
20
+ try {
21
+ // Validar dayOfWeek
22
+ if (dayOfWeek < 0 || dayOfWeek > 6) {
23
+ throw new Error('dayOfWeek debe estar entre 0 (Domingo) y 6 (Sábado)');
24
+ }
25
+
26
+ // Validar que location sea válida
27
+ var validLocations = ['C.C Las Virtudes', 'Sambil Paraguaná'];
28
+ if (!validLocations.includes(location)) {
29
+ throw new Error("Ubicaci\xF3n inv\xE1lida. Debe ser: ".concat(validLocations.join(' o ')));
30
+ }
31
+
32
+ // Validar formato de timeSlots
33
+ var timeRegex = /^(1[0-2]|[1-9])(:([0-5][0-9]))?(am|pm)$/i;
34
+ for (var slot of timeSlots) {
35
+ if (!timeRegex.test(slot.time)) {
36
+ throw new Error("Formato de hora inv\xE1lido: ".concat(slot.time, ". Use formato como: 7am, 8:30am, 5pm"));
37
+ }
38
+ }
39
+ var schedule = yield _weeklyScheduleTemplateModel.default.findOneAndUpdate({
40
+ location,
41
+ dayOfWeek
42
+ }, {
43
+ location,
44
+ dayOfWeek,
45
+ timeSlots,
46
+ isActive: true,
47
+ updatedAt: new Date()
48
+ }, {
49
+ upsert: true,
50
+ new: true,
51
+ runValidators: true
52
+ });
53
+ return schedule;
54
+ } catch (error) {
55
+ throw new Error("Error al crear/actualizar horario semanal: ".concat(error.message));
56
+ }
57
+ });
58
+ return function upsertWeeklySchedule(_x, _x2, _x3) {
59
+ return _ref.apply(this, arguments);
60
+ };
61
+ }();
62
+
63
+ /**
64
+ * Obtener todos los templates de horario para una ubicación
65
+ * @param {String} location - Ubicación
66
+ * @returns {Array} Templates de horarios
67
+ */
68
+ var getWeeklyScheduleByLocation = exports.getWeeklyScheduleByLocation = /*#__PURE__*/function () {
69
+ var _ref2 = _asyncToGenerator(function* (location) {
70
+ try {
71
+ var schedules = yield _weeklyScheduleTemplateModel.default.find({
72
+ location,
73
+ isActive: true
74
+ }).sort({
75
+ dayOfWeek: 1
76
+ });
77
+ return schedules;
78
+ } catch (error) {
79
+ throw new Error("Error al obtener horarios por ubicaci\xF3n: ".concat(error.message));
80
+ }
81
+ });
82
+ return function getWeeklyScheduleByLocation(_x4) {
83
+ return _ref2.apply(this, arguments);
84
+ };
85
+ }();
86
+
87
+ /**
88
+ * Obtener template de horario para un día específico
89
+ * @param {String} location - Ubicación
90
+ * @param {Number} dayOfWeek - Día de la semana (0-6)
91
+ * @returns {Object|null} Template de horario o null
92
+ */
93
+ var getWeeklyScheduleForDay = exports.getWeeklyScheduleForDay = /*#__PURE__*/function () {
94
+ var _ref3 = _asyncToGenerator(function* (location, dayOfWeek) {
95
+ try {
96
+ var schedule = yield _weeklyScheduleTemplateModel.default.findOne({
97
+ location,
98
+ dayOfWeek,
99
+ isActive: true
100
+ });
101
+ return schedule;
102
+ } catch (error) {
103
+ throw new Error("Error al obtener horario para el d\xEDa: ".concat(error.message));
104
+ }
105
+ });
106
+ return function getWeeklyScheduleForDay(_x5, _x6) {
107
+ return _ref3.apply(this, arguments);
108
+ };
109
+ }();
110
+
111
+ /**
112
+ * Obtener todos los templates de horario (admin)
113
+ * @returns {Array} Todos los templates
114
+ */
115
+ var getAllWeeklySchedules = exports.getAllWeeklySchedules = /*#__PURE__*/function () {
116
+ var _ref4 = _asyncToGenerator(function* () {
117
+ try {
118
+ var schedules = yield _weeklyScheduleTemplateModel.default.find({}).sort({
119
+ location: 1,
120
+ dayOfWeek: 1
121
+ });
122
+ return schedules;
123
+ } catch (error) {
124
+ throw new Error("Error al obtener todos los horarios: ".concat(error.message));
125
+ }
126
+ });
127
+ return function getAllWeeklySchedules() {
128
+ return _ref4.apply(this, arguments);
129
+ };
130
+ }();
131
+
132
+ /**
133
+ * Eliminar un template de horario
134
+ * @param {String} scheduleId - ID del template
135
+ * @returns {Object} Template eliminado
136
+ */
137
+ var deleteWeeklySchedule = exports.deleteWeeklySchedule = /*#__PURE__*/function () {
138
+ var _ref5 = _asyncToGenerator(function* (scheduleId) {
139
+ try {
140
+ var schedule = yield _weeklyScheduleTemplateModel.default.findByIdAndDelete(scheduleId);
141
+ if (!schedule) {
142
+ throw new Error('Template de horario no encontrado');
143
+ }
144
+ return schedule;
145
+ } catch (error) {
146
+ throw new Error("Error al eliminar horario: ".concat(error.message));
147
+ }
148
+ });
149
+ return function deleteWeeklySchedule(_x7) {
150
+ return _ref5.apply(this, arguments);
151
+ };
152
+ }();
153
+
154
+ /**
155
+ * Activar/desactivar un template de horario
156
+ * @param {String} scheduleId - ID del template
157
+ * @param {Boolean} isActive - Estado de activación
158
+ * @returns {Object} Template actualizado
159
+ */
160
+ var toggleWeeklyScheduleStatus = exports.toggleWeeklyScheduleStatus = /*#__PURE__*/function () {
161
+ var _ref6 = _asyncToGenerator(function* (scheduleId, isActive) {
162
+ try {
163
+ var schedule = yield _weeklyScheduleTemplateModel.default.findByIdAndUpdate(scheduleId, {
164
+ isActive,
165
+ updatedAt: new Date()
166
+ }, {
167
+ new: true,
168
+ runValidators: true
169
+ });
170
+ if (!schedule) {
171
+ throw new Error('Template de horario no encontrado');
172
+ }
173
+ return schedule;
174
+ } catch (error) {
175
+ throw new Error("Error al cambiar estado del horario: ".concat(error.message));
176
+ }
177
+ });
178
+ return function toggleWeeklyScheduleStatus(_x8, _x9) {
179
+ return _ref6.apply(this, arguments);
180
+ };
181
+ }();
182
+
183
+ /**
184
+ * Actualizar slots específicos de un template
185
+ * @param {String} scheduleId - ID del template
186
+ * @param {Array} timeSlots - Nuevos slots
187
+ * @returns {Object} Template actualizado
188
+ */
189
+ var updateTimeSlots = exports.updateTimeSlots = /*#__PURE__*/function () {
190
+ var _ref7 = _asyncToGenerator(function* (scheduleId, timeSlots) {
191
+ try {
192
+ // Validar formato de timeSlots
193
+ var timeRegex = /^(1[0-2]|[1-9])(:([0-5][0-9]))?(am|pm)$/i;
194
+ for (var slot of timeSlots) {
195
+ if (!timeRegex.test(slot.time)) {
196
+ throw new Error("Formato de hora inv\xE1lido: ".concat(slot.time, ". Use formato como: 7am, 8:30am, 5pm"));
197
+ }
198
+ }
199
+ var schedule = yield _weeklyScheduleTemplateModel.default.findByIdAndUpdate(scheduleId, {
200
+ timeSlots,
201
+ updatedAt: new Date()
202
+ }, {
203
+ new: true,
204
+ runValidators: true
205
+ });
206
+ if (!schedule) {
207
+ throw new Error('Template de horario no encontrado');
208
+ }
209
+ return schedule;
210
+ } catch (error) {
211
+ throw new Error("Error al actualizar slots: ".concat(error.message));
212
+ }
213
+ });
214
+ return function updateTimeSlots(_x10, _x11) {
215
+ return _ref7.apply(this, arguments);
216
+ };
217
+ }();
218
+ var _default = exports.default = {
219
+ upsertWeeklySchedule,
220
+ getWeeklyScheduleByLocation,
221
+ getWeeklyScheduleForDay,
222
+ getAllWeeklySchedules,
223
+ deleteWeeklySchedule,
224
+ toggleWeeklyScheduleStatus,
225
+ updateTimeSlots
226
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goldstars-services",
3
- "version": "1.0.70",
3
+ "version": "1.0.73",
4
4
  "description": "This is the services layer for GoldStars",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {