http.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import * as account from './account/api'
  2. import * as herd from './herd/api'
  3. import * as task from './task/api'
  4. import type { Context } from './types'
  5. import type { ErrorRequestHandler } from 'express'
  6. import express from 'express'
  7. import { http } from '@edge/misc-utils'
  8. /** Create an Express application. */
  9. function createExpress(ctx: Context) {
  10. // Initialize app with JSON and auth middleware
  11. const app = express()
  12. app.use(express.json())
  13. app.use(ctx.auth.verifyRequestMiddleware)
  14. const prefix = ctx.config.api.prefix
  15. // Account APIs
  16. app.post(`${prefix}/account`, account.createAccount(ctx))
  17. app.get(`${prefix}/account/:id?`, account.getAccount())
  18. app.put(`${prefix}/account/:id?`, account.updateAccount(ctx))
  19. app.delete(`${prefix}/account/:id?`, account.deleteAccount(ctx))
  20. // Herd APIs
  21. app.get(`${prefix}/herds`, herd.searchHerds(ctx))
  22. app.post(`${prefix}/herd`, herd.createHerd(ctx))
  23. app.get(`${prefix}/herd/:id`, herd.getHerd(ctx))
  24. app.put(`${prefix}/herd/:id`, herd.updateHerd(ctx))
  25. app.delete(`${prefix}/herd/:id`, herd.deleteHerd(ctx))
  26. // Task APIs
  27. app.get(`${prefix}/tasks`, task.searchTasks(ctx))
  28. app.get(`${prefix}/herd/:herd/tasks`, task.searchTasks(ctx))
  29. app.post(`${prefix}/task`, task.createTask(ctx))
  30. app.get(`${prefix}/task/:id`, task.getTask(ctx))
  31. app.put(`${prefix}/task/:id`, task.updateTask(ctx))
  32. app.delete(`${prefix}/task/:id`, task.deleteTask(ctx))
  33. // Task patch APIs
  34. app.patch(`${prefix}/task/:id/done`, task.toggleTaskDone(ctx))
  35. app.patch(`${prefix}/task/:id/move/:position`, task.moveTask(ctx))
  36. // Authentication APIs
  37. app.post(`${prefix}/login/account`, account.loginAccount(ctx))
  38. // Add middleware to handle any errors forwarded from previous handlers via `next(err)`
  39. const catchError: ErrorRequestHandler = (err, req, res, next) => {
  40. if (!res.headersSent) {
  41. http.internalServerError(res, next, { reason: (err as Error).message })
  42. }
  43. ctx.log.error(err)
  44. }
  45. app.use(catchError)
  46. // Add request logging middleware
  47. app.use((req, res, next) => {
  48. ctx.log.debug(`[${req.socket.remoteAddress}] ${req.method} ${req.url} ${res.statusCode}`)
  49. next()
  50. })
  51. return app
  52. }
  53. export default createExpress