PharmaGuide Backend es una API REST avanzada desarrollada con Node.js, Express, TypeScript y Prisma ORM, diseñada para respaldar la aplicación móvil PharmaGuide. Esta plataforma educativa innovadora está dirigida a estudiantes de Química Farmacéutica, proporcionando herramientas inteligentes para optimizar su aprendizaje.
El backend gestiona usuarios, contenido educativo, planificación académica adaptativa y comunicación con herramientas de inteligencia artificial integradas y gestionables.
- 🎯 Características Principales
- 🛠️ Tecnologías y Dependencias
- 🏗️ Arquitectura del Proyecto
- 🚀 Instalación y Configuración
- 🗄️ Base de Datos
- 🔐 Autenticación y Seguridad
- 📚 Documentación API
- 🧪 Scripts Disponibles
- 🌐 Despliegue
- 🔧 Configuración Avanzada
- 🧪 Testing
- 🤝 Contribución
- 📄 Licencia
- 👥 Autores
- 📞 Contacto
- Arquitectura escalable con Express.js y TypeScript
- Validación de datos con middleware personalizado
- Manejo de errores centralizado y consistente
- CORS configurado para desarrollo y producción
- Documentación automática con Swagger/OpenAPI 3.0
- JWT (JSON Web Tokens) para autenticación segura
- Bcrypt para hash de contraseñas
- Middleware de autorización para rutas protegidas
- Roles de usuario (Admin, Cliente)
- Sesiones persistentes con tokens de larga duración
- CRUD completo para múltiples proveedores de IA
- Activación/desactivación dinámica de modelos
- Configuración de prompts personalizados
- Soporte para múltiples proveedores (DeepSeek, OpenAI, etc.)
- Versionado de modelos y APIs
- Planes de estudio personalizados por usuario
- Gestión de medicamentos con información detallada
- Categorización por clase terapéutica y mecanismo de acción
- Sistema de tags para organización avanzada
- Registro y autenticación completa
- Perfiles de usuario detallados
- Gestión de roles y permisos
- Soft delete para mantener integridad de datos
- Node.js
>= 18.x
- Runtime de JavaScript - Express.js
^5.1.0
- Framework web rápido y minimalista - TypeScript
^5.8.3
- Superset de JavaScript con tipos estáticos - Prisma ORM
^6.8.2
- ORM moderno para TypeScript y Node.js - PostgreSQL
>= 14
- Base de datos relacional avanzada
{
"dependencies": {
"@prisma/client": "^6.8.2",
"@prisma/extension-accelerate": "^1.3.0",
"bcrypt": "^5.1.1",
"cors": "^2.8.5",
"date-fns": "^4.1.0",
"dotenv": "^16.4.7",
"express": "^5.1.0",
"jsonwebtoken": "^9.0.2",
"swagger-autogen": "^2.23.7",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1"
}
}
{
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.31.0",
"@typescript-eslint/parser": "^5.31.0",
"cross-env": "^7.0.3",
"eslint": "^8.31.0",
"nodemon": "^3.0.0",
"prisma": "^6.6.0",
"ts-node": "^10.9.2",
"ts-node-dev": "^2.0.0"
}
}
- ESLint - Linter para JavaScript/TypeScript
- Prettier - Formateador de código (implícito)
- ts-node-dev - Desarrollo con hot reload
- cross-env - Variables de entorno multiplataforma
- Nodemon - Monitor de archivos para desarrollo
El proyecto sigue una arquitectura modular organizada por características funcionales:
src/
├── app.ts # Configuración principal de Express
├── index.ts # Punto de entrada del servidor
├── modules/ # Módulos funcionales
│ ├── access/ # Autenticación y registro
│ │ ├── controller/ # Controladores
│ │ ├── router/ # Rutas
│ │ └── services/ # Lógica de negocio
│ ├── user/ # Gestión de usuarios
│ ├── role/ # Gestión de roles
│ ├── drug/ # Gestión de medicamentos
│ ├── study-plan/ # Planes de estudio
│ ├── ia-management/ # Gestión de IA
│ └── email/ # Servicios de email
├── types/ # Definiciones de tipos
│ └── express/ # Extensiones de Express
├── utils/ # Utilidades
│ ├── bcrypt/ # Servicios de encriptación
│ ├── jwt/ # Servicios JWT
│ └── helpers/ # Funciones auxiliares
└── swagger.ts # Configuración de Swagger
- MVC (Model-View-Controller) - Separación de responsabilidades
- Repository Pattern - Abstracción de acceso a datos
- Service Layer - Lógica de negocio centralizada
- Middleware Pattern - Interceptores de requests/responses
- Dependency Injection - Inyección de dependencias
// Modelos principales
User // Usuarios del sistema
Role // Roles de usuario
Drug // Medicamentos
StudyPlan // Planes de estudio
ManagementIa // Gestión de IA
- Node.js >= 18.x
- PostgreSQL >= 14
- Git
- npm o yarn
-
Clona el repositorio:
git clone https://github.com/2A2G/pharma-guide-backend.git cd pharma-guide-backend
-
Instala las dependencias:
npm install
-
Configura las variables de entorno:
cp .env.example .env
Edita el archivo
.env
:# Base de datos DATABASE_URL="postgresql://usuario:contraseña@localhost:5432/pharmaguide" # JWT Configuration JWT_SECRET="tu_jwt_secret_muy_seguro" JWT_EXPIRATION="86400" # Configuración del servidor PORT=3000 NODE_ENV=development
-
Configura la base de datos:
# Generar cliente Prisma npx prisma generate # Ejecutar migraciones npx prisma migrate dev --name init # Poblar datos iniciales npx prisma db seed
-
Inicia el servidor:
npm run dev
El proyecto utiliza Prisma ORM con PostgreSQL como base de datos principal.
model User {
id Int @id @default(autoincrement())
full_name String
email String @unique
password String
roleId Int
birth_date DateTime @db.Date
country String?
number_identity String @unique
phone String?
sex String
// Relaciones
role Role @relation(fields: [roleId], references: [id])
studyPlans StudyPlan[]
drug Drug[]
}
model Drug {
id Int @id @default(autoincrement())
name_generic String @db.VarChar(100)
brand_name String @db.VarChar(100)
mechanism_of_action String @db.VarChar(255)
therapeutic_class String? @db.VarChar(100)
tags String?
userId Int
// Relación
user User @relation(fields: [userId], references: [id])
}
model ManagementIa {
id Int @id @default(autoincrement())
name String @db.VarChar(100)
provider String @db.VarChar(100)
api_key String
model String @db.VarChar(100)
status Boolean @default(false)
prompt_description String
url_api String
version String? @db.VarChar(50)
@@unique([provider, model, version])
}
# Generar cliente
npx prisma generate
# Aplicar migraciones
npx prisma migrate dev
# Resetear base de datos
npx prisma migrate reset --force
# Abrir Prisma Studio
npx prisma studio
# Verificar estado
npx prisma migrate status
// Estructura del token
interface JwtPayload {
userId: number;
emailUser: string;
roleId: number;
}
// Middleware de autenticación
app.use('/api/pharma-guide', jwtService.verifyTokenMiddleware);
- Bcrypt para hash de contraseñas (salt rounds: 10)
- JWT con expiración configurable
- CORS habilitado para desarrollo
- Validación de entrada en todos los endpoints
- Soft delete para mantener integridad referencial
- Rate limiting (configuración pendiente)
enum UserRole {
ADMIN = 1,
CLIENT = 2
}
La documentación completa de la API está disponible en:
- Desarrollo:
http://localhost:3000/api-docs
- Producción:
https://api.pharmaguide.com/api-docs
// Autenticación
POST /api/access/pharma-guide/register
POST /api/access/pharma-guide/login
// Usuarios (requiere autenticación)
GET /api/pharma-guide/users
GET /api/pharma-guide/users/:id
PUT /api/pharma-guide/users/:id
DELETE /api/pharma-guide/users/:id
// Medicamentos
GET /api/pharma-guide/drug
POST /api/pharma-guide/drug
PUT /api/pharma-guide/drug/:id
DELETE /api/pharma-guide/drug/:id
// Planes de estudio
GET /api/pharma-guide/study-plans
POST /api/pharma-guide/study-plans
GET /api/pharma-guide/study-plans/:id
PUT /api/pharma-guide/study-plans/:id
DELETE /api/pharma-guide/study-plans/:id
// Gestión de IA
GET /api/pharma-guide/ia-management
POST /api/pharma-guide/ia-management
PUT /api/pharma-guide/ia-management/:id
DELETE /api/pharma-guide/ia-management/:id
// Configuración - Roles
GET /api/pharma-guide/setting/role
POST /api/pharma-guide/setting/role
PUT /api/pharma-guide/setting/role/:id
DELETE /api/pharma-guide/setting/role/:id
# Desarrollo con hot reload
npm run dev
# Modo de prueba
npm run test
# Construcción para producción
npm run build
# Iniciar en producción
npm start
# Linting
npm run lint
{
"scripts": {
"dev": "cross-env NODE_ENV=development ts-node-dev --respawn --transpile-only src/index.ts",
"test": "cross-env NODE_ENV=test ts-node-dev --respawn --transpile-only src/index.ts",
"build": "tsc",
"start": "cross-env NODE_ENV=production node dist/index.js",
"prestart": "npm run build",
"lint": "eslint 'src/**/*.ts' --fix",
"postinstall": "prisma generate"
}
}
# Base de datos
DATABASE_URL="postgresql://user:password@host:port/database"
# JWT
JWT_SECRET="your-super-secret-key"
JWT_EXPIRATION="86400"
# Servidor
PORT=3000
NODE_ENV=production
HOST="api.pharmaguide.com"
-
Preparar la aplicación:
npm run build
-
Configurar base de datos:
npx prisma migrate deploy npx prisma db seed
-
Iniciar en producción:
npm start
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"outDir": "./dist",
"baseUrl": "./",
"rootDir": "./src"
}
}
{
"parser": "@typescript-eslint/parser",
"extends": [
"plugin:@typescript-eslint/recommended",
"eslint:recommended"
],
"rules": {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/explicit-module-boundary-types": "off"
}
}
# Ejecutar tests
npm run test
# Tests con coverage
npm run test:coverage
# Tests en modo watch
npm run test:watch
tests/
├── unit/ # Tests unitarios
├── integration/ # Tests de integración
├── e2e/ # Tests end-to-end
└── fixtures/ # Datos de prueba
- Fork el repositorio
- Crea una rama para tu feature:
git checkout -b feature/amazing-feature
- Realiza tus cambios y commitea:
git commit -m 'feat: Add amazing feature'
- Push a la rama:
git push origin feature/amazing-feature
- Abre un Pull Request
- TypeScript con tipos estrictos
- ESLint para linting
- Conventional Commits para mensajes de commit
- Documentación para funciones públicas
- Tests para nuevas funcionalidades
feat: nueva funcionalidad
fix: corrección de bug
docs: documentación
style: formato de código
refactor: refactorización
test: añadir tests
chore: tareas de mantenimiento
Este proyecto está licenciado bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
MIT License
Copyright (c) 2025 2A2G
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- 2A2G - Desarrollo inicial - GitHub Profile
- Prisma Team por el excelente ORM
- Express.js Community por el framework robusto
- TypeScript Team por el lenguaje tipado
- Estudiantes de Química Farmacéutica por el feedback valioso
Para preguntas, sugerencias o reportar bugs:
- GitHub Issues: Crear Issue
- Email: aldairgguer@gmail.com
- GitHub Profile: @2A2G
© 2025 PharmaGuide Backend - Todos los derechos reservados
Desarrollado por 2A2G