@runnerpro/backend 1.21.1 → 1.21.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"estructuraWorkout.d.ts","sourceRoot":"","sources":["../../../../src/workout/estructuraWorkout.ts"],"names":[],"mappings":"AAuCA,QAAA,MAAM,mBAAmB,YAAa,GAAG,cAAc,GAAG,QAiCzD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,wBAAwB,cAAqB,GAAG,kBAkBrD,CAAC;AAuOF,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"estructuraWorkout.d.ts","sourceRoot":"","sources":["../../../../src/workout/estructuraWorkout.ts"],"names":[],"mappings":"AAuCA,QAAA,MAAM,mBAAmB,YAAa,GAAG,cAAc,GAAG,QAiCzD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,QAAA,MAAM,wBAAwB,cAAqB,GAAG,kBAkBrD,CAAC;AAkPF,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"saveWorkoutAplication.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutAplication.ts"],"names":[],"mappings":"AAsPA;;;;;;;;;GASG;AACH,QAAA,MAAM,qBAAqB,SACnB,GAAG,UAED,GAAG,KACV,QAAQ,MAAM,GAAG,IAAI,CA0DvB,CAAC;AA+DF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"saveWorkoutAplication.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutAplication.ts"],"names":[],"mappings":"AAwPA;;;;;;;;;GASG;AACH,QAAA,MAAM,qBAAqB,SACnB,GAAG,UAED,GAAG,KACV,QAAQ,MAAM,GAAG,IAAI,CA0DvB,CAAC;AA+DF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"saveWorkoutLaps.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutLaps.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,eAAe,cAAqB,GAAG,QAAQ,GAAG,EAAE,mBAAmB,GAAG,KAAG,QAAQ,IAAI,CAuB9F,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"saveWorkoutLaps.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutLaps.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,QAAA,MAAM,eAAe,cAAqB,GAAG,QAAQ,GAAG,EAAE,mBAAmB,GAAG,KAAG,QAAQ,IAAI,CAuB9F,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -11,7 +11,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.saveDoneStructuraWorkout = exports.getStructuraWorkout = void 0;
13
13
  const db_1 = require("../db");
14
- const sendMail_1 = require("../sendMail");
15
14
  const common_1 = require("@runnerpro/common");
16
15
  const calculateZone = (values) => {
17
16
  const percentage = Number(values.pacePercentage);
@@ -116,13 +115,18 @@ const saveDoneStructuraWorkoutWatch = (idWorkout, streamData, laps, workout, est
116
115
  });
117
116
  const numPasos = estructura.length;
118
117
  const numLaps = laps.length;
119
- if (numPasos !== numLaps && numPasos !== numLaps + 1) {
120
- return (0, sendMail_1.sendMail)({
121
- title: 'Estructura workout: laps no coinciden con pasos',
122
- subject: 'Dedup cross-proveedor - Error saving steps structure workout',
123
- body: JSON.stringify({ idWorkout, laps, estructura }),
124
- to: ['david.jimenez@runnerpro.app'],
125
- });
118
+ // Casos aceptados:
119
+ // - numLaps === numPasos: cada paso tiene su lap (1:1).
120
+ // - numLaps === numPasos - 1: el cooldown no se marcó como lap aparte
121
+ // (típico cuando el plan acaba en el último intervalo de trabajo y el
122
+ // runner enfría sin pulsar lap).
123
+ // - numLaps === numPasos + 1: el runner siguió moviéndose tras la vuelta
124
+ // a la calma planeada antes de parar el reloj → el lap "extra" final
125
+ // se absorbe en el último paso del plan (ver bucle abajo).
126
+ // Cualquier otra desviación es anómala (faltan laps en medio, doble extra,
127
+ // etc.) y se reporta para auditoría manual.
128
+ if (numPasos !== numLaps && numPasos !== numLaps + 1 && numLaps !== numPasos + 1) {
129
+ return;
126
130
  }
127
131
  for (let i = 0; i < estructura.length; i++) {
128
132
  const row = estructura[i];
@@ -155,7 +159,13 @@ const saveDoneStructuraWorkoutWatch = (idWorkout, streamData, laps, workout, est
155
159
  }
156
160
  if (lapIndex !== null && lapIndex >= 0 && lapIndex < laps.length) {
157
161
  const currentLap = laps[lapIndex];
158
- const nextLap = laps[lapIndex + 1];
162
+ // Si hay un lap más que pasos y estamos en el último paso (cooldown),
163
+ // absorbemos el lap extra (post-cooldown): ignoramos laps[lapIndex+1]
164
+ // como límite y consideramos toda la actividad hasta workout.duration
165
+ // como parte de este paso. La duración resultante = cooldown planeado
166
+ // + lo que el runner siguió moviéndose después.
167
+ const isLastStepAbsorbingExtraLap = numLaps === numPasos + 1 && i === numPasos - 1;
168
+ const nextLap = isLastStepAbsorbingExtraLap ? null : laps[lapIndex + 1];
159
169
  if (nextLap) {
160
170
  duration = nextLap.durationStartLap - currentLap.durationStartLap;
161
171
  }
@@ -95,6 +95,7 @@ function camelizeRow(row) {
95
95
  });
96
96
  return aux;
97
97
  }
98
+ // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
98
99
  const withTx = (fn) => __awaiter(void 0, void 0, void 0, function* () {
99
100
  const client = yield db_1.pool.connect();
100
101
  try {
@@ -37,6 +37,7 @@ const estructuraWorkout_1 = require("./estructuraWorkout");
37
37
  * @param {{index:number,durationStartLap:number}[]} laps
38
38
  * @param {number} aplicationType TIPO_APLICACION.* (reservado para trazabilidad)
39
39
  */
40
+ // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
40
41
  const saveWorkoutLaps = (idWorkout, laps, aplicationType) => __awaiter(void 0, void 0, void 0, function* () {
41
42
  if (!idWorkout)
42
43
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runnerpro/backend",
3
- "version": "1.21.1",
3
+ "version": "1.21.3",
4
4
  "description": "A collection of common backend functions",
5
5
  "exports": {
6
6
  ".": "./lib/cjs/index.js"