goldstars-services 1.0.65 → 1.0.67

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