feat: add methods to update closing date and search applications by jobId#197
feat: add methods to update closing date and search applications by jobId#197LeidejanedaRosa wants to merge 5 commits into
Conversation
|
Caution Review failedFailed to post review comments. Configuration used: CodeRabbit UI 💡 Knowledge Base configuration:
You can enable these sources in your CodeRabbit configuration. 📒 Files selected for processing (37)
💤 Files with no reviewable changes (4)
✅ Files skipped from review due to trivial changes (5)
🧰 Additional context used🧬 Code Graph Analysis (9)test/mocks/auth/user-login.mock.ts (1)
test/modules/auth/strategy/jwt.strategy.spec.ts (3)
test/modules/auth/controller/auth.controller.spec.ts (3)
test/modules/auth/auth.e2e-spec.ts (3)
test/modules/auth/services/auth-login.service.spec.ts (3)
src/modules/company/repository/company.repository.ts (10)
test/modules/user/services/create-user.service.spec.ts (2)
src/modules/jobs/services/get-all-jobs-from-logged-company.service.ts (1)
test/modules/user/services/update-user.service.spec.ts (2)
🔇 Additional comments (35)
WalkthroughForam adicionados métodos para gerenciar fechamento de candidaturas por vaga e atualizado o fluxo de arquivamento de vagas para operar em transação e encerrar candidaturas relacionadas. Também foram introduzidos ajustes de formatação, renomeações/remoções de repositórios de empresa, uma nova JwtStrategy, atualizações de testes/mocks e configurações do Jest. Changes
Sequence Diagram(s)sequenceDiagram
participant Controller as JobsController
participant Service as DeleteJobService
participant QueryRunner as QueryRunner/EntityManager
participant JobRepo as JobRepository
participant CandService as CandidacyService
participant CandRepo as CandidacyRepository
Controller->>Service: archivedJob(jobId, content)
Service->>QueryRunner: startTransaction()
QueryRunner->>JobRepo: update job status -> ARCHIVED (via manager)
alt job updated (rowsAffected>0)
Service->>CandService: updateDateClosingByJobId(jobId, dateClosing, EntityManager)
CandService->>CandRepo: updateDateClosing(jobId, dateClosing, EntityManager)
CandRepo-->>CandService: void
Service->>QueryRunner: commit()
Service-->>Controller: 200 OK
else no rows affected / error
Service->>QueryRunner: rollback()
Service-->>Controller: 404 or 500
end
Service->>QueryRunner: release()
Estimated code review effort🎯 4 (Complexo) | ⏱️ ~45 minutos Suggested reviewers
Poem
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (3)
src/modules/candidacy/repository/candidacy.repository.ts (1)
88-106: Atualização em massa: visibilidade de impacto e índice recomendado
- Considere retornar/registrar
affecteddo update para observabilidade (quantas candidaturas foram impactadas).- Garanta índice composto em
(jobId, status)para esta atualização em massa.src/modules/jobs/jobs.controller.ts (1)
80-86: Evitar uso de @res direto para manter pipes/interceptores/serializaçãoDeixe o NestJS gerenciar o status/retorno quando possível. Pode simplificar sem perda de funcionalidade.
- async getAllLoggedCompanyJobs( - @LoggedCompany() company: CompaniesEntity, - @Res() res: Response, - ) { - const { status, data } = await this.getAllJobsFromLoggedCompany.execute( - company.id, - ); - return res.status(status).json(data); - } + async getAllLoggedCompanyJobs( + @LoggedCompany() company: CompaniesEntity, + ) { + return this.getAllJobsFromLoggedCompany.execute(company.id); + }E remova o import
Response(fora do trecho alterado):// import { Response } from 'express'; // removersrc/modules/candidacy/service/candidacy.service.ts (1)
77-93: updateDateClosingByJobId: default de data e validação de entrada
- Torne
dateClosingopcional com defaultnew Date().- Valide
dateClosingquando fornecida.- async updateDateClosingByJobId( - jobId: string, - dateClosing: Date, - ): Promise<void> { + async updateDateClosingByJobId( + jobId: string, + dateClosing: Date = new Date(), + ): Promise<void> { if (!jobId) { throw new BadRequestException('jobId é obrigatório'); } try { + if (!(dateClosing instanceof Date) || isNaN(dateClosing.getTime())) { + throw new BadRequestException('dateClosing inválido'); + } await this.candidacyRepository.updateDateClosing(jobId, dateClosing); } catch (error) { throw new BadRequestException( 'Erro ao atualizar dateClosing e status das candidaturas: ' + error.message, ); } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/modules/candidacy/repository/candidacy.repository.ts(2 hunks)src/modules/candidacy/service/candidacy.service.ts(1 hunks)src/modules/jobs/jobs.controller.ts(3 hunks)src/modules/jobs/jobs.module.ts(3 hunks)src/modules/jobs/repository/job.repository.ts(3 hunks)src/modules/jobs/services/delete-job.service.ts(1 hunks)
🔇 Additional comments (5)
src/modules/jobs/repository/job.repository.ts (2)
17-20: Formatação do construtor — OKApenas estilização; sem mudança funcional.
70-71: Refatoração de encadeamento — OKA alteração para múltiplas linhas melhora legibilidade sem alterar a lógica.
src/modules/jobs/jobs.module.ts (1)
26-26: CandidacyModule já exportaCandidacyServicee não há ciclo comJobsModuleO arquivo
src/modules/candidacy/candidacy.module.tsdeclaraexports: [CandidacyService]e não importa
JobsModule, portanto não há dependência cíclica.Nenhuma ação adicional é necessária.
src/modules/jobs/jobs.controller.ts (2)
49-49: Injeção do serviço — OKNome e ordem dos serviços coerentes.
105-107: Correção do parâmetro de rota — OKUso explícito de
@Param('id')é o esperado.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
src/modules/jobs/services/delete-job.service.ts (2)
19-28: Idempotência: evitar reprocessar quando já está arquivadoAntes de abrir transação, se
jobExists.status === StatusEnum.ARCHIVED, retorne 200 (ou 204) e não altere nada. Isso evita updates desnecessários e facilita chamadas repetidas do cliente.Exemplo:
- if (jobExists.status === StatusEnum.ARCHIVED) return { status: 200, data: { message: 'Job already archived' } }
64-69: Mensagem de erro genérica; considerar enriquecimento controladoA resposta 500 é ok. Considere incluir um
errorCodeinterno (por ex.JOB_ARCHIVE_FAILED) para facilitar troubleshooting no cliente sem vazar detalhes sensíveis.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
src/modules/candidacy/repository/candidacy.repository.ts(2 hunks)src/modules/jobs/repository/job.repository.ts(3 hunks)src/modules/jobs/services/delete-job.service.ts(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- src/modules/jobs/repository/job.repository.ts
- src/modules/candidacy/repository/candidacy.repository.ts
🔇 Additional comments (2)
src/modules/jobs/services/delete-job.service.ts (2)
1-2: Boa adoção do Nest Logger e mensagens de log úteisImport do Logger, instância privada e logs de sucesso/erro bem posicionados. Pontos extras por incluir
jobIdno contexto da mensagem.Also applies to: 10-10, 47-48, 58-62
55-62: Flag useUnknownInCatchVariables não está habilitada – sugestão não é necessáriaApós verificar o tsconfig.json do projeto, não encontramos
"useUnknownInCatchVariables": true. Como a flag não está ativada, o TypeScript continua tratando o erro do catch comoanysem bloqueios de compilação, portanto não há obrigatoriedade de tiparerror: unknownnem de normalizar imediatamente o acesso amessage/stack. Caso queiram adotar essa prática para reforçar a segurança do logging, podem aplicar o diff sugerido, mas não é um requisito neste momento.Likely an incorrect or invalid review comment.
…ation closing date
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/modules/jobs/services/delete-job.service.ts (3)
20-29: Reduzir roundtrip e risco de TOCTOU: remover pré-checagem com findOneById.Você já valida
affected === 0após o UPDATE. A pré-checagem gera 2 idas ao DB e ainda está sujeita a corrida. Recomendo confiar apenas no UPDATE +affected.- const jobExists = await this.jobRepository.findOneById(jobId); - - if (!jobExists) { - return { - status: 404, - data: { - message: 'Job could not be found', - }, - }; - } + // Pré-checagem removida; 404 será retornado com base em `updateResult.affected`
71-76: Resposta 200 pode incluir metadados úteis (ex.: total de candidaturas encerradas).Se o serviço de candidaturas puder retornar o número de linhas afetadas, incluir isso no payload melhora a UX e auditoria.
Exemplo:
- await this.candidacyService.updateDateClosingByJobId( + const closedCount = await this.candidacyService.updateDateClosingByJobId( jobId, currentDate, queryRunner.manager, ); ... - data: { - message: 'Job archived successfully', - }, + data: { + message: 'Job archived successfully', + closedApplications: closedCount, + },Quer que eu proponha as alterações na CandidacyService/Repository para retornar
affected?
19-77: Cobertura de testes: validar atomicidade e idempotência.Sugestões de testes (unit/e2e):
- Arquiva com sucesso: status 200, job em ARCHIVED, candidaturas “in progress” migradas para “closed” e
dateClosingdefinido.- Idempotência: segunda chamada não deve modificar nada e retornar 404 (após aplicar a condição
status != ARCHIVED).- Falha no update de candidaturas: simular exceção e garantir rollback total (job permanece não arquivado).
Posso gerar specs Jest para esses cenários.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
src/modules/candidacy/repository/candidacy.repository.ts(3 hunks)src/modules/candidacy/service/candidacy.service.ts(2 hunks)src/modules/jobs/services/delete-job.service.ts(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- src/modules/candidacy/repository/candidacy.repository.ts
- src/modules/candidacy/service/candidacy.service.ts
🔇 Additional comments (5)
src/modules/jobs/services/delete-job.service.ts (5)
31-34: Transação bem estruturada e ciclo de vida correto (start/commit/rollback/release).Uso adequado do QueryRunner: conecta, inicia transação, comita/rollback e libera no finally. Ótimo.
Also applies to: 67-68, 78-78, 93-93
1-1: Uso do Nest Logger e logs contextuais — boa melhoria.Substituição de console.error por Logger, inclusão de contexto e stack. Excelente para observabilidade.
Also applies to: 11-11, 80-84
61-66: Integração transacional com CandidacyService — ponto positivo.Passar
queryRunner.managergarante atomicidade entre arquivar a vaga e encerrar candidaturas. Boa prática aplicada.
37-42: Uso do Repository da entidade (vs. string de tabela) e checagem deaffected— ótimo.Remove acoplamento ao nome da tabela e confere robustez contra corridas.
61-66: Confirmado uso de EntityManager emupdateDateClosingByJobIdPontos verificados:
src/modules/candidacy/service/candidacy.service.ts
• Assinatura:async updateDateClosingByJobId(jobId: string, dateClosing: Date, entityManager?: EntityManager)src/modules/candidacy/repository/candidacy.repository.ts
• Dentro de métodos, usaentityManager.getRepository(CandidacyEntity)quando fornecido, caso contráriothis.candidacyRepository.src/modules/jobs/services/delete-job.service.ts
• ChamaupdateDateClosingByJobId(..., queryRunner.manager), garantindo execução na mesma transação.Nenhuma ação adicional necessária.
e35d605 to
968be51
Compare
|



📝 Descrição das Alterações
Este Pull Request implementa melhorias no sistema de candidaturas e gerenciamento de vagas, focando na atualização automática de status e datas de encerramento quando uma vaga é arquivada.
✨ Funcionalidades Implementadas
🔄 Atualização Automática de Status de Candidaturas
📅 Controle de Data de Encerramento
dateClosing) nas candidaturas🔍 Busca de Candidaturas por Vaga
findAllByJobId()para buscar todas as candidaturas relacionadas a uma vaga específica🛠️ Arquivos Modificados
Módulo de Candidaturas
candidacy.repository.ts:findAllByJobId()para buscar candidaturas por ID da vagaupdateDateClosing()para atualização em massa de candidaturasdateClosingautomaticamente na mudança de statuscandidacy.service.ts:updateDateClosingByJobId()para atualizar candidaturas por vagaMódulo de Vagas
jobs.module.ts:CandidacyModulepara permitir integração entre módulosjobs.controller.ts:job.repository.ts:updateJob()com validações mais robustasdelete-job.service.ts:🎯 Benefícios
Esta implementação resolve o problema de sincronização entre vagas arquivadas e suas candidaturas, melhorando significativamente a integridade dos dados do sistema.
Summary by CodeRabbit
Novos Recursos
Correções e Melhorias
Refactor
Tests