Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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 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