Repository navigation
Releases: muke78/Backend_Portafolio
Release list
0.7.0 - about/education/skills (Fase 5a)
Convierte About/Educación/Habilidades de código estático a tablas reales en Turso, editables vía dashboard igual que projects/experiences.
- about: singleton, solo GET/PUT, upsert real.
- education: lista, CRUD completo.
- skills: lista de categorías, CRUD completo.
Las tres protegidas por JWT admin (Fase 4a) en escritura. Contenido real migrado vía scripts/seed-content.ts (about/education/skills sembrados en Turso, verificado en los 3 idiomas).
0.6.0 - hono/language + best practices
Pedido explicito: sumar `hono/language` y revisar el proyecto contra la guia de best practices de Hono (ver `docs/05-hono-language-and-best-practices.md`).
hono/language
- Configurado con `lookupQueryString: "currentLocale"` - mismo nombre que ya usaba el contrato con Astro, no lo duplica.
- Cambio de comportamiento intencional: `currentLocale` ausente sigue dando 400; presente-pero-no-exacto (`es-MX`, `ES`) ya no se rechaza - se normaliza o cae al fallback.
- Verificado en vivo: `es-MX` devuelve exactamente el mismo contenido que `es` puro.
Best practices
- `export type AppType` agregado (deja la puerta abierta a RPC tipado con `hono/client`).
- El resto de la guia ya se cumplia (sin controllers estilo Rails, `app.route()` ya en uso, sin HEAD dedicado).
Verificacion: 50 tests con `bun test`, verificacion end-to-end contra el servidor real.
Pre-release: vive en `dev`, `main` no se toco.
🤖 Generated with Claude Code
0.5.0 - CRUD de projects/experiences
Fase 4b del plan (ver `docs/04-hono-projects-experiences-crud.md`). Hono no tenia nada de escritura para `projects`/`experiences` - se construye protegido por JWT desde el dia uno.
CRUD real
- `POST/PUT/DELETE /projects`, `POST/PUT/DELETE /experiences`, transacciones reales, cascada de traducciones verificada contra Turso real (`foreign_keys` ON confirmado, no asumido).
Hallazgo de seguridad
- `hono/csrf` bloqueaba con 403 cualquier `DELETE` sin `Content-Type` explicito - corregido y documentado antes de que llegara a produccion (Fase 4c).
Convenciones de codigo nuevas
- Tests por recurso (antes un archivo de 560 lineas).
- Limite de 250 lineas por archivo.
- `HTTPException` de Hono en vez de `c.json` manual en cada corte temprano.
- Tipos centralizados en `src/interfaces/interfaces.ts`.
- Log de auditoria en cada escritura admin (OWASP A09).
- Doc con tabla de cobertura OWASP Top 10 completa.
Verificacion: end-to-end contra Turso real, 49 tests con `bun test`.
Pre-release: vive en `dev`, `main` no se toco.
🤖 Generated with Claude Code
0.4.0 - JWT de sesion admin + tabla users
Fase 4a del plan (ver `docs/03-hono-admin-auth.md`). Cierra el hallazgo 3 de `docs/00-auditoria.md`.
Auth real, por fin
- Tabla `users` (Argon2id via `Bun.password`, nativo) reemplaza `ADMIN_PASSWORD` en env var.
- `scripts/seed-admin-user.ts`: interactivo, la contraseña nunca toca chat/archivo/argumento.
- `POST /auth/login` firma un JWT (`hono/jwt`, HS256, 2h) con clave distinta del `API_TOKEN` fijo.
- `adminAuth.middleware.ts` protege `GET/PUT` admin de `comments`/`contact-messages`.
Infraestructura
- `__drizzle_migrations` reparada de verdad esta vez - el intento de la Fase 3 nunca se aplico.
Verificacion
- End-to-end contra Turso real: ciclo completo de moderacion (pending -> admin lo ve con JWT -> aprobado -> publico) confirmado en produccion, con limpieza inmediata.
- 28 tests con `bun test`.
Pendiente: Fase 4b (CRUD de `projects`/`experiences`) y Fase 4c (repo Portafolio, login real).
Pre-release: vive en `dev`, `main` no se toco.
🤖 Generated with Claude Code
0.3.0 - Moderacion de comentarios + fin de Telegram
Fase 3 del plan de auditoria (ver `docs/02-comentarios-y-contacto.md`). Cierra el hallazgo 1 de `docs/00-auditoria.md` (causa raiz del hackeo de 800 comentarios) del lado del backend.
Moderacion de comentarios
- `comments.status` (`pending`/`published`/`hidden`): `POST /comments` siempre inserta `pending`, `GET /comments` publico filtra `published`. Un comentario nuevo nunca se publica en vivo solo.
Fin de Telegram, centro de mensajes real
- Tabla `contact_messages` nueva, reemplaza al modulo de Telegram (eliminado por completo).
- `POST /contact-messages` valida con Zod de verdad (el `/tlgrm` viejo no validaba nada) y guarda `phone` como string (el viejo lo forzaba a `Number`, bug real con telefonos con formato).
Hallazgo de infraestructura
- `bun run db:migrate` estaba roto: `__drizzle_migrations` desincronizada de los archivos de migracion (6 migraciones aplicadas sin registrar). Corregido sin re-ejecutar ninguna migracion vieja.
Verificacion
- End-to-end contra Turso real: confirmado que un comentario `pending` no aparece en el listado publico.
- 16 tests con `bun test`, cero tocan Turso/red real.
Pendiente, otro repo: Portafolio necesita apuntar el form de contacto a `/api/contact-messages` y conectar rate limiting al proxy publico de comentarios.
Pre-release: vive en `dev`, `main` no se toco en esta ronda.
🤖 Generated with Claude Code
0.2.0 - Backup de Turso
Fase 2 del plan de auditoria (ver `docs/01-backup-turso.md`).
- `scripts/backup-turso.ts`: backup completo de la Turso real, tabla por tabla, a JSON local. Descubre las tablas via `sqlite_master` en vez de hardcodear la lista.
- Resuelve una pregunta abierta de `docs/04-migracion-datos.md` (repo Portafolio): `experience_translations` si existe como tabla separada (mismo patron que `projects`/`project_translations`) - no hace falta migrar nada ahi.
- Corrida real hoy: 6 tablas (`comments`, `experience`, `experience_translations`, `projects`, `project_translations`, `__drizzle_migrations`), 0 errores, sin datos de prueba que limpiar.
- `backups/` en `.gitignore` - contiene PII real, nunca se commitea.
- De paso: la `version` del health check ahora se lee de `package.json` en vez de estar hardcodeada.
Pre-release: vive en `dev`, `main` no se toco en esta ronda.
🤖 Generated with Claude Code
0.1.0 - Hardening de Hono + testing
Fase 1 del plan de auditoria (ver docs/00-auditoria.md para el detalle completo).
Seguridad
- Rate limiting propio en
POST /commentsyPOST /tlgrm- cierra el vector real del hackeo de ~800 comentarios. basePathsimplificado a/api- ya no un UUID tratado como pseudo-secreto (aparecia en texto plano en cada log de acceso).hono/secure-headers,hono/body-limit,hono/csrf,hono/timeoutnuevos.errorHandlerrespeta el status/mensaje real deHTTPExceptionen vez de aplanar todo a 500.- Dependencias actualizadas:
bun audit46 -> 3 vulnerabilidades (las 3 restantes documentadas).
Correccion de bugs
count()agregado en vez deSELECT *completo para alternardirectionen comentarios (N+1 real).- Logs movidos a consola - los de archivo nunca funcionaron en produccion (filesystem read-only en Vercel serverless).
- Respuesta de error de Zod normalizada al shape
ApiResponse.
Testing
- 15 tests con
bun test, cero tocan Turso o Telegram reales. .husky/pre-pushnuevo: biome + tsc + bun test antes de cada push.
Primera version real: este repo no tenia "version" en package.json hasta ahora.
Pre-release: vive en dev, main no se toco en esta ronda.
🤖 Generated with Claude Code
0.0.3
What's Changed
- fix(adaptation): Global configuration fix in config ts and adaptation of tables from drizzle on migrations by @muke78 in #4
- feat(logger): Log files are added to collect data about the requests made. by @muke78 in #5
- fix(extensions): tsconfig for code extensions is improved and a new field has been added to turso and adaptation imports runtime by @muke78 in #6
- deploy(Improvements): Typing adaptations and semantic improvements to the backend, loggers, and protection of unauthenticated sites by @muke78 in #7
Full Changelog: 0.0.2...0.0.3
0.0.2
0.0.1
Full Changelog: https://github.com/muke78/Backend_Portafolio/commits/0.0.0
What's Changed
- feat(setup): Initial setup with drizzle by @muke78 in #1
- feat(controllers): Implementation of functions for controllers such as comments, projects, experiences and chatbot telegram by @muke78 in #2
- deploy(functions): Backend deployment in pull to the main branch by @muke78 in #3
New Contributors
Full Changelog: 0.0.0...0.0.1