# core - Sistema de Gestión de Documentos en la Nube

Sistema de gestión de documentos en la nube desarrollado con Django REST Framework que permite a la organización almacenar, organizar y controlar el acceso a documentos digitales de manera eficiente, segura y escalable.

## 🚀 Características

### Módulo de Usuarios
- **Permisos Granulares**: Sistema completo de permisos por usuario
  - Agregar documentos
  - Crear carpetas
  - Descargar archivos
  - Visualizar contenido
  - Editar carpetas y documentos
  - Eliminar carpetas y documentos
  - Crear usuarios
- **Autenticación JWT**: Sistema seguro de autenticación con tokens
- **Gestión de Usuarios**: CRUD completo de usuarios con roles personalizados

### Módulo de Documentos
- **Carpetas Jerárquicas**: Organización de documentos en carpetas y subcarpetas
- **Múltiples Formatos**: Soporte para diversos tipos de archivos
  - Documentos: PDF, Word, Excel, PowerPoint, TXT, CSV
  - Imágenes: JPG, PNG, GIF, BMP, SVG, WebP
  - Videos: MP4, AVI, MOV, WMV, FLV, MKV, WebM
  - Comprimidos: ZIP, RAR, 7Z, TAR, GZ
- **Control de Acceso**: Configuración de permisos por carpeta y documento
- **Versionamiento**: Sistema de versiones para documentos
- **Metadata Completa**: Información detallada de cada archivo
  - Fecha de creación y modificación
  - Usuario creador y último modificador
  - Tamaño y tipo de archivo
  - Historial de versiones

## 📋 Requisitos Previos

- Python 3.13 o superior
- pip (gestor de paquetes de Python)
- Virtualenv (recomendado)

## 🔧 Instalación

### 1. Clonar o descargar el proyecto

```bash
cd core
```

### 2. Crear y activar entorno virtual

**Windows:**
```bash
python -m venv venv
venv\Scripts\activate
```

**Linux/Mac:**
```bash
python3 -m venv venv
source venv/bin/activate
```

### 3. Instalar dependencias

```bash
pip install -r requirements.txt
```

### 4. Configurar variables de entorno

Copiar el archivo `.env.example` a `.env` y configurar las variables:

```bash
copy .env.example .env  # Windows
cp .env.example .env    # Linux/Mac
```

Editar el archivo `.env` con tus configuraciones.

### 5. Ejecutar migraciones

```bash
python manage.py makemigrations
python manage.py migrate
```

### 6. Crear superusuario

```bash
python manage.py createsuperuser
```

Ingresa los datos solicitados:
- Email
- Nombre
- Contraseña

### 7. Ejecutar servidor de desarrollo

```bash
python manage.py runserver
```

El servidor estará disponible en: `http://localhost:8000`

## 📚 Documentación de la API

Una vez el servidor esté corriendo, puedes acceder a la documentación interactiva:

- **Swagger UI**: http://localhost:8000/swagger/
- **ReDoc**: http://localhost:8000/redoc/
- **Admin Panel**: http://localhost:8000/admin/

## 🔐 Autenticación

La API utiliza JWT (JSON Web Tokens) para autenticación.

### Obtener Token

**Endpoint:** `POST /api/users/auth/login/`

**Body:**
```json
{
  "email": "usuario@ejemplo.com",
  "password": "contraseña"
}
```

**Respuesta:**
```json
{
  "access": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "refresh": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "user": {
    "id": 1,
    "email": "usuario@ejemplo.com",
    "name": "Usuario Ejemplo",
    "permissions": {
      "can_add_documents": true,
      "can_create_folders": true,
      "can_download": true,
      "can_view": true,
      "can_edit_folders": true,
      "can_edit_documents": true,
      "can_delete_documents": true,
      "can_delete_folders": true,
      "can_create_users": true
    }
  }
}
```

### Usar Token en Requests

Incluir el token en el header de cada request:

```
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
```

## 📖 Endpoints Principales

### Usuarios

- `POST /api/users/auth/login/` - Iniciar sesión
- `POST /api/users/auth/refresh/` - Refrescar token
- `GET /api/users/` - Listar usuarios
- `POST /api/users/` - Crear usuario
- `GET /api/users/{id}/` - Obtener usuario
- `PUT /api/users/{id}/` - Actualizar usuario
- `DELETE /api/users/{id}/` - Eliminar usuario
- `GET /api/users/me/` - Obtener perfil actual
- `PUT /api/users/update_profile/` - Actualizar perfil
- `POST /api/users/change_password/` - Cambiar contraseña
- `POST /api/users/{id}/toggle_active/` - Activar/desactivar usuario

### Carpetas

- `GET /api/documents/folders/` - Listar carpetas
- `POST /api/documents/folders/` - Crear carpeta
- `GET /api/documents/folders/{id}/` - Obtener carpeta
- `PUT /api/documents/folders/{id}/` - Actualizar carpeta
- `DELETE /api/documents/folders/{id}/` - Eliminar carpeta
- `GET /api/documents/folders/{id}/contents/` - Obtener contenido de carpeta
- `POST /api/documents/folders/{id}/add_user_access/` - Agregar acceso a usuario
- `POST /api/documents/folders/{id}/remove_user_access/` - Remover acceso a usuario

### Documentos

- `GET /api/documents/files/` - Listar documentos
- `POST /api/documents/files/` - Subir documento
- `GET /api/documents/files/{id}/` - Obtener documento
- `PUT /api/documents/files/{id}/` - Actualizar documento
- `DELETE /api/documents/files/{id}/` - Eliminar documento
- `GET /api/documents/files/{id}/download/` - Descargar documento
- `GET /api/documents/files/{id}/versions/` - Obtener versiones
- `POST /api/documents/files/{id}/create_version/` - Crear versión
- `POST /api/documents/files/{id}/add_user_access/` - Agregar acceso a usuario
- `POST /api/documents/files/{id}/remove_user_access/` - Remover acceso a usuario

## 💡 Ejemplos de Uso

### Crear Usuario

```bash
curl -X POST http://localhost:8000/api/users/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "nuevo@ejemplo.com",
    "name": "Nuevo Usuario",
    "password": "contraseña123",
    "can_add_documents": true,
    "can_create_folders": true,
    "can_download": true,
    "can_view": true
  }'
```

### Crear Carpeta

```bash
curl -X POST http://localhost:8000/api/documents/folders/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Documentos Importantes",
    "description": "Carpeta para documentos importantes",
    "is_public": false,
    "allowed_users_ids": [2, 3]
  }'
```

### Subir Documento

```bash
curl -X POST http://localhost:8000/api/documents/files/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "name=Reporte Mensual" \
  -F "description=Reporte del mes de octubre" \
  -F "file=@/ruta/al/archivo.pdf" \
  -F "folder=1" \
  -F "is_public=false"
```

### Descargar Documento

```bash
curl -X GET http://localhost:8000/api/documents/files/1/download/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  --output archivo.pdf
```

## 🔒 Seguridad

- Autenticación JWT con tokens de acceso y refresco
- Permisos granulares por usuario
- Control de acceso a nivel de carpeta y documento
- Validación de tipos de archivo permitidos
- Límite de tamaño de archivos (100 MB por defecto)
- Protección CORS configurada

## 🗄️ Base de Datos

Por defecto, el proyecto usa SQLite para desarrollo. Para producción, se recomienda usar PostgreSQL.

### Configurar PostgreSQL

1. Instalar PostgreSQL
2. Crear base de datos
3. Actualizar `.env`:

```env
DB_ENGINE=django.db.backends.postgresql
DB_NAME=core
DB_USER=postgres
DB_PASSWORD=tu_contraseña
DB_HOST=localhost
DB_PORT=5432
```

## 📁 Estructura del Proyecto

```
core/
├── core/          # Configuración del proyecto
│   ├── settings.py       # Configuraciones
│   ├── urls.py          # URLs principales
│   └── wsgi.py          # WSGI config
├── users/               # App de usuarios
│   ├── models.py        # Modelo de usuario
│   ├── serializers.py   # Serializers
│   ├── views.py         # Vistas
│   ├── permissions.py   # Permisos
│   └── urls.py          # URLs
├── documents/           # App de documentos
│   ├── models.py        # Modelos de carpetas y documentos
│   ├── serializers.py   # Serializers
│   ├── views.py         # Vistas
│   ├── permissions.py   # Permisos
│   └── urls.py          # URLs
├── media/               # Archivos subidos
├── requirements.txt     # Dependencias
├── .env.example        # Ejemplo de variables de entorno
└── manage.py           # CLI de Django
```

## 🛠️ Comandos Útiles

```bash
# Crear migraciones
python manage.py makemigrations

# Aplicar migraciones
python manage.py migrate

# Crear superusuario
python manage.py createsuperuser

# Ejecutar servidor
python manage.py runserver

# Ejecutar tests
python manage.py test

# Recolectar archivos estáticos
python manage.py collectstatic

# Crear shell interactivo
python manage.py shell
```

## 🐛 Troubleshooting

### Error: No module named 'rest_framework'

Asegúrate de tener el entorno virtual activado e instalar las dependencias:
```bash
pip install -r requirements.txt
```

### Error: CSRF verification failed

Si estás usando Postman o similar, asegúrate de incluir el token JWT en el header:
```
Authorization: Bearer YOUR_TOKEN
```

### Error al subir archivos grandes

Aumenta el límite en `settings.py`:
```python
FILE_UPLOAD_MAX_MEMORY_SIZE = 200 * 1024 * 1024  # 200 MB
DATA_UPLOAD_MAX_MEMORY_SIZE = 200 * 1024 * 1024  # 200 MB
```

## 📝 Licencia

Este proyecto es privado y confidencial para core.

## 👥 Soporte

Para soporte técnico, contactar al equipo de desarrollo.
