Skip to content

feat: add methods to update closing date and search applications by jobId#197

Closed
LeidejanedaRosa wants to merge 5 commits into
SouJunior:mainfrom
LeidejanedaRosa:leidejane
Closed

feat: add methods to update closing date and search applications by jobId#197
LeidejanedaRosa wants to merge 5 commits into
SouJunior:mainfrom
LeidejanedaRosa:leidejane

Conversation

@LeidejanedaRosa

@LeidejanedaRosa LeidejanedaRosa commented Aug 10, 2025

Copy link
Copy Markdown

📝 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

  • Problema resolvido: Quando uma vaga era arquivada, as candidaturas relacionadas permaneciam com status "em andamento"
  • Solução: Implementação de lógica para atualizar automaticamente o status das candidaturas para "encerrada" quando a vaga é arquivada

📅 Controle de Data de Encerramento

  • Nova funcionalidade: Adição automática da data de encerramento (dateClosing) nas candidaturas
  • Comportamento:
    • Quando o status de uma candidatura é alterado para qualquer valor diferente de "em andamento", a data de encerramento é automaticamente definida
    • Quando uma vaga é arquivada, todas as candidaturas "em andamento" recebem a data atual como data de encerramento

🔍 Busca de Candidaturas por Vaga

  • Nova funcionalidade: Método findAllByJobId() para buscar todas as candidaturas relacionadas a uma vaga específica
  • Utilidade: Facilita operações em massa nas candidaturas de uma vaga

🛠️ Arquivos Modificados

Módulo de Candidaturas

  • candidacy.repository.ts:

    • ✅ Adicionado método findAllByJobId() para buscar candidaturas por ID da vaga
    • ✅ Adicionado método updateDateClosing() para atualização em massa de candidaturas
    • ✅ Implementada lógica para definir dateClosing automaticamente na mudança de status
  • candidacy.service.ts:

    • ✅ Adicionado método updateDateClosingByJobId() para atualizar candidaturas por vaga
    • ✅ Implementadas validações de entrada e tratamento de erros

Módulo de Vagas

  • jobs.module.ts:

    • ✅ Adicionada importação do CandidacyModule para permitir integração entre módulos
  • jobs.controller.ts:

    • ✅ Pequenos ajustes de formatação e correção no parâmetro do endpoint de arquivamento
  • job.repository.ts:

    • ✅ Melhorada a implementação do método updateJob() com validações mais robustas
    • ✅ Ajustes de formatação e estrutura do código
  • delete-job.service.ts:

    • Principal mudança: Integração com o serviço de candidaturas
    • ✅ Implementação da atualização automática das candidaturas quando uma vaga é arquivada
    • ✅ Adicionado tratamento de erro para operações de candidatura

🎯 Benefícios

  1. Consistência de Dados: Garante que candidaturas sejam automaticamente atualizadas quando vagas são arquivadas
  2. Rastreabilidade: Registro preciso das datas de encerramento das candidaturas
  3. Integridade do Sistema: Mantém a coerência entre o status das vagas e suas candidaturas relacionadas
  4. Experiência do Usuário: Eliminação da necessidade de atualização manual das candidaturas

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

    • Arquivar vagas agora atualiza em lote as candidaturas relacionadas: marca data de encerramento e fecha status.
    • Autenticação via JWT agora suporta login para usuários e empresas.
  • Correções e Melhorias

    • Uso de transações ao arquivar vagas para garantir integridade e atualização atômica das candidaturas.
    • Tratamento de erros aprimorado em operações de vagas e candidaturas.
  • Refactor

    • Repositório de empresas reestruturado e APIs de dados reorganizadas.
  • Tests

    • Ampliação da suíte de testes e configuração Jest para TypeScript.

@coderabbitai

coderabbitai Bot commented Aug 10, 2025

Copy link
Copy Markdown

Caution

Review failed

Failed to post review comments.

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 968be51 and e35d605.

📒 Files selected for processing (37)
  • package.json (1 hunks)
  • src/modules/auth/auth.module.ts (1 hunks)
  • src/modules/auth/jwt/jwt.strategy.ts (1 hunks)
  • src/modules/auth/services/auth-login.service.ts (1 hunks)
  • src/modules/candidacy/service/candidacy.service.spec.ts (1 hunks)
  • src/modules/company/company.module.ts (2 hunks)
  • src/modules/company/repository/company-repository.ts (0 hunks)
  • src/modules/company/repository/company.repository.ts (1 hunks)
  • src/modules/company/services/activate-company.service.ts (1 hunks)
  • src/modules/company/services/create-company.service.ts (2 hunks)
  • src/modules/company/services/delete-company.service.ts (1 hunks)
  • src/modules/company/services/find-all-company.service.ts (1 hunks)
  • src/modules/company/services/recovery-password-by-email.service.ts (1 hunks)
  • src/modules/company/services/update-company.service.ts (2 hunks)
  • src/modules/company/services/update-password-by-email.service.ts (2 hunks)
  • src/modules/company/services/update-password.service.ts (1 hunks)
  • src/modules/jobs/jobs.module.ts (3 hunks)
  • src/modules/jobs/services/get-all-jobs-from-logged-company.service.ts (1 hunks)
  • src/modules/savedjobs/services/savedjobs.service.spec.ts (1 hunks)
  • src/modules/user/services/create-user.service.ts (2 hunks)
  • src/modules/user/user.module.ts (2 hunks)
  • test/jest-e2e.json (1 hunks)
  • test/mocks/auth/company.mock.ts (1 hunks)
  • test/mocks/auth/jwt-payload.mock.ts (1 hunks)
  • test/mocks/auth/user-login.mock.ts (1 hunks)
  • test/mocks/user/create-user.mock.ts (1 hunks)
  • test/modules/auth/auth.e2e-spec.ts (1 hunks)
  • test/modules/auth/controller/auth.controller.spec.ts (1 hunks)
  • test/modules/auth/services/auth-login.service.spec.ts (1 hunks)
  • test/modules/auth/strategy/jwt.strategy.spec.ts (1 hunks)
  • test/modules/user/services/create-user.service.spec.ts (8 hunks)
  • test/modules/user/services/delete-user.service.spec.ts (0 hunks)
  • test/modules/user/services/find-all-users.service.spec.ts (0 hunks)
  • test/modules/user/services/find-one-user.service.spec.ts (0 hunks)
  • test/modules/user/services/recovery-password-by-email.service.spec.ts (2 hunks)
  • test/modules/user/services/update-password-by-email.service.spec.ts (6 hunks)
  • test/modules/user/services/update-user.service.spec.ts (3 hunks)
💤 Files with no reviewable changes (4)
  • test/modules/user/services/find-all-users.service.spec.ts
  • test/modules/user/services/find-one-user.service.spec.ts
  • test/modules/user/services/delete-user.service.spec.ts
  • src/modules/company/repository/company-repository.ts
✅ Files skipped from review due to trivial changes (5)
  • src/modules/company/services/activate-company.service.ts
  • src/modules/company/services/find-all-company.service.ts
  • src/modules/company/services/update-password-by-email.service.ts
  • src/modules/auth/services/auth-login.service.ts
  • src/modules/company/services/create-company.service.ts
🧰 Additional context used
🧬 Code Graph Analysis (9)
test/mocks/auth/user-login.mock.ts (1)
src/modules/auth/dtos/user-login.dto.ts (1)
  • UserLoginDto (12-42)
test/modules/auth/strategy/jwt.strategy.spec.ts (3)
test/mocks/auth/jwt-payload.mock.ts (3)
  • jwtPayloadMock (1-7)
  • companyJwtPayloadMock (9-15)
  • invalidJwtPayloadMock (17-23)
test/mocks/user/user.mock.ts (1)
  • userMock (3-13)
test/mocks/auth/company.mock.ts (1)
  • companyEntityMock (36-54)
test/modules/auth/controller/auth.controller.spec.ts (3)
test/mocks/auth/user-login.mock.ts (3)
  • userLoginMock (4-10)
  • companyLoginMock (12-18)
  • invalidUserLoginMock (20-26)
test/mocks/user/user.mock.ts (1)
  • userMock (3-13)
test/mocks/auth/company.mock.ts (1)
  • companyEntityMock (36-54)
test/modules/auth/auth.e2e-spec.ts (3)
test/mocks/auth/user-login.mock.ts (3)
  • userLoginMock (4-10)
  • companyLoginMock (12-18)
  • invalidUserLoginMock (20-26)
test/mocks/user/user.mock.ts (1)
  • userMock (3-13)
test/mocks/auth/company.mock.ts (1)
  • companyMock (1-20)
test/modules/auth/services/auth-login.service.spec.ts (3)
test/mocks/auth/user-login.mock.ts (4)
  • userLoginMock (4-10)
  • userWithUnconfirmedEmailMock (28-34)
  • invalidUserLoginMock (20-26)
  • companyLoginMock (12-18)
test/mocks/user/user.mock.ts (1)
  • userMock (3-13)
test/mocks/auth/company.mock.ts (2)
  • companyMock (1-20)
  • companyWithUnconfirmedEmailMock (22-34)
src/modules/company/repository/company.repository.ts (10)
src/modules/company/services/activate-company.service.ts (1)
  • Injectable (4-22)
src/modules/company/services/find-all-company.service.ts (1)
  • Injectable (7-18)
src/modules/company/services/create-company.service.ts (1)
  • Injectable (8-67)
src/modules/company/services/update-password.service.ts (1)
  • Injectable (8-50)
src/modules/company/services/delete-company.service.ts (1)
  • Injectable (4-29)
src/modules/company/dtos/create-company.dto.ts (1)
  • CreateCompanyDto (12-68)
src/shared/utils/handle-error.util.ts (1)
  • handleError (3-14)
src/shared/pagination/pageOptions.dto.ts (1)
  • PageOptionsDto (6-42)
src/shared/pagination/page.dto.ts (1)
  • PageDto (4-14)
src/shared/pagination/pageMeta.dto.ts (1)
  • PageMetaDto (3-21)
test/modules/user/services/create-user.service.spec.ts (2)
test/mocks/user/create-user.mock.ts (1)
  • createUserMock (4-12)
test/mocks/user/user.mock.ts (1)
  • userMock (3-13)
src/modules/jobs/services/get-all-jobs-from-logged-company.service.ts (1)
src/modules/jobs/interfaces/interfaces.ts (1)
  • IJobsResponse (9-11)
test/modules/user/services/update-user.service.spec.ts (2)
test/mocks/user/user.mock.ts (2)
  • userEntityMock (28-41)
  • userMock (3-13)
test/mocks/user/user-update.mock.ts (1)
  • userUpdateMock (1-8)
🔇 Additional comments (35)
src/modules/candidacy/service/candidacy.service.spec.ts (2)

2-4: Imports atualizados — bom ajuste

O caminho relativo para o service e o import do repositório parecem corretos em relação à estrutura dos diretórios. Sem apontamentos aqui.


5-9: Atualizar mock de CandidacyRepository com os métodos usados

Adicione stub para updateDateClosing, já verificado como chamado em CandidacyService, e inclua também findAllByJobId caso o serviço passe a utilizá-lo:

 class CandidacyRepositoryMock {
   create = jest.fn();
   findOne = jest.fn();
   update = jest.fn();
+  updateDateClosing = jest.fn();    // usado em CandidacyService
+  findAllByJobId = jest.fn();       // se for chamado pelo service
 }

Opcional: limpe todos os mocks após cada teste para manter isolamento:

afterEach(() => {
  jest.clearAllMocks();
});

Por favor, confirme se o serviço realmente chama findAllByJobId e updateDateClosing para garantir que os stubs sejam obrigatórios.

src/modules/savedjobs/services/savedjobs.service.spec.ts (2)

2-2: Injeção via getRepositoryToken: escolha adequada.

Uso correto do getRepositoryToken para fornecer mocks dos repositórios do TypeORM no contexto de testes do Nest.


4-6: Importações de entidades verificadas com sucesso

As entidades SavedJobsEntity, UsersEntity e JobsEntity existem apenas em src/database/entities e são exatamente as mesmas classes injetadas em SavedJobsService. Não há múltiplas declarações/exportações nem risco de token mismatch no TypeORM.
Comentário resolvido.

test/modules/user/services/recovery-password-by-email.service.spec.ts (1)

58-60: Asserções PT-BR alinhadas com os Services
Verifiquei que em ambos os serviços—

  • src/modules/user/services/recovery-password-by-email.service.ts (linhas 20 e 38)
  • src/modules/company/services/recovery-password-by-email.service.ts (linhas 20 e 40)

a mensagem retorna exatamente a mesma string utilizada nos testes.

Sugestão opcional: extrair essa mensagem para uma constante/mocK compartilhada (por exemplo em test/mocks/password-messages.mock.ts) para evitar divergências em futuras alterações.

test/modules/user/services/update-password-by-email.service.spec.ts (2)

54-54: Mensagem de erro PT-BR: OK.

Mensagem alinhada com a nova convenção de respostas.


70-70: Mensagem de erro (senhas não conferem): OK.

Mensagem clara e em PT-BR; sem ressalvas.

src/modules/jobs/services/get-all-jobs-from-logged-company.service.ts (2)

18-23: Resposta 200 com lista vazia é adequada

Ajuste para retornar 200 com content: [] elimina o 400 indevido para ausência de registros e melhora a DX.


28-31: LGTM no payload de sucesso

Mensagem e content: jobs mantêm consistência com o caso de lista vazia.

src/modules/company/services/recovery-password-by-email.service.ts (1)

4-4: Atualização de import do CompanyRepository está correta

Caminho atualizado para ../repository/company.repository alinha com a refatoração do repositório.

src/modules/user/user.module.ts (1)

19-19: Import do CompanyRepository atualizado — OK

Reflete a nova localização do repositório.

src/modules/auth/auth.module.ts (1)

5-5: Caminhos de import corrigidos — bom ajuste

Os imports para CompanyRepository e JwtStrategy foram corrigidos para os novos caminhos. Isso evita erros de build e mantém consistência com a reorganização do repositório.

Also applies to: 8-8

src/modules/company/services/update-password.service.ts (1)

5-5: Caminho do repositório atualizado corretamente

O import passou a apontar para ../repository/company.repository. Alinha com a nova estrutura.

test/mocks/user/create-user.mock.ts (2)

9-9: Mock atualizado com confirmPassword — ok

A inclusão de confirmPassword no mock acompanha fluxos de validação mais recentes.


4-11: Compatibilidade com CreateUserDto verificada

File: test/mocks/user/create-user.mock.ts
Lines: 4–11

Snippet final do código nestas linhas

export const createUserMock = (): CreateUserDto => {
  return {
    name: 'Non-Admin for tests',
    email: 'user@teste.com',
    password: 'teste@12A',
    confirmPassword: 'teste@12A',
    type: UserRole.USER,
  };
};

Comentário

O DTO CreateUserDto possui o campo confirmPassword e não define mais os campos cpf ou policies.
O mock está em conformidade com a definição atual do DTO.

src/modules/company/company.module.ts (1)

6-6: Caminho do repositório atualizado — ok

Ajuste coerente com a renomeação do arquivo do repositório.

src/modules/company/services/update-company.service.ts (1)

5-5: Import e método do repositório atualizados — ok

O caminho e o método updateCompanyById estão alinhados com a nova API do repositório.

Also applies to: 33-33

src/modules/jobs/jobs.module.ts (2)

5-5: Import do CompanyRepository atualizado corretamente

O rename do arquivo para company.repository está refletido aqui. Nenhuma ação adicional necessária.


7-7: Integração do CandidacyModule confirmada — CandidacyService exportado e sem ciclo de dependência

Foi verificado que:

  • O CandidacyModule declara CandidacyService em providers e também o inclui em exports.
  • Não há importação recíproca: o CandidacyModule não importa o JobsModule.

Nenhuma mudança adicional é necessária.

src/modules/user/services/create-user.service.ts (1)

8-8: Import do CompanyRepository corrigido

Ajuste de path coerente com a reorganização dos repositórios. Sem impactos colaterais aparentes.

test/modules/auth/controller/auth.controller.spec.ts (1)

1-180: Boa cobertura do AuthController; cenários felizes e de erro bem exercitados

Mocks estão enxutos, verificação de chamadas ao serviço e respostas HTTP consistente. Fluxo de exceções também validado corretamente.

test/modules/auth/services/auth-login.service.spec.ts (2)

1-312: Testes abrangentes e bem estruturados para AuthLoginService

Cobrem sucesso, e-mails não confirmados, inexistência e senha inválida para usuário e empresa, além de sanitização de dados sensíveis. Uso de mocks e resets está correto.


125-139: Mensagem de erro para usuário inexistente igual a 'Email not validated' — confirme a intenção

O teste espera 'Email not validated' quando findOneByEmail retorna null. Caso a intenção seja não revelar se o e-mail existe (por segurança), faz sentido. Se a regra de negócio diferencia inexistente de não confirmado, ajuste a mensagem no serviço e nos testes.

test/mocks/auth/user-login.mock.ts (1)

1-35: Mocks de login consistentes e reutilizáveis

Factories retornam novos objetos a cada chamada, evitando mutações entre testes. Nomes claros e alinhados aos DTOs.

test/modules/auth/strategy/jwt.strategy.spec.ts (3)

33-35: Boa prática: configurar e limpar SECRET_KEY nos testes

Configurar process.env.SECRET_KEY no beforeEach e limpar no afterEach evita vazamento de estado entre testes. Está correto.

Also applies to: 57-59


81-97: Fluxo empresa quando usuário não existe: LGTM

O teste garante a ordem das consultas e a sanitização do objeto (remoção de senha) com userType: 'company'. Tudo certo.


119-157: Sanitização de campos sensíveis: LGTM

Os testes garantem a remoção de password mantendo demais campos (“secretKey”/“secretInfo”). Boa cobertura de segurança.

test/mocks/auth/company.mock.ts (1)

1-20: Mocks de empresa completos e consistentes

O mock cobre campos essenciais incluindo senha para cenários de login. Adequado para os testes.

test/modules/auth/auth.e2e-spec.ts (1)

75-118: Cobertura da rota de login está adequada

Os testes contemplam login de usuário e empresa, verificando contrato básico e chamada do serviço. Bom isolamento via DI.

test/modules/user/services/create-user.service.spec.ts (1)

63-88: Caminho “email já cadastrado” está bem verificado

Validações e asserts de não-chamada (CPF, createUser, e-mail) estão coerentes com a mudança de regra. OK.

test/modules/user/services/update-user.service.spec.ts (5)

4-4: Import do FileUploadService — OK

A adição do serviço de upload ao teste está correta e necessária para os novos cenários com arquivo.


6-6: Imports dos mocks de usuário — OK

Os mocks adicionados cobrem os cenários exercitados no teste.


77-115: Caminho feliz com arquivo — OK

Boas asserções: garante deleção da key antiga, upload do novo arquivo e persistência. Após alinhar o mock e a injeção, o cenário fica robusto.


121-134: Atualização sem arquivo — OK

Caminho sem anexos coberto e validado com sucesso.


141-146: Atualização com password no payload — OK

Mantém compatibilidade ao aceitar DTO com senha. Bom garantir que o hash seja tratado no serviço (fora do escopo deste teste).

Walkthrough

Foram 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

Cohort / File(s) Change Summary
Candidacy - repositório e serviço
src/modules/candidacy/repository/candidacy.repository.ts, src/modules/candidacy/service/candidacy.service.ts, src/modules/candidacy/service/candidacy.service.spec.ts
Adiciona findAllByJobId e updateDateClosing no repositório; updateStatus passa a definir dateClosing quando status sai de InProgress; serviço ganha updateDateClosingByJobId com validação e opção de EntityManager; testes atualizados com mock do repositório.
Jobs - controller, módulo, repositório, serviço de exclusão
src/modules/jobs/jobs.controller.ts, src/modules/jobs/jobs.module.ts, src/modules/jobs/repository/job.repository.ts, src/modules/jobs/services/delete-job.service.ts, src/modules/jobs/services/get-all-jobs-from-logged-company.service.ts
Ajustes de imports e formatação; JobsModule passa a importar CandidacyModule; JobRepository.updateJob reformulado com erros explícitos; DeleteJobService reescrito para transação via QueryRunner, injeta CandidacyService e DataSource, atualiza job e chama updateDateClosingByJobId dentro da transação; get-all ajusta resposta para lista vazia.
Company repository rename / replacement & modules/services usage
src/modules/company/repository/company-repository.ts (deleted), src/modules/company/repository/company.repository.ts (added), src/modules/company/*.service.ts, src/modules/company/company.module.ts, src/modules/auth/auth.module.ts, src/modules/user/*
Substituição do antigo arquivo do repositório por nova implementação company.repository.ts com API extensa; diversos serviços e módulos atualizam caminhos de import para o novo arquivo; pequenas renomeações de métodos (UpdateCompanyByIdupdateCompanyById).
Auth - JwtStrategy e ajustes
src/modules/auth/jwt/jwt.strategy.ts, src/modules/auth/services/auth-login.service.ts, test/modules/auth/**, test/mocks/auth/**
Nova JwtStrategy que autentica usuário ou empresa pelo email do payload JWT; ajustado import em AuthLoginService; adicionados testes unitários/e2e e mocks para cenários de login e payloads JWT.
User services: criação e atualização
src/modules/user/services/create-user.service.ts, src/modules/user/services/update-user.service.ts, src/modules/user/user.module.ts, testes relacionados (test/modules/user/services/*.spec.ts)
create-user.service atualiza imports e chamadas de verificação de email; UpdateUserService agora injeta FileUploadService e altera assinatura de execute para aceitar (user, updateDto, file); testes ajustados/removidos conforme novas assinaturas e fluxos; CreateUserService tests passam a fornecer Request.
Jest / test config and mocks
package.json, test/jest-e2e.json, test/mocks/auth/*.mock.ts, test/mocks/user/*.mock.ts, vários test/modules/**
Expansão/ajuste da configuração Jest para TS (moduleFileExtensions, transform, moduleNameMapper, preset, etc.); novos mocks para auth (company, jwt payload, user-login); múltiplos testes adicionados, removidos ou atualizados (unitários e e2e) para refletir mudanças de serviços e mensagens localizadas.
Miscellaneous - formatting & small fixes
various files (src/modules/jobs/jobs.controller.ts, several services across modules)
Remoção de imports não utilizados, correções de decorators (@Param('id')), trailing commas, reformatações, pequenas mensagens ajustadas/locale strings em testes.

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()
Loading

Estimated code review effort

🎯 4 (Complexo) | ⏱️ ~45 minutos

Suggested reviewers

  • MikaelMelo1

Poem

🐇
Fui ao campo do código brincar,
Fechei portas que precisavam fechar,
Atualizei datas pra tudo alinhar,
Serviços e repositórios a conversar.
Um pulinho, um teste a passar — e pronto, vou comemorar!

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 Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 affected do 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ção

Deixe 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';  // remover
src/modules/candidacy/service/candidacy.service.ts (1)

77-93: updateDateClosingByJobId: default de data e validação de entrada

  • Torne dateClosing opcional com default new Date().
  • Valide dateClosing quando 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

📥 Commits

Reviewing files that changed from the base of the PR and between dcee15d and 4f87bb7.

📒 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 — OK

Apenas estilização; sem mudança funcional.


70-71: Refatoração de encadeamento — OK

A alteração para múltiplas linhas melhora legibilidade sem alterar a lógica.

src/modules/jobs/jobs.module.ts (1)

26-26: CandidacyModule já exporta CandidacyService e não há ciclo com JobsModule

O arquivo src/modules/candidacy/candidacy.module.ts declara

exports: [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 — OK

Nome e ordem dos serviços coerentes.


105-107: Correção do parâmetro de rota — OK

Uso explícito de @Param('id') é o esperado.

Comment thread src/modules/candidacy/repository/candidacy.repository.ts Outdated
Comment thread src/modules/candidacy/repository/candidacy.repository.ts
Comment thread src/modules/jobs/repository/job.repository.ts
Comment thread src/modules/jobs/repository/job.repository.ts Outdated
Comment thread src/modules/jobs/services/delete-job.service.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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á arquivado

Antes 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 controlado

A resposta 500 é ok. Considere incluir um errorCode interno (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

📥 Commits

Reviewing files that changed from the base of the PR and between 4f87bb7 and baba7c8.

📒 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 úteis

Import do Logger, instância privada e logs de sucesso/erro bem posicionados. Pontos extras por incluir jobId no 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ária

Apó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 como any sem bloqueios de compilação, portanto não há obrigatoriedade de tipar error: unknown nem de normalizar imediatamente o acesso a message/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.

Comment thread src/modules/jobs/services/delete-job.service.ts
Comment thread src/modules/jobs/services/delete-job.service.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 === 0 apó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 dateClosing definido.
  • 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

📥 Commits

Reviewing files that changed from the base of the PR and between baba7c8 and 85d9339.

📒 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.manager garante 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 de affected — ótimo.

Remove acoplamento ao nome da tabela e confere robustez contra corridas.


61-66: Confirmado uso de EntityManager em updateDateClosingByJobId

Pontos 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, usa entityManager.getRepository(CandidacyEntity) quando fornecido, caso contrário this.candidacyRepository.
  • src/modules/jobs/services/delete-job.service.ts
    • Chama updateDateClosingByJobId(..., queryRunner.manager), garantindo execução na mesma transação.

Nenhuma ação adicional necessária.

Comment thread src/modules/jobs/services/delete-job.service.ts Outdated
@sonarqubecloud

Copy link
Copy Markdown

@LeidejanedaRosa LeidejanedaRosa deleted the leidejane branch August 18, 2025 17:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant