Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
208 changes: 192 additions & 16 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,19 @@ src/main/java/com/mergingtonhigh/schoolmanagement/
│ │ ├── ActivityRepository.java
│ │ └── TeacherRepository.java
│ └── valueobjects/ # Objetos de valor
│ ├── ActivityType.java # Enum de tipos de atividade
│ ├── Email.java # Validação de email
│ └── ScheduleDetails.java # Detalhes de horário
├── application/ # 🔧 Camada de Aplicação
│ ├── dtos/ # Data Transfer Objects
│ │ ├── ActivityDTO.java
│ │ ├── ActivityTypeDTO.java
│ │ ├── LoginRequestDTO.java
│ │ ├── StudentRegistrationDTO.java
│ │ └── TeacherDTO.java
│ └── usecases/ # Casos de uso
│ ├── ActivityUseCase.java
│ ├── AuthenticationUseCase.java
│ └── StudentRegistrationUseCase.java
├── infrastructure/ # 🏭 Camada de Infraestrutura
│ ├── config/ # Configurações
Expand All @@ -48,7 +52,9 @@ src/main/java/com/mergingtonhigh/schoolmanagement/
│ └── TeacherRepositoryImpl.java
└── presentation/ # 🎨 Camada de Apresentação
├── controllers/ # Controllers REST
│ └── ActivityController.java
│ ├── ActivityController.java
│ ├── AuthController.java
│ └── StaticController.java
└── mappers/ # Mapeadores DTO ↔ Entity
├── ActivityMapper.java
└── TeacherMapper.java
Expand All @@ -69,8 +75,15 @@ src/main/java/com/mergingtonhigh/schoolmanagement/

### Frontend

- **HTML5/CSS3/JavaScript** - Interface web
- **Vanilla JavaScript** - Interatividade do frontend
- **HTML5/CSS3/JavaScript** - Interface web responsiva
- **Vanilla JavaScript** - Interatividade sem frameworks externos
- **Design português/brasileiro** - Interface totalmente localizada
- **Componentes principais**:
- Sistema de filtros por categoria e busca textual
- Modal de autenticação integrado
- Cartões de atividade com informações visuais
- Gerenciamento de estado de sessão
- Feedback visual para ações do usuário

### Banco de Dados

Expand Down Expand Up @@ -103,6 +116,8 @@ src/main/java/com/mergingtonhigh/schoolmanagement/
- **Login de professores** com username/senha
- **Controle de acesso** baseado em roles (TEACHER/ADMIN)
- **Autenticação requerida** para inscrições
- **Verificação de sessão** para manter estado de login
- **Logout** para encerrar sessão do usuário

### 📝 Gestão de Inscrições

Expand All @@ -116,9 +131,86 @@ src/main/java/com/mergingtonhigh/schoolmanagement/
### 🎨 Interface Web

- **Design responsivo** e intuitivo
- **Filtros dinâmicos** para busca de atividades
- **Modais** para login e inscrições
- **Filtros dinâmicos** para busca de atividades por:
- Categoria (Esportes, Artes, Acadêmico, Comunidade, Tecnologia)
- Busca por texto
- Dia da semana
- **Sistema de autenticação** integrado com modais
- **Categorização automática** de atividades por tipo
- **Feedback visual** para ações do usuário
- **Gerenciamento de sessão** com persistência de login

### 🏷️ Sistema de Categorização

As atividades são automaticamente categorizadas por tipo usando a enum `ActivityType`:

- **SPORTS** (Esportes) - `#e8f5e9` / `#2e7d32`
- **ARTS** (Artes) - `#f3e5f5` / `#7b1fa2`
- **ACADEMIC** (Acadêmico) - `#e3f2fd` / `#1565c0`
- **COMMUNITY** (Comunidade) - `#fff3e0` / `#e65100`
- **TECHNOLOGY** (Tecnologia) - `#e8eaf6` / `#3949ab`

A categorização é baseada em palavras-chave no nome e descrição da atividade, com algoritmo automático que identifica o tipo mais apropriado.

## 📋 Estrutura de Dados

### DTOs (Data Transfer Objects)

#### ActivityDTO
Representa uma atividade completa com todos os dados necessários para o frontend:
```java
public record ActivityDTO(
String name, // Nome da atividade
String description, // Descrição detalhada
String schedule, // Horário formatado para exibição
ScheduleDetailsDTO scheduleDetails, // Detalhes estruturados do horário
int maxParticipants, // Capacidade máxima
List<String> participants, // Lista de emails dos participantes
int currentParticipantCount, // Número atual de participantes
ActivityTypeDTO type // Categoria com informações visuais
)
```

#### TeacherDTO
Dados do professor para autenticação:
```java
public record TeacherDTO(
String username, // Nome de usuário único
String displayName, // Nome para exibição
String role // Função (teacher/admin)
)
```

#### ActivityTypeDTO
Informações de categoria para interface:
```java
public record ActivityTypeDTO(
String name, // Nome interno da categoria
String label, // Rótulo para exibição
String color, // Cor de fundo
String textColor // Cor do texto
)
```

#### LoginRequestDTO & StudentRegistrationDTO
DTOs para operações específicas de login e inscrição de estudantes.

### Value Objects

#### ActivityType (Enum)
Define os tipos de atividade com categorização automática baseada em palavras-chave:
- Detecta automaticamente o tipo analisando nome e descrição
- Fornece cores consistentes para interface
- Suporta português e inglês

#### ScheduleDetails
Encapsula horários estruturados:
- Lista de dias da semana
- Horários de início e fim
- Validação de consistência

#### Email
Value object para validação de endereços de email com regex pattern.

## 🔧 Configuração e Execução

Expand All @@ -130,7 +222,21 @@ src/main/java/com/mergingtonhigh/schoolmanagement/

### Variáveis de Ambiente

Crie um arquivo `.env` baseado no `.env.example`
Crie um arquivo `.env` baseado no `.env.example`:

```bash
# Configuração de Segurança
SECURITY_ADMIN_USERNAME=admin
SECURITY_ADMIN_PASSWORD=admin123
SECURITY_ADMIN_ROLES=ADMIN

# Senhas dos Professores (para seed do banco)
PRINCIPAL_PASSWORD=admin123
TEACHER_RODRIGUEZ_PASSWORD=art123
TEACHER_CHEN_PASSWORD=chess456
```

**Importante**: Use senhas fortes em produção. As senhas padrão são apenas para desenvolvimento.

### Executando o Projeto

Expand Down Expand Up @@ -160,6 +266,8 @@ Crie um arquivo `.env` baseado no `.env.example`
3. **Acessar a aplicação**:
- Frontend: <http://localhost:8080>
- API REST: <http://localhost:8080/activities>
- Autenticação: <http://localhost:8080/auth>
- Health Check: <http://localhost:8080/actuator/health>

### Tasks Maven Disponíveis

Expand All @@ -175,25 +283,81 @@ Crie um arquivo `.env` baseado no `.env.example`
#### Atividades

```http
# Listar todas as atividades
GET /activities

# Listar atividades com filtros opcionais
GET /activities?day=Monday&start_time=15:00&end_time=17:00

# Obter dias disponíveis para atividades
GET /activities/days
```

**Resposta de `/activities`**: Retorna um objeto com atividades onde cada chave é o nome da atividade e o valor contém:
- `name` - Nome da atividade
- `description` - Descrição detalhada
- `schedule` - Horário formatado para exibição
- `scheduleDetails` - Objeto com `days[]`, `startTime`, `endTime`
- `maxParticipants` - Capacidade máxima
- `participants[]` - Lista de emails dos participantes
- `currentParticipantCount` - Número atual de participantes
- `type` - Objeto com informações de categoria (`name`, `label`, `color`, `textColor`)

#### Autenticação

```http
# Login de professor
POST /auth/login
Content-Type: application/x-www-form-urlencoded

username=mrodriguez&password=password123

# Verificar sessão ativa
GET /auth/check-session?username=mrodriguez
```

**Resposta de `/auth/login`**: Retorna dados do professor logado:
```json
{
"username": "mrodriguez",
"displayName": "Sr. Rodriguez",
"role": "teacher"
}
```

**Resposta de erro**: `401` com `{"detail": "Invalid username or password"}`

#### Inscrições

```http
# Inscrever estudante em atividade
POST /activities/{activityName}/signup
Content-Type: application/x-www-form-urlencoded

email=student@mergington.edu&teacher_username=teacher1
email=student@mergington.edu&teacher_username=mrodriguez

POST /activities/{activityName}/unregister
# Cancelar inscrição de estudante
POST /activities/{activityName}/unregister
Content-Type: application/x-www-form-urlencoded

email=student@mergington.edu&teacher_username=teacher1
email=student@mergington.edu&teacher_username=mrodriguez
```

**Respostas**:
- `200` - `{"message": "Sucesso na operação"}`
- `400` - `{"detail": "Erro de validação"}`
- `401` - `{"detail": "Authentication required for this action"}`
- `404` - `{"detail": "Activity/Student not found"}`

#### Interface Web

```http
# Página principal da aplicação
GET /
```

Serve a interface web estática localizada em `/static/index.html`.

## 🧪 Testes

### Estrutura de Testes
Expand Down Expand Up @@ -225,15 +389,22 @@ O sistema utiliza **Mongock** para realizar migrações automáticas do banco de

### Professores Padrão

- **admin** - Administrador principal
- **teacher.rodriguez** - Professor de artes
- **teacher.chen** - Professor de xadrez
- **admin** - Administrador principal (senha configurável via `ADMIN_PASSWORD`)
- **mrodriguez** - Sr. Rodriguez, Professor de artes (senha via `TEACHER_RODRIGUEZ_PASSWORD`)
- **mchen** - Sra. Chen, Professora de xadrez (senha via `TEACHER_CHEN_PASSWORD`)
- **principal** - Diretor da escola (senha via `PRINCIPAL_PASSWORD`)

### Atividades Exemplo

- **Art Club** - Terças e quintas, 15:30-17:00
- **Chess Club** - Segundas e quartas, 15:30-17:00
- **Drama Club** - Quartas e sextas, 16:00-18:00
O sistema inclui 14 atividades pré-configuradas categorizadas por tipo:

**Esportes**: Time de Futebol, Time de Basquete, Fitness Matinal
**Artes**: Clube de Arte, Clube de Teatro, Manga Maniacs
**Acadêmico**: Clube de Xadrez, Torneio de Xadrez, Clube de Matemática, Equipe de Debates, Olimpíada de Ciências
**Tecnologia**: Aula de Programação, Oficina de Robótica
**Comunidade**: Serviço Comunitário

Cada atividade possui horários específicos, capacidade limitada e alguns participantes pré-inscritos para demonstração.

## 🔒 Segurança

Expand All @@ -252,4 +423,9 @@ O sistema utiliza **Mongock** para realizar migrações automáticas do banco de

### Perfis de Ambiente

- **dev** - Ambiente de desenvolvimento
- **dev** - Ambiente de desenvolvimento com:
- CORS habilitado para todos os origins (`*`)
- Logs em nível DEBUG
- MongoDB local (localhost:27017)
- DevTools habilitado com LiveReload
- **prod** - Ambiente de produção (configurar conforme necessário)
2 changes: 1 addition & 1 deletion docs/architecture/component-diagram.puml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Container_Boundary(webApp, "Spring Boot Web Application") {
Component(staticController, "Static Controller", "Spring Controller", "Serves static web content")

Component(activityUseCase, "Activity Use Case", "Application Service", "Orchestrates activity business logic")
Component(authUseCase, "Authentication Use Case", "Application Service", "Orchestrates authentication logic")
Component(authUseCase, "Authentication Use Case", "Application Service", "Handles teacher authentication and session management")
Component(registrationUseCase, "Student Registration Use Case", "Application Service", "Handles student registrations")

Component(activityEntity, "Activity Entity", "Domain Model", "Core activity business logic")
Expand Down