Skip to content

feat(project-teams): ideias de projeto, interesse em vagas e formação de times - #112

Merged
leo-nardo merged 17 commits into
mainfrom
feat/project-teams
Oct 28, 2026
Merged

leo-nardo merged 17 commits into
mainfrom
feat/project-teams

Conversation

@leo-nardo

Copy link
Copy Markdown
Contributor

Adiciona o módulo project-teams (ideias, moderação, interesse em vagas, times e membros), migration CreateProjectTeams e doc em docs/project-teams.md. Inclui commits anteriores ainda não enviados ao main. A migration já foi aplicada em produção via deploy manual.

🤖 Generated with Claude Code

leo-nardo and others added 17 commits April 19, 2026 07:01
feat: milestone 4 — missões, badges, GitHub OAuth, notificações e gamificação completa
Tracks whether a user was created during social login (Google/GitHub)
so the frontend can redirect new users to the onboarding flow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- proofUrl: 500 → 2048 (URLs can be long, especially signed storage URLs)
- description: 1000 → 2000 (matches frontend character limit)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g/profiles

- GET /missions/:id/participants returns count + usernames/status only (no proof/description)
- Exclude admin users (role=1) from ranking list (findAllWithPagination)
- Return null for admin profiles in findById and findByUsername

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tokens de Gratidão now replenish every day at midnight instead of once
per month. Monthly cron keeps resetting currentMonthlyXp only.
On startup the service replenishes tokens immediately so users with 0
balance can donate right after this deploy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TypeORM throws "Empty criteria not allowed" when using repository.update({})
with an empty object. Replaced all bulk updates with createQueryBuilder to
avoid this restriction. Also updated onModuleInit to work correctly on
startup. Daily token amount changed from 3 to 5.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Exposes GET /transactions/profile/:profileId/tokens without authentication,
returning only TOKEN_REWARD and TOKEN_TRANSFER entries for a given profile.
Enables auditability of gratitude token activity on public profiles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O merge de 146 commits do upstream (-X theirs) resolveu conflitos
descartando pedaços de código local que não conflitavam textualmente
com nada, mas dependiam de outras partes que foram sobrescritas:

- FilesService perdeu o método create() (usado no login GitHub)
- UsersService referenciava variável inexistente (existingUser) e
  perdeu a injeção de GamificationProfilesService (anonimização LGPD)
- GamificationProfile ficou com campo photo duplicado
- auditorReward sobreviveu nos DTOs mas sumiu do domain/entity/mapper
  de Activity, e a recompensa do moderador em submissions.service.ts
  continuou usando a constante fixa antiga em vez do valor por atividade
- submissions.service.ts chamava filesService.deleteFile/extractStoragePath,
  métodos que nunca existiram na versão atual de FilesService — qualquer
  rejeição/cancelamento de submissão com comprovante quebrava com 500

Corrigido restaurando as pontas que faltavam, usando a API atual do
FilesService (remove por id, com lookup por path). auditorReward de
missions.service.ts foi auditado e sobreviveu ao merge intacto.

Também reaplica trabalho local que só existia como WIP não commitado:
- Activity.requiresActivityDate / Submission.activityDate, exigindo e
  registrando a data em que a atividade foi realizada
- Notificação in-app imediata + digest diário por e-mail (6h) para
  moderadores sobre submissões pendentes
- activityDate exposto no endpoint público de submissão

A migration AddActivityDateFields já estava aplicada e registrada em
produção; só o arquivo nunca tinha sido commitado.

Corrige também um teste de events.service.spec.ts com data de início
hardcoded que virou passado (usava validação de "não pode ser no
passado" contra o relógio real) — trocado por data relativa.
…ssue"

Adiciona Activity.createsGithubIssue: quando true, a submissão passa a
exigir customTitle (título da issue), githubRepo (front ou api) e
issueCategory (bug/melhoria/duvida/outro). Ao aprovar a submissão, o
GithubIssuesService cria a issue de verdade via API REST do GitHub
(POST /repos/{owner}/{repo}/issues), atribuindo a label correspondente
à categoria, com o texto mencionando quem abriu via legado.dev. A URL
criada fica salva em Submission.githubIssueUrl.

A criação da issue é best-effort e roda depois do commit da transação
principal: se o GitHub falhar (token ausente, rate limit, etc.), a
aprovação e o XP do usuário não são afetados, só fica sem a issue —
logado para investigação manual.

Autenticação via GITHUB_BOT_TOKEN (novo campo em github.config.ts),
ainda não configurado em produção.
… de times

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…o novo

A migration roda antes de CreateNotificationsAndReports e falhava no CI e2e
(banco vazio) ao dropar índice/tabela inexistentes. Usa IF EXISTS.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
6.0% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@leo-nardo
leo-nardo merged commit aa53c01 into main Oct 28, 2026
2 of 3 checks passed
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