From 03ffb66d52cd8970f4fa2c8935a1300b82823755 Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Wed, 9 Jul 2025 18:29:52 -0300 Subject: [PATCH 1/6] feat: add route for professor executed activities --- src/professor/dto/executed-activities.dto.ts | 16 +++++++++++ src/professor/professor.controller.ts | 14 +++++++++- src/professor/professor.service.ts | 28 ++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/professor/dto/executed-activities.dto.ts diff --git a/src/professor/dto/executed-activities.dto.ts b/src/professor/dto/executed-activities.dto.ts new file mode 100644 index 0000000..602d8b0 --- /dev/null +++ b/src/professor/dto/executed-activities.dto.ts @@ -0,0 +1,16 @@ +import { ApiTags, ApiProperty } from '@nestjs/swagger'; + +@ApiTags('ExecutedActivitiesDto') +export class ExecutedActivitiesDto { + @ApiProperty({ name: 'projects', type: Boolean }) + projects!: boolean; + + @ApiProperty({ name: 'publications', type: Boolean }) + publications!: boolean; + + @ApiProperty({ name: 'supervisions', type: Boolean }) + supervisions!: boolean; + + @ApiProperty({ name: 'patents', type: Boolean }) + patents!: boolean; +} diff --git a/src/professor/professor.controller.ts b/src/professor/professor.controller.ts index 76d9d76..78dfded 100644 --- a/src/professor/professor.controller.ts +++ b/src/professor/professor.controller.ts @@ -11,7 +11,7 @@ import { } from '@nestjs/common'; import { ApiOAuth2, ApiResponse, ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; -import { AuthenticatedUser, Roles } from 'nest-keycloak-connect'; +import { AuthenticatedUser, Public, Roles } from 'nest-keycloak-connect'; import { ProfessorPatentDto } from 'src/patents/dto/professor-patent.dto'; import { SystemRoles } from 'src/types/enums'; import { AdviseeFormatDto } from './dto/advisee-format.dto'; @@ -22,6 +22,7 @@ import { ProfessorPublicationsDto } from './dto/professor-publications.dto'; import { ProfessorTableDto } from './dto/professor-table.dto'; import { Professor } from './entities/professor.entity'; import { ProfessorService } from './professor.service'; +import { ExecutedActivitiesDto } from './dto/executed-activities.dto'; @Roles({ roles: [SystemRoles.USERS] }) @ApiTags('Professor Module') @@ -117,6 +118,17 @@ export class ProfessorController { return this.professorService.getPatents(id, lattes); } + @ApiResponse({ + status: 200, + description: 'Returns activities the professor executed.', + isArray: false, + type: ExecutedActivitiesDto, + }) + @Get('executed-activities') + getExecutedActivities(@Query() { lattes }: { lattes: string }): Promise { + return this.professorService.getExecutedActivities(lattes); + } + @ApiResponse({ status: 200, description: 'Delete professor.', diff --git a/src/professor/professor.service.ts b/src/professor/professor.service.ts index 6b2277e..e2cd3a2 100644 --- a/src/professor/professor.service.ts +++ b/src/professor/professor.service.ts @@ -98,6 +98,34 @@ export class ProfessorService { return result; } + async getExecutedActivities(lattes: string) { + const result = await AppDataSource.createQueryBuilder() + .select([ + `CASE WHEN EXISTS ( + SELECT 1 FROM "project" pr WHERE pr.professor_id = p.id + ) THEN true ELSE false END AS projects`, + + `CASE WHEN EXISTS ( + SELECT 1 FROM "conference_publication" cp WHERE cp.professor_id = p.id + ) OR EXISTS ( + SELECT 1 FROM "journal_publication" jp WHERE jp.professor_id = p.id + ) THEN true ELSE false END AS publications`, + + `CASE WHEN EXISTS ( + SELECT 1 FROM "advisee" a WHERE a.professor_id = p.id + ) THEN true ELSE false END AS supervisions`, + + `CASE WHEN EXISTS ( + SELECT 1 FROM "patent" pt WHERE pt.professor_id = p.id + ) THEN true ELSE false END AS patents`, + ]) + .from('professor', 'p') + .where('p.identifier = :identifier', { identifier: lattes }) + .getRawOne(); + + return result; + } + update(id: number, updateProfessorDto: UpdateProfessorDto) { return `This action updates a #${id} professor`; } From 6f69cbf6023ba2678e585874ee806ebaa3e08c53 Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Fri, 22 Aug 2025 11:16:20 -0300 Subject: [PATCH 2/6] feat: get professor supervisions route --- src/main.ts | 2 +- src/professor/professor.controller.ts | 19 ++++++++++++++++++- src/professor/professor.service.ts | 10 ++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index b161e97..d48f647 100644 --- a/src/main.ts +++ b/src/main.ts @@ -55,7 +55,7 @@ async function bootstrap() { await AppDataSource.initialize() .then(() => console.log('LOG [Typeorm] Success connection')) - .catch((error) => console.log(error)); + .catch(error => console.log(error)); const document = SwaggerModule.createDocument(app, config); diff --git a/src/professor/professor.controller.ts b/src/professor/professor.controller.ts index 78dfded..4d0debf 100644 --- a/src/professor/professor.controller.ts +++ b/src/professor/professor.controller.ts @@ -11,7 +11,7 @@ import { } from '@nestjs/common'; import { ApiOAuth2, ApiResponse, ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; -import { AuthenticatedUser, Public, Roles } from 'nest-keycloak-connect'; +import { AuthenticatedUser, Roles } from 'nest-keycloak-connect'; import { ProfessorPatentDto } from 'src/patents/dto/professor-patent.dto'; import { SystemRoles } from 'src/types/enums'; import { AdviseeFormatDto } from './dto/advisee-format.dto'; @@ -96,6 +96,23 @@ export class ProfessorController { return this.professorService.getStudents(filter, id, lattes); } + @ApiResponse({ + status: 200, + description: 'Returns professor supervisions.', + isArray: true, + type: AdviseeFormatDto, + }) + @Get('professor-supervisions') + getProfessorSupervisions( + @Query('lattes', new ValidationPipe({ transform: true })) lattes: string, + ): Promise { + if (!lattes) { + throw new Error('Lattes precisa ser informado.'); + } + + return this.professorService.getProfessorSupervisions(lattes); + } + @ApiResponse({ status: 200, description: 'Returns professor projects.', diff --git a/src/professor/professor.service.ts b/src/professor/professor.service.ts index e2cd3a2..82f2a4b 100644 --- a/src/professor/professor.service.ts +++ b/src/professor/professor.service.ts @@ -126,6 +126,16 @@ export class ProfessorService { return result; } + async getProfessorSupervisions(lattes: string) { + const result = await AppDataSource.getRepository(Advisee) + .createQueryBuilder('a') + .innerJoin('a.professor', 'p') + .where('p.identifier = :identifier', { identifier: lattes }) + .getMany(); + + return result; + } + update(id: number, updateProfessorDto: UpdateProfessorDto) { return `This action updates a #${id} professor`; } From fef5d7517f3ad4b6664e75d8dc91deb37d04d73d Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Mon, 25 Aug 2025 16:03:41 -0300 Subject: [PATCH 3/6] fix: remove unnecessary use of type/interface in getExecutedActivities. --- src/professor/professor.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/professor/professor.controller.ts b/src/professor/professor.controller.ts index 4d0debf..9b8d2e6 100644 --- a/src/professor/professor.controller.ts +++ b/src/professor/professor.controller.ts @@ -142,7 +142,7 @@ export class ProfessorController { type: ExecutedActivitiesDto, }) @Get('executed-activities') - getExecutedActivities(@Query() { lattes }: { lattes: string }): Promise { + getExecutedActivities(@Query() lattes: string): Promise { return this.professorService.getExecutedActivities(lattes); } From 5de5b4a78b4382c0983f1187ead9e83b9f7d83a5 Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Tue, 26 Aug 2025 16:24:37 -0300 Subject: [PATCH 4/6] fix: getExecutedActivities query params fix --- src/professor/professor.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/professor/professor.controller.ts b/src/professor/professor.controller.ts index 9b8d2e6..ff07b1d 100644 --- a/src/professor/professor.controller.ts +++ b/src/professor/professor.controller.ts @@ -142,7 +142,7 @@ export class ProfessorController { type: ExecutedActivitiesDto, }) @Get('executed-activities') - getExecutedActivities(@Query() lattes: string): Promise { + getExecutedActivities(@Query('lattes') lattes: string): Promise { return this.professorService.getExecutedActivities(lattes); } From b2fe7b32a9cf31a9e1a059f2022c923808680f86 Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Thu, 27 Nov 2025 14:50:00 -0300 Subject: [PATCH 5/6] fix: remove redundant professor-supervisions endpoint and related professor.service methods --- src/professor/professor.controller.ts | 17 ----------------- src/professor/professor.service.ts | 10 ---------- 2 files changed, 27 deletions(-) diff --git a/src/professor/professor.controller.ts b/src/professor/professor.controller.ts index ff07b1d..fd0895f 100644 --- a/src/professor/professor.controller.ts +++ b/src/professor/professor.controller.ts @@ -96,23 +96,6 @@ export class ProfessorController { return this.professorService.getStudents(filter, id, lattes); } - @ApiResponse({ - status: 200, - description: 'Returns professor supervisions.', - isArray: true, - type: AdviseeFormatDto, - }) - @Get('professor-supervisions') - getProfessorSupervisions( - @Query('lattes', new ValidationPipe({ transform: true })) lattes: string, - ): Promise { - if (!lattes) { - throw new Error('Lattes precisa ser informado.'); - } - - return this.professorService.getProfessorSupervisions(lattes); - } - @ApiResponse({ status: 200, description: 'Returns professor projects.', diff --git a/src/professor/professor.service.ts b/src/professor/professor.service.ts index 82f2a4b..e2cd3a2 100644 --- a/src/professor/professor.service.ts +++ b/src/professor/professor.service.ts @@ -126,16 +126,6 @@ export class ProfessorService { return result; } - async getProfessorSupervisions(lattes: string) { - const result = await AppDataSource.getRepository(Advisee) - .createQueryBuilder('a') - .innerJoin('a.professor', 'p') - .where('p.identifier = :identifier', { identifier: lattes }) - .getMany(); - - return result; - } - update(id: number, updateProfessorDto: UpdateProfessorDto) { return `This action updates a #${id} professor`; } From e1020f106b254e06f15bb0c0f1549c5d82f4ac1a Mon Sep 17 00:00:00 2001 From: Antonio Marcelo Date: Fri, 19 Dec 2025 18:58:54 -0300 Subject: [PATCH 6/6] feat: throw error when executed activities query result is undefined --- src/import-xml/import-xml.service.ts | 4 ++-- src/professor/professor.service.ts | 6 +++++- xmls/7188784344595649.xml | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 xmls/7188784344595649.xml diff --git a/src/import-xml/import-xml.service.ts b/src/import-xml/import-xml.service.ts index ecba7fc..1e91aec 100644 --- a/src/import-xml/import-xml.service.ts +++ b/src/import-xml/import-xml.service.ts @@ -1325,7 +1325,7 @@ export class ImportXmlService { renameFile = (oldPath: string, newPath: string) => { return new Promise((resolve, reject) => { - fs.rename(oldPath, newPath, (err) => { + fs.rename(oldPath, newPath, err => { if (err) { console.error('Error occurred during file renaming:', err); reject(err); @@ -1364,7 +1364,7 @@ export class ImportXmlService { await queryRunner.release(); } - this.insertDataToDatabase(files, username).catch((err) => { + this.insertDataToDatabase(files, username).catch(err => { logErrorToDatabase(err, EntityType.XML, undefined); }); } diff --git a/src/professor/professor.service.ts b/src/professor/professor.service.ts index e2cd3a2..021a4f2 100644 --- a/src/professor/professor.service.ts +++ b/src/professor/professor.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { AppDataSource } from 'src/app.datasource'; import { Curriculum } from 'src/import-xml/curriculum.enum'; import { ProfessorPatentDto } from 'src/patents/dto/professor-patent.dto'; @@ -123,6 +123,10 @@ export class ProfessorService { .where('p.identifier = :identifier', { identifier: lattes }) .getRawOne(); + if (!result) { + throw new NotFoundException('Professor not found'); + } + return result; } diff --git a/xmls/7188784344595649.xml b/xmls/7188784344595649.xml new file mode 100644 index 0000000..ecd19ae --- /dev/null +++ b/xmls/7188784344595649.xml @@ -0,0 +1 @@ +Computação Eletrônica IInterface Homem-MáquinaComputação eletrônica IEngenharia de Software EducativoComputação Eletrônica ITrabalho Supervisionado IEngenharia de Software EducativoInterface Homem MáquinaIntrodução à computaçãoInterface Homem-MáquinaTrabalho Supervisionado ITrabalho Supervisionado IIInterface Usuário MáquinaEngenharia de Software EducativoIF681 Interface Usuário Máquina [Ciência da Computação]QF140 Introdução a Computação [Licenciatura em Química]IF681 Interface Usuário MáquinaInterface Usuário MáquinaTópios de Pesquisa III - Análise qualitativa de dados assistida por computadorComputação L1 - Introdução a computaçãoED119 - Estudo Individualizado IIIF681 - Interface Usuário MáquinaIF683 - Projeto e DesenvolvimentoIF800 - Engenharia de software educativoIF278 - Empreendedorismo em InformáticaIF681 - Interface usuário máquinaIF683 - Projeto e DesenvolvimentoIF800 - Tópicos avançados de InterfaceIn1094 - Tópicos avançados de Interface usuárioAnálise de UsabilidadeIN1146 - Modelos Teóricos em Interação Humano-ComputadorIN1146 - Modelos Teóricos em Interação Humano-ComputadorIN1146 - Modelos Teóricos em Interação Humano-ComputadorIN1146 - Modelos Teóricos em Interação Humano-ComputadorIN1146 - Modelos Teóricos em Interação Humano-ComputadorEngenharia de Software EducativoInterface Usuário MáquinaEngenharia de Software EducativoInterface Usuário MáquinaEngenharia de Software EducativoInterface Usuário MáquinaSeminários Mídias e InteraçãoEngenharia de Software EducativoInteração Humano ComputadorInterface Usuário MáquinaTópicos Avançados de interfacesIF762 Tópicos avançados de InterfaceIF681 Interface usuário máquinaIF801 Tecnologia EducacionalIF1000 Interação Humano ComputadorIF681 Interface usuário máquinaIF800 Engenharia de Software EducativoIF681-Interface Usuário MáquinaIF762-Tópicos avançados de interfaceIF997-Tópicos avançados de sistemas de informaçãoIF1000-Interação Humano ComputadorIF681-Interface Usuário MáquinaIF800-Engenharia de Software EducativoIF681-Interface usuário máquinaIF997-Tópicos avançados de sistemas de informaçãoIF691. Interface usuário máquinaIF1000. Interação Humano ComputadorIN1146. Modelos Teóricos de Interação Humano ComputadorIF681. Interação Humano ComputadorIF997. Tópicos avançados em sistemas de informação (Tecnologia Educacional)IF1000. Interação Humano ComputadorIF681. Interface Humano ComputadorIN1146. Modelos teóricos da Interação Humano ComputadorMetodologia do Ensino de Matemática IIntrodução à Educação EspecialNovas Tecnologias e Ensino à DistânciaAprendizagem Mediada por ComputadorPesquisa Qualitativa Assistida por ComputadorEstudos Orientados IPesquisa Qualitativa Assistida por ComputadorEstudos Orientados IEstudos Orientados IITeorias da Aprendizagem e Informática EducativaPesquisa Qualitativa Assistida por Computador \ No newline at end of file