routes_migrations.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { Hono } from 'hono'
  2. import { APIClient } from '@d8d-appcontainer/api'
  3. import type { Variables } from './app.tsx'
  4. import type { WithAuth } from './app.tsx'
  5. import { migrations } from './migrations.ts'
  6. import debug from "debug";
  7. const log = {
  8. api: debug("api:migrations"),
  9. };
  10. export function createMigrationsRoutes(withAuth: WithAuth) {
  11. const migrationsRoutes = new Hono<{ Variables: Variables }>()
  12. migrationsRoutes.get('/', async (c) => {
  13. const apiClient = c.get('apiClient')
  14. log.api('正在执行数据库迁移...')
  15. const migrationsResult = await apiClient.database.executeLiveMigrations(migrations)
  16. // log.app('数据库迁移完成 %O',migrationsResult)
  17. const failedResult = migrationsResult?.find((migration) => migration.status === 'failed')
  18. if (failedResult) {
  19. log.api('数据库迁移失败 %O', failedResult)
  20. return c.json({ error: '数据库迁移失败', failedResult }, 500)
  21. }
  22. return c.json({ success: true })
  23. })
  24. migrationsRoutes.get('/history', async (c) => {
  25. const apiClient = c.get('apiClient')
  26. log.api('正在执行数据库迁移...')
  27. const MIRGRATIONS_TABLE = 'knex_migrations'
  28. const hasTable = await apiClient.database.schema.hasTable(MIRGRATIONS_TABLE);
  29. let history = []
  30. if(hasTable)
  31. history = await apiClient.database.table(MIRGRATIONS_TABLE).orderBy('id', 'desc')
  32. return c.json({
  33. success: true,
  34. history
  35. })
  36. })
  37. migrationsRoutes.get('/rollback', async (c) => {
  38. const apiClient = c.get('apiClient')
  39. const all = c.req.query('all') === 'true'
  40. log.api('正在执行数据库回滚...')
  41. const rollbackResult = await apiClient.database.rollbackLiveMigrations(migrations, all)
  42. const failedResult = rollbackResult?.find((migration) => migration.status === 'failed')
  43. if (failedResult) {
  44. log.api('数据库回滚失败 %O', failedResult)
  45. return c.json({ error: '数据库回滚失败', failedResult }, 500)
  46. }
  47. return c.json({ success: true })
  48. })
  49. return migrationsRoutes
  50. }