Skip to content

Commit 0af0efe

Browse files
authored
Develop (#109)
## Reformulação da Interface e Novas Funcionalidades (UI/UX) O ecossistema visual do projeto foi completamente recriado do zero, saindo de um design genérico para uma estética Cyberpunk/Tech Dark Mode de alta fidelidade. O foco principal foi garantir uma experiência de usuário (UX) fluida, tipografia legível e componentes altamente interativos. --- ### 1. Painel Principal (Dashboard de Vagas) A página de listagem de vagas foi otimizada para legibilidade e organização de dados em larga escala. * **Paleta de Cores e Contraste:** Uso de um fundo grafite profundo (#0B0F19) combinado com superfícies de cards levemente mais claras, criando uma hierarquia visual por elevação. * **Badges Dinâmicas:** Categorias, portais de origem (LinkedIn, etc.) e palavras-chave utilizam tags com fundos semi-transparentes e bordas coloridas atenuadas para não poluir a leitura. * **Ações Rápidas:** Botão de execução do scraper (Run Scraper) destacado no topo com a identidade visual do projeto, facilitando a atualização dos dados com um único clique. #### Dashboard Principal Reformulado ![Dashboard Principal](https://github.com/user-attachments/assets/d0bc2c45-7ab4-479c-879d-7169a70531e2) --- ### 2. Área de Time (Carrossel Interativo de Membros) Para exibir os contribuidores do projeto de forma elegante e dinâmica, foi desenvolvido um componente customizado de Carrossel de Equipe. * **Cartões de Contribuidores:** Cada card renderiza dinamicamente o avatar oficial do GitHub do usuário dentro de uma moldura circular com efeito de brilho (glow). * **Métricas do Git:** Exibição em tempo real do volume de engajamento de cada membro (ex: contagem de commits de desenvolvimento e tags de funções como QA). * **Botão de Ação "Ver Perfil":** Um botão estilizado com um gradiente moderno (do Azul Royal ao Roxo Neon) que integra o ícone oficial do GitHub, direcionando o usuário de forma externa e segura para o perfil do dev. * **Navegação Fluida:** Layout responsivo em grid deslizante que se adapta perfeitamente a telas mobile e desktops de alta resolução. #### Área do Time - Carrossel Dinâmico de Membros ![Carrossel de Equipe](https://github.com/user-attachments/assets/af964cf4-14bf-4f5e-ac47-6eb51bae8408) --- ### 3. Fluxo de Autenticação (Telas de Login e Cadastro) As páginas de acesso foram projetadas seguindo os padrões mais modernos de segurança e design de interfaces SaaS (Software as a Service). * **Estrutura Split-Screen (Tela Dividida):** * **Lado Esquerdo (Branding):** Uma seção imersiva que exibe o logotipo e a proposta de valor do projeto sobre um fundo com gradiente radial neon abstrato, reforçando a identidade de IA e automação. * **Lado Direito (Formulário):** Um formulário limpo, centralizado e focado na conversão do usuário. * **Inputs Modernos:** Campos de texto com bordas finas que se iluminam ao receber foco (focus state) e textos de ajuda em tons suaves de cinza. * **Autenticação Social (OAuth):** Botão nativo integrado para login rápido via GitHub, posicionado de forma estratégica acima do formulário tradicional para incentivar o login em um clique. * **Alternância de Fluxo:** Links sutis e bem posicionados na base ("Não tem uma conta? Cadastre-se" / "Já tem uma conta? Entre") garantem uma transição perfeita entre as telas sem quebras de estado. #### Página de Autenticação (Login) ![Tela de Login](https://github.com/user-attachments/assets/323916a2-47bf-43a4-8ea5-1577c6df9f90)
2 parents e53add6 + c067287 commit 0af0efe

47 files changed

Lines changed: 10567 additions & 9926 deletions

Some content is hidden

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

backend/package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "backend",
33
"version": "1.0.0",
4-
"description": "Backend para scraping e API de vagas do LinkedIn",
4+
"description": "Backend para o projeto <Cand!date!>",
55
"main": "index.ts",
66
"scripts": {
77
"start": "tsx src/server.ts",
@@ -31,19 +31,19 @@
3131
"axios",
3232
"cheerio"
3333
],
34-
"author": "Bene Tesla Dev",
34+
"author": "Projeto Open Source - Bene Tesla Dev",
3535
"license": "ISC",
3636
"dependencies": {
3737
"argon2": "^0.44.0",
38-
"axios": "^1.13.6",
38+
"axios": "^1.17.0",
3939
"cheerio": "^1.2.0",
4040
"cors": "^2.8.6",
41-
"dotenv": "^17.3.1",
41+
"dotenv": "^17.4.2",
4242
"express": "^5.2.1",
4343
"iron-session": "^8.0.4",
4444
"pdfkit": "^0.18.0",
4545
"redis": "^5.12.1",
46-
"swagger-jsdoc": "^6.2.8",
46+
"swagger-jsdoc": "^6.3.0",
4747
"swagger-ui-express": "^5.0.1",
4848
"xlsx": "^0.18.5",
4949
"zod": "^4.4.3"
@@ -52,13 +52,13 @@
5252
"node": ">=22.0.0"
5353
},
5454
"devDependencies": {
55-
"@types/node": "^25.6.0",
55+
"@types/node": "^25.9.1",
5656
"@types/pg": "^8.20.0",
5757
"@types/supertest": "^7.2.0",
58-
"@vitest/coverage-v8": "^3.2.4",
58+
"@vitest/coverage-v8": "^4.1.8",
5959
"nodemon": "^3.1.14",
60-
"supertest": "^7.1.4",
61-
"typescript": "^6.0.2",
62-
"vitest": "^3.2.4"
60+
"supertest": "^7.2.2",
61+
"typescript": "^6.0.3",
62+
"vitest": "^4.1.8"
6363
}
6464
}

backend/tests/integration/routes/auth.routes.test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ const mockAuthService = vi.hoisted(() => ({
99
}));
1010

1111
vi.mock("../../../src/modules/auth/auth.service", () => ({
12-
AuthService: vi.fn(() => mockAuthService),
12+
AuthService: class {
13+
constructor() {
14+
return mockAuthService;
15+
}
16+
},
1317
}));
1418

1519
// ── CredentialsService mock ───────────────────────────────────────────────────
@@ -20,7 +24,11 @@ const mockCredentialsService = vi.hoisted(() => ({
2024
}));
2125

2226
vi.mock("../../../src/modules/auth/credentials.service", () => ({
23-
CredentialsService: vi.fn(() => mockCredentialsService),
27+
CredentialsService: class {
28+
constructor() {
29+
return mockCredentialsService;
30+
}
31+
},
2432
}));
2533

2634
// ── iron-session ──────────────────────────────────────────────────────────────

backend/tests/integration/routes/savedJobs.routes.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ const mockSavedJobsService = vi.hoisted(() => ({
1212
}));
1313

1414
vi.mock("../../../src/modules/savedJobs/savedJobs.service", () => ({
15-
SavedJobsService: vi.fn(() => mockSavedJobsService),
15+
SavedJobsService: class {
16+
constructor() {
17+
return mockSavedJobsService;
18+
}
19+
},
1620
}));
1721

1822
// ── iron-session ──────────────────────────────────────────────────────────────

backend/tests/integration/routes/user.routes.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ const mockUsersService = vi.hoisted(() => ({
1212
}));
1313

1414
vi.mock("../../../src/modules/users/users.service", () => ({
15-
UsersService: vi.fn(() => mockUsersService),
15+
UsersService: class {
16+
constructor() {
17+
return mockUsersService;
18+
}
19+
},
1620
}));
1721

1822
// ── iron-session ──────────────────────────────────────────────────────────────
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { describe, expect, it, vi } from "vitest";
2+
import { errorHandler } from "../../../src/middleware/errorHandler";
3+
4+
describe("errorHandler", () => {
5+
it("deve retornar 403 para erro de CORS", () => {
6+
const json = vi.fn();
7+
const status = vi.fn(() => ({ json }));
8+
9+
const res = {
10+
status,
11+
};
12+
13+
errorHandler(
14+
new Error("Origin not allowed by CORS"),
15+
{} as any,
16+
res as any,
17+
vi.fn(),
18+
);
19+
20+
expect(status).toHaveBeenCalledWith(403);
21+
expect(json).toHaveBeenCalledWith({
22+
message: "Origem não permitida.",
23+
});
24+
});
25+
26+
it("deve retornar 500 para erros genéricos", () => {
27+
const json = vi.fn();
28+
const status = vi.fn(() => ({ json }));
29+
30+
const res = {
31+
status,
32+
};
33+
34+
errorHandler(
35+
new Error("Erro qualquer"),
36+
{} as any,
37+
res as any,
38+
vi.fn(),
39+
);
40+
41+
expect(status).toHaveBeenCalledWith(500);
42+
expect(json).toHaveBeenCalledWith({
43+
message: "Erro interno.",
44+
error: "Erro qualquer",
45+
});
46+
});
47+
});

0 commit comments

Comments
 (0)