From ab096bb539c492e9361e0d1cf0289b9256132be6 Mon Sep 17 00:00:00 2001 From: martinsglucas Date: Sat, 2 Dec 2023 18:50:14 -0300 Subject: [PATCH 01/15] (#116) cria entidade metrica Co-authored-by: Pedro Cella Co-authored-by: Guilherme Silva <221021984@aluno.unb.br> --- src/app.module.ts | 4 +- src/metrica/classes/tipo-metrica.enum.ts | 8 ++ src/metrica/dto/create-metrica-dto.ts | 12 +++ src/metrica/dto/update-metrica-dto.ts | 4 + src/metrica/entities/metrica.entity.ts | 22 +++++ src/metrica/metrica.controller.ts | 50 ++++++++++ src/metrica/metrica.module.ts | 14 +++ src/metrica/metrica.service.ts | 95 +++++++++++++++++++ .../1701549606356-CreateTableMetrica.ts | 18 ++++ .../1701553301515-CreateTableMetrica.ts | 16 ++++ 10 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 src/metrica/classes/tipo-metrica.enum.ts create mode 100644 src/metrica/dto/create-metrica-dto.ts create mode 100644 src/metrica/dto/update-metrica-dto.ts create mode 100644 src/metrica/entities/metrica.entity.ts create mode 100644 src/metrica/metrica.controller.ts create mode 100644 src/metrica/metrica.module.ts create mode 100644 src/metrica/metrica.service.ts create mode 100644 src/migration/1701549606356-CreateTableMetrica.ts create mode 100644 src/migration/1701553301515-CreateTableMetrica.ts diff --git a/src/app.module.ts b/src/app.module.ts index 6c67a52..502a619 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,6 +8,7 @@ import { DbModule } from './config/db/db.module'; import { DbService } from './config/db/db.service'; import { IdosoModule } from './idoso/idoso.module'; import { RotinaModule } from './rotina/rotina.module'; +import { MetricaModule } from './metrica/metrica.module'; const ENV = process.env.NODE_ENV; @@ -38,6 +39,7 @@ const ENV = process.env.NODE_ENV; DbModule, IdosoModule, RotinaModule, + MetricaModule, ], controllers: [], providers: [ @@ -47,4 +49,4 @@ const ENV = process.env.NODE_ENV; }, ], }) -export class AppModule {} +export class AppModule { } diff --git a/src/metrica/classes/tipo-metrica.enum.ts b/src/metrica/classes/tipo-metrica.enum.ts new file mode 100644 index 0000000..f3bfe61 --- /dev/null +++ b/src/metrica/classes/tipo-metrica.enum.ts @@ -0,0 +1,8 @@ +export enum ECategoriaMetrica { + FREQUENCIA_CARDIACA = 'Frequência Cardíaca', + PRESSAO_SANGUINEA = 'Pressão', + TEMPERATURA = 'Temperatura', + PESO = 'Peso', + GLICEMIA = 'Glicemia', + SATURACAO = 'Saturação', +} diff --git a/src/metrica/dto/create-metrica-dto.ts b/src/metrica/dto/create-metrica-dto.ts new file mode 100644 index 0000000..2a6ada8 --- /dev/null +++ b/src/metrica/dto/create-metrica-dto.ts @@ -0,0 +1,12 @@ +import { IsEnum, IsNotEmpty, IsNumber } from "class-validator"; +import { ECategoriaMetrica } from "../classes/tipo-metrica.enum"; + +export class CreateMetricaDto { + @IsNotEmpty() + @IsNumber() + idIdoso!: number; + + @IsNotEmpty() + @IsEnum(ECategoriaMetrica) + categoria?: ECategoriaMetrica; +} \ No newline at end of file diff --git a/src/metrica/dto/update-metrica-dto.ts b/src/metrica/dto/update-metrica-dto.ts new file mode 100644 index 0000000..aaa8487 --- /dev/null +++ b/src/metrica/dto/update-metrica-dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from "@nestjs/mapped-types"; +import { CreateMetricaDto } from "./create-metrica-dto"; + +export class UpdateMetricaDto extends PartialType(CreateMetricaDto) { } \ No newline at end of file diff --git a/src/metrica/entities/metrica.entity.ts b/src/metrica/entities/metrica.entity.ts new file mode 100644 index 0000000..ef646a7 --- /dev/null +++ b/src/metrica/entities/metrica.entity.ts @@ -0,0 +1,22 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { Idoso } from "../../idoso/entities/idoso.entity"; +import { ECategoriaMetrica } from "../classes/tipo-metrica.enum"; +import { CreateMetricaDto } from "../dto/create-metrica-dto"; +import { UpdateMetricaDto } from "../dto/update-metrica-dto"; + +@Entity({ name: 'metrica' }) +export class Metrica { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => Idoso) + @JoinColumn({ name: 'idIdoso' }) + idIdoso!: number; + + @Column('enum', { enum: ECategoriaMetrica }) + categoria!: ECategoriaMetrica; + + constructor(createMetricaDto: CreateMetricaDto | UpdateMetricaDto) { + Object.assign(this, createMetricaDto); + } +} \ No newline at end of file diff --git a/src/metrica/metrica.controller.ts b/src/metrica/metrica.controller.ts new file mode 100644 index 0000000..3a0e937 --- /dev/null +++ b/src/metrica/metrica.controller.ts @@ -0,0 +1,50 @@ +import { Body, Controller, Get, Param, Patch, Post, Delete } from "@nestjs/common"; +import { MetricaService } from "./metrica.service"; +import { Response } from '../shared/interceptors/data-transform.interceptor'; +import { Paginate, Pagination } from "../shared/decorators/paginate.decorator"; +import { Ordenate, Ordering } from "../shared/decorators/ordenate.decorator"; +import { ResponsePaginate } from "../shared/interfaces/response-paginate.interface"; +import { Metrica } from "./entities/metrica.entity"; +import { IdValidator } from "../shared/validators/id.validator"; +import { UpdateMetricaDto } from "./dto/update-metrica-dto"; +import { HttpResponse } from "../shared/classes/http-response"; +import { CreateMetricaDto } from "./dto/create-metrica-dto"; +import { PublicRoute } from "../shared/decorators/public-route.decorator"; + +@Controller('metrica') +export class MetricaController { + constructor(private readonly _service: MetricaService) { } + + @Get() + @PublicRoute() + async findAll( + // @Filtrate() queryParam: Filtering, + @Paginate() pagination: Pagination, + @Ordenate() ordering: Ordering, + ): Promise> { + return this._service.findAll(ordering, pagination); + } + @Get(':id') + async findOne(@Param() param: IdValidator): Promise { + return this._service.findOne(param.id); + } + @Patch(':id') + async update( + @Param() param: IdValidator, + @Body() body: UpdateMetricaDto, + ): Promise> { + const updated = await this._service.update(param.id, body); + return new HttpResponse(updated).onUpdated(); + } + @Post() + async create(@Body() body: CreateMetricaDto) { + const created = await this._service.create(body); + return new HttpResponse(created).onCreated(); + } + + @Delete(':id') + async remove(@Param() param: IdValidator): Promise> { + const deleted = await this._service.remove(param.id); + return new HttpResponse(deleted).onDeleted(); + } +} \ No newline at end of file diff --git a/src/metrica/metrica.module.ts b/src/metrica/metrica.module.ts new file mode 100644 index 0000000..1c48d79 --- /dev/null +++ b/src/metrica/metrica.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Metrica } from './entities/metrica.entity'; +import { MetricaController } from './metrica.controller'; +import { MetricaService } from './metrica.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([Metrica])], + controllers: [MetricaController], + providers: [MetricaService, Repository], + exports: [MetricaService], +}) +export class MetricaModule { } diff --git a/src/metrica/metrica.service.ts b/src/metrica/metrica.service.ts new file mode 100644 index 0000000..f603177 --- /dev/null +++ b/src/metrica/metrica.service.ts @@ -0,0 +1,95 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Ordering } from '../shared/decorators/ordenate.decorator'; +import { Pagination } from '../shared/decorators/paginate.decorator'; +// import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; +import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; +import { CreateMetricaDto } from './dto/create-metrica-dto'; +import { Metrica } from './entities/metrica.entity'; +import { UpdateMetricaDto } from './dto/update-metrica-dto'; + +@Injectable() +export class MetricaService { + constructor( + @InjectRepository(Metrica) + private readonly _repository: Repository, + ) { } + + async create(body: CreateMetricaDto): Promise { + const metrica = new Metrica(body); + return this._repository.save(metrica); + } + + async findOne(id: number) { + const metrica = await this._repository.findOneOrFail({ where: { id } }); + return metrica; + } + + async update(id: number, body: UpdateMetricaDto): Promise { + const found = await this.findOne(id); + const merged = Object.assign(found, body); + + const updated = await this._repository.save(merged); + + return updated; + } + + async findAll( + // filter: IRotinaFilter, + ordering: Ordering, + paging: Pagination, + ): Promise> { + const limit = paging.limit; + const offset = paging.offset; + const sort = ordering.column; + const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; + // const where = this.buildWhereClause(filter); + + const [result, total] = await this._repository + .createQueryBuilder('rotinas') + // .where(`${where}`) + .limit(limit) + .offset(offset) + .orderBy(`"${sort}"`, order) + .getManyAndCount(); + + return { + data: result, + count: +total, + pageSize: +total, + }; + } + + // private buildWhereClause(filter: IRotinaFilter): string { + // let whereClause = '1 = 1 '; + + // whereClause += getWhereClauseNumber(filter.id, 'id'); + // whereClause += getWhereClauseNumber(filter.idIdoso, '"idIdoso"'); + // whereClause += this.getWhereClauseDate(filter.dataHora); + + // return whereClause; + // } + + // private getWhereClauseDate(value: string | undefined): string { + // if (!value || value.length < 1) return ''; + + // const date = new Date(value); + // const weekday = date.getDay(); + + // const start = new Date(value); + // start.setUTCHours(0, 0, 0); + // const startString = start.toISOString(); + + // const end = new Date(value); + // end.setUTCHours(23, 59, 59); + // const endString = end.toISOString(); + + // return ` AND (("dataHora"::date BETWEEN '${startString}'::date AND '${endString}'::date) OR ("dias" && '{${weekday}}'::rotina_dias_enum[]))`; + // } + + async remove(id: number) { + const found = await this._repository.findOneOrFail({ where: { id } }); + return this._repository.remove(found); + } +} \ No newline at end of file diff --git a/src/migration/1701549606356-CreateTableMetrica.ts b/src/migration/1701549606356-CreateTableMetrica.ts new file mode 100644 index 0000000..d9988ae --- /dev/null +++ b/src/migration/1701549606356-CreateTableMetrica.ts @@ -0,0 +1,18 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class CreateTableMetrica1701549606356 implements MigrationInterface { + name = 'CreateTableMetrica1701549606356' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TYPE "public"."metrica_categoria_enum" AS ENUM('Frequência Cardíaca', 'Pressão', 'Temperatura', 'Peso', 'Glicemia', 'Saturação')`); + await queryRunner.query(`CREATE TABLE "metrica" ("id" SERIAL NOT NULL, "categoria" "public"."metrica_categoria_enum" NOT NULL, "idIdoso" integer, CONSTRAINT "PK_37eda6d5162b9305738916e1712" PRIMARY KEY ("id"))`); + await queryRunner.query(`ALTER TABLE "metrica" ADD CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726" FOREIGN KEY ("idIdoso") REFERENCES "idoso"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "metrica" DROP CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726"`); + await queryRunner.query(`DROP TABLE "metrica"`); + await queryRunner.query(`DROP TYPE "public"."metrica_categoria_enum"`); + } + +} diff --git a/src/migration/1701553301515-CreateTableMetrica.ts b/src/migration/1701553301515-CreateTableMetrica.ts new file mode 100644 index 0000000..81c4a77 --- /dev/null +++ b/src/migration/1701553301515-CreateTableMetrica.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class CreateTableMetrica1701553301515 implements MigrationInterface { + name = 'CreateTableMetrica1701553301515' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "metrica" ("id" SERIAL NOT NULL, "categoria" "public"."metrica_categoria_enum" NOT NULL, "idIdoso" integer, CONSTRAINT "PK_37eda6d5162b9305738916e1712" PRIMARY KEY ("id"))`); + await queryRunner.query(`ALTER TABLE "metrica" ADD CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726" FOREIGN KEY ("idIdoso") REFERENCES "idoso"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "metrica" DROP CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726"`); + await queryRunner.query(`DROP TABLE "metrica"`); + } + +} From 0dcf1f024bb0e7ee8b14d3be9201d9f81324065d Mon Sep 17 00:00:00 2001 From: martinsglucas Date: Sat, 2 Dec 2023 20:35:03 -0300 Subject: [PATCH 02/15] (#116) cria entidade valorMetrica --- src/app.module.ts | 2 + src/metrica/metrica.service.ts | 2 +- .../1701559083238-CreateTableValorMetrica.ts | 16 ++++ .../dto/create-valorMetrica-dto.ts | 17 ++++ .../dto/update-valorMetrica-dto.ts | 4 + .../entities/valorMetrica.entity.ts | 24 ++++++ src/valorMetrica/valorMetrica.controller.ts | 41 +++++++++ src/valorMetrica/valorMetrica.module.ts | 14 +++ src/valorMetrica/valorMetrica.service.ts | 85 +++++++++++++++++++ 9 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 src/migration/1701559083238-CreateTableValorMetrica.ts create mode 100644 src/valorMetrica/dto/create-valorMetrica-dto.ts create mode 100644 src/valorMetrica/dto/update-valorMetrica-dto.ts create mode 100644 src/valorMetrica/entities/valorMetrica.entity.ts create mode 100644 src/valorMetrica/valorMetrica.controller.ts create mode 100644 src/valorMetrica/valorMetrica.module.ts create mode 100644 src/valorMetrica/valorMetrica.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 502a619..5d11f9b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,6 +9,7 @@ import { DbService } from './config/db/db.service'; import { IdosoModule } from './idoso/idoso.module'; import { RotinaModule } from './rotina/rotina.module'; import { MetricaModule } from './metrica/metrica.module'; +import { ValorMetricaModule } from './valorMetrica/valorMetrica.module'; const ENV = process.env.NODE_ENV; @@ -40,6 +41,7 @@ const ENV = process.env.NODE_ENV; IdosoModule, RotinaModule, MetricaModule, + ValorMetricaModule ], controllers: [], providers: [ diff --git a/src/metrica/metrica.service.ts b/src/metrica/metrica.service.ts index f603177..46d451b 100644 --- a/src/metrica/metrica.service.ts +++ b/src/metrica/metrica.service.ts @@ -47,7 +47,7 @@ export class MetricaService { // const where = this.buildWhereClause(filter); const [result, total] = await this._repository - .createQueryBuilder('rotinas') + .createQueryBuilder('metrica') // .where(`${where}`) .limit(limit) .offset(offset) diff --git a/src/migration/1701559083238-CreateTableValorMetrica.ts b/src/migration/1701559083238-CreateTableValorMetrica.ts new file mode 100644 index 0000000..4f4d935 --- /dev/null +++ b/src/migration/1701559083238-CreateTableValorMetrica.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class CreateTableValorMetrica1701559083238 implements MigrationInterface { + name = 'CreateTableValorMetrica1701559083238' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "valorMetrica" ("id" SERIAL NOT NULL, "valor" double precision NOT NULL, "dataHora" TIMESTAMP NOT NULL, "idMetrica" integer, CONSTRAINT "PK_9e8ca5a7cfc9169850aa35d4fe2" PRIMARY KEY ("id"))`); + await queryRunner.query(`ALTER TABLE "valorMetrica" ADD CONSTRAINT "FK_80f274382900aafd3a667034d46" FOREIGN KEY ("idMetrica") REFERENCES "metrica"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "valorMetrica" DROP CONSTRAINT "FK_80f274382900aafd3a667034d46"`); + await queryRunner.query(`DROP TABLE "valorMetrica"`); + } + +} diff --git a/src/valorMetrica/dto/create-valorMetrica-dto.ts b/src/valorMetrica/dto/create-valorMetrica-dto.ts new file mode 100644 index 0000000..ee6e663 --- /dev/null +++ b/src/valorMetrica/dto/create-valorMetrica-dto.ts @@ -0,0 +1,17 @@ +import { IsDateString, IsNotEmpty, IsNumber } from "class-validator"; + +export class CreateValorMetricaDto { + + @IsNotEmpty() + @IsNumber() + idMetrica!: number; + + @IsNotEmpty() + @IsNumber() + valor!: number; + + @IsDateString() + @IsNotEmpty() + dataHora!: Date; + +} \ No newline at end of file diff --git a/src/valorMetrica/dto/update-valorMetrica-dto.ts b/src/valorMetrica/dto/update-valorMetrica-dto.ts new file mode 100644 index 0000000..8604a57 --- /dev/null +++ b/src/valorMetrica/dto/update-valorMetrica-dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from "@nestjs/mapped-types"; +import { CreateValorMetricaDto } from "./create-valorMetrica-dto"; + +export class UpdateValorMetricaDto extends PartialType(CreateValorMetricaDto) { } \ No newline at end of file diff --git a/src/valorMetrica/entities/valorMetrica.entity.ts b/src/valorMetrica/entities/valorMetrica.entity.ts new file mode 100644 index 0000000..4b233cb --- /dev/null +++ b/src/valorMetrica/entities/valorMetrica.entity.ts @@ -0,0 +1,24 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { Metrica } from "../../metrica/entities/metrica.entity"; +import { CreateValorMetricaDto } from "../dto/create-valorMetrica-dto"; +import { UpdateValorMetricaDto } from "../dto/update-valorMetrica-dto"; + +@Entity({ name: 'valorMetrica' }) +export class ValorMetrica { + @PrimaryGeneratedColumn() + id!: number; + + @ManyToOne(() => Metrica) + @JoinColumn({ name: 'idMetrica' }) + idMetrica!: number; + + @Column('float') + valor!: number; + + @Column('timestamp') + dataHora!: Date; + + constructor(createValorMetricaDto: CreateValorMetricaDto | UpdateValorMetricaDto) { + Object.assign(this, createValorMetricaDto); + } +} \ No newline at end of file diff --git a/src/valorMetrica/valorMetrica.controller.ts b/src/valorMetrica/valorMetrica.controller.ts new file mode 100644 index 0000000..b641ead --- /dev/null +++ b/src/valorMetrica/valorMetrica.controller.ts @@ -0,0 +1,41 @@ +import { Body, Controller, Delete, Get, Param, Post } from "@nestjs/common"; +import { ValorMetricaService } from "./valorMetrica.service"; +import { Response } from '../shared/interceptors/data-transform.interceptor'; +import { PublicRoute } from "../shared/decorators/public-route.decorator"; +import { Paginate, Pagination } from "../shared/decorators/paginate.decorator"; +import { Ordenate, Ordering } from "../shared/decorators/ordenate.decorator"; +import { ResponsePaginate } from "../shared/interfaces/response-paginate.interface"; +import { ValorMetrica } from "./entities/valorMetrica.entity"; +import { IdValidator } from "../shared/validators/id.validator"; +import { CreateValorMetricaDto } from "./dto/create-valorMetrica-dto"; +import { HttpResponse } from "../shared/classes/http-response"; + +@Controller('valorMetrica') +export class ValorMetricaController { + constructor(private readonly _service: ValorMetricaService) { } + + @Get() + @PublicRoute() + async findAll( + // @Filtrate() queryParam: Filtering, + @Paginate() pagination: Pagination, + @Ordenate() ordering: Ordering, + ): Promise> { + return this._service.findAll(ordering, pagination); + } + @Get(':id') + async findOne(@Param() param: IdValidator): Promise { + return this._service.findOne(param.id); + } + @Post() + async create(@Body() body: CreateValorMetricaDto) { + const created = await this._service.create(body); + return new HttpResponse(created).onCreated(); + } + + @Delete(':id') + async remove(@Param() param: IdValidator): Promise> { + const deleted = await this._service.remove(param.id); + return new HttpResponse(deleted).onDeleted(); + } +} \ No newline at end of file diff --git a/src/valorMetrica/valorMetrica.module.ts b/src/valorMetrica/valorMetrica.module.ts new file mode 100644 index 0000000..b1c5dcb --- /dev/null +++ b/src/valorMetrica/valorMetrica.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { ValorMetrica } from './entities/valorMetrica.entity'; +import { ValorMetricaController } from './valorMetrica.controller'; +import { ValorMetricaService } from './valorMetrica.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([ValorMetrica])], + controllers: [ValorMetricaController], + providers: [ValorMetricaService, Repository], + exports: [ValorMetricaService], +}) +export class ValorMetricaModule { } \ No newline at end of file diff --git a/src/valorMetrica/valorMetrica.service.ts b/src/valorMetrica/valorMetrica.service.ts new file mode 100644 index 0000000..cd2a690 --- /dev/null +++ b/src/valorMetrica/valorMetrica.service.ts @@ -0,0 +1,85 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Ordering } from '../shared/decorators/ordenate.decorator'; +import { Pagination } from '../shared/decorators/paginate.decorator'; +// import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; +import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; +import { CreateValorMetricaDto } from './dto/create-valorMetrica-dto'; +import { ValorMetrica } from './entities/valorMetrica.entity'; + +@Injectable() +export class ValorMetricaService { + constructor( + @InjectRepository(ValorMetrica) + private readonly _repository: Repository, + ) { } + + async create(body: CreateValorMetricaDto): Promise { + const valorMetrica = new ValorMetrica(body); + return this._repository.save(valorMetrica); + } + + async findOne(id: number) { + const metrica = await this._repository.findOneOrFail({ where: { id } }); + return metrica; + } + + async findAll( + // filter: IRotinaFilter, + ordering: Ordering, + paging: Pagination, + ): Promise> { + const limit = paging.limit; + const offset = paging.offset; + const sort = ordering.column; + const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; + // const where = this.buildWhereClause(filter); + + const [result, total] = await this._repository + .createQueryBuilder('valorMetrica') + // .where(`${where}`) + .limit(limit) + .offset(offset) + .orderBy(`"${sort}"`, order) + .getManyAndCount(); + + return { + data: result, + count: +total, + pageSize: +total, + }; + } + + // private buildWhereClause(filter: IRotinaFilter): string { + // let whereClause = '1 = 1 '; + + // whereClause += getWhereClauseNumber(filter.id, 'id'); + // whereClause += getWhereClauseNumber(filter.idIdoso, '"idIdoso"'); + // whereClause += this.getWhereClauseDate(filter.dataHora); + + // return whereClause; + // } + + // private getWhereClauseDate(value: string | undefined): string { + // if (!value || value.length < 1) return ''; + + // const date = new Date(value); + // const weekday = date.getDay(); + + // const start = new Date(value); + // start.setUTCHours(0, 0, 0); + // const startString = start.toISOString(); + + // const end = new Date(value); + // end.setUTCHours(23, 59, 59); + // const endString = end.toISOString(); + + // return ` AND (("dataHora"::date BETWEEN '${startString}'::date AND '${endString}'::date) OR ("dias" && '{${weekday}}'::rotina_dias_enum[]))`; + // } + + async remove(id: number) { + const found = await this._repository.findOneOrFail({ where: { id } }); + return this._repository.remove(found); + } +} \ No newline at end of file From 23786e421f53364cf4a7c510bc8bc8950bdf941a Mon Sep 17 00:00:00 2001 From: Thefast777 <221021984@aluno.unb.br> Date: Mon, 4 Dec 2023 21:43:36 -0300 Subject: [PATCH 03/15] (#116) remove migration duplicada Co-authored-by: Lucas Martins --- .../1701553301515-CreateTableMetrica.ts | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/migration/1701553301515-CreateTableMetrica.ts diff --git a/src/migration/1701553301515-CreateTableMetrica.ts b/src/migration/1701553301515-CreateTableMetrica.ts deleted file mode 100644 index 81c4a77..0000000 --- a/src/migration/1701553301515-CreateTableMetrica.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class CreateTableMetrica1701553301515 implements MigrationInterface { - name = 'CreateTableMetrica1701553301515' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "metrica" ("id" SERIAL NOT NULL, "categoria" "public"."metrica_categoria_enum" NOT NULL, "idIdoso" integer, CONSTRAINT "PK_37eda6d5162b9305738916e1712" PRIMARY KEY ("id"))`); - await queryRunner.query(`ALTER TABLE "metrica" ADD CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726" FOREIGN KEY ("idIdoso") REFERENCES "idoso"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "metrica" DROP CONSTRAINT "FK_574d03daab9657eaa6cc7d5d726"`); - await queryRunner.query(`DROP TABLE "metrica"`); - } - -} From 178715fbbfa34cca805d29f2238633cb2a9f4c9d Mon Sep 17 00:00:00 2001 From: Thefast777 <221021984@aluno.unb.br> Date: Tue, 5 Dec 2023 14:33:40 -0300 Subject: [PATCH 04/15] (#116) cria filter metricas do idoso Co-authored-by: Lucas Martins --- .../interfaces/metrica-filter.interface.ts | 3 + src/metrica/metrica.controller.ts | 98 ++++++------ src/metrica/metrica.service.ts | 148 ++++++++---------- 3 files changed, 122 insertions(+), 127 deletions(-) create mode 100644 src/metrica/interfaces/metrica-filter.interface.ts diff --git a/src/metrica/interfaces/metrica-filter.interface.ts b/src/metrica/interfaces/metrica-filter.interface.ts new file mode 100644 index 0000000..e54b987 --- /dev/null +++ b/src/metrica/interfaces/metrica-filter.interface.ts @@ -0,0 +1,3 @@ +export interface IMetricaFilter { + idIdoso?: number; +} diff --git a/src/metrica/metrica.controller.ts b/src/metrica/metrica.controller.ts index 3a0e937..09c842e 100644 --- a/src/metrica/metrica.controller.ts +++ b/src/metrica/metrica.controller.ts @@ -1,50 +1,60 @@ -import { Body, Controller, Get, Param, Patch, Post, Delete } from "@nestjs/common"; -import { MetricaService } from "./metrica.service"; +import { + Body, + Controller, + Get, + Param, + Patch, + Post, + Delete, +} from '@nestjs/common'; +import { MetricaService } from './metrica.service'; import { Response } from '../shared/interceptors/data-transform.interceptor'; -import { Paginate, Pagination } from "../shared/decorators/paginate.decorator"; -import { Ordenate, Ordering } from "../shared/decorators/ordenate.decorator"; -import { ResponsePaginate } from "../shared/interfaces/response-paginate.interface"; -import { Metrica } from "./entities/metrica.entity"; -import { IdValidator } from "../shared/validators/id.validator"; -import { UpdateMetricaDto } from "./dto/update-metrica-dto"; -import { HttpResponse } from "../shared/classes/http-response"; -import { CreateMetricaDto } from "./dto/create-metrica-dto"; -import { PublicRoute } from "../shared/decorators/public-route.decorator"; +import { Paginate, Pagination } from '../shared/decorators/paginate.decorator'; +import { Ordenate, Ordering } from '../shared/decorators/ordenate.decorator'; +import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; +import { Metrica } from './entities/metrica.entity'; +import { IdValidator } from '../shared/validators/id.validator'; +import { UpdateMetricaDto } from './dto/update-metrica-dto'; +import { HttpResponse } from '../shared/classes/http-response'; +import { CreateMetricaDto } from './dto/create-metrica-dto'; +import { PublicRoute } from '../shared/decorators/public-route.decorator'; +import { Filtering, Filtrate } from '../shared/decorators/filtrate.decorator'; +import { IMetricaFilter } from './interfaces/metrica-filter.interface'; @Controller('metrica') export class MetricaController { - constructor(private readonly _service: MetricaService) { } + constructor(private readonly _service: MetricaService) {} - @Get() - @PublicRoute() - async findAll( - // @Filtrate() queryParam: Filtering, - @Paginate() pagination: Pagination, - @Ordenate() ordering: Ordering, - ): Promise> { - return this._service.findAll(ordering, pagination); - } - @Get(':id') - async findOne(@Param() param: IdValidator): Promise { - return this._service.findOne(param.id); - } - @Patch(':id') - async update( - @Param() param: IdValidator, - @Body() body: UpdateMetricaDto, - ): Promise> { - const updated = await this._service.update(param.id, body); - return new HttpResponse(updated).onUpdated(); - } - @Post() - async create(@Body() body: CreateMetricaDto) { - const created = await this._service.create(body); - return new HttpResponse(created).onCreated(); - } + @Get() + @PublicRoute() + async findAll( + @Filtrate() queryParam: Filtering, + @Paginate() pagination: Pagination, + @Ordenate() ordering: Ordering, + ): Promise> { + return this._service.findAll(queryParam.filter, ordering, pagination); + } + @Get(':id') + async findOne(@Param() param: IdValidator): Promise { + return this._service.findOne(param.id); + } + @Patch(':id') + async update( + @Param() param: IdValidator, + @Body() body: UpdateMetricaDto, + ): Promise> { + const updated = await this._service.update(param.id, body); + return new HttpResponse(updated).onUpdated(); + } + @Post() + async create(@Body() body: CreateMetricaDto) { + const created = await this._service.create(body); + return new HttpResponse(created).onCreated(); + } - @Delete(':id') - async remove(@Param() param: IdValidator): Promise> { - const deleted = await this._service.remove(param.id); - return new HttpResponse(deleted).onDeleted(); - } -} \ No newline at end of file + @Delete(':id') + async remove(@Param() param: IdValidator): Promise> { + const deleted = await this._service.remove(param.id); + return new HttpResponse(deleted).onDeleted(); + } +} diff --git a/src/metrica/metrica.service.ts b/src/metrica/metrica.service.ts index 46d451b..871912d 100644 --- a/src/metrica/metrica.service.ts +++ b/src/metrica/metrica.service.ts @@ -3,93 +3,75 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Ordering } from '../shared/decorators/ordenate.decorator'; import { Pagination } from '../shared/decorators/paginate.decorator'; -// import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; +import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; import { CreateMetricaDto } from './dto/create-metrica-dto'; import { Metrica } from './entities/metrica.entity'; import { UpdateMetricaDto } from './dto/update-metrica-dto'; +import { IMetricaFilter } from './interfaces/metrica-filter.interface'; @Injectable() export class MetricaService { - constructor( - @InjectRepository(Metrica) - private readonly _repository: Repository, - ) { } - - async create(body: CreateMetricaDto): Promise { - const metrica = new Metrica(body); - return this._repository.save(metrica); - } - - async findOne(id: number) { - const metrica = await this._repository.findOneOrFail({ where: { id } }); - return metrica; - } - - async update(id: number, body: UpdateMetricaDto): Promise { - const found = await this.findOne(id); - const merged = Object.assign(found, body); - - const updated = await this._repository.save(merged); - - return updated; - } - - async findAll( - // filter: IRotinaFilter, - ordering: Ordering, - paging: Pagination, - ): Promise> { - const limit = paging.limit; - const offset = paging.offset; - const sort = ordering.column; - const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; - // const where = this.buildWhereClause(filter); - - const [result, total] = await this._repository - .createQueryBuilder('metrica') - // .where(`${where}`) - .limit(limit) - .offset(offset) - .orderBy(`"${sort}"`, order) - .getManyAndCount(); - - return { - data: result, - count: +total, - pageSize: +total, - }; - } - - // private buildWhereClause(filter: IRotinaFilter): string { - // let whereClause = '1 = 1 '; - - // whereClause += getWhereClauseNumber(filter.id, 'id'); - // whereClause += getWhereClauseNumber(filter.idIdoso, '"idIdoso"'); - // whereClause += this.getWhereClauseDate(filter.dataHora); - - // return whereClause; - // } - - // private getWhereClauseDate(value: string | undefined): string { - // if (!value || value.length < 1) return ''; - - // const date = new Date(value); - // const weekday = date.getDay(); - - // const start = new Date(value); - // start.setUTCHours(0, 0, 0); - // const startString = start.toISOString(); - - // const end = new Date(value); - // end.setUTCHours(23, 59, 59); - // const endString = end.toISOString(); - - // return ` AND (("dataHora"::date BETWEEN '${startString}'::date AND '${endString}'::date) OR ("dias" && '{${weekday}}'::rotina_dias_enum[]))`; - // } - - async remove(id: number) { - const found = await this._repository.findOneOrFail({ where: { id } }); - return this._repository.remove(found); - } -} \ No newline at end of file + constructor( + @InjectRepository(Metrica) + private readonly _repository: Repository, + ) {} + + async create(body: CreateMetricaDto): Promise { + const metrica = new Metrica(body); + return this._repository.save(metrica); + } + + async findOne(id: number) { + const metrica = await this._repository.findOneOrFail({ where: { id } }); + return metrica; + } + + async update(id: number, body: UpdateMetricaDto): Promise { + const found = await this.findOne(id); + const merged = Object.assign(found, body); + + const updated = await this._repository.save(merged); + + return updated; + } + + async findAll( + filter: IMetricaFilter, + ordering: Ordering, + paging: Pagination, + ): Promise> { + const limit = paging.limit; + const offset = paging.offset; + const sort = ordering.column; + const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; + const where = this.buildWhereClause(filter); + + const [result, total] = await this._repository + .createQueryBuilder('metrica') + .where(`${where}`) + .limit(limit) + .offset(offset) + .orderBy(`"${sort}"`, order) + .getManyAndCount(); + + return { + data: result, + count: +total, + pageSize: +total, + }; + } + + private buildWhereClause(filter: IMetricaFilter): string { + let whereClause = '1 = 1 '; + + whereClause += getWhereClauseNumber(filter.idIdoso, '"idIdoso"'); + + return whereClause; + } + + async remove(id: number) { + const found = await this._repository.findOneOrFail({ where: { id } }); + return this._repository.remove(found); + } +} From 63274840d6a2d74ac6a1479185207a5dac5c3283 Mon Sep 17 00:00:00 2001 From: Thefast777 <221021984@aluno.unb.br> Date: Thu, 7 Dec 2023 01:01:47 -0300 Subject: [PATCH 05/15] (#116) cria teste para o metrica.controller Co-authored-by: Lucas Martins --- src/metrica/metrica.controller.spec.ts | 132 +++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/metrica/metrica.controller.spec.ts diff --git a/src/metrica/metrica.controller.spec.ts b/src/metrica/metrica.controller.spec.ts new file mode 100644 index 0000000..dbe7735 --- /dev/null +++ b/src/metrica/metrica.controller.spec.ts @@ -0,0 +1,132 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MetricaService } from './metrica.service'; +import { MetricaController } from './metrica.controller'; +import { ECategoriaMetrica } from './classes/tipo-metrica.enum'; +import { Metrica } from './entities/metrica.entity'; +import { IMetricaFilter } from './interfaces/metrica-filter.interface'; +import { + Pagination, + PaginationParams, +} from '../shared/decorators/paginate.decorator'; +import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Filtering } from '../shared/decorators/filtrate.decorator'; + +describe('MetricaController', () => { + let controller: MetricaController; + let service: MetricaService; + + const metricaDto = { + idIdoso: 1, + categoria: ECategoriaMetrica.FREQUENCIA_CARDIACA, + }; + + const metrica = { + ...metricaDto, + id: 1, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [MetricaController], + providers: [ + { + provide: MetricaService, + useValue: { + create: jest.fn(), + findOne: jest.fn(), + remove: jest.fn(), + update: jest.fn(), + findAll: jest.fn(), + }, + }, + { + provide: getRepositoryToken(Metrica), + useValue: {}, + }, + ], + }).compile(); + + controller = module.get(MetricaController); + service = module.get(MetricaService); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should create IMetrica', async () => { + jest + .spyOn(service, 'create') + .mockReturnValue(Promise.resolve(metrica as Metrica)); + + const response = await controller.create(metricaDto); + expect(response.data).toEqual(metrica); + expect(response.message).toEqual('Salvo com sucesso!'); + }); + + it('should find IMetrica', async () => { + jest + .spyOn(service, 'findOne') + .mockReturnValue(Promise.resolve(metrica as Metrica)); + + const response = await controller.findOne({ id: 1 }); + expect(response).toEqual(metrica); + }); + + it('should remove IMetrica', async () => { + jest + .spyOn(service, 'remove') + .mockReturnValue(Promise.resolve(metrica as Metrica)); + + const response = await controller.remove({ id: 1 }); + expect(response.data).toEqual(metrica); + expect(response.message).toEqual('Excluído com sucesso!'); + }); + + it('should update IMetrica', async () => { + jest + .spyOn(service, 'update') + .mockReturnValue(Promise.resolve(metrica as Metrica)); + + const response = await controller.update({ id: 1 }, { idIdoso: 2 }); + expect(response.data).toEqual(metrica); + expect(response.message).toEqual('Atualizado com sucesso!'); + }); + + describe('findAll', () => { + const filter: IMetricaFilter = { + idIdoso: 1, + }; + const filtering = new Filtering(JSON.stringify(filter)); + + const order: OrderParams = { + column: 'id', + dir: 'ASC', + }; + const ordering: Ordering = new Ordering(JSON.stringify(order)); + + const paginate: PaginationParams = { + limit: 10, + offset: 0, + }; + const pagination: Pagination = new Pagination(paginate); + + it('should findAll Rotina', async () => { + const expected = { data: [metrica], count: 1, pageSize: 1 }; + + jest.spyOn(service, 'findAll').mockReturnValue(Promise.resolve(expected)); + + const { data, count, pageSize } = await controller.findAll( + filtering as any, + pagination, + ordering, + ); + + expect(count).toEqual(1); + expect(pageSize).toEqual(1); + expect(data).toEqual([metrica]); + }); + }); +}); From 688588a014d918e2006fcd66467c0b89fc83319b Mon Sep 17 00:00:00 2001 From: martinsglucas Date: Thu, 7 Dec 2023 14:04:09 -0300 Subject: [PATCH 06/15] (#116) adiciona filtro da ValorMetrica --- .../valorMetrica-filter.interface.ts | 3 + src/valorMetrica/valorMetrica.controller.ts | 72 +++++------ src/valorMetrica/valorMetrica.service.ts | 112 ++++++++---------- 3 files changed, 87 insertions(+), 100 deletions(-) create mode 100644 src/valorMetrica/interfaces/valorMetrica-filter.interface.ts diff --git a/src/valorMetrica/interfaces/valorMetrica-filter.interface.ts b/src/valorMetrica/interfaces/valorMetrica-filter.interface.ts new file mode 100644 index 0000000..048bf42 --- /dev/null +++ b/src/valorMetrica/interfaces/valorMetrica-filter.interface.ts @@ -0,0 +1,3 @@ +export interface IValorMetricaFilter { + idMetrica?: number; +} diff --git a/src/valorMetrica/valorMetrica.controller.ts b/src/valorMetrica/valorMetrica.controller.ts index b641ead..b28ff9c 100644 --- a/src/valorMetrica/valorMetrica.controller.ts +++ b/src/valorMetrica/valorMetrica.controller.ts @@ -1,41 +1,43 @@ -import { Body, Controller, Delete, Get, Param, Post } from "@nestjs/common"; -import { ValorMetricaService } from "./valorMetrica.service"; +import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; +import { HttpResponse } from '../shared/classes/http-response'; +import { Filtering, Filtrate } from '../shared/decorators/filtrate.decorator'; +import { Ordenate, Ordering } from '../shared/decorators/ordenate.decorator'; +import { Paginate, Pagination } from '../shared/decorators/paginate.decorator'; +import { PublicRoute } from '../shared/decorators/public-route.decorator'; import { Response } from '../shared/interceptors/data-transform.interceptor'; -import { PublicRoute } from "../shared/decorators/public-route.decorator"; -import { Paginate, Pagination } from "../shared/decorators/paginate.decorator"; -import { Ordenate, Ordering } from "../shared/decorators/ordenate.decorator"; -import { ResponsePaginate } from "../shared/interfaces/response-paginate.interface"; -import { ValorMetrica } from "./entities/valorMetrica.entity"; -import { IdValidator } from "../shared/validators/id.validator"; -import { CreateValorMetricaDto } from "./dto/create-valorMetrica-dto"; -import { HttpResponse } from "../shared/classes/http-response"; +import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; +import { IdValidator } from '../shared/validators/id.validator'; +import { CreateValorMetricaDto } from './dto/create-valorMetrica-dto'; +import { ValorMetrica } from './entities/valorMetrica.entity'; +import { IValorMetricaFilter } from './interfaces/valorMetrica-filter.interface'; +import { ValorMetricaService } from './valorMetrica.service'; @Controller('valorMetrica') export class ValorMetricaController { - constructor(private readonly _service: ValorMetricaService) { } + constructor(private readonly _service: ValorMetricaService) { } - @Get() - @PublicRoute() - async findAll( - // @Filtrate() queryParam: Filtering, - @Paginate() pagination: Pagination, - @Ordenate() ordering: Ordering, - ): Promise> { - return this._service.findAll(ordering, pagination); - } - @Get(':id') - async findOne(@Param() param: IdValidator): Promise { - return this._service.findOne(param.id); - } - @Post() - async create(@Body() body: CreateValorMetricaDto) { - const created = await this._service.create(body); - return new HttpResponse(created).onCreated(); - } + @Get() + @PublicRoute() + async findAll( + @Filtrate() queryParam: Filtering, + @Paginate() pagination: Pagination, + @Ordenate() ordering: Ordering, + ): Promise> { + return this._service.findAll(queryParam.filter, ordering, pagination); + } + @Get(':id') + async findOne(@Param() param: IdValidator): Promise { + return this._service.findOne(param.id); + } + @Post() + async create(@Body() body: CreateValorMetricaDto) { + const created = await this._service.create(body); + return new HttpResponse(created).onCreated(); + } - @Delete(':id') - async remove(@Param() param: IdValidator): Promise> { - const deleted = await this._service.remove(param.id); - return new HttpResponse(deleted).onDeleted(); - } -} \ No newline at end of file + @Delete(':id') + async remove(@Param() param: IdValidator): Promise> { + const deleted = await this._service.remove(param.id); + return new HttpResponse(deleted).onDeleted(); + } +} diff --git a/src/valorMetrica/valorMetrica.service.ts b/src/valorMetrica/valorMetrica.service.ts index cd2a690..ae86c0b 100644 --- a/src/valorMetrica/valorMetrica.service.ts +++ b/src/valorMetrica/valorMetrica.service.ts @@ -3,83 +3,65 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Ordering } from '../shared/decorators/ordenate.decorator'; import { Pagination } from '../shared/decorators/paginate.decorator'; -// import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; +import { getWhereClauseNumber } from '../shared/helpers/sql-query-helper'; import { ResponsePaginate } from '../shared/interfaces/response-paginate.interface'; import { CreateValorMetricaDto } from './dto/create-valorMetrica-dto'; import { ValorMetrica } from './entities/valorMetrica.entity'; +import { IValorMetricaFilter } from './interfaces/valorMetrica-filter.interface'; @Injectable() export class ValorMetricaService { - constructor( - @InjectRepository(ValorMetrica) - private readonly _repository: Repository, - ) { } + constructor( + @InjectRepository(ValorMetrica) + private readonly _repository: Repository, + ) { } - async create(body: CreateValorMetricaDto): Promise { - const valorMetrica = new ValorMetrica(body); - return this._repository.save(valorMetrica); - } + async create(body: CreateValorMetricaDto): Promise { + const valorMetrica = new ValorMetrica(body); + return this._repository.save(valorMetrica); + } - async findOne(id: number) { - const metrica = await this._repository.findOneOrFail({ where: { id } }); - return metrica; - } + async findOne(id: number) { + const metrica = await this._repository.findOneOrFail({ where: { id } }); + return metrica; + } - async findAll( - // filter: IRotinaFilter, - ordering: Ordering, - paging: Pagination, - ): Promise> { - const limit = paging.limit; - const offset = paging.offset; - const sort = ordering.column; - const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; - // const where = this.buildWhereClause(filter); + async findAll( + filter: IValorMetricaFilter, + ordering: Ordering, + paging: Pagination, + ): Promise> { + const limit = paging.limit; + const offset = paging.offset; + const sort = ordering.column; + const order = ordering.dir.toUpperCase() as 'ASC' | 'DESC'; + const where = this.buildWhereClause(filter); - const [result, total] = await this._repository - .createQueryBuilder('valorMetrica') - // .where(`${where}`) - .limit(limit) - .offset(offset) - .orderBy(`"${sort}"`, order) - .getManyAndCount(); + const [result, total] = await this._repository + .createQueryBuilder('valorMetrica') + .where(`${where}`) + .limit(limit) + .offset(offset) + .orderBy(`"${sort}"`, order) + .getManyAndCount(); - return { - data: result, - count: +total, - pageSize: +total, - }; - } + return { + data: result, + count: +total, + pageSize: +total, + }; + } - // private buildWhereClause(filter: IRotinaFilter): string { - // let whereClause = '1 = 1 '; + private buildWhereClause(filter: IValorMetricaFilter): string { + let whereClause = '1 = 1 '; - // whereClause += getWhereClauseNumber(filter.id, 'id'); - // whereClause += getWhereClauseNumber(filter.idIdoso, '"idIdoso"'); - // whereClause += this.getWhereClauseDate(filter.dataHora); + whereClause += getWhereClauseNumber(filter.idMetrica, 'idMetrica'); - // return whereClause; - // } + return whereClause; + } - // private getWhereClauseDate(value: string | undefined): string { - // if (!value || value.length < 1) return ''; - - // const date = new Date(value); - // const weekday = date.getDay(); - - // const start = new Date(value); - // start.setUTCHours(0, 0, 0); - // const startString = start.toISOString(); - - // const end = new Date(value); - // end.setUTCHours(23, 59, 59); - // const endString = end.toISOString(); - - // return ` AND (("dataHora"::date BETWEEN '${startString}'::date AND '${endString}'::date) OR ("dias" && '{${weekday}}'::rotina_dias_enum[]))`; - // } - - async remove(id: number) { - const found = await this._repository.findOneOrFail({ where: { id } }); - return this._repository.remove(found); - } -} \ No newline at end of file + async remove(id: number) { + const found = await this._repository.findOneOrFail({ where: { id } }); + return this._repository.remove(found); + } +} From 939d39439be59ac7f7848ad0b493f9c9e2688baa Mon Sep 17 00:00:00 2001 From: martinsglucas Date: Thu, 7 Dec 2023 14:08:56 -0300 Subject: [PATCH 07/15] (#116) adiciona teste da controller valorMetrica --- .../valorMetrica.controller.spec.ts | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/valorMetrica/valorMetrica.controller.spec.ts diff --git a/src/valorMetrica/valorMetrica.controller.spec.ts b/src/valorMetrica/valorMetrica.controller.spec.ts new file mode 100644 index 0000000..25134e6 --- /dev/null +++ b/src/valorMetrica/valorMetrica.controller.spec.ts @@ -0,0 +1,119 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Filtering } from '../shared/decorators/filtrate.decorator'; +import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; +import { Pagination, PaginationParams } from '../shared/decorators/paginate.decorator'; +import { ValorMetrica } from './entities/valorMetrica.entity'; +import { IValorMetricaFilter } from './interfaces/valorMetrica-filter.interface'; +import { ValorMetricaController } from './valorMetrica.controller'; +import { ValorMetricaService } from './valorMetrica.service'; + +describe("ValorMetricaController", () => { + let controller: ValorMetricaController; + let service: ValorMetricaService; + + const valorMetricaDto = { + idMetrica: 1, + valor: 10, + dataHora: new Date().toISOString() as any, + } + + const valorMetrica = { + ...valorMetricaDto, + id: 1 + } + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [ValorMetricaController], + providers: [ + { + provide: ValorMetricaService, + useValue: { + create: jest.fn(), + findOne: jest.fn(), + remove: jest.fn(), + update: jest.fn(), + findAll: jest.fn(), + }, + }, + { + provide: getRepositoryToken(ValorMetrica), + useValue: {}, + }, + ], + }).compile(); + + controller = module.get(ValorMetricaController); + service = module.get(ValorMetricaService); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should create ValorMetrica', async () => { + jest + .spyOn(service, 'create') + .mockReturnValue(Promise.resolve(valorMetrica as ValorMetrica)); + + const response = await controller.create(valorMetricaDto); + expect(response.data).toEqual(valorMetrica); + expect(response.message).toEqual('Salvo com sucesso!'); + }); + + it('should find ValorMetrica', async () => { + jest + .spyOn(service, 'findOne') + .mockReturnValue(Promise.resolve(valorMetrica as ValorMetrica)); + + const response = await controller.findOne({ id: 1 }); + expect(response).toEqual(valorMetrica); + }); + + it('should remove ValorMetrica', async () => { + jest + .spyOn(service, 'remove') + .mockReturnValue(Promise.resolve(valorMetrica as ValorMetrica)); + + const response = await controller.remove({ id: 1 }); + expect(response.data).toEqual(valorMetrica); + expect(response.message).toEqual('Excluído com sucesso!'); + }); + + describe('findAll', () => { + const filter: IValorMetricaFilter = { + idMetrica: 1, + }; + const filtering = new Filtering(JSON.stringify(filter)); + + const order: OrderParams = { + column: 'id', + dir: 'ASC', + }; + const ordering: Ordering = new Ordering(JSON.stringify(order)); + + const paginate: PaginationParams = { + limit: 10, + offset: 0, + }; + const pagination: Pagination = new Pagination(paginate); + + it('should findAll Idoso', async () => { + const expected = { data: [valorMetrica], count: 1, pageSize: 1 }; + + jest.spyOn(service, 'findAll').mockReturnValue(Promise.resolve(expected)); + + const { data, count, pageSize } = await controller.findAll( + filtering, + pagination, + ordering, + ); + + expect(count).toEqual(1); + expect(pageSize).toEqual(1); + expect(data).toEqual([valorMetrica]); + }); + }); +}) \ No newline at end of file From 12687efbe83325001eb2bfe7cfff844f9b8c0160 Mon Sep 17 00:00:00 2001 From: melohugo Date: Thu, 7 Dec 2023 21:07:18 -0300 Subject: [PATCH 08/15] (#116) Adiciona teste valorMetria.service Co-authored-by: JulioR2022 <221022041@aluno.unb.br> Co-authored-by: Guilherme Silva <221021984@aluno.unb.br> Co-authored-by: Lucas Martins --- src/metrica/metrica.controller.spec.ts | 18 +-- src/valorMetrica/valorMetrica.service.spec.ts | 132 ++++++++++++++++++ 2 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 src/valorMetrica/valorMetrica.service.spec.ts diff --git a/src/metrica/metrica.controller.spec.ts b/src/metrica/metrica.controller.spec.ts index dbe7735..09f0dcf 100644 --- a/src/metrica/metrica.controller.spec.ts +++ b/src/metrica/metrica.controller.spec.ts @@ -1,16 +1,16 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { MetricaService } from './metrica.service'; -import { MetricaController } from './metrica.controller'; -import { ECategoriaMetrica } from './classes/tipo-metrica.enum'; -import { Metrica } from './entities/metrica.entity'; -import { IMetricaFilter } from './interfaces/metrica-filter.interface'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Filtering } from '../shared/decorators/filtrate.decorator'; +import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; import { Pagination, PaginationParams, } from '../shared/decorators/paginate.decorator'; -import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; -import { getRepositoryToken } from '@nestjs/typeorm'; -import { Filtering } from '../shared/decorators/filtrate.decorator'; +import { ECategoriaMetrica } from './classes/tipo-metrica.enum'; +import { Metrica } from './entities/metrica.entity'; +import { IMetricaFilter } from './interfaces/metrica-filter.interface'; +import { MetricaController } from './metrica.controller'; +import { MetricaService } from './metrica.service'; describe('MetricaController', () => { let controller: MetricaController; @@ -113,7 +113,7 @@ describe('MetricaController', () => { }; const pagination: Pagination = new Pagination(paginate); - it('should findAll Rotina', async () => { + it('should findAll Metrica', async () => { const expected = { data: [metrica], count: 1, pageSize: 1 }; jest.spyOn(service, 'findAll').mockReturnValue(Promise.resolve(expected)); diff --git a/src/valorMetrica/valorMetrica.service.spec.ts b/src/valorMetrica/valorMetrica.service.spec.ts new file mode 100644 index 0000000..8340f72 --- /dev/null +++ b/src/valorMetrica/valorMetrica.service.spec.ts @@ -0,0 +1,132 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { Filtering } from '../shared/decorators/filtrate.decorator'; +import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; +import { + Pagination, + PaginationParams, +} from '../shared/decorators/paginate.decorator'; +import { ValorMetrica } from './entities/valorMetrica.entity'; +import { IValorMetricaFilter } from './interfaces/valorMetrica-filter.interface'; +import { ValorMetricaService } from './valorMetrica.service'; + +describe('ValorMetricaService', () => { + let service: ValorMetricaService; + let repository: Repository; + + const mockRepository = { + save: jest.fn(), + findOneOrFail: jest.fn(), + remove: jest.fn(), + findOne: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + where: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + offset: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + getManyAndCount: jest.fn(), + })), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: getRepositoryToken(ValorMetrica), + useValue: mockRepository, + }, + ValorMetricaService, + ], + }).compile(); + + service = module.get(ValorMetricaService); + repository = module.get>(getRepositoryToken(ValorMetrica)); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('should create ValorMetrica', async () => { + const valorMetrica = { idMetrica: 1 } as any; + jest.spyOn(repository, 'save').mockReturnValue({ id: 1 } as any); + const created = await service.create(valorMetrica); + expect(created.id).toEqual(1); + }); + + it('should find ValorMetrica', async () => { + jest.spyOn(repository, 'findOneOrFail').mockReturnValue({ id: 1 } as any); + + const found = await service.findOne(1); + expect(found.id).toEqual(1); + }); + + it('should remove ValorMetrica', async () => { + jest.spyOn(repository, 'findOneOrFail').mockReturnValue({ id: 1 } as any); + jest.spyOn(repository, 'remove').mockReturnValue({ id: 1 } as any); + + const removed = await service.remove(1); + expect(removed.id).toEqual(1); + }); + + // it('should update ValorMetrica', async () => { + // jest.spyOn(repository, 'findOneOrFail').mockReturnValue({ id: 1 } as any); + // jest + // .spyOn(repository, 'save') + // .mockReturnValue({ id: 1, idMetrica: 1} as any); + + // const found = await service.update(1, { idMetrica: 2 }); + // expect(found).toEqual({ id: 1, idMetrica : 2 }); + // }); + + describe('findAll', () => { + const valorMetrica = { + id: 1, + idMetrica: 1, + }; + + const order: OrderParams = { + column: 'id', + dir: 'ASC', + }; + const ordering: Ordering = new Ordering(JSON.stringify(order)); + + const paginate: PaginationParams = { + limit: 10, + offset: 0, + }; + const pagination: Pagination = new Pagination(paginate); + + const filter: IValorMetricaFilter = { + idMetrica: 1, + }; + const filtering = new Filtering(JSON.stringify(filter)); + + it('should findAll ValorMetrica', async () => { + jest.spyOn(repository, 'createQueryBuilder').mockReturnValue({ + where: () => ({ + limit: () => ({ + offset: () => ({ + orderBy: () => ({ + getManyAndCount: jest.fn().mockResolvedValueOnce([[valorMetrica], 1]), + }), + }), + }), + }), + } as any); + + const { data, count } = await service.findAll( + filtering as any, + ordering, + pagination, + ); + expect(count).toEqual(1); + expect((data as ValorMetrica[])[0]).toEqual(valorMetrica); + + const res = await service.findAll({}, ordering, pagination); + expect(res.count).toEqual(1); + expect((res.data as ValorMetrica[])[0]).toEqual(valorMetrica); + }); + }); +}); From bbe1dca28f913dba5b39a9c3dba5cd380b372d4d Mon Sep 17 00:00:00 2001 From: JulioR2022 <221022041@aluno.unb.br> Date: Thu, 7 Dec 2023 22:00:08 -0300 Subject: [PATCH 09/15] (#116) atualiza entidade valorMetrica e enum Co-authored-by: melohugo Co-authored-by: Lucas Martins Co-authored-by: gabryelns --- src/metrica/classes/tipo-metrica.enum.ts | 3 +++ .../1701996752336-AlterTableValorMetrica.ts | 24 +++++++++++++++++++ .../dto/create-valorMetrica-dto.ts | 6 ++--- .../entities/valorMetrica.entity.ts | 4 ++-- 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/migration/1701996752336-AlterTableValorMetrica.ts diff --git a/src/metrica/classes/tipo-metrica.enum.ts b/src/metrica/classes/tipo-metrica.enum.ts index f3bfe61..acc57b9 100644 --- a/src/metrica/classes/tipo-metrica.enum.ts +++ b/src/metrica/classes/tipo-metrica.enum.ts @@ -5,4 +5,7 @@ export enum ECategoriaMetrica { PESO = 'Peso', GLICEMIA = 'Glicemia', SATURACAO = 'Saturação', + HORAS_DORMIDAS = 'Horas Dormidas', + ALTURA = 'Altura', + IMC = 'IMC', } diff --git a/src/migration/1701996752336-AlterTableValorMetrica.ts b/src/migration/1701996752336-AlterTableValorMetrica.ts new file mode 100644 index 0000000..9f4205e --- /dev/null +++ b/src/migration/1701996752336-AlterTableValorMetrica.ts @@ -0,0 +1,24 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AlterTableValorMetrica1701996752336 implements MigrationInterface { + name = 'AlterTableValorMetrica1701996752336' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TYPE "public"."metrica_categoria_enum" RENAME TO "metrica_categoria_enum_old"`); + await queryRunner.query(`CREATE TYPE "public"."metrica_categoria_enum" AS ENUM('Frequência Cardíaca', 'Pressão', 'Temperatura', 'Peso', 'Glicemia', 'Saturação', 'Horas Dormidas', 'Altura', 'IMC')`); + await queryRunner.query(`ALTER TABLE "metrica" ALTER COLUMN "categoria" TYPE "public"."metrica_categoria_enum" USING "categoria"::"text"::"public"."metrica_categoria_enum"`); + await queryRunner.query(`DROP TYPE "public"."metrica_categoria_enum_old"`); + await queryRunner.query(`ALTER TABLE "valorMetrica" DROP COLUMN "valor"`); + await queryRunner.query(`ALTER TABLE "valorMetrica" ADD "valor" character varying(10) NOT NULL`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "valorMetrica" DROP COLUMN "valor"`); + await queryRunner.query(`ALTER TABLE "valorMetrica" ADD "valor" double precision NOT NULL`); + await queryRunner.query(`CREATE TYPE "public"."metrica_categoria_enum_old" AS ENUM('Frequência Cardíaca', 'Pressão', 'Temperatura', 'Peso', 'Glicemia', 'Saturação')`); + await queryRunner.query(`ALTER TABLE "metrica" ALTER COLUMN "categoria" TYPE "public"."metrica_categoria_enum_old" USING "categoria"::"text"::"public"."metrica_categoria_enum_old"`); + await queryRunner.query(`DROP TYPE "public"."metrica_categoria_enum"`); + await queryRunner.query(`ALTER TYPE "public"."metrica_categoria_enum_old" RENAME TO "metrica_categoria_enum"`); + } + +} diff --git a/src/valorMetrica/dto/create-valorMetrica-dto.ts b/src/valorMetrica/dto/create-valorMetrica-dto.ts index ee6e663..f49189d 100644 --- a/src/valorMetrica/dto/create-valorMetrica-dto.ts +++ b/src/valorMetrica/dto/create-valorMetrica-dto.ts @@ -1,4 +1,4 @@ -import { IsDateString, IsNotEmpty, IsNumber } from "class-validator"; +import { IsDateString, IsNotEmpty, IsNumber, IsString } from "class-validator"; export class CreateValorMetricaDto { @@ -7,8 +7,8 @@ export class CreateValorMetricaDto { idMetrica!: number; @IsNotEmpty() - @IsNumber() - valor!: number; + @IsString() + valor!: string; @IsDateString() @IsNotEmpty() diff --git a/src/valorMetrica/entities/valorMetrica.entity.ts b/src/valorMetrica/entities/valorMetrica.entity.ts index 4b233cb..ef10908 100644 --- a/src/valorMetrica/entities/valorMetrica.entity.ts +++ b/src/valorMetrica/entities/valorMetrica.entity.ts @@ -12,8 +12,8 @@ export class ValorMetrica { @JoinColumn({ name: 'idMetrica' }) idMetrica!: number; - @Column('float') - valor!: number; + @Column('varchar', {length: 10}) + valor!: string; @Column('timestamp') dataHora!: Date; From 04c6e538edd8cd8d2771962a4a841d7f7286e63e Mon Sep 17 00:00:00 2001 From: JulioR2022 <221022041@aluno.unb.br> Date: Thu, 7 Dec 2023 22:02:36 -0300 Subject: [PATCH 10/15] (#116) corrige teste valorMetrica.controller Co-authored-by: melohugo Co-authored-by: Guilherme Silva <221021984@aluno.unb.br> Co-authored-by: Lucas Martins Co-authored-by: gabryelns --- src/valorMetrica/valorMetrica.controller.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/valorMetrica/valorMetrica.controller.spec.ts b/src/valorMetrica/valorMetrica.controller.spec.ts index 25134e6..b3f4a49 100644 --- a/src/valorMetrica/valorMetrica.controller.spec.ts +++ b/src/valorMetrica/valorMetrica.controller.spec.ts @@ -14,7 +14,7 @@ describe("ValorMetricaController", () => { const valorMetricaDto = { idMetrica: 1, - valor: 10, + valor: "10", dataHora: new Date().toISOString() as any, } From 1bc79acbc71f5123344f2476f559162910cdbf1c Mon Sep 17 00:00:00 2001 From: JulioR2022 <221022041@aluno.unb.br> Date: Thu, 7 Dec 2023 22:11:14 -0300 Subject: [PATCH 11/15] (#116) corrige filter valorMetrica.service Co-authored-by: Lucas Martins Co-authored-by: melohugo Co-authored-by: Guilherme Silva <221021984@aluno.unb.br> Co-authored-by: gabryelns --- src/valorMetrica/valorMetrica.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/valorMetrica/valorMetrica.service.ts b/src/valorMetrica/valorMetrica.service.ts index ae86c0b..640e377 100644 --- a/src/valorMetrica/valorMetrica.service.ts +++ b/src/valorMetrica/valorMetrica.service.ts @@ -55,7 +55,7 @@ export class ValorMetricaService { private buildWhereClause(filter: IValorMetricaFilter): string { let whereClause = '1 = 1 '; - whereClause += getWhereClauseNumber(filter.idMetrica, 'idMetrica'); + whereClause += getWhereClauseNumber(filter.idMetrica, '"idMetrica"'); return whereClause; } From f786f4ed402d95598f8a7500ebc7331d6acea0fe Mon Sep 17 00:00:00 2001 From: gabryelns Date: Fri, 8 Dec 2023 00:30:22 -0300 Subject: [PATCH 12/15] (#116) adiciona teste a metrica.service Co-authored-by: JulioR2022 <221022041@aluno.unb.br> --- src/metrica/metrica.service.spec.ts | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/metrica/metrica.service.spec.ts diff --git a/src/metrica/metrica.service.spec.ts b/src/metrica/metrica.service.spec.ts new file mode 100644 index 0000000..56587ca --- /dev/null +++ b/src/metrica/metrica.service.spec.ts @@ -0,0 +1,80 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { MetricaService } from './metrica.service'; +import { Metrica } from './entities/metrica.entity'; +import { CreateMetricaDto } from './dto/create-metrica-dto'; +import { UpdateMetricaDto } from './dto/update-metrica-dto'; +import { ECategoriaMetrica } from './classes/tipo-metrica.enum'; + + +describe('MetricaService', () => { + let service: MetricaService; + let repository: Repository; + + const metricatest: CreateMetricaDto = { + idIdoso: 2, + categoria: ECategoriaMetrica.TEMPERATURA, + }; + + const mockRepository = { + save: jest.fn(), + findOneOrFail: jest.fn(), + remove: jest.fn(), + findOne: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + where: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + offset: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + getManyAndCount: jest.fn(), + })), + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: getRepositoryToken(Metrica), + useValue: mockRepository, + }, + MetricaService, + ], + }).compile(); + + service = module.get(MetricaService); + repository = module.get>(getRepositoryToken(Metrica)); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('create', () => { + it('criacao metrica', async () => { + const createMetricaDto: CreateMetricaDto = metricatest; + const metrica = new Metrica(createMetricaDto); + + jest.spyOn(repository, 'save').mockResolvedValue(metrica); + + const result = await service.create(createMetricaDto); + + expect(result).toEqual(metrica); + expect(repository.save).toHaveBeenCalledWith(metrica); + }); + }); +describe('findOne', () => { + it('should find a metrica by id', async () => { + const id = 1; + const metrica = new Metrica(metricatest); + + jest.spyOn(repository, 'findOneOrFail').mockResolvedValue(metrica); + + const result = await service.findOne(id); + + expect(result).toEqual(metrica); + expect(repository.findOneOrFail).toHaveBeenCalledWith({ where: { id } }); + }); + }); + +}); \ No newline at end of file From 612e45d0560c443eba212e6d46d262268634035e Mon Sep 17 00:00:00 2001 From: gabryelns Date: Fri, 8 Dec 2023 00:35:07 -0300 Subject: [PATCH 13/15] (#116) aumenta cobertura de teste metrica.service --- src/metrica/metrica.service.spec.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/metrica/metrica.service.spec.ts b/src/metrica/metrica.service.spec.ts index 56587ca..66db7f3 100644 --- a/src/metrica/metrica.service.spec.ts +++ b/src/metrica/metrica.service.spec.ts @@ -63,6 +63,7 @@ describe('MetricaService', () => { expect(repository.save).toHaveBeenCalledWith(metrica); }); }); + describe('findOne', () => { it('should find a metrica by id', async () => { const id = 1; @@ -77,4 +78,24 @@ describe('findOne', () => { }); }); + describe('update', () => { + it('should update a metrica by id', async () => { + const id = 1; + const updateMetricaDto: UpdateMetricaDto = { + idIdoso: 3, + categoria: ECategoriaMetrica.PRESSAO_SANGUINEA, + }; + const metrica = new Metrica(metricatest); + + jest.spyOn(service, 'findOne').mockResolvedValue(metrica); + jest.spyOn(repository, 'save').mockResolvedValue(metrica); + + const result = await service.update(id, updateMetricaDto); + + expect(result).toEqual(metrica); + expect(service.findOne).toHaveBeenCalledWith(id); + expect(repository.save).toHaveBeenCalledWith(expect.objectContaining(updateMetricaDto)); + }); + }); + }); \ No newline at end of file From 58f9eab30464455ba901478e5c260de2642dfb82 Mon Sep 17 00:00:00 2001 From: gabryelns Date: Fri, 8 Dec 2023 01:00:47 -0300 Subject: [PATCH 14/15] (#116) atinge cobertura maxima metrica.service Co-authored-by: JulioR2022 <221022041@aluno.unb.br> --- src/metrica/metrica.service.spec.ts | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/metrica/metrica.service.spec.ts b/src/metrica/metrica.service.spec.ts index 66db7f3..5e949b6 100644 --- a/src/metrica/metrica.service.spec.ts +++ b/src/metrica/metrica.service.spec.ts @@ -6,6 +6,10 @@ import { Metrica } from './entities/metrica.entity'; import { CreateMetricaDto } from './dto/create-metrica-dto'; import { UpdateMetricaDto } from './dto/update-metrica-dto'; import { ECategoriaMetrica } from './classes/tipo-metrica.enum'; +import { OrderParams, Ordering } from '../shared/decorators/ordenate.decorator'; +import { Pagination, PaginationParams } from '../shared/decorators/paginate.decorator'; +import { IMetricaFilter } from './interfaces/metrica-filter.interface'; +import { Filtering } from '../shared/decorators/filtrate.decorator'; describe('MetricaService', () => { @@ -62,6 +66,7 @@ describe('MetricaService', () => { expect(result).toEqual(metrica); expect(repository.save).toHaveBeenCalledWith(metrica); }); + }); describe('findOne', () => { @@ -76,6 +81,7 @@ describe('findOne', () => { expect(result).toEqual(metrica); expect(repository.findOneOrFail).toHaveBeenCalledWith({ where: { id } }); }); + }); describe('update', () => { @@ -96,6 +102,70 @@ describe('findOne', () => { expect(service.findOne).toHaveBeenCalledWith(id); expect(repository.save).toHaveBeenCalledWith(expect.objectContaining(updateMetricaDto)); }); + + }); + + it('should remove Metrica', async () => { + jest.spyOn(repository, 'findOneOrFail').mockReturnValue({ id: 1 } as any); + jest.spyOn(repository, 'remove').mockReturnValue({ id: 1 } as any); + + const removed = await service.remove(1); + expect(removed.id).toEqual(1); +}); + +describe('findAll', () => { + const Metrica = { + id: 1, + idMetrica: 1, + }; + + const order: OrderParams = { + column: 'id', + dir: 'ASC', + }; + + const ordering: Ordering = new Ordering(JSON.stringify(order)); + + const paginate: PaginationParams = { + limit: 10, + offset: 0, + }; + + const pagination: Pagination = new Pagination(paginate); + + const filter: IMetricaFilter = { + idIdoso: 1, + }; + + const filtering = new Filtering(JSON.stringify(filter)); + + it('should findAll Metrica', async () => { + jest.spyOn(repository, 'createQueryBuilder').mockReturnValue({ + where: () => ({ + limit: () => ({ + offset: () => ({ + orderBy: () => ({ + getManyAndCount: jest.fn().mockResolvedValueOnce([[Metrica], 1]), + }), + }), + }), + }), + } as any); + + const { data, count } = await service.findAll( + filtering as any, + ordering, + pagination, + ); + expect(count).toEqual(1); + expect((data as Metrica[])[0]).toEqual(Metrica); + + const res = await service.findAll({}, ordering, pagination); + expect(res.count).toEqual(1); + expect((res.data as Metrica[])[0]).toEqual(Metrica); }); +}); + + }); \ No newline at end of file From bc2a0a8c0f116932102c09e8f36e82dcee52d6b1 Mon Sep 17 00:00:00 2001 From: Pedro Cella Date: Sun, 10 Dec 2023 19:16:21 -0300 Subject: [PATCH 15/15] (#116) Corrige app.module --- src/app.module.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 5933ef4..d6415cb 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,8 +9,8 @@ import { DbModule } from './config/db/db.module'; import { DbService } from './config/db/db.service'; import { CronModule } from './cron/cron.module'; import { IdosoModule } from './idoso/idoso.module'; -import { RotinaModule } from './rotina/rotina.module'; import { MetricaModule } from './metrica/metrica.module'; +import { RotinaModule } from './rotina/rotina.module'; import { ValorMetricaModule } from './valorMetrica/valorMetrica.module'; const ENV = process.env.NODE_ENV; @@ -44,7 +44,7 @@ const ENV = process.env.NODE_ENV; IdosoModule, RotinaModule, MetricaModule, - ValorMetricaModule + ValorMetricaModule, CronModule, ], controllers: [], @@ -55,4 +55,4 @@ const ENV = process.env.NODE_ENV; }, ], }) -export class AppModule { } +export class AppModule {}