Merge pull request 'UX-013: endpoint PUT /carrito/mover-modulo para superadmin' (#6) from feature/UX-013-mover-carrito-modulo into dev

Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
2026-08-04 00:55:12 +00:00
3 changed files with 63 additions and 0 deletions
+27
View File
@@ -23,6 +23,7 @@ import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.servic
import { CarritoDto } from './dto/input/carrito.dto';
import { CarritosDto } from './dto/input/carritos.dto';
import { CreateCarritoDto } from './dto/input/create.dto';
import { MoverModuloCarritoDto } from './dto/input/mover-modulo.dto';
import { UpdateCarritoDto } from './dto/input/update.dto';
import { MessageOutputDto } from '../dto/output/message.dto';
import { CarritoOutputDto } from './dto/output/carrito.dto';
@@ -183,4 +184,30 @@ export class CarritoController {
body.numero_equipos,
);
}
@Serealize(MessageOutputDto)
@Put('mover-modulo')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description:
'Mover un carrito a otro módulo de la misma institución (superadmin).',
})
@ApiBearerAuth('jwt')
@ApiBody({
description: 'Variables que necesita el endpoint.',
examples: {
ejemplo: {
value: {
id_carrito: 1,
id_modulo: 2,
},
},
},
})
moverModulo(@Request() req, @Body() body: MoverModuloCarritoDto) {
const superAdmin: Operador = req.user.operador;
this.validarUsuarioService.validarSuperAdmin(superAdmin);
return this.carritoService.moverModulo(body.id_carrito, body.id_modulo);
}
}
+27
View File
@@ -1,4 +1,5 @@
import {
ConflictException,
ForbiddenException,
forwardRef,
Inject,
@@ -243,6 +244,32 @@ export class CarritoService {
});
}
async moverModulo(
id_carrito: number,
id_modulo: number,
): Promise<{ message: string }> {
const carrito = await this.findById(id_carrito);
const modulo = await this.moduloService.findById(id_modulo);
// Validamos que el módulo destino no sea el módulo actual del carrito
if (carrito.modulo.id_modulo === modulo.id_modulo)
throw new ConflictException('Este carrito ya pertenece a este módulo.');
// Validamos que el módulo destino pertenezca a la misma institución del carrito
if (
carrito.modulo.institucion.id_institucion !=
modulo.institucion.id_institucion
)
throw new ForbiddenException(
'No puedes mover este carrito a un módulo que no pertenece a la misma institución.',
);
carrito.modulo = modulo;
return this.repository
.save(carrito)
.then((_) => ({
message: 'Se movió correctamente el carrito de módulo.',
}));
}
private viewToCarrito(infoCarrito: InformacionCarritoView): Carrito {
if (!infoCarrito) return null;
return this.repository.create({
@@ -0,0 +1,9 @@
import { IsInt } from 'class-validator';
export class MoverModuloCarritoDto {
@IsInt()
id_carrito: number;
@IsInt()
id_modulo: number;
}