xiongzhu 1 年之前
父節點
當前提交
0abc2970e4
共有 8 個文件被更改,包括 95 次插入13 次删除
  1. 1 1
      bindings.d.ts
  2. 9 0
      migrations/0001_init.sql
  3. 4 1
      package.json
  4. 0 1
      scripts/migration.ts
  5. 9 0
      src/database.ts
  6. 6 5
      src/index.ts
  7. 36 5
      src/routes/users-route.ts
  8. 30 0
      src/types.ts

+ 1 - 1
bindings.d.ts

@@ -4,4 +4,4 @@ type Environment = {
         DB: D1Database
     }
     Variables: {}
-}
+}

+ 9 - 0
migrations/0001_init.sql

@@ -0,0 +1,9 @@
+-- Migration number: 0001 	 2024-03-24T17:57:51.379Z
+create table if not exists user (
+    id integer primary key autoincrement,
+    name varchar(255),
+    email varchar(255),
+    password varchar(255),
+    created_at timestamp not null default current_timestamp
+);
+

+ 4 - 1
package.json

@@ -5,7 +5,10 @@
     "preview": "wrangler preview --watch src/index.ts"
   },
   "dependencies": {
-    "hono": "^4.1.3"
+    "@hono/swagger-ui": "^0.2.1",
+    "hono": "^4.1.3",
+    "kysely": "^0.27.3",
+    "kysely-d1": "^0.3.0"
   },
   "devDependencies": {
     "@cloudflare/workers-types": "^4.20240208.0",

+ 0 - 1
scripts/migration.ts

@@ -1 +0,0 @@
-import { env, getRuntimeKey } from 'hono/adapter'

+ 9 - 0
src/database.ts

@@ -0,0 +1,9 @@
+import { Context } from "hono"
+import { Database } from "./types"
+import { Kysely } from "kysely"
+import { D1Dialect } from "kysely-d1"
+export const getDB = (c: Context<Environment>) => {
+    return new Kysely<Database>({
+        dialect: new D1Dialect({ database: c.env.DB })
+    })
+}

+ 6 - 5
src/index.ts

@@ -1,12 +1,13 @@
 import { Hono } from "hono"
 import UserRoute from "./routes/users-route"
+import { swaggerUI } from "@hono/swagger-ui"
+import { cors } from "hono/cors"
+import { showRoutes } from "hono/dev"
 
 const app = new Hono<Environment>()
 
-app.get("/:id", c => {
-    c.req.param('id')
-    return c.text("Hello World!")
-})
-app.route("/users", UserRoute)
+app.use("/*", cors())
 
+app.route("/users", UserRoute)
+showRoutes(app)
 export default app

+ 36 - 5
src/routes/users-route.ts

@@ -1,13 +1,44 @@
 import { Hono } from "hono"
-
+import { getDB } from "../database"
 const route = new Hono<Environment>()
 
-route.get("/", c => {
-    return c.text("Hello User!")
+route.get("/:id", async c => {
+    const db = getDB(c)
+    return c.json(
+        await db
+            .selectFrom("user")
+            .where("id", "=", Number(c.req.param("id")))
+            .selectAll()
+            .executeTakeFirstOrThrow()
+    )
+})
+
+route.patch("/:id", async c => {
+    const db = getDB(c)
+    const body = await c.req.json()
+    await db
+        .updateTable("user")
+        .set(body)
+        .where("id", "=", Number(c.req.param("id")))
+        .executeTakeFirstOrThrow()
+    return c.text("")
+})
+
+route.get("/", async c => {
+    const db = getDB(c)
+    return c.json(await db.selectFrom("user").selectAll().execute())
 })
 
-route.post("/", c => {
-    return c.text("User created!")
+route.post("/", async c => {
+    const db = getDB(c)
+    const user = await db
+        .insertInto("user")
+        .values({
+            name: "John Doe"
+        })
+        .returningAll()
+        .executeTakeFirstOrThrow()
+    return c.json(user)
 })
 
 export default route

+ 30 - 0
src/types.ts

@@ -0,0 +1,30 @@
+import {
+    ColumnType,
+    Generated,
+    Insertable,
+    JSONColumnType,
+    Selectable,
+    Updateable
+} from "kysely"
+
+export interface Database {
+    user: UserTable
+}
+
+export interface UserTable {
+    id: Generated<number>
+    created_at: ColumnType<Date, string | undefined, never>
+    name: string | null
+    email: string | null
+    password: string | null
+    metadata: JSONColumnType<
+        {
+            [key: string]: any
+        },
+        string | undefined
+    >
+}
+
+export type User = Selectable<UserTable>
+export type NewUser = Insertable<UserTable>
+export type UserUpdate = Updateable<UserTable>