Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PORT=3000
CLERK_SECRET_KEY=
CLERK_SECRET_KEY= # solicite no discord
DB_USERNAME=postgres
DB_PASSWORD=
DB_PASSWORD= # crie a sua própria credencial
DB_NAME=postgres
DB_HOST=localhost
DB_PORT=5432
13 changes: 12 additions & 1 deletion src/aluno/aluno.controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Controller, Get, UseGuards, Req } from '@nestjs/common';
import { Controller, Get, UseGuards, Req, Body, Patch } from '@nestjs/common';
import { AuthGuard } from '../auth/auth.guard';
import { AlunoService } from './aluno.service';
import AuthenticatedRequest from '../types/authenticated-request.interface';
import { AtualizaDadosAlunoDTO } from './dto/atualizaDadosAluno';

@Controller('aluno')
export class AlunoController {
Expand All @@ -13,4 +14,14 @@ export class AlunoController {
const { id } = request.user;
return this.alunoService.findByClerkId(id);
}

@UseGuards(AuthGuard)
@Patch('/update')
async updateStudentData(
@Req() request: AuthenticatedRequest,
@Body() atualizaDadosAlunoDTO: AtualizaDadosAlunoDTO,
) {
const { id } = request.user;
return await this.alunoService.updateStudentData(id, atualizaDadosAlunoDTO);
}
}
58 changes: 58 additions & 0 deletions src/aluno/aluno.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { createClerkClient } from '@clerk/backend';
import { InjectRepository } from '@nestjs/typeorm';
import type { Repository } from 'typeorm';
import { Aluno } from '../entities/aluno/aluno.entity';
import { AtualizaDadosAlunoDTO } from './dto/atualizaDadosAluno';

@Injectable()
export class AlunoService {
Expand Down Expand Up @@ -61,4 +62,61 @@ export class AlunoService {
throw new BadRequestException('Erro ao buscar aluno');
}
}

async updateStudentData(
id: string,
atualizaDadosAlunoDTO: AtualizaDadosAlunoDTO,
) {
try {
const alunoClerk = await this.clerk.users.getUser(id);
if (!alunoClerk) {
throw new NotFoundException('Aluno não encontrado.');
}
const aluno = await this.alunoRepository.findOneBy({ id_clerk: id });
if (!aluno) {
throw new NotFoundException('Aluno não encontrado.');
}
const emailNovo = atualizaDadosAlunoDTO.email;
const emailAtual = alunoClerk.primaryEmailAddress?.emailAddress;
const novoEmailDiferente = emailNovo && emailNovo !== emailAtual;

let primaryEmailId = alunoClerk.primaryEmailAddress?.id;

if (novoEmailDiferente) {
const emailExistente = alunoClerk.emailAddresses.find(
(email) => email.emailAddress === emailNovo,
);

if (!emailExistente) {
throw new BadRequestException('Novo email não validado.');
}

primaryEmailId = emailExistente.id;
}

await this.clerk.users.updateUser(id, {
firstName: atualizaDadosAlunoDTO.nome,
lastName: atualizaDadosAlunoDTO.sobrenome,
username: `m-${atualizaDadosAlunoDTO.matricula}`,
primaryEmailAddressID: primaryEmailId,
});
Object.assign(aluno, {
pronome: atualizaDadosAlunoDTO.pronome,
data_nascimento: atualizaDadosAlunoDTO.data_nascimento,
curso: atualizaDadosAlunoDTO.curso,
campus: atualizaDadosAlunoDTO.campus,
data_ingresso: atualizaDadosAlunoDTO.data_ingresso,
celular: atualizaDadosAlunoDTO.celular,
});
await this.alunoRepository.save(aluno);

return {
success: true,
message: 'Dados do aluno atualizados com sucesso!',
};
} catch (e) {
console.log(e);
throw new BadRequestException('Erro ao atualizar os dados do aluno');
}
}
}
53 changes: 53 additions & 0 deletions src/aluno/dto/atualizaDadosAluno.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import {
IsDateString,
IsEmail,
IsEnum,
IsNumberString,
IsOptional,
IsString,
} from 'class-validator';
import { UnidadeEnum } from '../../enum/enumCampus';
import { CursosEnum } from '../../enum/enumCursos';
import { PronomesEnum } from '../../enum/enumPronomes';

export class AtualizaDadosAlunoDTO {
@IsOptional()
@IsString()
nome?: string;

@IsOptional()
@IsString()
sobrenome?: string;

@IsOptional()
@IsEmail()
email?: string;

@IsOptional()
@IsNumberString()
matricula?: string;

@IsOptional()
@IsEnum(PronomesEnum)
pronome?: PronomesEnum;

@IsOptional()
@IsDateString()
data_nascimento?: string;

@IsOptional()
@IsEnum(CursosEnum)
curso?: CursosEnum;

@IsOptional()
@IsEnum(UnidadeEnum)
campus?: UnidadeEnum;

@IsOptional()
@IsDateString()
data_ingresso?: string;

@IsOptional()
@IsString()
celular?: string;
}
6 changes: 3 additions & 3 deletions src/entities/aluno/aluno.entity.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Inscricao } from '../inscricao/inscricao.entity';
import { PronomesEnum } from 'src/enum/enumPronomes';
import { CursosEnum } from 'src/enum/enumCursos';
import { UnidadeEnum } from 'src/enum/enumCampus';
import { PronomesEnum } from '../../enum/enumPronomes';
import { CursosEnum } from '../../enum/enumCursos';
import { UnidadeEnum } from '../../enum/enumCampus';

@Entity()
export class Aluno {
Expand Down
4 changes: 2 additions & 2 deletions src/entities/documento/documento.entity.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import { Inscricao } from '../inscricao/inscricao.entity';
import { EnumTipoDocumento } from 'src/enum/enumTipoDocumento';
import { StatusDocumento } from 'src/enum/statusDocumento';
import { EnumTipoDocumento } from '../../enum/enumTipoDocumento';
import { StatusDocumento } from '../../enum/statusDocumento';

@Entity()
export class Documento {
Expand Down
4 changes: 2 additions & 2 deletions src/entities/edital/edital.entity.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Inscricao } from '../inscricao/inscricao.entity';
import { EtapaInscricao } from '../etapaInscricao/etapaInscricao.entity';
import { EditalEnum } from 'src/enum/enumEdital';
import { StatusEdital } from 'src/enum/enumStatusEdital';
import { EditalEnum } from '../../enum/enumEdital';
import { StatusEdital } from '../../enum/enumStatusEdital';

@Entity()
export class Edital {
Expand Down
2 changes: 1 addition & 1 deletion src/entities/inscricao/inscricao.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { Edital } from '../edital/edital.entity';
import { ResultadoEtapa } from '../resultadoEtapa/resultadoEtapa.entity';
import { Documento } from '../documento/documento.entity';
import { Formulario } from '../formulario/formulario.entity';
import { StatusInscricao } from 'src/enum/enumStatusInscricao';
import { StatusInscricao } from '../../enum/enumStatusInscricao';

@Entity()
export class Inscricao {
Expand Down
2 changes: 1 addition & 1 deletion src/entities/resultadoEtapa/resultadoEtapa.entity.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import { Inscricao } from '../inscricao/inscricao.entity';
import { EtapaInscricao } from '../etapaInscricao/etapaInscricao.entity';
import { StatusEtapa } from 'src/enum/enumStatusEtapa';
import { StatusEtapa } from '../../enum/enumStatusEtapa';

@Entity()
export class ResultadoEtapa {
Expand Down