# Documentação - Monitoramento de Sites PHP

## 📋 Índice

1. [Arquitetura](#arquitetura)
2. [Instalação](#instalação)
3. [APIs REST](#apis-rest)
4. [Banco de Dados](#banco-de-dados)
5. [Autenticação](#autenticação)
6. [Tratamento de Erros](#tratamento-de-erros)
7. [Segurança](#segurança)
8. [Deployment](#deployment)

## 🏗️ Arquitetura

### Padrão MVC

A aplicação segue o padrão Model-View-Controller:

- **Models**: Gerenciam acesso aos dados (`src/Models/`)
- **Controllers**: Processam requisições e retornam respostas (`src/Controllers/`)
- **Views**: Templates HTML (`public/`)

### Estrutura de Diretórios

```
monitoramento-php/
├── config/                 # Configurações
│   ├── constants.php      # Constantes globais
│   └── database.php       # Configuração do BD
├── src/
│   ├── Database/          # Conexão com BD
│   │   └── Connection.php
│   ├── Models/            # Modelos de dados
│   │   ├── BaseModel.php
│   │   ├── User.php
│   │   └── Site.php
│   ├── Controllers/       # Controladores
│   │   ├── AuthController.php
│   │   └── SiteController.php
│   ├── Services/          # Lógica de negócio
│   ├── Utils/             # Utilitários
│   │   ├── Response.php
│   │   └── Validator.php
│   └── Middleware/        # Middlewares
├── public/                # Arquivos públicos
│   ├── index.html        # Frontend
│   ├── index.php         # Entry point
│   ├── api.php           # Router de APIs
│   ├── css/              # Estilos
│   └── js/               # Scripts
├── views/                # Templates
├── database/             # Schema e migrations
├── workers/              # Workers em background
└── composer.json         # Dependências
```

## 🚀 Instalação

### Pré-requisitos

- PHP 8.1+
- MySQL 5.7+ ou MariaDB 10.3+
- Composer
- cURL

### Passo 1: Clonar Repositório

```bash
git clone https://github.com/sheikagencia/monitoramento-php.git
cd monitoramento-php
```

### Passo 2: Instalar Dependências

```bash
composer install
```

### Passo 3: Configurar Ambiente

```bash
cp .env.example .env
# Edite o arquivo .env com suas configurações
```

### Passo 4: Criar Banco de Dados

```bash
mysql -u root -p -e "CREATE DATABASE monitoramento CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
```

### Passo 5: Executar Migrations

```bash
php database/migrate.php
```

### Passo 6: Executar Seeds

```bash
php database/seed.php
```

### Passo 7: Iniciar Servidor

```bash
composer start
```

Acesse `http://localhost:8000`

## 🔌 APIs REST

### Autenticação

#### Login

```http
POST /api/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "senha123"
}
```

**Resposta (200):**
```json
{
  "success": true,
  "message": "Login realizado com sucesso",
  "status_code": 200,
  "data": {
    "id": 1,
    "name": "João Silva",
    "email": "joao@example.com",
    "role": "user",
    "company_name": "Minha Empresa"
  }
}
```

#### Logout

```http
POST /api/auth/logout
```

#### Dados do Usuário

```http
GET /api/auth/me
```

#### Registrar

```http
POST /api/auth/register
Content-Type: application/json

{
  "name": "João Silva",
  "email": "joao@example.com",
  "password": "senha123",
  "password_confirmation": "senha123",
  "company_name": "Minha Empresa"
}
```

#### Estatísticas

```http
GET /api/auth/stats
```

### Sites

#### Listar Sites

```http
GET /api/sites?page=1&limit=20
```

**Resposta:**
```json
{
  "success": true,
  "message": "Sites listados com sucesso",
  "status_code": 200,
  "data": [
    {
      "id": 1,
      "user_id": 1,
      "name": "Meu Site",
      "url": "https://meusite.com.br",
      "domain": "meusite.com.br",
      "technology": "wordpress",
      "last_status": "online",
      "uptime_percentage": 99.5,
      "last_check_at": "2024-01-27 10:30:00"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 5,
    "pages": 1
  }
}
```

#### Criar Site

```http
POST /api/sites
Content-Type: application/json

{
  "name": "Meu Site",
  "url": "https://meusite.com.br",
  "domain": "meusite.com.br",
  "technology": "wordpress",
  "description": "Descrição do site",
  "check_interval": 60
}
```

#### Obter Detalhes

```http
GET /api/sites/1
```

#### Atualizar Site

```http
PUT /api/sites/1
Content-Type: application/json

{
  "name": "Novo Nome",
  "check_interval": 120
}
```

#### Deletar Site

```http
DELETE /api/sites/1
```

#### Histórico de Checks

```http
GET /api/sites/1/checks?limit=100
```

#### Forçar Verificação

```http
POST /api/sites/1/check
```

## 💾 Banco de Dados

### Tabelas Principais

#### users
Usuários do sistema

```sql
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  role ENUM('admin', 'user', 'client') NOT NULL DEFAULT 'user',
  company_name VARCHAR(255),
  is_active BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

#### sites
Sites monitorados

```sql
CREATE TABLE sites (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  url VARCHAR(500) NOT NULL,
  domain VARCHAR(255) NOT NULL,
  technology ENUM('wordpress', 'php', 'laravel', 'symfony', 'custom'),
  check_interval INT DEFAULT 60,
  is_active BOOLEAN DEFAULT TRUE,
  last_status ENUM('online', 'offline', 'unstable'),
  uptime_percentage DECIMAL(5, 2) DEFAULT 100.00,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
```

#### checks
Histórico de verificações

```sql
CREATE TABLE checks (
  id INT PRIMARY KEY AUTO_INCREMENT,
  site_id INT NOT NULL,
  status ENUM('success', 'failed', 'timeout') NOT NULL,
  http_code INT,
  response_time INT,
  error_message TEXT,
  checked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE CASCADE
);
```

#### alerts
Configurações de alertas

```sql
CREATE TABLE alerts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT NOT NULL,
  site_id INT,
  name VARCHAR(255) NOT NULL,
  alert_type ENUM('site_down', 'site_up', 'unstable', 'high_response_time'),
  channels JSON NOT NULL,
  cooldown_minutes INT DEFAULT 5,
  is_active BOOLEAN DEFAULT TRUE,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
  FOREIGN KEY (site_id) REFERENCES sites(id) ON DELETE SET NULL
);
```

## 🔐 Autenticação

### Fluxo de Autenticação

1. Usuário faz login com email e senha
2. Senha é verificada com `password_verify()`
3. Sessão é criada com `session_start()`
4. Dados do usuário são armazenados em `$_SESSION`

### Proteção de Rotas

```php
session_start();

if (!isset($_SESSION['user_id'])) {
    return Response::unauthorized('Usuário não autenticado')->send();
}
```

### Verificação de Propriedade

```php
if (!$this->siteModel->belongsToUser($siteId, $_SESSION['user_id'])) {
    return Response::forbidden('Acesso negado')->send();
}
```

## ⚠️ Tratamento de Erros

### Códigos de Status HTTP

- **200**: OK - Requisição bem-sucedida
- **201**: Created - Recurso criado com sucesso
- **400**: Bad Request - Requisição inválida
- **401**: Unauthorized - Não autenticado
- **403**: Forbidden - Acesso proibido
- **404**: Not Found - Recurso não encontrado
- **422**: Unprocessable Entity - Erro de validação
- **500**: Internal Server Error - Erro interno

### Exemplo de Resposta de Erro

```json
{
  "success": false,
  "message": "Erro de validação",
  "status_code": 422,
  "errors": {
    "email": ["Email é obrigatório"],
    "password": ["Senha deve ter no mínimo 6 caracteres"]
  }
}
```

## 🔒 Segurança

### Proteções Implementadas

1. **SQL Injection**: Prepared Statements
2. **XSS**: Escape de output
3. **CSRF**: Tokens CSRF
4. **Password**: bcrypt hashing
5. **CORS**: Configuração segura
6. **Rate Limiting**: Proteção contra brute force
7. **HTTPS**: Recomendado em produção

### Headers de Segurança

```
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Referrer-Policy: strict-origin-when-cross-origin
```

## 🚀 Deployment

### Heroku

```bash
heroku create seu-app
git push heroku main
heroku run php database/migrate.php
```

### Docker

```dockerfile
FROM php:8.1-apache

RUN docker-php-ext-install pdo pdo_mysql

COPY . /var/www/html

RUN a2enmod rewrite

EXPOSE 80
```

### Nginx

```nginx
server {
    listen 80;
    server_name seu-dominio.com;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}
```

## 📚 Recursos Adicionais

- [PHP Documentation](https://www.php.net/docs.php)
- [MySQL Documentation](https://dev.mysql.com/doc/)
- [REST API Best Practices](https://restfulapi.net/)
- [OWASP Security](https://owasp.org/)
