jerryliao преди 1 година
родител
ревизия
558ca37272
променени са 10 файла, в които са добавени 82 реда и са изтрити 9 реда
  1. 1 0
      .gitignore
  2. 11 0
      deno.lock
  3. 6 4
      fresh.gen.ts
  4. 1 0
      import_map.json
  5. 1 1
      routes/_app.tsx
  6. 6 3
      routes/api/user/login.tsx
  7. 10 0
      routes/api/user/logout.tsx
  8. 1 0
      static/global.css
  9. 44 0
      utils/db.ts
  10. 1 1
      utils/server.ts

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+postdown.db

+ 11 - 0
deno.lock

@@ -109,6 +109,16 @@
     "https://deno.land/x/importmap@0.2.1/_util.ts": "ada9a9618b537e6c0316c048a898352396c882b9f2de38aba18fd3f2950ede89",
     "https://deno.land/x/importmap@0.2.1/mod.ts": "ae3d1cd7eabd18c01a4960d57db471126b020f23b37ef14e1359bbb949227ade",
     "https://deno.land/x/rutt@0.1.0/mod.ts": "4662ad4f687740ac612b779ed4c62eecebd718b56d24a07f719ec3b24464c139",
+    "https://deno.land/x/sqlite@v3.7.1/build/sqlite.d.ts": "d724a21a588a0e19ae46a3476349fe5d75e896735e7362ea8cf997ffad35d0f9",
+    "https://deno.land/x/sqlite@v3.7.1/build/sqlite.js": "c59f109f100c2bae0b9342f04e0d400583e2e3211d08bb71095177a4109ee5bf",
+    "https://deno.land/x/sqlite@v3.7.1/build/vfs.js": "08533cc78fb29b9d9bd62f6bb93e5ef333407013fed185776808f11223ba0e70",
+    "https://deno.land/x/sqlite@v3.7.1/mod.ts": "e09fc79d8065fe222578114b109b1fd60077bff1bb75448532077f784f4d6a83",
+    "https://deno.land/x/sqlite@v3.7.1/src/constants.ts": "90f3be047ec0a89bcb5d6fc30db121685fc82cb00b1c476124ff47a4b0472aa9",
+    "https://deno.land/x/sqlite@v3.7.1/src/db.ts": "59c6c2b5c4127132558bb8c610eadd811822f1a5d7f9c509704179ca192f94e0",
+    "https://deno.land/x/sqlite@v3.7.1/src/error.ts": "f7a15cb00d7c3797da1aefee3cf86d23e0ae92e73f0ba3165496c3816ab9503a",
+    "https://deno.land/x/sqlite@v3.7.1/src/function.ts": "e4c83b8ec64bf88bafad2407376b0c6a3b54e777593c70336fb40d43a79865f2",
+    "https://deno.land/x/sqlite@v3.7.1/src/query.ts": "d58abda928f6582d77bad685ecf551b1be8a15e8e38403e293ec38522e030cad",
+    "https://deno.land/x/sqlite@v3.7.1/src/wasm.ts": "e79d0baa6e42423257fb3c7cc98091c54399254867e0f34a09b5bdef37bd9487",
     "https://deno.land/x/ts_morph@17.0.1/common/DenoRuntime.ts": "537800e840d0994f9055164e11bf33eadf96419246af0d3c453793c3ae67bdb3",
     "https://deno.land/x/ts_morph@17.0.1/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed",
     "https://deno.land/x/ts_morph@17.0.1/common/ts_morph_common.d.ts": "ee7767b0c68b23c65bb607c94b6cb3512e8237fbcb7d1d8383a33235cde2c068",
@@ -126,6 +136,7 @@
     "https://esm.sh/stable/preact@10.13.2/deno/preact.mjs": "365fab897381f4f403f859c5d12939084560545567108cc90dae901bbe892578",
     "https://esm.sh/v116/@types/showdown@2.0.0/index.d.ts": "0cae38d42cef880ce4848fcd9ed704d65ba3ecc825443cd548ff81931c64cdca",
     "https://esm.sh/v116/preact-render-to-string@6.0.2/X-ZC9wcmVhY3RAMTAuMTMuMg/deno/preact-render-to-string.mjs": "09ead691b3745189a4171a6ee0948592c7a862b1bf1a97fe651fb34f88eabe3b",
+    "https://esm.sh/v116/preact-render-to-string@6.0.2/X-ZC9wcmVhY3RAMTAuMTMuMg/src/index.d.ts": "36e470f81eacf9700b80c92d7bf7342f0d46e2e7152a31cbe166576bb634a96e",
     "https://esm.sh/v116/preact@10.13.2/hooks/src/index.d.ts": "5c29febb624fc25d71cb0e125848c9b711e233337a08f7eacfade38fd4c14cc3",
     "https://esm.sh/v116/preact@10.13.2/src/index.d.ts": "65398710de6aa0a07412da79784e05e6e96763f51c7c91b77344d2d0af06385c",
     "https://esm.sh/v116/preact@10.13.2/src/jsx.d.ts": "9ac9b82c199fa7b04748807d750eba1a106c0be52041b8617416f88d6fc0a257",

+ 6 - 4
fresh.gen.ts

@@ -6,8 +6,9 @@ import config from "./deno.json" assert { type: "json" };
 import * as $0 from "./routes/_app.tsx";
 import * as $1 from "./routes/api/post.tsx";
 import * as $2 from "./routes/api/user/login.tsx";
-import * as $3 from "./routes/index.tsx";
-import * as $4 from "./routes/login.tsx";
+import * as $3 from "./routes/api/user/logout.tsx";
+import * as $4 from "./routes/index.tsx";
+import * as $5 from "./routes/login.tsx";
 import * as $$0 from "./islands/Editor.tsx";
 import * as $$1 from "./islands/LoginFrame.tsx";
 import * as $$2 from "./islands/TopBar.tsx";
@@ -17,8 +18,9 @@ const manifest = {
     "./routes/_app.tsx": $0,
     "./routes/api/post.tsx": $1,
     "./routes/api/user/login.tsx": $2,
-    "./routes/index.tsx": $3,
-    "./routes/login.tsx": $4,
+    "./routes/api/user/logout.tsx": $3,
+    "./routes/index.tsx": $4,
+    "./routes/login.tsx": $5,
   },
   islands: {
     "./islands/Editor.tsx": $$0,

+ 1 - 0
import_map.json

@@ -1,6 +1,7 @@
 {
   "imports": {
     "$fresh/": "https://deno.land/x/fresh@1.1.5/",
+    "$sqlite/": "https://deno.land/x/sqlite@v3.7.1/",
     "$http/": "https://deno.land/std@0.184.0/http/",
     "preact": "https://esm.sh/preact@10.13.2",
     "preact/": "https://esm.sh/preact@10.13.2/",

+ 1 - 1
routes/_app.tsx

@@ -10,8 +10,8 @@ export default function App(props: AppProps) {
       <Head>
         <link href={asset("/global.css")} rel="stylesheet" />
         <link
+          href="https://www.unpkg.com/bootstrap-icons@1.10.4/font/bootstrap-icons.css"
           rel="stylesheet"
-          href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css"
         />
       </Head>
       <props.Component />

+ 6 - 3
routes/api/user/login.tsx

@@ -5,6 +5,7 @@ import {
   makeSuccessResponse,
   setToken,
 } from "utils/server.ts";
+import { find } from "utils/db.ts";
 
 export const handler: Handlers = {
   GET(req: Request) {
@@ -20,9 +21,11 @@ export const handler: Handlers = {
   async POST(req: Request) {
     const reqJson = await req.json();
     if (reqJson.email && reqJson.password) {
-      const successResponse = makeSuccessResponse(true);
-      setToken(successResponse);
-      return successResponse;
+      if (find("User", { email: reqJson.email, password: reqJson.password })) {
+        const successResponse = makeSuccessResponse(true);
+        setToken(successResponse);
+        return successResponse;
+      }
     }
     return makeErrorResponse();
   },

+ 10 - 0
routes/api/user/logout.tsx

@@ -0,0 +1,10 @@
+import { Handlers } from "$fresh/server.ts";
+import { clearToken, makeSuccessResponse } from "utils/server.ts";
+
+export const handler: Handlers = {
+  GET(_req: Request) {
+    const successResponse = makeSuccessResponse(true);
+    clearToken(successResponse);
+    return successResponse;
+  },
+};

+ 1 - 0
static/global.css

@@ -249,6 +249,7 @@ button {
 .pd-editor .pd-edit-view textarea::-webkit-scrollbar,
 .pd-editor .pd-read-view::-webkit-scrollbar {
   width: 8px;
+  height: 8px;
 }
 
 .pd-editor .pd-edit-view textarea::-webkit-scrollbar-track,

+ 44 - 0
utils/db.ts

@@ -0,0 +1,44 @@
+import { DB } from "$sqlite/mod.ts";
+
+function prepareDB(tableName: string) {
+  const db = new DB("postdown.db");
+  switch (tableName) {
+    case "User":
+      db.execute(`
+        CREATE TABLE IF NOT EXISTS user (
+          id INTEGER PRIMARY KEY AUTOINCREMENT,
+          name VARCHAR(128),
+          email VARCHAR(128),
+          password TEXT
+        )
+      `);
+      break;
+    case "Token":
+      db.execute(`
+        CREATE TABLE IF NOT EXISTS session (
+          id INTEGER PRIMARY KEY AUTOINCREMENT,
+          user_id INTEGER,
+          token VARCHAR(128),
+        )
+      `);
+      break;
+  }
+  return db;
+}
+
+export function find(
+  tableName: string,
+  queryObject: { [key: string]: string | number }
+) {
+  const db = prepareDB(tableName);
+  const queryConditions = Object.keys(queryObject).map((queryKey) =>
+    typeof queryObject[queryKey] === "number"
+      ? `${queryKey}=${queryObject[queryKey]}`
+      : `${queryKey}="${queryObject[queryKey]}"`
+  );
+  return db.query(
+    `SELECT * FROM ${tableName.toLowerCase()} WHERE ${queryConditions.join(
+      " AND "
+    )}`
+  );
+}

+ 1 - 1
utils/server.ts

@@ -17,7 +17,7 @@ export function setToken(res: Response) {
 }
 
 export function clearToken(res: Response) {
-  deleteCookie(res.headers, "pd-user-token");
+  deleteCookie(res.headers, "pd-user-token", { path: "/" });
 }
 
 export function makeSuccessResponse(