routes_migrations.ts 2.0 KB

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