goldstars-services 1.0.64 → 1.0.66
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.
- package/dist/index.js +7 -0
- package/dist/models/gymPass.model.js +96 -0
- package/dist/services/gymPass.service.js +233 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "EventRegistrationService", {
|
|
|
9
9
|
return _eventRegistration.default;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "GymPassService", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _gymPass.default;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
Object.defineProperty(exports, "ReservationService", {
|
|
13
19
|
enumerable: true,
|
|
14
20
|
get: function get() {
|
|
@@ -73,4 +79,5 @@ var _bike = _interopRequireDefault(require("./services/bike.service"));
|
|
|
73
79
|
var _report = _interopRequireDefault(require("./services/report.service"));
|
|
74
80
|
var _reservation = _interopRequireDefault(require("./services/reservation.service"));
|
|
75
81
|
var _eventRegistration = _interopRequireDefault(require("./services/eventRegistration.service"));
|
|
82
|
+
var _gymPass = _interopRequireDefault(require("./services/gymPass.service"));
|
|
76
83
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _mongoose = _interopRequireDefault(require("mongoose"));
|
|
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
|
+
var gymPassSchema = new _mongoose.default.Schema({
|
|
12
|
+
name: {
|
|
13
|
+
type: String,
|
|
14
|
+
required: [true, 'El nombre es obligatorio'],
|
|
15
|
+
trim: true,
|
|
16
|
+
maxlength: [100, 'El nombre no puede exceder 100 caracteres']
|
|
17
|
+
},
|
|
18
|
+
email: {
|
|
19
|
+
type: String,
|
|
20
|
+
required: [true, 'El email es obligatorio'],
|
|
21
|
+
trim: true,
|
|
22
|
+
lowercase: true,
|
|
23
|
+
unique: true,
|
|
24
|
+
match: [/^[^\s@]+@[^\s@]+\.[^\s@]+$/, 'Por favor ingresa un email válido']
|
|
25
|
+
},
|
|
26
|
+
phone: {
|
|
27
|
+
type: String,
|
|
28
|
+
required: [true, 'El teléfono es obligatorio'],
|
|
29
|
+
trim: true,
|
|
30
|
+
match: [/^[0-9]{10,15}$/, 'El teléfono debe tener entre 10 y 15 dígitos']
|
|
31
|
+
},
|
|
32
|
+
passNumber: {
|
|
33
|
+
type: String,
|
|
34
|
+
required: true,
|
|
35
|
+
unique: true,
|
|
36
|
+
index: true
|
|
37
|
+
},
|
|
38
|
+
isUsed: {
|
|
39
|
+
type: Boolean,
|
|
40
|
+
default: false
|
|
41
|
+
},
|
|
42
|
+
usedAt: {
|
|
43
|
+
type: Date,
|
|
44
|
+
default: null
|
|
45
|
+
},
|
|
46
|
+
expiresAt: {
|
|
47
|
+
type: Date,
|
|
48
|
+
default: () => new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
|
|
49
|
+
// 30 días
|
|
50
|
+
index: true
|
|
51
|
+
}
|
|
52
|
+
}, {
|
|
53
|
+
timestamps: true,
|
|
54
|
+
versionKey: false
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Índices compuestos
|
|
58
|
+
gymPassSchema.index({
|
|
59
|
+
email: 1
|
|
60
|
+
});
|
|
61
|
+
gymPassSchema.index({
|
|
62
|
+
phone: 1
|
|
63
|
+
});
|
|
64
|
+
gymPassSchema.index({
|
|
65
|
+
passNumber: 1
|
|
66
|
+
});
|
|
67
|
+
gymPassSchema.index({
|
|
68
|
+
isUsed: 1,
|
|
69
|
+
expiresAt: 1
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Middleware para validar que solo se pueda registrar una vez por email y teléfono
|
|
73
|
+
gymPassSchema.pre('save', /*#__PURE__*/function () {
|
|
74
|
+
var _ref = _asyncToGenerator(function* (next) {
|
|
75
|
+
if (this.isNew) {
|
|
76
|
+
var existingByEmail = yield this.constructor.findOne({
|
|
77
|
+
email: this.email
|
|
78
|
+
});
|
|
79
|
+
if (existingByEmail) {
|
|
80
|
+
throw new Error('Ya existe un pase registrado con este email');
|
|
81
|
+
}
|
|
82
|
+
var existingByPhone = yield this.constructor.findOne({
|
|
83
|
+
phone: this.phone
|
|
84
|
+
});
|
|
85
|
+
if (existingByPhone) {
|
|
86
|
+
throw new Error('Ya existe un pase registrado con este teléfono');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
next();
|
|
90
|
+
});
|
|
91
|
+
return function (_x) {
|
|
92
|
+
return _ref.apply(this, arguments);
|
|
93
|
+
};
|
|
94
|
+
}());
|
|
95
|
+
var GymPass = _mongoose.default.model('GymPass', gymPassSchema);
|
|
96
|
+
var _default2 = exports.default = GymPass;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _gymPassModel = _interopRequireDefault(require("../models/gymPass.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
|
+
// Generar número de pase único (formato: GP-YYYYMMDD-XXXX)
|
|
12
|
+
var generatePassNumber = () => {
|
|
13
|
+
var today = new Date();
|
|
14
|
+
var dateStr = today.toISOString().slice(0, 10).replace(/-/g, '');
|
|
15
|
+
var randomSuffix = Math.floor(Math.random() * 9999).toString().padStart(4, '0');
|
|
16
|
+
return "GP-".concat(dateStr, "-").concat(randomSuffix);
|
|
17
|
+
};
|
|
18
|
+
var getUsedPassNumbers = /*#__PURE__*/function () {
|
|
19
|
+
var _ref = _asyncToGenerator(function* () {
|
|
20
|
+
var passes = yield _gymPassModel.default.find({}, {
|
|
21
|
+
passNumber: 1,
|
|
22
|
+
_id: 0
|
|
23
|
+
}).lean();
|
|
24
|
+
return new Set(passes.map(p => p.passNumber));
|
|
25
|
+
});
|
|
26
|
+
return function getUsedPassNumbers() {
|
|
27
|
+
return _ref.apply(this, arguments);
|
|
28
|
+
};
|
|
29
|
+
}();
|
|
30
|
+
var getNextAvailablePassNumber = /*#__PURE__*/function () {
|
|
31
|
+
var _ref2 = _asyncToGenerator(function* () {
|
|
32
|
+
var used = yield getUsedPassNumbers();
|
|
33
|
+
|
|
34
|
+
// Intentar generar un número único hasta 10 veces
|
|
35
|
+
for (var i = 0; i < 10; i++) {
|
|
36
|
+
var candidate = generatePassNumber();
|
|
37
|
+
if (!used.has(candidate)) return candidate;
|
|
38
|
+
}
|
|
39
|
+
throw new Error('No se pudo generar un número de pase único');
|
|
40
|
+
});
|
|
41
|
+
return function getNextAvailablePassNumber() {
|
|
42
|
+
return _ref2.apply(this, arguments);
|
|
43
|
+
};
|
|
44
|
+
}();
|
|
45
|
+
var createGymPass = /*#__PURE__*/function () {
|
|
46
|
+
var _ref4 = _asyncToGenerator(function* (_ref3) {
|
|
47
|
+
var {
|
|
48
|
+
name,
|
|
49
|
+
email,
|
|
50
|
+
phone
|
|
51
|
+
} = _ref3;
|
|
52
|
+
if (!name || !email || !phone) {
|
|
53
|
+
throw new Error('Todos los campos son requeridos: nombre, email y teléfono');
|
|
54
|
+
}
|
|
55
|
+
var lastErr;
|
|
56
|
+
for (var attempt = 0; attempt < 3; attempt++) {
|
|
57
|
+
try {
|
|
58
|
+
var passNumber = yield getNextAvailablePassNumber();
|
|
59
|
+
var gymPass = yield _gymPassModel.default.create({
|
|
60
|
+
name: name.trim(),
|
|
61
|
+
email: email.trim().toLowerCase(),
|
|
62
|
+
phone: phone.trim(),
|
|
63
|
+
passNumber
|
|
64
|
+
});
|
|
65
|
+
return gymPass.toObject();
|
|
66
|
+
} catch (e) {
|
|
67
|
+
var _e$keyPattern;
|
|
68
|
+
lastErr = e;
|
|
69
|
+
// Retry if duplicate key error on passNumber
|
|
70
|
+
if (e && e.code === 11000 && (_e$keyPattern = e.keyPattern) !== null && _e$keyPattern !== void 0 && _e$keyPattern.passNumber) continue;
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw lastErr || new Error('No se pudo crear el pase de gimnasio');
|
|
75
|
+
});
|
|
76
|
+
return function createGymPass(_x) {
|
|
77
|
+
return _ref4.apply(this, arguments);
|
|
78
|
+
};
|
|
79
|
+
}();
|
|
80
|
+
var listGymPasses = /*#__PURE__*/function () {
|
|
81
|
+
var _ref5 = _asyncToGenerator(function* () {
|
|
82
|
+
var filters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
83
|
+
var query = {};
|
|
84
|
+
if (filters.isUsed !== undefined) {
|
|
85
|
+
query.isUsed = filters.isUsed;
|
|
86
|
+
}
|
|
87
|
+
if (filters.expired !== undefined) {
|
|
88
|
+
if (filters.expired) {
|
|
89
|
+
query.expiresAt = {
|
|
90
|
+
$lt: new Date()
|
|
91
|
+
};
|
|
92
|
+
} else {
|
|
93
|
+
query.expiresAt = {
|
|
94
|
+
$gte: new Date()
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return _gymPassModel.default.find(query).sort({
|
|
99
|
+
createdAt: -1
|
|
100
|
+
}).lean();
|
|
101
|
+
});
|
|
102
|
+
return function listGymPasses() {
|
|
103
|
+
return _ref5.apply(this, arguments);
|
|
104
|
+
};
|
|
105
|
+
}();
|
|
106
|
+
var getGymPassById = /*#__PURE__*/function () {
|
|
107
|
+
var _ref6 = _asyncToGenerator(function* (id) {
|
|
108
|
+
return _gymPassModel.default.findById(id).lean();
|
|
109
|
+
});
|
|
110
|
+
return function getGymPassById(_x2) {
|
|
111
|
+
return _ref6.apply(this, arguments);
|
|
112
|
+
};
|
|
113
|
+
}();
|
|
114
|
+
var getGymPassByNumber = /*#__PURE__*/function () {
|
|
115
|
+
var _ref7 = _asyncToGenerator(function* (passNumber) {
|
|
116
|
+
return _gymPassModel.default.findOne({
|
|
117
|
+
passNumber
|
|
118
|
+
}).lean();
|
|
119
|
+
});
|
|
120
|
+
return function getGymPassByNumber(_x3) {
|
|
121
|
+
return _ref7.apply(this, arguments);
|
|
122
|
+
};
|
|
123
|
+
}();
|
|
124
|
+
var getGymPassByEmail = /*#__PURE__*/function () {
|
|
125
|
+
var _ref8 = _asyncToGenerator(function* (email) {
|
|
126
|
+
return _gymPassModel.default.findOne({
|
|
127
|
+
email: email.toLowerCase()
|
|
128
|
+
}).lean();
|
|
129
|
+
});
|
|
130
|
+
return function getGymPassByEmail(_x4) {
|
|
131
|
+
return _ref8.apply(this, arguments);
|
|
132
|
+
};
|
|
133
|
+
}();
|
|
134
|
+
var markPassAsUsed = /*#__PURE__*/function () {
|
|
135
|
+
var _ref9 = _asyncToGenerator(function* (passNumber) {
|
|
136
|
+
var gymPass = yield _gymPassModel.default.findOne({
|
|
137
|
+
passNumber
|
|
138
|
+
});
|
|
139
|
+
if (!gymPass) {
|
|
140
|
+
throw new Error('Pase no encontrado');
|
|
141
|
+
}
|
|
142
|
+
if (gymPass.isUsed) {
|
|
143
|
+
throw new Error('Este pase ya ha sido utilizado');
|
|
144
|
+
}
|
|
145
|
+
if (gymPass.expiresAt < new Date()) {
|
|
146
|
+
throw new Error('Este pase ha expirado');
|
|
147
|
+
}
|
|
148
|
+
gymPass.isUsed = true;
|
|
149
|
+
gymPass.usedAt = new Date();
|
|
150
|
+
yield gymPass.save();
|
|
151
|
+
return gymPass.toObject();
|
|
152
|
+
});
|
|
153
|
+
return function markPassAsUsed(_x5) {
|
|
154
|
+
return _ref9.apply(this, arguments);
|
|
155
|
+
};
|
|
156
|
+
}();
|
|
157
|
+
var getGymPassStats = /*#__PURE__*/function () {
|
|
158
|
+
var _ref10 = _asyncToGenerator(function* () {
|
|
159
|
+
var total = yield _gymPassModel.default.countDocuments();
|
|
160
|
+
var used = yield _gymPassModel.default.countDocuments({
|
|
161
|
+
isUsed: true
|
|
162
|
+
});
|
|
163
|
+
var expired = yield _gymPassModel.default.countDocuments({
|
|
164
|
+
expiresAt: {
|
|
165
|
+
$lt: new Date()
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
var active = yield _gymPassModel.default.countDocuments({
|
|
169
|
+
isUsed: false,
|
|
170
|
+
expiresAt: {
|
|
171
|
+
$gte: new Date()
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
total,
|
|
176
|
+
used,
|
|
177
|
+
expired,
|
|
178
|
+
active,
|
|
179
|
+
usageRate: total > 0 ? (used / total * 100).toFixed(2) : 0
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
return function getGymPassStats() {
|
|
183
|
+
return _ref10.apply(this, arguments);
|
|
184
|
+
};
|
|
185
|
+
}();
|
|
186
|
+
var updateGymPass = /*#__PURE__*/function () {
|
|
187
|
+
var _ref11 = _asyncToGenerator(function* (id, updateData) {
|
|
188
|
+
var allowedUpdates = ['name', 'phone'];
|
|
189
|
+
var updates = {};
|
|
190
|
+
Object.keys(updateData).forEach(key => {
|
|
191
|
+
if (allowedUpdates.includes(key)) {
|
|
192
|
+
updates[key] = updateData[key];
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
if (Object.keys(updates).length === 0) {
|
|
196
|
+
throw new Error('No hay campos válidos para actualizar');
|
|
197
|
+
}
|
|
198
|
+
var gymPass = yield _gymPassModel.default.findByIdAndUpdate(id, updates, {
|
|
199
|
+
new: true,
|
|
200
|
+
runValidators: true
|
|
201
|
+
}).lean();
|
|
202
|
+
if (!gymPass) {
|
|
203
|
+
throw new Error('Pase no encontrado');
|
|
204
|
+
}
|
|
205
|
+
return gymPass;
|
|
206
|
+
});
|
|
207
|
+
return function updateGymPass(_x6, _x7) {
|
|
208
|
+
return _ref11.apply(this, arguments);
|
|
209
|
+
};
|
|
210
|
+
}();
|
|
211
|
+
var deleteGymPass = /*#__PURE__*/function () {
|
|
212
|
+
var _ref12 = _asyncToGenerator(function* (id) {
|
|
213
|
+
var gymPass = yield _gymPassModel.default.findByIdAndDelete(id).lean();
|
|
214
|
+
if (!gymPass) {
|
|
215
|
+
throw new Error('Pase no encontrado');
|
|
216
|
+
}
|
|
217
|
+
return gymPass;
|
|
218
|
+
});
|
|
219
|
+
return function deleteGymPass(_x8) {
|
|
220
|
+
return _ref12.apply(this, arguments);
|
|
221
|
+
};
|
|
222
|
+
}();
|
|
223
|
+
var _default = exports.default = {
|
|
224
|
+
createGymPass,
|
|
225
|
+
listGymPasses,
|
|
226
|
+
getGymPassById,
|
|
227
|
+
getGymPassByNumber,
|
|
228
|
+
getGymPassByEmail,
|
|
229
|
+
markPassAsUsed,
|
|
230
|
+
getGymPassStats,
|
|
231
|
+
updateGymPass,
|
|
232
|
+
deleteGymPass
|
|
233
|
+
};
|