Asterium es una API REST desarrollada con Node.js, Express, TypeScript y Sequelize,
diseñada para gestionar descubrimientos astronómicos con autenticación, roles y carga de imágenes.
- 🌠 ASTERIUM SERVER
- Usuarios con roles (admin y user).
- CRUD completo de descubrimientos astronómicos.
- Carga flexible de imágenes por archivo o URL (Cloudinary).
- Validación de datos con Zod.
- ORM Sequelize + MySQL.
- Middlewares personalizados para autenticación, validación y seguridad.
- Pruebas con Jest y Supertest.
| Rol | Listar | Ver detalle | Crear | Editar | Eliminar |
|---|---|---|---|---|---|
| Usuario | ✅ | ✅ | ✅ | ✅ (solo propios) | ✅ (solo propios) |
| Admin | ✅ | ✅ | ✅ | ✅ (todos) | ✅ (todos) |
Solo los usuarios autenticados pueden crear, editar o eliminar sus propios descubrimientos.
Los administradores tienen control total sobre todos los registros.
| Categoría | Tecnologías |
|---|---|
| Lenguaje | TypeScript |
| Framework | Express.js |
| ORM / DB | Sequelize + MySQL |
| Validación | Zod |
| Seguridad | Helmet · CORS · JWT |
| Imágenes | Cloudinary + Multer |
| Testing | Jest · Supertest |
| Documentación | Postman |
src/
├─ config/ # Configuración (p.ej. Cloudinary)
├─ controllers/ # Lógica de negocio (Asterium, Auth, Users)
├─ middlewares/ # Auth, roles, validaciones
├─ models/ # Modelos Sequelize
├─ routes/ # Endpoints
├─ schemas/ # Validaciones Zod
├─ seeders/ # Datos iniciales
├─ tests/ # Pruebas unitarias
├─ db.ts # Conexión MySQL
├─ app.ts # Configuración Express
└─ index.ts # Punto de entrada1️⃣ Clonar el repositorio
git clone https://github.com/Asterium360/Aster-Server.git
cd Aster-Server2️⃣ Instalar dependencias
npm install3️⃣ Variables de entorno Crea un archivo .env en la raíz del proyecto con el siguiente contenido:
DB_NAME=asterium
DB_USER=root
DB_PASSWORD=tu_contraseña
DB_HOST=localhost
DB_PORT=3306
JWT_SECRET=tu_token_secreto
PORT=40004️⃣ Ejecutar el servidor
npm run devServidor disponible en 👉 http://localhost:4000
Multer + CloudinaryStorage
📁 Carpeta automática: Asterium_Discoveries
🌐 Se aceptan archivos locales y URLs externas:
const image_url = req.file?.path || body.image_url || null;Si el usuario pega un link desde una web externa, la API también lo guarda sin subir archivo.
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| POST | /auth/register | Registrar usuario | ❌ |
| POST | /auth/login | Iniciar sesión (JWT) | ❌ |
| PUT | /auth/promote/:id | Promover usuario a admin | ✅ Solo admin |
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| GET | /asterium | Lista de descubrimientos | ✅ Logueados |
| GET | /asterium/:id | Ver detalle | ✅ Logueados |
| POST | /asterium | Crear nuevo descubrimiento | ✅ user/admin |
| PUT | /asterium/:id | Editar (propio) o admin | ✅ user/admin |
| DELETE | /asterium/:id | Eliminar (propio) o admin | ✅ user/admin |
📊 Diagrama en dbdiagram.io 📁 Ver colección en db.io
Table users {
id int [pk, increment]
email varchar(191) [unique, not null]
username varchar(50) [unique, not null]
password_hash varchar(100) [not null]
role_id int
display_name varchar(100)
is_active boolean [default: true]
created_at datetime
updated_at datetime
}
Table roles {
id int [pk, increment]
name varchar(50) [unique, not null]
}
Table asteriums {
id int [pk, increment]
author_id int [not null]
title varchar(255) [not null]
excerpt text
content_md text [not null]
status varchar(20) [default: 'draft']
image_url varchar(500)
like_count int [default: 0]
published_at datetime
created_at datetime
updated_at datetime
}
Table contact_messages {
id int [pk, increment]
user_id int [not null]
name varchar(120) [not null]
email varchar(191) [not null]
subject varchar(200)
message text [not null]
status varchar(20) [default: 'new']
created_at datetime
updated_at datetime
}
Ref: users.role_id > roles.id
Ref: asteriums.author_id > users.id
Ref: contact_messages.user_id > users.idArchivo Propósito auth.test.ts Registro, login y JWT asterium.test.ts CRUD de descubrimientos auth.ts Middleware de autenticación checkRole.ts Middleware de control de roles
Ejecutar pruebas:
npm run testEsta colección incluye todos los endpoints organizados por módulos, con ejemplos funcionales, tokens de prueba y respuestas esperadas.
| 📦 Módulo | 🌐 Endpoint | ⚙️ Método | 📝 Descripción |
|---|---|---|---|
| Usuarios (Auth) | /auth/register | POST | Registra un nuevo usuario |
| Usuarios (Auth) | /auth/login | POST | Inicia sesión y devuelve un token JWT |
| Usuarios (Auth) | /auth/promote/:id | PUT | Promueve un usuario normal a admin |
| Descubrimientos (Asterium) | /asterium | GET | Lista todos los descubrimientos |
| Descubrimientos (Asterium) | /asterium/:id | GET | Obtiene el detalle de un descubrimiento |
| Descubrimientos (Asterium) | /asterium | POST | Crea un nuevo descubrimiento |
| Descubrimientos (Asterium) | /asterium/:id | PUT | Actualiza un descubrimiento existente |
| Descubrimientos (Asterium) | /asterium/:id | DELETE | Elimina un descubrimiento |
Las rutas protegidas requieren autenticación mediante token JWT:
Authorization: Bearer <tu_token>Importar la colección manualmente:
Descarga el archivo Asterium_API.postman_collection.json
Abre Postman → pestaña Collections
Clic en Import → selecciona el archivo JSON
Verás todas las peticiones organizadas por módulos con ejemplos de uso. Ideal para equipos: asegura que todos trabajen con la misma versión documentada de la API.
| Rol | Integrante |
|---|---|
| 🧭 Scrum Master | Anggy Pereira |
| 🚀 Backend Developer | Maryori Cruz |
| 🚀 Backend Developer | Sofía Reyes |
Proyecto desarrollado en Factoría F5 – Bootcamp FullStack & DevOps (2025) Diseñado aplicando buenas prácticas de arquitectura, seguridad y documentación profesional.
✨ "El universo es infinito y nuestra curiosidad también." Asterium Backend Team – 2025