450 lines
12 KiB
Markdown
450 lines
12 KiB
Markdown
# 🐴 GoHorse Jobss
|
|
|
|
[](https://golang.org/)
|
|
[](https://nextjs.org/)
|
|
[](https://nestjs.com/)
|
|
[](https://postgresql.org/)
|
|
[](https://docker.com/)
|
|
|
|
> 🇧🇷 Plataforma SaaS de recrutamento conectando empresas e profissionais de tecnologia.
|
|
|
|
---
|
|
|
|
## 💼 O Negócio
|
|
|
|
### Proposta de Valor
|
|
|
|
**GoHorse Jobs** é uma plataforma completa de recrutamento que conecta empresas a candidatos qualificados, oferecendo:
|
|
|
|
| Para Empresas | Para Candidatos |
|
|
|---------------|-----------------|
|
|
| ✅ Publicar vagas ilimitadas | ✅ Buscar vagas com filtros avançados |
|
|
| ✅ Gerenciar candidaturas | ✅ Candidatar-se em 1 clique |
|
|
| ✅ Chat em tempo real | ✅ Perfil profissional completo |
|
|
| ✅ Painel de analytics | ✅ Notificações push |
|
|
| ✅ Múltiplos recrutadores | ✅ Favoritar vagas |
|
|
|
|
### Modelos de Monetização
|
|
|
|
| Plano | Features | Preço |
|
|
|-------|----------|-------|
|
|
| **Basic** | 3 vagas/mês, 1 usuário | Grátis |
|
|
| **Pro** | 20 vagas/mês, 5 usuários | R$ 199/mês |
|
|
| **Enterprise** | Ilimitado, SSO, API | Sob consulta |
|
|
|
|
---
|
|
|
|
## 🔄 Fluxos de Negócio
|
|
|
|
### 1. Empresa Publica Vaga
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
A[Empresa] --> B[Registro/Login]
|
|
B --> C[Criar Vaga]
|
|
C --> D[Pagamento]
|
|
D --> E[Vaga Publicada]
|
|
E --> F[Candidatos Aplicam]
|
|
F --> G[Triagem]
|
|
G --> H[Contratação]
|
|
```
|
|
|
|
### 2. Candidato Busca Emprego
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
A[Candidato] --> B[Buscar Vagas]
|
|
B --> C[Filtrar]
|
|
C --> D[Ver Detalhes]
|
|
D --> E[Candidatar]
|
|
E --> F[Aguardar Resposta]
|
|
F --> G[Chat com Recrutador]
|
|
G --> H[Contratação]
|
|
```
|
|
|
|
### 3. Registro Rápido + Vaga (Novo!)
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
A[/post-job/] --> B[Dados da Empresa]
|
|
B --> C[Dados da Vaga]
|
|
C --> D[Confirmação]
|
|
D --> E[Empresa + Vaga Criados]
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Roadmap B2C (Marketplace Transformation)
|
|
|
|
Estamos transformando o GoHorse Jobs de um Job Board tradicional para um **Marketplace Completo** de Serviços e Produtos.
|
|
|
|
| Fase | Foco | Features Principais | Status |
|
|
|------|------|---------------------|--------|
|
|
| **1** | **Monetização** | Stripe Checkout, Boost de Vagas, Assinaturas | 🟡 Em Progresso |
|
|
| **2** | **Serviços (Gigs)** | Marketplace de Freelancers, Stripe Connect, Escrow | 🔴 Q1 2025 |
|
|
| **3** | **Loja (Store)** | Venda de Equipamentos, Merch, Logística | 🔴 Q2 2025 |
|
|
| **4** | **AI & Matching** | Video Interviews, Triagem Automática, Cover Letter AI | 🔴 Q3 2025 |
|
|
|
|
> Ver o [Roadmap Detalhado](docs/ROADMAP.md) para o Gap Analysis completo.
|
|
|
|
---
|
|
|
|
## 📚 Documentação
|
|
|
|
### Documentação Principal
|
|
|
|
| Documento | Descrição |
|
|
|-----------|-----------|
|
|
| 📖 [docs/API.md](docs/API.md) | Referência completa da API |
|
|
| 🔐 [docs/API_SECURITY.md](docs/API_SECURITY.md) | Autenticação e RBAC |
|
|
| 🗄️ [docs/DATABASE.md](docs/DATABASE.md) | Schema do banco de dados |
|
|
| 🚀 [docs/DEVOPS.md](docs/DEVOPS.md) | CI/CD, Docker, Kubernetes |
|
|
| 🗺️ [docs/ROADMAP.md](docs/ROADMAP.md) | Status e progresso |
|
|
| 📋 [docs/TASKS.md](docs/TASKS.md) | Tarefas detalhadas |
|
|
|
|
### Documentação por Componente
|
|
|
|
| Componente | Documentação | Tech Stack |
|
|
|------------|--------------|------------|
|
|
| **Backend** | [backend/BACKEND.md](backend/BACKEND.md) | Go, Clean Architecture, DDD |
|
|
| **Frontend** | [frontend/FRONTEND.md](frontend/FRONTEND.md) | Next.js 15, Tailwind, shadcn |
|
|
| **Backoffice** | [backoffice/BACKOFFICE.md](backoffice/BACKOFFICE.md) | NestJS, Fastify, Stripe |
|
|
| **Seeder** | [seeder-api/README.md](seeder-api/README.md) | Node.js, PostgreSQL |
|
|
|
|
---
|
|
|
|
## 🏗️ Arquitetura
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "Frontend (Appwrite)"
|
|
FE[Next.js 15]
|
|
end
|
|
|
|
subgraph "Backend (Kubernetes)"
|
|
API[Go API]
|
|
BO[NestJS Backoffice]
|
|
end
|
|
|
|
subgraph "Database"
|
|
DB[(PostgreSQL 16)]
|
|
end
|
|
|
|
subgraph "External Services"
|
|
MQ[LavinMQ]
|
|
S3[Cloudflare R2]
|
|
FCM[Firebase FCM]
|
|
AW[Appwrite Realtime]
|
|
ST[Stripe]
|
|
end
|
|
|
|
FE --> API
|
|
FE --> AW
|
|
API --> DB
|
|
API --> MQ
|
|
API --> S3
|
|
BO --> DB
|
|
BO --> MQ
|
|
BO --> FCM
|
|
BO --> ST
|
|
```
|
|
|
|
### Componentes
|
|
|
|
| Componente | Responsabilidade | Porta |
|
|
|------------|------------------|-------|
|
|
| **Frontend** | UI, SSR, Auth | 3000 |
|
|
| **Backend** | API REST, Business Logic | 8521 |
|
|
| **Backoffice** | Stripe, Email, FCM | 3001 |
|
|
| **PostgreSQL** | Persistência | 5432 |
|
|
| **LavinMQ** | Email Queue | 5672 |
|
|
|
|
---
|
|
|
|
## 🛠️ Tech Stack
|
|
|
|
### Backend (Go)
|
|
| Tecnologia | Uso |
|
|
|------------|-----|
|
|
| Go 1.24 | API REST |
|
|
| GORM | ORM |
|
|
| JWT v5 | Autenticação |
|
|
| Swagger | Documentação |
|
|
| BCrypt | Password hashing |
|
|
|
|
### Frontend (Next.js)
|
|
| Tecnologia | Uso |
|
|
|------------|-----|
|
|
| Next.js 15 | Framework |
|
|
| Tailwind 4 | CSS |
|
|
| shadcn/ui | Componentes |
|
|
| Framer Motion | Animações |
|
|
| Appwrite | Realtime |
|
|
|
|
### Backoffice (NestJS)
|
|
| Tecnologia | Uso |
|
|
|------------|-----|
|
|
| NestJS 11 | Framework |
|
|
| Stripe | Pagamentos |
|
|
| Nodemailer | Emails |
|
|
| Firebase Admin | Push |
|
|
|
|
---
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### Pré-requisitos
|
|
|
|
- Docker v24+ ou Go 1.24+
|
|
- Node.js v20+
|
|
- PostgreSQL v16+
|
|
|
|
### Instalação
|
|
|
|
```bash
|
|
# Clone
|
|
git clone https://github.com/rede5/gohorsejobs.git
|
|
cd gohorsejobs
|
|
|
|
# Configure
|
|
cp backend/.env.example backend/.env
|
|
cp frontend/.env.example frontend/.env
|
|
|
|
# Backend
|
|
cd backend && go run ./cmd/api
|
|
|
|
# Frontend (outro terminal)
|
|
cd frontend && npm install && npm run dev
|
|
|
|
# Seeder (opcional)
|
|
cd seeder-api && npm install && npm run seed
|
|
```
|
|
|
|
### Usando start.sh
|
|
|
|
```bash
|
|
./start.sh
|
|
# Escolha uma opção:
|
|
# 1. Run Backend
|
|
# 2. Run Frontend
|
|
# 3. Run Seeder
|
|
# 4. Run Migrations
|
|
# 5. Reset + Seed
|
|
```
|
|
|
|
---
|
|
|
|
## 🔑 Credenciais de Teste
|
|
|
|
> [!NOTE]
|
|
> O SuperAdmin foi atualizado via migration `032_update_superadmin_lol.sql`.
|
|
> No primeiro login será necessário trocar a senha (status `force_change_password`).
|
|
|
|
| Tipo | Login | Email | Senha |
|
|
|------|-------|-------|-------|
|
|
| **SuperAdmin** | `lol` | `lol@gohorsejobs.com` | `Admin@2025!` |
|
|
| **Company Admin** | `takeshi_yamamoto` | - | `Takeshi@2025` |
|
|
| **Recruiter** | `maria_santos` | - | `User@2025` |
|
|
| **Candidate** | `paulo_santos` | - | `User@2025` |
|
|
|
|
> [!WARNING]
|
|
> Se o login retornar 401, verifique se a migration `032_update_superadmin_lol.sql` foi executada no banco.
|
|
|
|
---
|
|
|
|
## 🔧 Environment Variables
|
|
|
|
### Backend
|
|
|
|
```env
|
|
DATABASE_URL=postgres://user:pass@host:5432/db
|
|
JWT_SECRET=your-secret-key-min-32-chars
|
|
PASSWORD_PEPPER=your-pepper
|
|
CORS_ORIGINS=https://frontend.com
|
|
```
|
|
|
|
### Frontend
|
|
|
|
```env
|
|
NEXT_PUBLIC_API_URL=https://api.gohorsejobs.com
|
|
NEXT_PUBLIC_APPWRITE_ENDPOINT=https://cloud.appwrite.io/v1
|
|
NEXT_PUBLIC_APPWRITE_PROJECT_ID=your-project
|
|
```
|
|
|
|
### Backoffice
|
|
|
|
```env
|
|
DATABASE_URL=postgres://user:pass@host:5432/db
|
|
STRIPE_SECRET_KEY=sk_test_xxx
|
|
AMQP_URL=amqp://user:pass@host:5672
|
|
```
|
|
|
|
---
|
|
|
|
## 📂 Estrutura
|
|
|
|
```
|
|
gohorsejobs/
|
|
├── backend/ # Go API (Clean Architecture)
|
|
│ ├── cmd/api/ # Entrypoint
|
|
│ ├── internal/ # Business logic
|
|
│ ├── migrations/ # 30 SQL migrations
|
|
│ └── BACKEND.md # Documentação
|
|
│
|
|
├── frontend/ # Next.js 15 App
|
|
│ ├── src/app/ # 35 pages
|
|
│ ├── src/components/ # 44 components
|
|
│ └── FRONTEND.md # Documentação
|
|
│
|
|
├── backoffice/ # NestJS API
|
|
│ ├── src/ # 7 modules
|
|
│ └── BACKOFFICE.md # Documentação
|
|
│
|
|
├── seeder-api/ # Node.js Seeder
|
|
│ └── README.md # Documentação
|
|
│
|
|
├── docs/ # Documentação central
|
|
│ ├── API.md
|
|
│ ├── API_SECURITY.md
|
|
│ ├── DATABASE.md
|
|
│ ├── DEVOPS.md
|
|
│ ├── ROADMAP.md
|
|
│ └── TASKS.md
|
|
│
|
|
├── k8s/ # Kubernetes manifests
|
|
│ ├── dev/
|
|
│ ├── hml/
|
|
│ └── prd/
|
|
│
|
|
└── start.sh # Script de inicialização
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Status do Projeto
|
|
|
|
| Área | Progresso | Status |
|
|
|------|-----------|--------|
|
|
| Backend API | 95% | 🟢 Production Ready |
|
|
| Frontend | 85% | 🟢 Funcional |
|
|
| Backoffice | 80% | 🟢 Funcional |
|
|
| Seeder | 100% | 🟢 Completo |
|
|
| Documentação | 95% | 🟢 Atualizada |
|
|
|
|
Ver [docs/ROADMAP.md](docs/ROADMAP.md) para detalhes.
|
|
|
|
---
|
|
|
|
## 🤝 Contribuindo
|
|
|
|
1. Fork o projeto
|
|
2. Crie sua branch (`git checkout -b feature/AmazingFeature`)
|
|
3. Commit suas mudanças (`git commit -m 'feat: add amazing feature'`)
|
|
4. Push para a branch (`git push origin feature/AmazingFeature`)
|
|
5. Abra um Pull Request
|
|
|
|
---
|
|
## 📊 Status Atual do Sistema (GoHorse Report)
|
|
|
|
Diagrama gerado automaticamente com base nos testes de validação do MVP.
|
|
Legenda:
|
|
* 🟢 **Verde:** Funcionando/Operacional.
|
|
* 🟡 **Amarelo:** Parcial/Bugado.
|
|
* 🔴 **Vermelho:** Quebrado/Faltando Config.
|
|
* 💀 **Vermelho Escuro:** Falha Crítica de Segurança.
|
|
|
|
```mermaid
|
|
graph TD
|
|
%% Estilos
|
|
classDef working fill:#dcfce7,stroke:#16a34a,stroke-width:2px;
|
|
classDef partial fill:#fef9c3,stroke:#ca8a04,stroke-width:2px,stroke-dasharray:5 5;
|
|
classDef broken fill:#fee2e2,stroke:#dc2626,stroke-width:2px,stroke-dasharray:5 5;
|
|
classDef critical fill:#991b1b,stroke:#fca5a5,stroke-width:4px,color:#fff;
|
|
classDef success fill:#dcfce7,stroke:#16a34a,stroke-width:2px;
|
|
classDef warning fill:#fef9c3,stroke:#ca8a04,stroke-width:2px;
|
|
classDef error fill:#fee2e2,stroke:#dc2626,stroke-width:2px;
|
|
|
|
subgraph Frontend["Frontend & App"]
|
|
FE[Next.js 15]:::working
|
|
end
|
|
|
|
subgraph Backend["Core Backend"]
|
|
API[Go API]:::working
|
|
DB[(PostgreSQL)]:::working
|
|
BO[NestJS Backoffice]:::broken
|
|
end
|
|
|
|
subgraph Integracoes["Integrações (O Gargalo)"]
|
|
MQ[LavinMQ]:::broken
|
|
S3["Cloudflare R2/S3<br/>(Uploads)"]:::broken
|
|
FCM[Firebase FCM]:::broken
|
|
AW["Appwrite Realtime<br/>(Chat)"]:::broken
|
|
ST["Stripe<br/>(Pagamentos)"]:::broken
|
|
end
|
|
|
|
%% Fluxos
|
|
FE -->|✅ OK| API
|
|
API -->|✅ OK| DB
|
|
|
|
%% Falhas
|
|
API -.->|❌ Falha no Upload| S3
|
|
FE -.->|❌ Falha na Conexão| AW
|
|
API -.->|❌ Não Configurado| MQ
|
|
API -.->|❌ Mockado/Ignorado| ST
|
|
|
|
%% Alerta de Segurança
|
|
SEC["⚠️ FALHA CRÍTICA DE SEGURANÇA<br/>Usuário altera o próprio Role para SuperAdmin"]:::critical
|
|
FE -.-> SEC
|
|
|
|
%% Atores
|
|
Empresa((Empresa))
|
|
Candidato((Candidato))
|
|
|
|
%% Fluxo Empresa
|
|
subgraph JornadaEmpresa["Jornada da Empresa"]
|
|
LoginE[Login/Registro]:::success
|
|
Dash[Dashboard]:::warning
|
|
NewJob[Criar Vaga]:::warning
|
|
Payment[Pagamento]:::error
|
|
ListJobs[Listar Minhas Vagas]:::error
|
|
AdminUser[Gerenciar Usuários]:::success
|
|
end
|
|
|
|
%% Fluxo Candidato
|
|
subgraph JornadaCandidato["Jornada do Candidato"]
|
|
Search[Buscar Vagas]:::success
|
|
Details[Ver Detalhes]:::success
|
|
Apply[Candidatar-se]:::error
|
|
end
|
|
|
|
%% Conexões Empresa
|
|
Empresa --> LoginE
|
|
LoginE --> Dash
|
|
Dash -->|Botão 'Publish' não funciona| NewJob
|
|
NewJob -->|❌ Salva mas não aparece na lista da empresa| ListJobs
|
|
NewJob -.->|❌ Pula Etapa| Payment
|
|
LoginE -->|⚠️ PERIGO: Permite virar Admin| AdminUser
|
|
|
|
%% Conexões Candidato
|
|
Candidato --> Search
|
|
Search -->|Vê vaga criada pela empresa| Details
|
|
Details -->|❌ Erro: Upload Obrigatório Falha| Apply
|
|
|
|
%% Funcionalidades Isoladas
|
|
subgraph OutrosModulos["Outros Módulos"]
|
|
Tickets[Tickets/Suporte]:::success
|
|
Chat[Chat Realtime]:::error
|
|
end
|
|
```
|
|
|
|
|
|
---
|
|
## 📄 Licença
|
|
|
|
Este projeto está sob a licença MIT. Veja [LICENSE](LICENSE) para detalhes.
|
|
|
|
---
|
|
|
|
<p align="center">
|
|
<sub>Desenvolvido com ❤️ pela equipe GoHorse</sub>
|
|
</p>
|