Skip to content

Commit 6ec084e

Browse files
authored
Merge pull request #12 from TSIW-PROAE/feat/student-edit-profile
Feat: update student data route
2 parents 326fe7c + 797e5b6 commit 6ec084e

File tree

4 files changed

+125
-3
lines changed

4 files changed

+125
-3
lines changed

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PORT=3000
2-
CLERK_SECRET_KEY=
2+
CLERK_SECRET_KEY= # solicite no discord
33
DB_USERNAME=postgres
4-
DB_PASSWORD=
4+
DB_PASSWORD= # crie a sua própria credencial
55
DB_NAME=postgres
66
DB_HOST=localhost
77
DB_PORT=5432

src/aluno/aluno.controller.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { Controller, Get, UseGuards, Req } from '@nestjs/common';
1+
import { Controller, Get, UseGuards, Req, Body, Patch } from '@nestjs/common';
22
import { AuthGuard } from '../auth/auth.guard';
33
import { AlunoService } from './aluno.service';
44
import AuthenticatedRequest from '../types/authenticated-request.interface';
5+
import { AtualizaDadosAlunoDTO } from './dto/atualizaDadosAluno';
56

67
@Controller('aluno')
78
export class AlunoController {
@@ -13,4 +14,14 @@ export class AlunoController {
1314
const { id } = request.user;
1415
return this.alunoService.findByClerkId(id);
1516
}
17+
18+
@UseGuards(AuthGuard)
19+
@Patch('/update')
20+
async updateStudentData(
21+
@Req() request: AuthenticatedRequest,
22+
@Body() atualizaDadosAlunoDTO: AtualizaDadosAlunoDTO,
23+
) {
24+
const { id } = request.user;
25+
return this.alunoService.updateStudentData(id, atualizaDadosAlunoDTO);
26+
}
1627
}

src/aluno/aluno.service.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { createClerkClient } from '@clerk/backend';
77
import { InjectRepository } from '@nestjs/typeorm';
88
import type { Repository } from 'typeorm';
99
import { Aluno } from '../entities/aluno/aluno.entity';
10+
import { AtualizaDadosAlunoDTO } from './dto/atualizaDadosAluno';
1011

1112
@Injectable()
1213
export class AlunoService {
@@ -61,4 +62,61 @@ export class AlunoService {
6162
throw new BadRequestException('Erro ao buscar aluno');
6263
}
6364
}
65+
66+
async updateStudentData(
67+
id: string,
68+
atualizaDadosAlunoDTO: AtualizaDadosAlunoDTO,
69+
) {
70+
try {
71+
const alunoClerk = await this.clerk.users.getUser(id);
72+
if (!alunoClerk) {
73+
throw new NotFoundException('Aluno não encontrado.');
74+
}
75+
const aluno = await this.alunoRepository.findOneBy({ id_clerk: id });
76+
if (!aluno) {
77+
throw new NotFoundException('Aluno não encontrado.');
78+
}
79+
const emailNovo = atualizaDadosAlunoDTO.email;
80+
const emailAtual = alunoClerk.primaryEmailAddress?.emailAddress;
81+
const novoEmailDiferente = emailNovo && emailNovo !== emailAtual;
82+
83+
let primaryEmailId = alunoClerk.primaryEmailAddress?.id;
84+
85+
if (novoEmailDiferente) {
86+
const emailExistente = alunoClerk.emailAddresses.find(
87+
(email) => email.emailAddress === emailNovo,
88+
);
89+
90+
if (!emailExistente) {
91+
throw new BadRequestException('Novo email não validado.');
92+
}
93+
94+
primaryEmailId = emailExistente.id;
95+
}
96+
97+
await this.clerk.users.updateUser(id, {
98+
firstName: atualizaDadosAlunoDTO.nome,
99+
lastName: atualizaDadosAlunoDTO.sobrenome,
100+
username: `m-${atualizaDadosAlunoDTO.matricula}`,
101+
primaryEmailAddressID: primaryEmailId,
102+
});
103+
Object.assign(aluno, {
104+
pronome: atualizaDadosAlunoDTO.pronome,
105+
data_nascimento: atualizaDadosAlunoDTO.data_nascimento,
106+
curso: atualizaDadosAlunoDTO.curso,
107+
campus: atualizaDadosAlunoDTO.campus,
108+
data_ingresso: atualizaDadosAlunoDTO.data_ingresso,
109+
celular: atualizaDadosAlunoDTO.celular,
110+
});
111+
await this.alunoRepository.save(aluno);
112+
113+
return {
114+
success: true,
115+
message: 'Dados do aluno atualizados com sucesso!',
116+
};
117+
} catch (e) {
118+
console.log(e);
119+
throw new BadRequestException('Erro ao atualizar os dados do aluno');
120+
}
121+
}
64122
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import {
2+
IsDateString,
3+
IsEmail,
4+
IsEnum,
5+
IsNumberString,
6+
IsOptional,
7+
IsString,
8+
} from 'class-validator';
9+
import { UnidadeEnum } from '../../enum/enumCampus';
10+
import { CursosEnum } from '../../enum/enumCursos';
11+
import { PronomesEnum } from '../../enum/enumPronomes';
12+
13+
export class AtualizaDadosAlunoDTO {
14+
@IsOptional()
15+
@IsString()
16+
nome?: string;
17+
18+
@IsOptional()
19+
@IsString()
20+
sobrenome?: string;
21+
22+
@IsOptional()
23+
@IsEmail()
24+
email?: string;
25+
26+
@IsOptional()
27+
@IsNumberString()
28+
matricula?: string;
29+
30+
@IsOptional()
31+
@IsEnum(PronomesEnum)
32+
pronome?: PronomesEnum;
33+
34+
@IsOptional()
35+
@IsDateString()
36+
data_nascimento?: string;
37+
38+
@IsOptional()
39+
@IsEnum(CursosEnum)
40+
curso?: CursosEnum;
41+
42+
@IsOptional()
43+
@IsEnum(UnidadeEnum)
44+
campus?: UnidadeEnum;
45+
46+
@IsOptional()
47+
@IsDateString()
48+
data_ingresso?: string;
49+
50+
@IsOptional()
51+
@IsString()
52+
celular?: string;
53+
}

0 commit comments

Comments
 (0)