diff --git a/.gitpod.yml b/.gitpod.yml index 5ebd850..98115c1 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,3 +1,4 @@ +--- # For more details, please see https://www.gitpod.io/docs/references/gitpod-yml image: gitpod/workspace-postgres @@ -6,7 +7,8 @@ tasks: command: | export HMR_HOST=`gp url 3000` npm run dev - + env: + DATABASE_URL: postgres://cherryTec@localhost/todos ports: - port: 3000 onOpen: open-browser @@ -17,8 +19,10 @@ vscode: extensions: - svelte.svelte-vscode + - prisma.prisma + github: prebuilds: master: true branches: true - pullRequests: true \ No newline at end of file + pullRequests: true diff --git a/package-lock.json b/package-lock.json index 717b09a..f8fd1d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,9 +7,13 @@ "": { "name": "full-stack-web-development", "version": "0.0.1", + "dependencies": { + "@prisma/client": "^3.6.0" + }, "devDependencies": { "@sveltejs/adapter-auto": "next", "@sveltejs/kit": "next", + "prisma": "^3.6.0", "svelte": "^3.44.0", "svelte-check": "^2.2.6", "svelte-preprocess": "^4.9.4", @@ -58,6 +62,38 @@ "node": ">= 8" } }, + "node_modules/@prisma/client": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.6.0.tgz", + "integrity": "sha512-ycSGY9EZGROtje0iCNsgC5Zqi/ttX2sO7BNMYaLsUMiTlf3F69ZPH+08pRo0hrDfkZzyimXYqeXJlaoYDH1w7A==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + }, + "engines": { + "node": ">=12.6" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", + "integrity": "sha512-dRClHS7DsTVchDKzeG72OaEyeDskCv91pnZ72Fftn0mp4BkUvX2LvWup65hCNzwwQm5IDd6A88APldKDnMiEMA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", + "integrity": "sha512-vtoO2ys6mSfc8ONTWdcYztKN3GBU1tcKBj0aXObyjzSuGwHFcM/pEA0xF+n1W4/0TAJgfoPX2khNEit6g0jtNA==" + }, "node_modules/@rollup/pluginutils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", @@ -1015,6 +1051,23 @@ "url": "https://opencollective.com/postcss/" } }, + "node_modules/prisma": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.6.0.tgz", + "integrity": "sha512-6SqgHS/5Rq6HtHjsWsTxlj+ySamGyCLBUQfotc2lStOjPv52IQuDVpp58GieNqc9VnfuFyHUvTZw7aQB+G2fvQ==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=12.6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -1437,6 +1490,25 @@ "fastq": "^1.6.0" } }, + "@prisma/client": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.6.0.tgz", + "integrity": "sha512-ycSGY9EZGROtje0iCNsgC5Zqi/ttX2sO7BNMYaLsUMiTlf3F69ZPH+08pRo0hrDfkZzyimXYqeXJlaoYDH1w7A==", + "requires": { + "@prisma/engines-version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + } + }, + "@prisma/engines": { + "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", + "integrity": "sha512-dRClHS7DsTVchDKzeG72OaEyeDskCv91pnZ72Fftn0mp4BkUvX2LvWup65hCNzwwQm5IDd6A88APldKDnMiEMA==", + "devOptional": true + }, + "@prisma/engines-version": { + "version": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727.tgz", + "integrity": "sha512-vtoO2ys6mSfc8ONTWdcYztKN3GBU1tcKBj0aXObyjzSuGwHFcM/pEA0xF+n1W4/0TAJgfoPX2khNEit6g0jtNA==" + }, "@rollup/pluginutils": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", @@ -2116,6 +2188,15 @@ "source-map-js": "^1.0.1" } }, + "prisma": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.6.0.tgz", + "integrity": "sha512-6SqgHS/5Rq6HtHjsWsTxlj+ySamGyCLBUQfotc2lStOjPv52IQuDVpp58GieNqc9VnfuFyHUvTZw7aQB+G2fvQ==", + "devOptional": true, + "requires": { + "@prisma/engines": "3.6.0-24.dc520b92b1ebb2d28dc3161f9f82e875bd35d727" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", diff --git a/package.json b/package.json index 1157fd9..3110f11 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,15 @@ "devDependencies": { "@sveltejs/adapter-auto": "next", "@sveltejs/kit": "next", + "prisma": "^3.6.0", "svelte": "^3.44.0", "svelte-check": "^2.2.6", "svelte-preprocess": "^4.9.4", "tslib": "^2.3.1", "typescript": "^4.4.3" }, - "type": "module" -} \ No newline at end of file + "type": "module", + "dependencies": { + "@prisma/client": "^3.6.0" + } +} diff --git a/prisma/migrations/20211219124240_init/migration.sql b/prisma/migrations/20211219124240_init/migration.sql new file mode 100644 index 0000000..d6ca5be --- /dev/null +++ b/prisma/migrations/20211219124240_init/migration.sql @@ -0,0 +1,9 @@ +-- CreateTable +CREATE TABLE "Todo" ( + "uid" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL, + "text" TEXT NOT NULL, + "done" BOOLEAN NOT NULL, + + CONSTRAINT "Todo_pkey" PRIMARY KEY ("uid") +); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..346ba20 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,17 @@ +// lear more about this file in the docs: https://pris.ly/d/prism-schema +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native"] +} + +model Todo { + uid String @id @default(cuid()) + created_at DateTime + text String + done Boolean +} \ No newline at end of file diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 0000000..7372931 --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,5 @@ +import Prisma, * as PrismaAll from "@prisma/client"; + +const PrismaClient = Prisma?.PrismaClient || PrismaAll?.PrismaClient; + +export default PrismaClient; \ No newline at end of file diff --git a/src/routes/todos/_api.ts b/src/routes/todos/_api.ts index ed8646c..664c71d 100644 --- a/src/routes/todos/_api.ts +++ b/src/routes/todos/_api.ts @@ -1,36 +1,58 @@ import type { Request } from "@sveltejs/kit"; +import PrismaClient from "$lib/prisma"; -// TODO: Persist in database -let todos: Todo[] = []; +const prisma = new PrismaClient(); -export const api = (request: Request, data?: Record) => { +export const api = async (request: Request, data?: Record) => { let body = {}; let status = 500; switch (request.method.toUpperCase()) { case "GET": - body = todos; + body = await prisma.todo.findMany(); status = 200; break; case "POST": - todos.push(data as Todo); + body = await prisma.todo.create({ + data: { + created_at: data.creat_at as Date, + done: data.done as boolean, + text: data.text as string + + } + }) + //todos.push(data as Todo); body = data; status = 201; break; case "DELETE": - todos = todos.filter(todo => todo.uid !== request.params.uid) + body = await prisma.todo.delete({ + where: { + uid:request.params.uid + } + }) + //todos = todos.filter(todo => todo.uid !== request.params.uid) status = 200; break; case "PATCH": - todos = todos.map(todo => { - if (todo.uid === request.params.uid) { - if (data.text) todo.text = data.text as string; - else todo.done = data.done as boolean; + body = await prisma.todo.update({ + where:{ + uid:request.params.uid + }, + data: { + done: data.done, + text: data.text } - return todo; - }); + }) + // todos = todos.map(todo => { + // if (todo.uid === request.params.uid) { + // if (data.text) todo.text = data.text as string; + // else todo.done = data.done as boolean; + // } + // return todo; + // }); status = 200; - body = todos.find(todo => todo.uid === request.params.uid); + //body = todos.find(todo => todo.uid === request.params.uid); break; default: diff --git a/src/routes/todos/index.json.ts b/src/routes/todos/index.json.ts index c56460d..edbe1b2 100644 --- a/src/routes/todos/index.json.ts +++ b/src/routes/todos/index.json.ts @@ -7,7 +7,7 @@ export const get: RequestHandler = (request) => { export const post: RequestHandler<{}, FormData> = (request) => { return api(request, { - uid: `${Date.now()}`, // TODO: Replace with the UID from the datbase + //uid: `${Date.now()}`, // TODO: Replace with the UID from the datbase created_at: new Date(), text: request.body.get("text"), done: false