Skip to content

Commit 81caf40

Browse files
committed
feat(admin): implement complete administrative module with RBAC and observability
- implement administrative dashboard with operational metrics - add consolidated healthcheck and Prometheus metrics endpoints - implement user management (list, search, block/unblock, password reset and role management) - implement scraper management with manual trigger and reprocessing - add audit log migration and administrative action tracking - integrate audit logs into dashboard, observability and scraper operations - implement role-based access control (support, admin and super_admin) - split administrative routes into support, admin and super_admin scopes - register administrative routes in the application - export audit schema and update dashboard repository - include user role in authenticated session for RBAC validation - update authentication tests for new session contract - ensure TypeScript compilation and unit tests pass
1 parent 73ec96f commit 81caf40

92 files changed

Lines changed: 4432 additions & 485 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.cspell/custom-dictionary-workspace.txt

Lines changed: 135 additions & 0 deletions
Large diffs are not rendered by default.

BACKEND.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,46 +89,46 @@ Cache & Indexes:
8989

9090
## Endpoints principais
9191

92-
Base: `/api`
92+
Base: `/`
9393

9494
- Sistema
95-
- `GET /api/health` — verifica disponibilidade (retorna `{ ok: true }`).
95+
- `GET /health` — verifica disponibilidade (retorna `{ ok: true }`).
9696
- `GET /docs` — UI do Swagger (quando habilitado).
9797

9898
- Auth / OAuth
99-
- `GET /api/auth/:provider/url` — retorna URL de autenticação (ex: `google`, `github`, `linkedin`).
100-
- `GET /api/auth/:provider/callback` — callback OAuth — processa código/state e cria sessão.
99+
- `GET /auth/:provider/url` — retorna URL de autenticação (ex: `google`, `github`, `linkedin`).
100+
- `GET /auth/:provider/callback` — callback OAuth — processa código/state e cria sessão.
101101

102102
- Credenciais (email/senha)
103-
- `POST /api/auth/register` — registra usuário (cria `users`, `credentials`, `userPreferences`) e inicia sessão.
104-
- `POST /api/auth/login` — autentica e inicia sessão.
105-
- `POST /api/auth/logout` — destroi sessão.
106-
- `GET /api/auth/me` — retorna id do usuário autenticado.
103+
- `POST /auth/register` — registra usuário (cria `users`, `credentials`, `userPreferences`) e inicia sessão.
104+
- `POST /auth/login` — autentica e inicia sessão.
105+
- `POST /auth/logout` — destroi sessão.
106+
- `GET /auth/me` — retorna id do usuário autenticado.
107107

108108
- Usuários
109-
- `GET /api/users/profile` — retorna perfil do usuário autenticado.
110-
- `PATCH /api/users/profile` — atualiza campos do perfil.
111-
- `GET /api/users/preferences` — obtém preferências do usuário.
112-
- `POST /api/users/preferences` — cria preferências (caso não existam).
113-
- `PATCH /api/users/preferences` — atualiza preferências.
109+
- `GET /users/profile` — retorna perfil do usuário autenticado.
110+
- `PATCH /users/profile` — atualiza campos do perfil.
111+
- `GET /users/preferences` — obtém preferências do usuário.
112+
- `POST /users/preferences` — cria preferências (caso não existam).
113+
- `PATCH /users/preferences` — atualiza preferências.
114114

115115
- Jobs
116-
- `GET /api/jobs/search?keywords=...` — busca vagas utilizando índices/Valkey/Redis. Retorna paginação e fonte (`source`).
116+
- `GET /jobs/search?keywords=...` — busca vagas utilizando índices/Valkey/Redis. Retorna paginação e fonte (`source`).
117117

118118
- Keywords
119-
- `GET /api/keywords` — lista keywords persistidas no banco.
120-
- `POST /api/keywords` — enfileira uma keyword para processamento pelo serviço Go (retorna 202).
119+
- `GET /keywords` — lista keywords persistidas no banco.
120+
- `POST /keywords` — enfileira uma keyword para processamento pelo serviço Go (retorna 202).
121121

122122
- Vagas salvas (Saved Jobs)
123-
- `GET /api/saved-jobs` — lista vagas salvas do usuário.
124-
- `GET /api/saved-jobs/:id` — obtém vaga salva por id.
125-
- `POST /api/saved-jobs` — cria nova vaga salva.
126-
- `PATCH /api/saved-jobs/:id` — atualiza vaga salva.
127-
- `DELETE /api/saved-jobs/:id` — remove vaga salva.
123+
- `GET /saved-jobs` — lista vagas salvas do usuário.
124+
- `GET /saved-jobs/:id` — obtém vaga salva por id.
125+
- `POST /saved-jobs` — cria nova vaga salva.
126+
- `PATCH /saved-jobs/:id` — atualiza vaga salva.
127+
- `DELETE /saved-jobs/:id` — remove vaga salva.
128128

129129
Observações de segurança nas rotas:
130130

131-
- Rotas sob `/api/users`, `/api/jobs`, `/api/keywords` e `/api/saved-jobs` usam `withSession` + `requireAuth` (quando aplicável).
131+
- Rotas sob `/users`, `/jobs`, `/keywords` e `/saved-jobs` usam `withSession` + `requireAuth` (quando aplicável).
132132
- `auth` usa `withSession` para armazenar OAuth state e criar sessão.
133133

134134
## Variáveis de ambiente importantes

README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -149,45 +149,45 @@ Os comandos abaixo existem hoje no repositório e foram conferidos nos package.j
149149

150150
## API backend (estado atual)
151151

152-
Base: /api
152+
Base: /
153153

154154
Sistema:
155155

156-
- GET /api/health
156+
- GET /health
157157

158158
Autenticação:
159159

160-
- GET /api/auth/:provider/url
161-
- GET /api/auth/:provider/callback
162-
- POST /api/auth/register
163-
- POST /api/auth/login
164-
- POST /api/auth/logout
165-
- GET /api/auth/me
160+
- GET /auth/:provider/url
161+
- GET /auth/:provider/callback
162+
- POST /auth/register
163+
- POST /auth/login
164+
- POST /auth/logout
165+
- GET /auth/me
166166

167167
Usuários:
168168

169-
- GET /api/users/profile
170-
- PATCH /api/users/profile
171-
- GET /api/users/preferences
172-
- POST /api/users/preferences
173-
- PATCH /api/users/preferences
169+
- GET /users/profile
170+
- PATCH /users/profile
171+
- GET /users/preferences
172+
- POST /users/preferences
173+
- PATCH /users/preferences
174174

175175
Jobs:
176176

177-
- GET /api/jobs/search
177+
- GET /jobs/search
178178

179179
Keywords:
180180

181-
- GET /api/keywords
182-
- POST /api/keywords
181+
- GET /keywords
182+
- POST /keywords
183183

184184
Saved jobs:
185185

186-
- GET /api/saved-jobs
187-
- GET /api/saved-jobs/:id
188-
- POST /api/saved-jobs
189-
- PATCH /api/saved-jobs/:id
190-
- DELETE /api/saved-jobs/:id
186+
- GET /saved-jobs
187+
- GET /saved-jobs/:id
188+
- POST /saved-jobs
189+
- PATCH /saved-jobs/:id
190+
- DELETE /saved-jobs/:id
191191

192192
Swagger:
193193

TESTING.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,21 @@ Validar o comportamento real da aplicacao no estado atual do codigo, cobrindo fr
3434

3535
### Backend implementado
3636

37-
- GET /api/health publico.
37+
- GET /health publico.
3838
- Rotas de auth:
39-
1. GET /api/auth/:provider/url
40-
2. GET /api/auth/:provider/callback
41-
3. POST /api/auth/register
42-
4. POST /api/auth/login
43-
5. POST /api/auth/logout
44-
6. GET /api/auth/me
39+
1. GET /auth/:provider/url
40+
2. GET /auth/:provider/callback
41+
3. POST /auth/register
42+
4. POST /auth/login
43+
5. POST /auth/logout
44+
6. GET /auth/me
4545
- Rotas protegidas por sessao + requireAuth:
46-
1. GET /api/jobs/search
47-
2. GET /api/keywords
48-
3. POST /api/keywords
49-
4. GET/PATCH /api/users/profile
50-
5. GET/POST/PATCH /api/users/preferences
51-
6. GET/GET:id/POST/PATCH:id/DELETE:id /api/saved-jobs
46+
1. GET /jobs/search
47+
2. GET /keywords
48+
3. POST /keywords
49+
4. GET/PATCH /users/profile
50+
5. GET/POST/PATCH /users/preferences
51+
6. GET/GET:id/POST/PATCH:id/DELETE:id /saved-jobs
5252

5353
### Diferencas reais entre frontend e backend atual
5454

backend/.env.example

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ GITHUB_CLIENT_ID=
6565
GITHUB_CLIENT_SECRET=
6666

6767
# Scraper Go service URL
68-
GO_SCRAPER_URL=http://localhost:8081
68+
GO_SCRAPER_URL=http://localhost:8081
69+
70+
71+
SCRAPER_URL=http://scraper-go:8081
72+
PROMETHEUS_URL=http://prometheus:9090

backend/Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ COPY package*.json ./
77
COPY backend/package*.json ./backend/
88

99
# Instala tudo com workspaces (tsx vem da raiz)
10+
RUN npm config set fetch-retries 5 \
11+
&& npm config set fetch-retry-factor 2 \
12+
&& npm config set fetch-retry-mintimeout 20000 \
13+
&& npm config set fetch-retry-maxtimeout 120000
1014
RUN npm ci --workspace=backend --include-workspace-root
1115

1216
# Copia o código do backend
@@ -18,4 +22,4 @@ EXPOSE 3001
1822

1923
# Roda a partir da pasta do workspace
2024
WORKDIR /app/backend
21-
CMD ["npx", "tsx", "src/server.ts"]
25+
CMD ["npx", "tsx", "src/server.ts"]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
meta {
2+
name: Update Role
3+
type: http
4+
seq: 2
5+
}
6+
7+
patch {
8+
url: {{base_url}}/admin/users/01cac0ad-01a3-4e1b-8afb-c262031956f9/role
9+
body: json
10+
auth: inherit
11+
}
12+
13+
body:json {
14+
{
15+
"role": "super_admin"
16+
}
17+
}
18+
19+
settings {
20+
encodeUrl: true
21+
timeout: 0
22+
}

backend/bruno/Admin/Users.bru

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
meta {
2+
name: Users
3+
type: http
4+
seq: 1
5+
}
6+
7+
get {
8+
url: {{base_url}}/admin/users
9+
body: json
10+
auth: none
11+
}
12+
13+
headers {
14+
Cookie: {{sessionCookie}}
15+
}
16+
17+
settings {
18+
encodeUrl: true
19+
timeout: 0
20+
}

backend/bruno/Admin/folder.bru

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
meta {
2+
name: Admin
3+
seq: 4
4+
}
5+
6+
auth {
7+
mode: inherit
8+
}

backend/bruno/Auth/Login.bru

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ post {
1212

1313
body:json {
1414
{
15-
"email":"hudsonteste@email.com",
16-
"password":"teste1234"
15+
"email":"hudsontavares@gmail.com",
16+
"password":"tavares10"
1717
}
1818
}
1919

0 commit comments

Comments
 (0)