Advertisement
wyrd27

Hono

May 4th, 2025 (edited)
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. app.ts
  2. import { OpenAPIHono } from '@hono/zod-openapi'
  3. import todoRoutes from './routes/todo.js'
  4.  
  5. const app = new OpenAPIHono()
  6.  
  7.  
  8. app.doc('/doc', {
  9. openapi: '3.0.0',
  10. info: {
  11. title: 'Todo API',
  12. version: '1.0.0',
  13. },
  14. })
  15.  
  16. const _app = app
  17. .route("/", todoRoutes)
  18.  
  19.  
  20.  
  21. export type AppType = typeof _app
  22. export default app
  23.  
  24.  
  25. todo.ts
  26.  
  27. import { z, createRoute, OpenAPIHono } from '@hono/zod-openapi'
  28. import { db } from '../db/index.js'
  29. import { todos } from '../db/schema.js'
  30. import { eq } from 'drizzle-orm'
  31. const todoSchema = z
  32. .object({
  33. id: z.number(),
  34. title: z.string(),
  35. completed: z.boolean(),
  36. createdAt: z.number(),
  37. updatedAt: z.number(),
  38. })
  39.  
  40. const getTodosRoute = createRoute({
  41. method: 'get',
  42. path: '/todos',
  43. responses: {
  44. 200: {
  45. description: 'List of todos',
  46. content: {
  47. 'application/json': {
  48. schema: z.array(todoSchema).openapi('TodoList'),
  49. },
  50. },
  51. },
  52. },
  53. })
  54.  
  55. const getTodoByIdRoute = createRoute({
  56. method: 'get',
  57. path: '/todos/:id',
  58. responses: {
  59. 200: {
  60. description: 'Todo item',
  61. content: {
  62. 'application/json': {
  63. schema: todoSchema.openapi('Todo'),
  64. },
  65. },
  66. },
  67. 404: {
  68. description: 'Todo does not exist',
  69. },
  70. },
  71. })
  72.  
  73.  
  74.  
  75. const app = new OpenAPIHono().openapi(getTodosRoute, async (c) => {
  76. const todosList = await db.select().from(todos).all()
  77.  
  78. const todosWithTimestamps = todosList.map(todo => ({
  79. ...todo,
  80. createdAt: new Date(todo.createdAt).getTime(),
  81. updatedAt: new Date(todo.updatedAt).getTime(),
  82. }))
  83.  
  84. return c.json(todosWithTimestamps)
  85. })
  86.  
  87. .openapi(getTodoByIdRoute, async (c) => {
  88. const id = parseInt(c.req.param('id'), 10)
  89. const todo = await db
  90. .select()
  91. .from(todos)
  92. .where(eq(todos.id, id)).limit(1)
  93. .all()
  94.  
  95. if (todo.length === 0) {
  96. return c.json({ error: 'Todo not found' }, 404)
  97. }
  98.  
  99. const todoWithTimestamps = {
  100. ...todo[0],
  101. createdAt: new Date(todo[0].createdAt).getTime(),
  102. updatedAt: new Date(todo[0].updatedAt).getTime(),
  103. }
  104.  
  105. return c.json(todoWithTimestamps)
  106. })
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113. export default app
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement