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

ULL-ESIT-INF-DSI-2526 / grp02-medcore-api-groupd / 25636325421

10 May 2026 06:24PM UTC coverage: 91.921% (+0.6%) from 91.312%
25636325421

push

github

eduzu
feat: record delete and modify controllers

117 of 123 branches covered (95.12%)

Branch coverage included in aggregate %.

56 of 58 new or added lines in 3 files covered. (96.55%)

486 of 533 relevant lines covered (91.18%)

8.91 hits per line

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

97.73
/src/controller/record/modifyRecord.controller.ts
1
import { Request, Response } from 'express';
2
import mongoose from 'mongoose';
3
import { Record } from '../../models/records/recordSchema.js';
4
import { Medication } from '../../models/medications/medicationSchema.js';
5

6
/**
7
 * Función auxiliar para procesar la nueva medicación:
8
 * Verifica existencia, stock y calcula el coste.
9
 */
10
async function validateAndProcessNewMeds(newMeds: any[]) {
11
  let totalCost = 0;
3✔
12
  const processedList = [];
3✔
13

14
  for (const item of newMeds) {
3✔
15
    const med = await Medication.findOne({ natCode: item.natCode });
2✔
16
    if (!med) throw new Error(`Medicamento con codigo ${item.natCode} no encontrado`);
2✔
17
    if (med.stock < item.amount) throw new Error(`Stock insuficiente para el medicamento con codigo ${item.natCode}`);
2✔
18

19
    totalCost += med.price * item.amount;
1✔
20
    processedList.push({
1✔
21
      medication: med._id,
22
      amount: item.amount,
23
      instructions: item.instructions
24
    });
25
    med.stock -= item.amount;
1✔
26
    await med.save();
1✔
27
  }
28
  return { processedList, totalCost };
2✔
29
}
30

31
/**
32
 * Función auxiliar para devolver el stock antiguo
33
 */
34
async function restoreOldStock(oldMedList: any[]) {
35
  for (const item of oldMedList) {
2✔
36
    const med = await Medication.findById(item.medication);
1✔
37
    if (med) {
1✔
38
      med.stock += item.amount;
1✔
39
      await med.save();
1✔
40
    }
41
  }
42
}
43

44
export async function modifyRecord(req: Request, res: Response) {
45
  try {
5✔
46
    const { id } = req.params;
5✔
47
    if (!mongoose.isValidObjectId(id)) {
5✔
48
      return res.status(400).json({ error: 'ID de registro no valido' });
1✔
49
    }
50
    const oldRecord = await Record.findById(id);
4✔
51
    if (!oldRecord) {
4✔
52
      return res.status(404).json({ error: 'Registro no encontrado' });
1✔
53
    }
54

55
    if (req.body.medications) {
3✔
56
      await restoreOldStock(oldRecord.medicationList);
2✔
57
      try {
2✔
58
        const { processedList, totalCost } = await validateAndProcessNewMeds(req.body.medications);
2✔
59
        req.body.medicationList = processedList;
1✔
60
        req.body.totalPrice = totalCost;
1✔
61
      } catch (error: any) {
62
          const oldPopulated = await Record.findById(id).populate('medicationList.medication');
1✔
63

64
          if (oldPopulated) {
1✔
65
            const medicationsToReDeduct = oldPopulated.medicationList.map((m: any) => ({
1✔
66
              natCode: m.medication.natCode,
67
              amount: m.amount,
68
              instructions: m.instructions
69
            }));
70
            await validateAndProcessNewMeds(medicationsToReDeduct);
1✔
71
          }
72
          return res.status(400).json({ error: error.message });
1✔
73
      }
74
    }
75
    const updatedRecord = await Record.findByIdAndUpdate( id, req.body,
2✔
76
      { new: true, runValidators: true });
77
    return res.status(200).json(updatedRecord);
2✔
78
  } catch (error: any) {
NEW
79
    return res.status(500).json({ error: error.message });
×
80
  }
81
}
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