Skip to content

GAlonso46/Tag-based-file-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

57 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🏷️ Tag-Based File System

Sistema de gestiΓ³n de archivos basado en etiquetas con interfaz web moderna y API REST.

Version Python FastAPI

πŸ“‹ CaracterΓ­sticas

  • βœ… Subir archivos con drag & drop
  • πŸ” BΓΊsqueda inteligente por mΓΊltiples tags (operador AND)
  • 🏷️ GestiΓ³n de etiquetas flexible (aΓ±adir, eliminar, editar)
  • πŸ“Š EstadΓ­sticas en tiempo real (archivos, tags, espacio usado)
  • 🎨 Interfaz moderna tipo Google Drive/Pinterest
  • πŸš€ API REST completa con documentaciΓ³n automΓ‘tica
  • πŸ’Ύ Persistencia local con JSON y sistema de archivos

πŸš€ Inicio RΓ‘pido

Opción A: Docker Compose (Recomendado para Producción) 🐳

# 1. Construir imΓ‘genes
docker-compose build

# 2. Iniciar servicios
docker-compose up -d

# 3. Verificar estado
docker-compose ps

La aplicaciΓ³n estarΓ‘ disponible en:

Para detener:

docker-compose down

Opción B: Docker Swarm (2 PCs Distribuidas) 🌐

Ver DOCKER_SWARM_GUIDE.md para instrucciones completas.

# Construir imΓ‘genes
./build-images.sh  # Linux/Mac
# o
.\build-images.ps1  # Windows

# Desplegar en Swarm
docker stack deploy -c docker-stack.yml tagfs

Opción C: Script AutomÑtico (Desarrollo Local) ⭐

# 1. Instalar dependencias (solo la primera vez)
pip install -r requirements.txt

# 2. Ejecutar todo con un solo comando
.\start.ps1

Β‘Eso es todo! El script:

  • βœ… Inicia la API en una nueva ventana
  • βœ… Espera a que estΓ© lista
  • βœ… Abre el frontend automΓ‘ticamente

OpciΓ³n D: Manual (MΓ‘s Control)

⚠️ IMPORTANTE: Necesitas 2 terminales separadas

Terminal 1 - API (dejar abierta)

# 1. Instalar dependencias (solo la primera vez)
pip install -r requirements.txt

# 2. Iniciar servidor API
python run_api.py

# Β‘NO CIERRES ESTA TERMINAL!

La API estarΓ‘ disponible en:

Terminal 2 - Frontend (nueva terminal)

# En una NUEVA terminal de PowerShell
start frontend\index.html

πŸ’‘ Tip: Usa VS Code y abre 2 terminales integradas (botΓ³n "+" en el panel de terminales)


πŸ“ Estructura del Proyecto

Tag-based-file-system/
β”œβ”€β”€ 🎨 frontend/
β”‚   └── index.html              # Interfaz web completa (single-page)
β”‚
β”œβ”€β”€ πŸ”§ api/
β”‚   β”œβ”€β”€ __init__.py
β”‚   └── main.py                 # API REST con FastAPI
β”‚
β”œβ”€β”€ πŸ“¦ tags/
β”‚   β”œβ”€β”€ cli/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── app.py              # CLI original (legacy)
β”‚   β”œβ”€β”€ core/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── tag_service.py      # LΓ³gica de negocio
β”‚   β”œβ”€β”€ data/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── file_store.py       # Capa de persistencia
β”‚   β”œβ”€β”€ utils/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── helpers.py          # Utilidades
β”‚   └── config.py               # ConfiguraciΓ³n
β”‚
β”œβ”€β”€ πŸ“‚ tags_data/
β”‚   └── files/
β”‚       β”œβ”€β”€ files.json          # Metadata (tags por archivo)
β”‚       └── [archivos subidos]  # Archivos binarios
β”‚
β”œβ”€β”€ πŸ§ͺ tests/
β”‚   └── test_db.py              # Tests unitarios
β”‚
β”œβ”€β”€ main.py                     # CLI legacy
β”œβ”€β”€ run_api.py                  # Script para ejecutar la API
β”œβ”€β”€ requirements.txt            # Dependencias
└── README.md                   # Este archivo

🎯 Endpoints de la API

πŸ“€ Subir Archivo

POST /files
Content-Type: multipart/form-data

file: <archivo>
tags: "trabajo,importante,pdf"

πŸ“‹ Listar Archivos

GET /files
GET /files?tags=trabajo,importante  # Filtrar por tags

⬇️ Descargar Archivo

GET /files/{filename}

πŸ—‘οΈ Eliminar Archivo

DELETE /files/{filename}

✏️ Actualizar Tags (reemplazar)

PATCH /files/{filename}/tags
Content-Type: application/json

{
  "tags": ["nuevo", "tags"]
}

βž• AΓ±adir Tags (sin eliminar existentes)

POST /files/{filename}/tags
Content-Type: application/json

{
  "tags": ["extra", "tags"]
}

βž– Eliminar Tags EspecΓ­ficos

DELETE /files/{filename}/tags
Content-Type: application/json

{
  "tags": ["tag_a_eliminar"]
}

🏷️ Obtener Todos los Tags

GET /tags

# Respuesta:
{
  "tags": [
    {"name": "trabajo", "count": 5},
    {"name": "importante", "count": 3}
  ],
  "total": 2
}

πŸ“Š EstadΓ­sticas

GET /stats

# Respuesta:
{
  "total_files": 10,
  "total_tags": 15,
  "total_size_bytes": 2048000,
  "total_size_mb": 2.05
}

🎨 Interfaz Web

CaracterΓ­sticas de la UI:

  1. 🎯 Barra de Búsqueda: Filtra archivos por tags múltiples
  2. πŸ“€ Upload Zone: Drag & drop o click para subir
  3. 🏷️ Tags Populares: Click para filtrar rÑpidamente
  4. πŸ“Š EstadΓ­sticas: Vista en tiempo real del sistema
  5. πŸ—‚οΈ Grid de Archivos: Tarjetas con preview, tags y acciones
  6. ✏️ Edición Inline: Modifica tags sin recargar
  7. 🎨 Diseño Responsive: Funciona en móvil, tablet y desktop

Capturas de Pantalla:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  🏷️ Tag-Based File System                          β”‚
β”‚  Organiza tus archivos con etiquetas inteligentes   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  πŸ“Š 10 Archivos  β”‚  🏷️ 15 Tags  β”‚  πŸ’Ύ 2.05 MB      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  πŸ” [Buscar por tags...]        [πŸ“€ Subir archivo] β”‚
β”‚  Tags: [trabajo (5)] [importante (3)] [pdf (2)]     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  πŸ“„ documento.pdf    πŸ–ΌοΈ foto.jpg    πŸ“Š datos.xlsx  β”‚
β”‚  [trabajo] [pdf]     [personal]      [trabajo]      β”‚
β”‚  ⬇️ ✏️ πŸ—‘οΈ            ⬇️ ✏️ πŸ—‘οΈ         ⬇️ ✏️ πŸ—‘οΈ       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ§ͺ Testing

# Ejecutar todos los tests
pytest tests

# Con verbose
pytest tests -v

# Con cobertura
pytest tests --cov=tags

πŸ’» CLI Original (Legacy)

El proyecto mantiene la CLI original para compatibilidad:

# Modo interactivo
python main.py

# Modo no interactivo
python main.py add "C:\path\archivo.txt" "importante,proyecto"

Comandos CLI: add, delete, list, add-tags, delete-tags, show, exit


πŸ› οΈ TecnologΓ­as Utilizadas

Backend:

  • Python 3.10+
  • FastAPI - Framework web moderno y rΓ‘pido
  • Uvicorn - Servidor ASGI
  • Pydantic - ValidaciΓ³n de datos
  • Python-multipart - Para upload de archivos

Frontend:

  • HTML5 + CSS3 + Vanilla JavaScript
  • Sin frameworks - Ligero y rΓ‘pido
  • Responsive Design
  • Drag & Drop API
  • Fetch API para comunicaciΓ³n con backend

Storage:

  • Sistema de archivos para binarios
  • JSON para metadata (tags)

πŸ“ Ejemplos de Uso

Ejemplo 1: Subir archivo con Python

import requests

url = "http://localhost:8000/files"
files = {"file": open("documento.pdf", "rb")}
data = {"tags": "trabajo,importante,pdf"}

response = requests.post(url, files=files, data=data)
print(response.json())

Ejemplo 2: Buscar archivos con curl

# Todos los archivos
curl http://localhost:8000/files

# Filtrar por tags
curl "http://localhost:8000/files?tags=trabajo,importante"

# EstadΓ­sticas
curl http://localhost:8000/stats

Ejemplo 3: Actualizar tags con JavaScript

const response = await fetch('http://localhost:8000/files/documento.pdf/tags', {
  method: 'PATCH',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ tags: ['nuevo', 'actualizado'] })
});

πŸ”§ ConfiguraciΓ³n

Puedes modificar el directorio de datos editando tags/config.py:

from pathlib import Path

DATA_DIR = Path("./tags_data")        # Directorio base
FILES_DIRNAME = "files"               # Carpeta de archivos
META_FILENAME = "files.json"          # Archivo de metadata

O pasar un directorio personalizado:

from tags.core.tag_service import TagService

service = TagService(data_dir="./mi_directorio")

πŸš€ Roadmap Futuro

  • πŸ” AutenticaciΓ³n y usuarios mΓΊltiples
  • ☁️ IntegraciΓ³n con cloud storage (S3, Google Drive)
  • πŸ”„ SincronizaciΓ³n en tiempo real (WebSockets)
  • πŸ€– Auto-tagging con ML (reconocimiento de imΓ‘genes/texto)
  • πŸ“± App mΓ³vil (React Native)
  • πŸ” BΓΊsqueda full-text en contenido de archivos
  • 🎨 Temas personalizables (dark mode)
  • πŸ“¦ Versionado de archivos
  • πŸ”— Compartir archivos con links pΓΊblicos
  • πŸ“Š Dashboard de analytics avanzado

πŸ“„ Licencia

Este proyecto estΓ‘ bajo la licencia que se encuentra en el archivo LICENSE.


πŸ‘¨β€πŸ’» Autores

GAlonso46


πŸ™ Agradecimientos

Proyecto desarrollado para la materia de Sistemas Distribuidos (4to aΓ±o).


Β‘Disfruta organizando tus archivos con tags! πŸŽ‰

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages