diff --git a/sql/08-programas.sql b/sql/08-programas.sql index 4df1d88..144c89a 100644 --- a/sql/08-programas.sql +++ b/sql/08-programas.sql @@ -1,3 +1,3 @@ -INSERT INTO programa(programa) VALUES ("Chromebook"); -INSERT INTO programa(programa) VALUES ("Laptop"); -INSERT INTO programa(programa) VALUES ("iPad"); +INSERT INTO programa(programa) VALUES ("Programación"); +INSERT INTO programa(programa) VALUES ("Adobe"); +INSERT INTO programa(programa) VALUES ("Autodesk"); diff --git a/sql/18-todo.sql b/sql/18-todo.sql index 6f46b20..3dff70d 100644 --- a/sql/18-todo.sql +++ b/sql/18-todo.sql @@ -173,9 +173,9 @@ INSERT INTO tipo_entrada(tipo_entrada) VALUES('HDMI'); INSERT INTO tipo_entrada(tipo_entrada) VALUES('Tipo c'); INSERT INTO tipo_entrada(tipo_entrada) VALUES('VGA'); -INSERT INTO programa(programa) VALUES ("Chromebook"); -INSERT INTO programa(programa) VALUES ("Laptop"); -INSERT INTO programa(programa) VALUES ("iPad"); +INSERT INTO programa(programa) VALUES ("Programación"); +INSERT INTO programa(programa) VALUES ("Adobe"); +INSERT INTO programa(programa) VALUES ("Autodesk"); INSERT INTO infraccion(infraccion) VALUES('Manchas de suciedad'); INSERT INTO infraccion(infraccion) VALUES('Etiquetas Removidas'); diff --git a/src/app.module.ts b/src/app.module.ts index 3c4f4e4..da9729d 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,7 +9,6 @@ import { CarreraProgramaModule } from './carrera-programa/carrera-programa.modul import { CarritoModule } from './carrito/carrito.module'; import { CronModule } from './cron/cron.module'; import { EquipoModule } from './equipo/equipo.module'; -import { EquipoProgramaModule } from './equipo-programa/equipo-programa.module'; import { HoraExcepcionModule } from './hora-excepcion/hora-excepcion.module'; import { InstitucionModule } from './institucion/institucion.module'; import { InstitucionCarreraModule } from './institucion-carrera/institucion-carrera.module'; @@ -34,7 +33,7 @@ import { CarreraPrograma } from './carrera-programa/entity/carrera-programa.enti import { Carrito } from './carrito/entity/carrito.entity'; import { Dia } from './institucion-dia/entity/dia.entity'; import { Equipo } from './equipo/entity/equipo.entity'; -import { EquipoPrograma } from './equipo-programa/entity/equipo-programa.entity'; +import { EquipoPrograma } from './equipo/entity/equipo-programa.entity'; import { EquipoTipoEntrada } from './equipo/entity/equipo-tipo-entrada.entity'; import { HoraExcepcion } from './hora-excepcion/entity/hora-excepcion.entity'; import { Infraccion } from './institucion-infraccion/entity/infraccion.entity'; @@ -112,7 +111,6 @@ import { SoapClientModule } from './soap-client/soap-client.module'; CarritoModule, CronModule, EquipoModule, - EquipoProgramaModule, HoraExcepcionModule, InstitucionModule, InstitucionCarreraModule, diff --git a/src/equipo-programa/equipo-programa.controller.spec.ts b/src/equipo-programa/equipo-programa.controller.spec.ts deleted file mode 100644 index 96dd9a7..0000000 --- a/src/equipo-programa/equipo-programa.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { EquipoProgramaController } from './equipo-programa.controller'; - -describe('EquipoProgramaController', () => { - let controller: EquipoProgramaController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [EquipoProgramaController], - }).compile(); - - controller = module.get(EquipoProgramaController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/equipo-programa/equipo-programa.controller.ts b/src/equipo-programa/equipo-programa.controller.ts deleted file mode 100644 index 292f2aa..0000000 --- a/src/equipo-programa/equipo-programa.controller.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Controller } from '@nestjs/common'; - -@Controller('equipo-programa') -export class EquipoProgramaController {} diff --git a/src/equipo-programa/equipo-programa.module.ts b/src/equipo-programa/equipo-programa.module.ts deleted file mode 100644 index 7f54f01..0000000 --- a/src/equipo-programa/equipo-programa.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { EquipoProgramaController } from './equipo-programa.controller'; -import { EquipoProgramaService } from './equipo-programa.service'; -import { EquipoPrograma } from './entity/equipo-programa.entity'; - -@Module({ - imports: [TypeOrmModule.forFeature([EquipoPrograma])], - controllers: [EquipoProgramaController], - providers: [EquipoProgramaService], -}) -export class EquipoProgramaModule {} diff --git a/src/equipo-programa/equipo-programa.service.spec.ts b/src/equipo-programa/equipo-programa.service.spec.ts deleted file mode 100644 index b3a172b..0000000 --- a/src/equipo-programa/equipo-programa.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { EquipoProgramaService } from './equipo-programa.service'; - -describe('EquipoProgramaService', () => { - let service: EquipoProgramaService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [EquipoProgramaService], - }).compile(); - - service = module.get(EquipoProgramaService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/equipo-programa/equipo-programa.service.ts b/src/equipo-programa/equipo-programa.service.ts deleted file mode 100644 index ca5ae1e..0000000 --- a/src/equipo-programa/equipo-programa.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { EquipoPrograma } from './entity/equipo-programa.entity'; - -@Injectable() -export class EquipoProgramaService { - constructor( - @InjectRepository(EquipoPrograma) - private repository: Repository, - ) {} -} diff --git a/src/equipo/dto/equipo-equipos.dto.ts b/src/equipo/dto/equipo-equipos.dto.ts new file mode 100644 index 0000000..343ffde --- /dev/null +++ b/src/equipo/dto/equipo-equipos.dto.ts @@ -0,0 +1,34 @@ +import { IsNumberString, IsOptional, IsString } from 'class-validator'; + +export class EquipoEquiposDto { + @IsNumberString() + pagina: string; + + @IsString() + @IsOptional() + carrito?: string; + + @IsString() + @IsOptional() + equipo?: string; + + @IsNumberString() + @IsOptional() + id_modulo?: string; + + @IsNumberString() + @IsOptional() + id_programa?: string; + + @IsNumberString() + @IsOptional() + id_tipo_carrito?: string; + + @IsNumberString() + @IsOptional() + id_tipo_entrada?: string; + + @IsNumberString() + @IsOptional() + id_status?: string; +} diff --git a/src/equipo/dto/equipo-update.dto.ts b/src/equipo/dto/equipo-update.dto.ts new file mode 100644 index 0000000..03dd18a --- /dev/null +++ b/src/equipo/dto/equipo-update.dto.ts @@ -0,0 +1,12 @@ +import { IsInt } from 'class-validator'; + +export class EquipoUpdateDto { + @IsInt() + id_equipo: number; + + @IsInt() + id_carrito: number; + + @IsInt() + id_status: number; +} diff --git a/src/equipo-programa/entity/equipo-programa.entity.ts b/src/equipo/entity/equipo-programa.entity.ts similarity index 65% rename from src/equipo-programa/entity/equipo-programa.entity.ts rename to src/equipo/entity/equipo-programa.entity.ts index 9b6a36b..346a495 100644 --- a/src/equipo-programa/entity/equipo-programa.entity.ts +++ b/src/equipo/entity/equipo-programa.entity.ts @@ -1,5 +1,5 @@ -import { Entity, PrimaryGeneratedColumn, ManyToOne, JoinColumn } from 'typeorm'; -import { Equipo } from '../../equipo/entity/equipo.entity'; +import { Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Equipo } from './equipo.entity'; import { Programa } from '../../institucion-programa/entity/programa.entity'; @Entity() @@ -7,10 +7,7 @@ export class EquipoPrograma { @PrimaryGeneratedColumn() id_equipo_programa: number; - @ManyToOne( - () => Equipo, - (equipo) => equipo.programas, - ) + @ManyToOne(() => Equipo, (equipo) => equipo.programas) @JoinColumn({ name: 'id_equipo' }) equipo: Equipo; diff --git a/src/equipo/entity/equipo-tipo-entrada.entity.ts b/src/equipo/entity/equipo-tipo-entrada.entity.ts index a067a35..ee96cce 100644 --- a/src/equipo/entity/equipo-tipo-entrada.entity.ts +++ b/src/equipo/entity/equipo-tipo-entrada.entity.ts @@ -7,7 +7,7 @@ export class EquipoTipoEntrada { @PrimaryGeneratedColumn() id_equipo_entrada: number; - @ManyToOne(() => Equipo, (equipo) => equipo.equipoTipoEntradas) + @ManyToOne(() => Equipo, (equipo) => equipo.tiposEntradas) @JoinColumn({ name: 'id_equipo' }) equipo: Equipo; diff --git a/src/equipo/entity/equipo.entity.ts b/src/equipo/entity/equipo.entity.ts index c53fbbd..4b30fc6 100644 --- a/src/equipo/entity/equipo.entity.ts +++ b/src/equipo/entity/equipo.entity.ts @@ -10,7 +10,7 @@ import { Carrito } from '../../carrito/entity/carrito.entity'; import { EquipoTipoEntrada } from './equipo-tipo-entrada.entity'; import { Motivo } from '../../motivo/entity/motivo.entity'; import { Prestamo } from '../../prestamo/entity/prestamo.entity'; -import { EquipoPrograma } from '../../equipo-programa/entity/equipo-programa.entity'; +import { EquipoPrograma } from './equipo-programa.entity'; import { Status } from '../../status/entity/status.entity'; @Entity() @@ -18,7 +18,7 @@ export class Equipo { @PrimaryGeneratedColumn() id_equipo: number; - @Column({ type: String, nullable: false, length: 2 }) + @Column({ type: String, nullable: false, length: 3 }) equipo: string; @Column({ type: String, nullable: false, length: 30 }) @@ -36,11 +36,11 @@ export class Equipo { @Column({ type: Boolean, nullable: false, default: false }) prestado: boolean; - @ManyToOne(() => Carrito, (carrito) => carrito.equipos) + @ManyToOne(() => Carrito, (carrito) => carrito.equipos, { eager: true }) @JoinColumn({ name: 'id_carrito' }) carrito: Carrito; - @ManyToOne(() => Status, (status) => status.equipos) + @ManyToOne(() => Status, (status) => status.equipos, { eager: true }) @JoinColumn({ name: 'id_status' }) status: Status; @@ -48,7 +48,7 @@ export class Equipo { () => EquipoTipoEntrada, (equipoTipoEntrada) => equipoTipoEntrada.tipoEntrada, ) - equipoTipoEntradas: EquipoTipoEntrada[]; + tiposEntradas: EquipoTipoEntrada[]; @OneToMany(() => EquipoPrograma, (equipoPrograma) => equipoPrograma.equipo) programas: EquipoPrograma[]; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index d59ef42..743c302 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,34 +1,34 @@ -import { Controller, Get, Post, Put, Query } from '@nestjs/common'; +import { Body, Controller, Get, Put, Query } from '@nestjs/common'; import { EquipoService } from './equipo.service'; import { EquipoDto } from './dto/equipo.dto'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { EquipoEquiposDto } from './dto/equipo-equipos.dto'; +import { EquipoUpdateDto } from './dto/equipo-update.dto'; @Controller('equipo') -// @ApiTags('equipo') +@ApiTags('equipo') export class EquipoController { constructor(private equipoService: EquipoService) {} - @Get() - // @ApiOperation({ - // description: 'Traemos todos los equipos', - // }) - get() { - return this.equipoService.findAll(); - } - @Get('equipo') - // @ApiOperation({ - // description: 'Buscamos un equipo en base al id_equipo', - // }) + @ApiOperation({ + description: 'Endpoint que retorna la información de un equipo.', + }) equipo(@Query() query: EquipoDto) { return this.equipoService.findById(parseInt(query.id_equipo)); } - // Terminar uwu @Get('equipos') - equiposs() {} + @ApiOperation({ + description: + 'Endpoint que retorna 15 equipos dependiendo de la página en la que esta el usuario y sus filtros.', + }) + equipos(@Query() query: EquipoEquiposDto) { + return this.equipoService.findAll(query); + } - // Terminar uwu @Put() - update() {} + update(@Body() body: EquipoUpdateDto) { + return this.equipoService.update(body); + } } diff --git a/src/equipo/equipo.module.ts b/src/equipo/equipo.module.ts index c515f9c..80cb537 100644 --- a/src/equipo/equipo.module.ts +++ b/src/equipo/equipo.module.ts @@ -3,10 +3,23 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { EquipoController } from './equipo.controller'; import { EquipoService } from './equipo.service'; import { Equipo } from './entity/equipo.entity'; +import { EquipoPrograma } from './entity/equipo-programa.entity'; import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity'; +import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module'; +import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module'; +import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module'; +import { ModuloModule } from '../modulo/modulo.module'; +import { StatusModule } from '../status/status.module'; @Module({ - imports: [TypeOrmModule.forFeature([Equipo, EquipoTipoEntrada])], + imports: [ + InstitucionProgramaModule, + InstitucionTipoCarritoModule, + InstitucionTipoEntradaModule, + ModuloModule, + TypeOrmModule.forFeature([Equipo, EquipoPrograma, EquipoTipoEntrada]), + StatusModule, + ], controllers: [EquipoController], providers: [EquipoService], exports: [EquipoService], diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index a71bb25..261f626 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -2,23 +2,120 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Equipo } from './entity/equipo.entity'; +import { EquipoPrograma } from '../equipo/entity/equipo-programa.entity'; +import { EquipoTipoEntrada } from '../equipo/entity/equipo-tipo-entrada.entity'; +import { InstitucionProgramaService } from 'src/institucion-programa/institucion-programa.service'; +import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service'; +import { InstitucionTipoEntradaService } from 'src/institucion-tipo-entrada/institucion-tipo-entrada.service'; +import { ModuloService } from '../modulo/modulo.service'; +import { StatusService } from 'src/status/status.service'; @Injectable() export class EquipoService { constructor( - @InjectRepository(Equipo) private repository: Repository, + @InjectRepository(Equipo) private equipoRepository: Repository, + @InjectRepository(EquipoPrograma) + private equipoProgramaRepository: Repository, + @InjectRepository(EquipoTipoEntrada) + private equipoTipoEntradaRepository: Repository, + private institucionProgramaService: InstitucionProgramaService, + private institucionTipoCarritoService: InstitucionTipoCarritoService, + private institucionTipoEntradaService: InstitucionTipoEntradaService, + private moduloService: ModuloService, + private statusService: StatusService, ) {} async create() {} - findAll() { - return this.repository.find(); + async findAll(filtros: { + pagina: string; + carrito?: string; + equipo?: string; + id_modulo?: string; + id_programa?: string; + id_tipo_carrito?: string; + id_tipo_entrada?: string; + id_status?: string; + }) { + const modulo = filtros.id_modulo + ? await this.moduloService.findById(parseInt(filtros.id_modulo)) + : null; + const programa = filtros.id_programa + ? await this.institucionProgramaService.findProgramaById( + parseInt(filtros.id_programa), + ) + : null; + const tipoCarrito = filtros.id_tipo_carrito + ? await this.institucionTipoCarritoService.findTipoCaritoById( + parseInt(filtros.id_tipo_carrito), + ) + : null; + const tipoEntrada = filtros.id_tipo_entrada + ? await this.institucionTipoEntradaService.findTipoEntradaById( + parseInt(filtros.id_tipo_entrada), + ) + : null; + const status = filtros.id_status + ? await this.statusService.findById(parseInt(filtros.id_status)) + : null; + const query = this.equipoRepository + .createQueryBuilder('e') + .innerJoinAndSelect('carrito', 'c') + .innerJoinAndSelect('status', 's') + .innerJoinAndSelect('e.programas', 'ps') + // .innerJoinAndSelect('e.tiposEntradas', 'tes') + .innerJoinAndSelect('ps.programa', 'p') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .take(15) + .skip((parseInt(filtros.pagina) - 1) * 15); + + if (filtros.carrito) + query.andWhere('c.carrito LIKE :carrito', { + carrito: `%${filtros.carrito}%`, + }); + if (filtros.equipo) + query.andWhere('equipo LIKE :equipo', { + equipo: `%${filtros.equipo}%`, + }); + if (modulo) + query.andWhere('m.id_modulo = :id_modulo', { + id_modulo: modulo.id_modulo, + }); + if (programa) + query.andWhere('ps.id_programa = :id_programa', { + id_programa: programa.id_programa, + }); + if (tipoCarrito) + query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }); + // if (tipoEntrada) + // query.andWhere('te.id_tipo_entrada = :id_tipo_entrada', { + // id_tipo_entrada: tipoEntrada.id_tipo_entrada, + // }); + if (status) + query.andWhere('s.id_status = :id_status', { + id_status: status.id_status, + }); + return query.getManyAndCount(); } findById(id_equipo: number) { - return this.repository.findOne({ id_equipo }).then((equipo) => { - if (!equipo) throw new NotFoundException('No existe este equipo'); + return this.equipoRepository.findOne({ id_equipo }).then((equipo) => { + if (!equipo) throw new NotFoundException('No existe este equipo.'); return equipo; }); } + + update(attrs: Partial) { + return this.findById(attrs.id_equipo) + .then((equipo) => { + Object.assign(equipo, attrs); + return this.equipoRepository.save(equipo); + }) + .then((_) => ({ + message: 'Se actualizó correctamente la información del equipo.', + })); + } } diff --git a/src/institucion-programa/entity/programa.entity.ts b/src/institucion-programa/entity/programa.entity.ts index 1bb1034..1e88783 100644 --- a/src/institucion-programa/entity/programa.entity.ts +++ b/src/institucion-programa/entity/programa.entity.ts @@ -1,6 +1,6 @@ import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; import { CarreraPrograma } from '../../carrera-programa/entity/carrera-programa.entity'; -import { EquipoPrograma } from '../../equipo-programa/entity/equipo-programa.entity'; +import { EquipoPrograma } from '../../equipo/entity/equipo-programa.entity'; import { InstitucionPrograma } from './institucion-programa.entity'; @Entity() diff --git a/src/institucion-tipo-entrada/institucion-tipo-entrada.module.ts b/src/institucion-tipo-entrada/institucion-tipo-entrada.module.ts index ffec7c4..5b27efb 100644 --- a/src/institucion-tipo-entrada/institucion-tipo-entrada.module.ts +++ b/src/institucion-tipo-entrada/institucion-tipo-entrada.module.ts @@ -13,5 +13,6 @@ import { TipoEntrada } from './entity/tipo-entrada.entity'; ], controllers: [InstitucionTipoEntradaController], providers: [InstitucionTipoEntradaService], + exports: [InstitucionTipoEntradaService], }) export class InstitucionTipoEntradaModule {} diff --git a/src/institucion-tipo-entrada/institucion-tipo-entrada.service.ts b/src/institucion-tipo-entrada/institucion-tipo-entrada.service.ts index f320bb7..473d8c8 100644 --- a/src/institucion-tipo-entrada/institucion-tipo-entrada.service.ts +++ b/src/institucion-tipo-entrada/institucion-tipo-entrada.service.ts @@ -70,6 +70,16 @@ export class InstitucionTipoEntradaService { }); } + findTipoEntradaById(id_tipo_entrada: number) { + return this.repositoryTipoEntrada + .findOne({ id_tipo_entrada }) + .then((tipoEntrada) => { + if (!tipoEntrada) + throw new NotFoundException('No existe este tipo de entrada.'); + return tipoEntrada; + }); + } + update(attrs: Partial) { return this.findById(attrs.id_institucion_tipo_entrada) .then((institucionTipoEntrada) => {