Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- app.ts
- import { OpenAPIHono } from '@hono/zod-openapi'
- import todoRoutes from './routes/todo.js'
- const app = new OpenAPIHono()
- app.doc('/doc', {
- openapi: '3.0.0',
- info: {
- title: 'Todo API',
- version: '1.0.0',
- },
- })
- const _app = app
- .route("/", todoRoutes)
- export type AppType = typeof _app
- export default app
- todo.ts
- import { z, createRoute, OpenAPIHono } from '@hono/zod-openapi'
- import { db } from '../db/index.js'
- import { todos } from '../db/schema.js'
- import { eq } from 'drizzle-orm'
- const todoSchema = z
- .object({
- id: z.number(),
- title: z.string(),
- completed: z.boolean(),
- createdAt: z.number(),
- updatedAt: z.number(),
- })
- const getTodosRoute = createRoute({
- method: 'get',
- path: '/todos',
- responses: {
- 200: {
- description: 'List of todos',
- content: {
- 'application/json': {
- schema: z.array(todoSchema).openapi('TodoList'),
- },
- },
- },
- },
- })
- const getTodoByIdRoute = createRoute({
- method: 'get',
- path: '/todos/:id',
- responses: {
- 200: {
- description: 'Todo item',
- content: {
- 'application/json': {
- schema: todoSchema.openapi('Todo'),
- },
- },
- },
- 404: {
- description: 'Todo does not exist',
- },
- },
- })
- const app = new OpenAPIHono().openapi(getTodosRoute, async (c) => {
- const todosList = await db.select().from(todos).all()
- const todosWithTimestamps = todosList.map(todo => ({
- ...todo,
- createdAt: new Date(todo.createdAt).getTime(),
- updatedAt: new Date(todo.updatedAt).getTime(),
- }))
- return c.json(todosWithTimestamps)
- })
- .openapi(getTodoByIdRoute, async (c) => {
- const id = parseInt(c.req.param('id'), 10)
- const todo = await db
- .select()
- .from(todos)
- .where(eq(todos.id, id)).limit(1)
- .all()
- if (todo.length === 0) {
- return c.json({ error: 'Todo not found' }, 404)
- }
- const todoWithTimestamps = {
- ...todo[0],
- createdAt: new Date(todo[0].createdAt).getTime(),
- updatedAt: new Date(todo[0].updatedAt).getTime(),
- }
- return c.json(todoWithTimestamps)
- })
- export default app
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement