{"id":48807712,"url":"https://github.com/ingfranciscastillo/task-manager-api","last_synced_at":"2026-04-14T06:03:32.602Z","repository":{"id":310777466,"uuid":"1041176239","full_name":"ingfranciscastillo/task-manager-api","owner":"ingfranciscastillo","description":"Una API REST robusta para gestión de tareas construida con Go, Gin, GORM y PostgreSQL.","archived":false,"fork":false,"pushed_at":"2025-08-20T05:27:12.000Z","size":19,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-20T07:21:07.925Z","etag":null,"topics":["api","apis","backend","backend-api","docker","gin","gin-gonic","go","goapi","golang","makefile","postgresql","restapi"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ingfranciscastillo.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-20T05:15:43.000Z","updated_at":"2025-08-20T05:27:16.000Z","dependencies_parsed_at":"2025-08-22T01:15:15.676Z","dependency_job_id":null,"html_url":"https://github.com/ingfranciscastillo/task-manager-api","commit_stats":null,"previous_names":["ingfranciscastillo/task-manager-api"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ingfranciscastillo/task-manager-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ingfranciscastillo%2Ftask-manager-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ingfranciscastillo%2Ftask-manager-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ingfranciscastillo%2Ftask-manager-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ingfranciscastillo%2Ftask-manager-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ingfranciscastillo","download_url":"https://codeload.github.com/ingfranciscastillo/task-manager-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ingfranciscastillo%2Ftask-manager-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31784255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","apis","backend","backend-api","docker","gin","gin-gonic","go","goapi","golang","makefile","postgresql","restapi"],"created_at":"2026-04-14T06:03:30.263Z","updated_at":"2026-04-14T06:03:32.596Z","avatar_url":"https://github.com/ingfranciscastillo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Task Manager API\n\nUna API REST robusta para gestión de tareas construida con Go, Gin, GORM y PostgreSQL.\n\n## ✨ Características\n\n- **Autenticación JWT** - Sistema seguro de autenticación con tokens\n- **CRUD de Tareas** - Crear, leer, actualizar y eliminar tareas\n- **Concurrencia** - Endpoint de resumen que utiliza goroutines para consultas paralelas\n- **Base de datos** - PostgreSQL con migraciones automáticas\n- **Arquitectura limpia** - Código organizado en capas (controllers, services, models)\n- **Docker ready** - Contenedorización completa con Docker Compose\n- **Hashing seguro** - Contraseñas encriptadas con bcrypt\n\n## 🛠️ Tecnologías Utilizadas\n\n- **Go** - Lenguaje de programación\n- **Gin** - Framework web HTTP\n- **GORM** - ORM para Go\n- **PostgreSQL** - Base de datos relacional\n- **JWT** - Autenticación con tokens\n- **Docker** - Contenedorización\n- **bcrypt** - Hashing de contraseñas\n\n## 📋 Endpoints\n\n### Autenticación\n\n- `POST /auth/register` - Registrar usuario\n- `POST /auth/login` - Iniciar sesión\n\n### Tareas (requieren JWT)\n\n- `GET /tasks` - Obtener todas las tareas del usuario\n- `POST /tasks` - Crear nueva tarea\n- `PUT /tasks/:id` - Actualizar tarea\n- `DELETE /tasks/:id` - Eliminar tarea\n- `GET /tasks/summary` - Obtener resumen de tareas (con concurrencia)\n\n### Utilidades\n\n- `GET /health` - Health check de la API\n\n## 🚀 Instalación y Ejecución\n\n### Prerrequisitos\n\n- Go\n- PostgreSQL\n- Docker (opcional)\n- Make (opcional)\n\n### Opción 1: Ejecución Local\n\n#### Clonar el repositorio\n\n```bash\ngit clone https://github.com/ingfranciscastillo/task-manager-api\ncd task-manager\n```\n\n#### Instalar dependencias\n\n```bash\nmake deps\n# o manualmente: go mod download\n```\n\n#### Configurar variables de entorno\n\n```bash\ncp .env.example .env\n# Editar .env con tus configuraciones\n```\n\n#### Crear base de datos\n\n```bash\ncreatedb -U postgres taskmanager\n# o usar: make db-create\n```\n\n#### Ejecutar la aplicación\n\n```bash\nmake run\n# o manualmente: go run cmd/server/main.go\n```\n\n### Opción 2: Docker Compose (Recomendado)\n\n#### Clonar y ejecutar\n\n```bash\ngit clone https://github.com/ingfranciscastillo/task-manager-api\ncd task-manager\ndocker-compose up -d\n```\n\nLa aplicación estará disponible en `http://localhost:9090`\n\n## 📖 Uso de la API\n\n### Registrar usuario\n\n```bash\ncurl -X POST http://localhost:9090/auth/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"email\": \"usuario@ejemplo.com\",\n    \"password\": \"password123\"\n  }'\n```\n\n### Iniciar sesión\n\n```bash\ncurl -X POST http://localhost:9090/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"email\": \"usuario@ejemplo.com\",\n    \"password\": \"password123\"\n  }'\n```\n\n### Crear tarea (requiere token)\n\n```bash\ncurl -X POST http://localhost:9090/tasks \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer \u003ctu-jwt-token\u003e\" \\\n  -d '{\n    \"title\": \"Mi primera tarea\",\n    \"description\": \"Descripción de la tarea\",\n    \"status\": \"pending\"\n  }'\n```\n\n### Obtener tareas\n\n```bash\ncurl -X GET http://localhost:9090/tasks \\\n  -H \"Authorization: Bearer \u003ctu-jwt-token\u003e\"\n```\n\n### Obtener resumen de tareas\n\n```bash\ncurl -X GET http://localhost:9090/tasks/summary \\\n  -H \"Authorization: Bearer \u003ctu-jwt-token\u003e\"\n```\n\n### Actualizar tarea\n\n```bash\ncurl -X PUT http://localhost:9090/tasks/1 \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer \u003ctu-jwt-token\u003e\" \\\n  -d '{\n    \"title\": \"Tarea actualizada\",\n    \"status\": \"completed\"\n  }'\n```\n\n### Eliminar tarea\n\n```bash\ncurl -X DELETE http://localhost:9090/tasks/1 \\\n  -H \"Authorization: Bearer \u003ctu-jwt-token\u003e\"\n```\n\n## 🏗️ Arquitectura del Proyecto\n\n```\ntask-manager/\n├── cmd/server/           # Punto de entrada de la aplicación\n├── internal/\n│   ├── controllers/      # Controladores HTTP (manejo de requests)\n│   ├── services/         # Lógica de negocio\n│   ├── models/          # Modelos de datos (GORM)\n│   ├── middleware/      # Middleware (autenticación, CORS, etc.)\n│   ├── routes/          # Definición de rutas\n│   └── config/          # Configuración (BD, etc.)\n├── pkg/utils/           # Utilidades compartidas\n└── migrations/          # Migraciones de BD (futuro)\n```\n\n## ⚡ Características de Concurrencia\n\nEl endpoint `/tasks/summary` implementa concurrencia usando goroutines y channels:\n\n- Ejecuta 3 consultas en paralelo:\n  - Total de tareas\n  - Tareas completadas\n  - Tareas pendientes\n- Utiliza `sync.WaitGroup` para sincronización\n- Manejo de errores con channels no bloqueantes\n\n## 🔒 Seguridad\n\n- Contraseñas hasheadas con bcrypt (cost 12)\n- JWT con expiración (24 horas)\n- Middleware de autenticación para rutas protegidas\n- Validación de entrada con Gin binding\n- CORS configurado para desarrollo\n\n## 🐳 Docker\n\nEl proyecto incluye:\n\n- Dockerfile multi-stage para optimizar tamaño\n- docker-compose.yml con PostgreSQL\n- Health checks para servicios\n- Volumes persistentes para datos\n\n## 📝 Variables de Entorno\n\n| Variable      | Descripción         | Valor por defecto |\n| ------------- | ------------------- | ----------------- |\n| `DB_HOST`     | Host de PostgreSQL  | `localhost`       |\n| `DB_USER`     | Usuario de BD       | `postgres`        |\n| `DB_PASSWORD` | Contraseña de BD    | `password`        |\n| `DB_NAME`     | Nombre de BD        | `taskmanager`     |\n| `DB_PORT`     | Puerto de BD        | `5432`            |\n| `JWT_SECRET`  | Secreto para JWT    | `requerido`       |\n| `PORT`        | Puerto del servidor | `8080`            |\n| `GIN_MODE`    | Modo de Gin         | `debug`           |\n\n## 🧪 Testing\n\n```bash\n# Ejecutar tests\nmake test\n\n# Con coverage\ngo test -cover ./...\n\n# Test específico\ngo test ./internal/services -v\n```\n\n## 📚 Comandos Make Útiles\n\n```bash\nmake run           # Ejecutar servidor\nmake build         # Compilar aplicación\nmake test          # Ejecutar tests\nmake docker-build  # Construir imagen Docker\nmake db-create     # Crear BD\nmake db-reset      # Reiniciar BD\nmake deps          # Instalar dependencias\nmake help          # Ver todos los comandos\n```\n\n## 🚨 Troubleshooting\n\n### Error de conexión a BD\n\n- Verificar que PostgreSQL esté ejecutándose\n- Revisar variables de entorno en `.env`\n- Verificar que la BD `taskmanager` exista\n\n### Error de JWT\n\n- Verificar que `JWT_SECRET` esté configurado\n- Verificar formato del token: `Bearer \u003ctoken\u003e`\n\n### Error de puerto\n\n- Verificar que el puerto 8080 esté libre\n- Cambiar `PORT` en `.env` si es necesario\n\n## 🤝 Contribución\n\n1. Fork el proyecto\n2. Crear branch de feature (`git checkout -b feature/nueva-caracteristica`)\n3. Commit cambios (`git commit -am 'Agregar nueva característica'`)\n4. Push al branch (`git push origin feature/nueva-caracteristica`)\n5. Crear Pull Request\n\n## 📄 Licencia\n\nEste proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.\n\n## 👨‍💻 Autor\n\nDesarrollado con ❤️ usando Go\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fingfranciscastillo%2Ftask-manager-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fingfranciscastillo%2Ftask-manager-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fingfranciscastillo%2Ftask-manager-api/lists"}