From 86df1d501df759182f4453a1cfe112473446845a Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Mon, 2 Nov 2020 07:02:11 +1100 Subject: [PATCH] Re-init DB and scaffold all models --- .../20201009213512-create-posts/README.md | 45 - .../20201009213512-create-posts/schema.prisma | 18 - .../20201009213512-create-posts/steps.json | 120 --- .../20201011043647-create-parts/README.md | 52 -- .../20201011043647-create-parts/schema.prisma | 28 - .../20201011043647-create-parts/steps.json | 105 --- .../20201011052155-add-code-to-part/README.md | 65 -- .../schema.prisma | 29 - .../steps.json | 37 - .../README.md | 69 -- .../schema.prisma | 29 - .../steps.json | 19 - .../20201011095227-create-contact/README.md | 50 -- .../schema.prisma | 37 - .../20201011095227-create-contact/steps.json | 105 --- .../README.md | 65 -- .../schema.prisma | 48 -- .../steps.json | 179 ---- .../README.md | 61 -- .../schema.prisma | 48 -- .../steps.json | 15 - .../20201029214206-rejig-schema/README.md | 188 ----- .../20201029214206-rejig-schema/schema.prisma | 76 -- .../20201030061957-rejig-schema/README.md | 91 -- .../20201030061957-rejig-schema/steps.json | 38 - .../20201101183848-db-init/README.md | 158 ++++ .../schema.prisma | 39 +- .../steps.json | 791 ++++++++++-------- api/prisma/migrations/migrate.lock | 10 +- api/prisma/schema.prisma | 39 +- api/src/functions/identity-signup.js | 4 +- api/src/graphql/comments.sdl.js | 35 + api/src/graphql/partReactions.sdl.js | 38 + api/src/graphql/parts.sdl.js | 42 + api/src/graphql/users.sdl.js | 39 + api/src/services/comments/comments.js | 38 + api/src/services/comments/comments.test.js | 9 + api/src/services/helpers.js | 13 + .../services/partReactions/partReactions.js | 38 + .../partReactions/partReactions.test.js | 9 + api/src/services/parts/parts.js | 40 + api/src/services/parts/parts.test.js | 9 + api/src/services/users/users.js | 38 + api/src/services/users/users.test.js | 9 + web/src/Routes.js | 20 +- web/src/components/Comment/Comment.js | 103 +++ web/src/components/CommentCell/CommentCell.js | 22 + web/src/components/CommentForm/CommentForm.js | 83 ++ web/src/components/Comments/Comments.js | 109 +++ .../components/CommentsCell/CommentsCell.js | 33 + .../EditCommentCell/EditCommentCell.js | 60 ++ .../components/EditPartCell/EditPartCell.js | 52 ++ .../EditPartReactionCell.js | 63 ++ .../components/EditUserCell/EditUserCell.js | 51 ++ web/src/components/IdePartCell/IdePartCell.js | 5 +- web/src/components/NewComment/NewComment.js | 41 + web/src/components/NewPart/NewPart.js | 38 + .../NewPartReaction/NewPartReaction.js | 41 + web/src/components/NewUser/NewUser.js | 38 + web/src/components/Part/Part.js | 111 +++ web/src/components/PartCell/PartCell.js | 24 + web/src/components/PartForm/ImageUploader.js | 120 --- web/src/components/PartForm/PartForm.js | 115 +++ .../components/PartReaction/PartReaction.js | 103 +++ .../PartReactionCell/PartReactionCell.js | 22 + .../PartReactionForm/PartReactionForm.js | 83 ++ .../components/PartReactions/PartReactions.js | 112 +++ .../PartReactionsCell/PartReactionsCell.js | 33 + web/src/components/Parts/Parts.js | 113 +++ web/src/components/PartsCell/PartsCell.js | 35 + web/src/components/User/User.js | 107 +++ web/src/components/UserCell/UserCell.js | 23 + web/src/components/UserForm/UserForm.js | 99 +++ web/src/components/Users/Users.js | 111 +++ web/src/components/UsersCell/UsersCell.js | 34 + .../layouts/CommentsLayout/CommentsLayout.js | 23 + web/src/layouts/MainLayout/MainLayout.js | 6 +- .../PartReactionsLayout.js | 26 + web/src/layouts/PartsLayout/PartsLayout.js | 23 + web/src/layouts/UsersLayout/UsersLayout.js | 23 + web/src/pages/CommentPage/CommentPage.js | 12 + web/src/pages/CommentsPage/CommentsPage.js | 12 + .../pages/EditCommentPage/EditCommentPage.js | 12 + web/src/pages/EditPartPage/EditPartPage.js | 12 + .../EditPartReactionPage.js | 12 + web/src/pages/EditUserPage/EditUserPage.js | 12 + web/src/pages/HomePage/HomePage.js | 12 +- .../pages/NewCommentPage/NewCommentPage.js | 12 + web/src/pages/NewPartPage/NewPartPage.js | 12 + .../NewPartReactionPage.js | 12 + web/src/pages/NewUserPage/NewUserPage.js | 12 + web/src/pages/PartPage/PartPage.js | 12 + .../PartReactionPage/PartReactionPage.js | 12 + .../PartReactionsPage/PartReactionsPage.js | 12 + web/src/pages/PartsPage/PartsPage.js | 12 + web/src/pages/UserPage/UserPage.js | 12 + web/src/pages/UsersPage/UsersPage.js | 12 + 97 files changed, 3202 insertions(+), 2122 deletions(-) delete mode 100644 api/prisma/migrations/20201009213512-create-posts/README.md delete mode 100644 api/prisma/migrations/20201009213512-create-posts/schema.prisma delete mode 100644 api/prisma/migrations/20201009213512-create-posts/steps.json delete mode 100644 api/prisma/migrations/20201011043647-create-parts/README.md delete mode 100644 api/prisma/migrations/20201011043647-create-parts/schema.prisma delete mode 100644 api/prisma/migrations/20201011043647-create-parts/steps.json delete mode 100644 api/prisma/migrations/20201011052155-add-code-to-part/README.md delete mode 100644 api/prisma/migrations/20201011052155-add-code-to-part/schema.prisma delete mode 100644 api/prisma/migrations/20201011052155-add-code-to-part/steps.json delete mode 100644 api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/README.md delete mode 100644 api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/schema.prisma delete mode 100644 api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/steps.json delete mode 100644 api/prisma/migrations/20201011095227-create-contact/README.md delete mode 100644 api/prisma/migrations/20201011095227-create-contact/schema.prisma delete mode 100644 api/prisma/migrations/20201011095227-create-contact/steps.json delete mode 100644 api/prisma/migrations/20201018233330-add-simple-user-model/README.md delete mode 100644 api/prisma/migrations/20201018233330-add-simple-user-model/schema.prisma delete mode 100644 api/prisma/migrations/20201018233330-add-simple-user-model/steps.json delete mode 100644 api/prisma/migrations/20201019072122-add-simplify-user-model/README.md delete mode 100644 api/prisma/migrations/20201019072122-add-simplify-user-model/schema.prisma delete mode 100644 api/prisma/migrations/20201019072122-add-simplify-user-model/steps.json delete mode 100644 api/prisma/migrations/20201029214206-rejig-schema/README.md delete mode 100644 api/prisma/migrations/20201029214206-rejig-schema/schema.prisma delete mode 100644 api/prisma/migrations/20201030061957-rejig-schema/README.md delete mode 100644 api/prisma/migrations/20201030061957-rejig-schema/steps.json create mode 100644 api/prisma/migrations/20201101183848-db-init/README.md rename api/prisma/migrations/{20201030061957-rejig-schema => 20201101183848-db-init}/schema.prisma (60%) rename api/prisma/migrations/{20201029214206-rejig-schema => 20201101183848-db-init}/steps.json (77%) create mode 100644 api/src/graphql/comments.sdl.js create mode 100644 api/src/graphql/partReactions.sdl.js create mode 100644 api/src/graphql/parts.sdl.js create mode 100644 api/src/graphql/users.sdl.js create mode 100644 api/src/services/comments/comments.js create mode 100644 api/src/services/comments/comments.test.js create mode 100644 api/src/services/helpers.js create mode 100644 api/src/services/partReactions/partReactions.js create mode 100644 api/src/services/partReactions/partReactions.test.js create mode 100644 api/src/services/parts/parts.js create mode 100644 api/src/services/parts/parts.test.js create mode 100644 api/src/services/users/users.js create mode 100644 api/src/services/users/users.test.js create mode 100644 web/src/components/Comment/Comment.js create mode 100644 web/src/components/CommentCell/CommentCell.js create mode 100644 web/src/components/CommentForm/CommentForm.js create mode 100644 web/src/components/Comments/Comments.js create mode 100644 web/src/components/CommentsCell/CommentsCell.js create mode 100644 web/src/components/EditCommentCell/EditCommentCell.js create mode 100644 web/src/components/EditPartCell/EditPartCell.js create mode 100644 web/src/components/EditPartReactionCell/EditPartReactionCell.js create mode 100644 web/src/components/EditUserCell/EditUserCell.js create mode 100644 web/src/components/NewComment/NewComment.js create mode 100644 web/src/components/NewPart/NewPart.js create mode 100644 web/src/components/NewPartReaction/NewPartReaction.js create mode 100644 web/src/components/NewUser/NewUser.js create mode 100644 web/src/components/Part/Part.js create mode 100644 web/src/components/PartCell/PartCell.js delete mode 100644 web/src/components/PartForm/ImageUploader.js create mode 100644 web/src/components/PartForm/PartForm.js create mode 100644 web/src/components/PartReaction/PartReaction.js create mode 100644 web/src/components/PartReactionCell/PartReactionCell.js create mode 100644 web/src/components/PartReactionForm/PartReactionForm.js create mode 100644 web/src/components/PartReactions/PartReactions.js create mode 100644 web/src/components/PartReactionsCell/PartReactionsCell.js create mode 100644 web/src/components/Parts/Parts.js create mode 100644 web/src/components/PartsCell/PartsCell.js create mode 100644 web/src/components/User/User.js create mode 100644 web/src/components/UserCell/UserCell.js create mode 100644 web/src/components/UserForm/UserForm.js create mode 100644 web/src/components/Users/Users.js create mode 100644 web/src/components/UsersCell/UsersCell.js create mode 100644 web/src/layouts/CommentsLayout/CommentsLayout.js create mode 100644 web/src/layouts/PartReactionsLayout/PartReactionsLayout.js create mode 100644 web/src/layouts/PartsLayout/PartsLayout.js create mode 100644 web/src/layouts/UsersLayout/UsersLayout.js create mode 100644 web/src/pages/CommentPage/CommentPage.js create mode 100644 web/src/pages/CommentsPage/CommentsPage.js create mode 100644 web/src/pages/EditCommentPage/EditCommentPage.js create mode 100644 web/src/pages/EditPartPage/EditPartPage.js create mode 100644 web/src/pages/EditPartReactionPage/EditPartReactionPage.js create mode 100644 web/src/pages/EditUserPage/EditUserPage.js create mode 100644 web/src/pages/NewCommentPage/NewCommentPage.js create mode 100644 web/src/pages/NewPartPage/NewPartPage.js create mode 100644 web/src/pages/NewPartReactionPage/NewPartReactionPage.js create mode 100644 web/src/pages/NewUserPage/NewUserPage.js create mode 100644 web/src/pages/PartPage/PartPage.js create mode 100644 web/src/pages/PartReactionPage/PartReactionPage.js create mode 100644 web/src/pages/PartReactionsPage/PartReactionsPage.js create mode 100644 web/src/pages/PartsPage/PartsPage.js create mode 100644 web/src/pages/UserPage/UserPage.js create mode 100644 web/src/pages/UsersPage/UsersPage.js diff --git a/api/prisma/migrations/20201009213512-create-posts/README.md b/api/prisma/migrations/20201009213512-create-posts/README.md deleted file mode 100644 index f52912a..0000000 --- a/api/prisma/migrations/20201009213512-create-posts/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Migration `20201009213512-create-posts` - -This migration has been generated by Kurt Hutten at 10/10/2020, 8:35:12 AM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -CREATE TABLE "Post" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "title" TEXT NOT NULL, - "body" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -) -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration ..20201009213512-create-posts ---- datamodel.dml -+++ datamodel.dml -@@ -1,0 +1,18 @@ -+datasource DS { -+ // optionally set multiple providers -+ // example: provider = ["sqlite", "postgresql"] -+ provider = "sqlite" -+ url = "***" -+} -+ -+generator client { -+ provider = "prisma-client-js" -+ binaryTargets = "native" -+} -+ -+model Post { -+ id Int @id @default(autoincrement()) -+ title String -+ body String -+ createdAt DateTime @default(now()) -+} -``` - - diff --git a/api/prisma/migrations/20201009213512-create-posts/schema.prisma b/api/prisma/migrations/20201009213512-create-posts/schema.prisma deleted file mode 100644 index 624cbdb..0000000 --- a/api/prisma/migrations/20201009213512-create-posts/schema.prisma +++ /dev/null @@ -1,18 +0,0 @@ -datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} diff --git a/api/prisma/migrations/20201009213512-create-posts/steps.json b/api/prisma/migrations/20201009213512-create-posts/steps.json deleted file mode 100644 index f2edc88..0000000 --- a/api/prisma/migrations/20201009213512-create-posts/steps.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "CreateSource", - "source": "DS" - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Source", - "source": "DS" - }, - "argument": "provider", - "value": "\"sqlite\"" - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Source", - "source": "DS" - }, - "argument": "url", - "value": "\"***\"" - }, - { - "tag": "CreateModel", - "model": "Post" - }, - { - "tag": "CreateField", - "model": "Post", - "field": "id", - "type": "Int", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Post", - "field": "id" - }, - "directive": "id" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Post", - "field": "id" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Post", - "field": "id" - }, - "directive": "default" - }, - "argument": "", - "value": "autoincrement()" - }, - { - "tag": "CreateField", - "model": "Post", - "field": "title", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Post", - "field": "body", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Post", - "field": "createdAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Post", - "field": "createdAt" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Post", - "field": "createdAt" - }, - "directive": "default" - }, - "argument": "", - "value": "now()" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201011043647-create-parts/README.md b/api/prisma/migrations/20201011043647-create-parts/README.md deleted file mode 100644 index 1def1c5..0000000 --- a/api/prisma/migrations/20201011043647-create-parts/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Migration `20201011043647-create-parts` - -This migration has been generated by Kurt Hutten at 10/11/2020, 3:36:47 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -CREATE TABLE "Part" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "mainImage" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -) -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201009213512-create-posts..20201011043647-create-parts ---- datamodel.dml -+++ datamodel.dml -@@ -1,9 +1,9 @@ - datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -15,4 +15,14 @@ - title String - body String - createdAt DateTime @default(now()) - } -+ -+model Part { -+ id Int @id @default(autoincrement()) -+ title String -+ description String // markdown string -+ mainImage String // link to cloudinary -+ createdAt DateTime @default(now()) -+ // userId -+ //likes, comments, reactions -+} -``` - - diff --git a/api/prisma/migrations/20201011043647-create-parts/schema.prisma b/api/prisma/migrations/20201011043647-create-parts/schema.prisma deleted file mode 100644 index 6d2b834..0000000 --- a/api/prisma/migrations/20201011043647-create-parts/schema.prisma +++ /dev/null @@ -1,28 +0,0 @@ -datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} diff --git a/api/prisma/migrations/20201011043647-create-parts/steps.json b/api/prisma/migrations/20201011043647-create-parts/steps.json deleted file mode 100644 index 3328ce6..0000000 --- a/api/prisma/migrations/20201011043647-create-parts/steps.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "CreateModel", - "model": "Part" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "id", - "type": "Int", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "id" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "default" - }, - "argument": "", - "value": "autoincrement()" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "title", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "description", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "mainImage", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "createdAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "createdAt" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "createdAt" - }, - "directive": "default" - }, - "argument": "", - "value": "now()" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201011052155-add-code-to-part/README.md b/api/prisma/migrations/20201011052155-add-code-to-part/README.md deleted file mode 100644 index ffbd7bc..0000000 --- a/api/prisma/migrations/20201011052155-add-code-to-part/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Migration `20201011052155-add-code-to-part` - -This migration has been generated by Kurt Hutten at 10/11/2020, 4:21:55 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Part" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "code" TEXT NOT NULL DEFAULT '// Welcome to Cascade Studio! Here are some useful functions: -// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection() -// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon() -// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(), -// FilletEdges(), ChamferEdges(), -// Slider(), Button(), Checkbox() -let holeRadius = Slider("Radius", 30 , 20 , 40); -let sphere = Sphere(50); -let cylinderZ = Cylinder(holeRadius, 200, true);/nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true)); -let cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));/nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ])); - -Translate([-25, 0, 40], Text3D("Hi!"));/n// Don''t forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!', - "mainImage" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); -INSERT INTO "new_Part" ("id", "title", "description", "mainImage", "createdAt") SELECT "id", "title", "description", "mainImage", "createdAt" FROM "Part"; -DROP TABLE "Part"; -ALTER TABLE "new_Part" RENAME TO "Part"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201011043647-create-parts..20201011052155-add-code-to-part ---- datamodel.dml -+++ datamodel.dml -@@ -1,9 +1,9 @@ - datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -20,8 +20,9 @@ - model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string -+ code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);/nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));/nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));/n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -``` - - diff --git a/api/prisma/migrations/20201011052155-add-code-to-part/schema.prisma b/api/prisma/migrations/20201011052155-add-code-to-part/schema.prisma deleted file mode 100644 index 41ca83b..0000000 --- a/api/prisma/migrations/20201011052155-add-code-to-part/schema.prisma +++ /dev/null @@ -1,29 +0,0 @@ -datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);/nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));/nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));/n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} diff --git a/api/prisma/migrations/20201011052155-add-code-to-part/steps.json b/api/prisma/migrations/20201011052155-add-code-to-part/steps.json deleted file mode 100644 index 0c8bd6f..0000000 --- a/api/prisma/migrations/20201011052155-add-code-to-part/steps.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "CreateField", - "model": "Part", - "field": "code", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "code" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "code" - }, - "directive": "default" - }, - "argument": "", - "value": "\"// Welcome to Cascade Studio! Here are some useful functions:\\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\\n// FilletEdges(), ChamferEdges(),\\n// Slider(), Button(), Checkbox()\\nlet holeRadius = Slider(\\\"Radius\\\", 30 , 20 , 40);\\nlet sphere = Sphere(50);\\nlet cylinderZ = Cylinder(holeRadius, 200, true);/nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));/nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\\n\\nTranslate([-25, 0, 40], Text3D(\\\"Hi!\\\"));/n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!\"" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/README.md b/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/README.md deleted file mode 100644 index 1e30c97..0000000 --- a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Migration `20201011082558-add-code-not-needed-upon-create` - -This migration has been generated by Kurt Hutten at 10/11/2020, 7:25:58 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Part" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "title" TEXT NOT NULL, - "description" TEXT NOT NULL, - "code" TEXT NOT NULL DEFAULT '// Welcome to Cascade Studio! Here are some useful functions: -// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection() -// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon() -// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(), -// FilletEdges(), ChamferEdges(), -// Slider(), Button(), Checkbox() -let holeRadius = Slider("Radius", 30 , 20 , 40); -let sphere = Sphere(50); -let cylinderZ = Cylinder(holeRadius, 200, true); -let cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true)); -let cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true)); -Translate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ])); - -Translate([-25, 0, 40], Text3D("Hi!")); -// Don''t forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!', - "mainImage" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); -INSERT INTO "new_Part" ("id", "title", "description", "mainImage", "createdAt", "code") SELECT "id", "title", "description", "mainImage", "createdAt", "code" FROM "Part"; -DROP TABLE "Part"; -ALTER TABLE "new_Part" RENAME TO "Part"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201011052155-add-code-to-part..20201011082558-add-code-not-needed-upon-create ---- datamodel.dml -+++ datamodel.dml -@@ -1,9 +1,9 @@ - datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -20,9 +20,9 @@ - model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string -- code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);/nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));/nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));/n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") -+ code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -``` - - diff --git a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/schema.prisma b/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/schema.prisma deleted file mode 100644 index f22b4b7..0000000 --- a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/schema.prisma +++ /dev/null @@ -1,29 +0,0 @@ -datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} diff --git a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/steps.json b/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/steps.json deleted file mode 100644 index 8c127a5..0000000 --- a/api/prisma/migrations/20201011082558-add-code-not-needed-upon-create/steps.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "UpdateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "code" - }, - "directive": "default" - }, - "argument": "", - "newValue": "\"// Welcome to Cascade Studio! Here are some useful functions:\\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\\n// FilletEdges(), ChamferEdges(),\\n// Slider(), Button(), Checkbox()\\nlet holeRadius = Slider(\\\"Radius\\\", 30 , 20 , 40);\\nlet sphere = Sphere(50);\\nlet cylinderZ = Cylinder(holeRadius, 200, true);\\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\\n\\nTranslate([-25, 0, 40], Text3D(\\\"Hi!\\\"));\\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!\"" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201011095227-create-contact/README.md b/api/prisma/migrations/20201011095227-create-contact/README.md deleted file mode 100644 index 5748d5e..0000000 --- a/api/prisma/migrations/20201011095227-create-contact/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Migration `20201011095227-create-contact` - -This migration has been generated by Kurt Hutten at 10/11/2020, 8:52:27 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -CREATE TABLE "Contact" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL, - "email" TEXT NOT NULL, - "message" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -) -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201011082558-add-code-not-needed-upon-create..20201011095227-create-contact ---- datamodel.dml -+++ datamodel.dml -@@ -1,9 +1,9 @@ - datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -26,4 +26,12 @@ - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions - } -+ -+model Contact { -+ id Int @id @default(autoincrement()) -+ name String -+ email String -+ message String -+ createdAt DateTime @default(now()) -+} -``` - - diff --git a/api/prisma/migrations/20201011095227-create-contact/schema.prisma b/api/prisma/migrations/20201011095227-create-contact/schema.prisma deleted file mode 100644 index 03189f2..0000000 --- a/api/prisma/migrations/20201011095227-create-contact/schema.prisma +++ /dev/null @@ -1,37 +0,0 @@ -datasource DS { - // optionally set multiple providers - // example: provider = ["sqlite", "postgresql"] - provider = "sqlite" - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} - -model Contact { - id Int @id @default(autoincrement()) - name String - email String - message String - createdAt DateTime @default(now()) -} diff --git a/api/prisma/migrations/20201011095227-create-contact/steps.json b/api/prisma/migrations/20201011095227-create-contact/steps.json deleted file mode 100644 index 0ca4b72..0000000 --- a/api/prisma/migrations/20201011095227-create-contact/steps.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "CreateModel", - "model": "Contact" - }, - { - "tag": "CreateField", - "model": "Contact", - "field": "id", - "type": "Int", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Contact", - "field": "id" - }, - "directive": "id" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Contact", - "field": "id" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Contact", - "field": "id" - }, - "directive": "default" - }, - "argument": "", - "value": "autoincrement()" - }, - { - "tag": "CreateField", - "model": "Contact", - "field": "name", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Contact", - "field": "email", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Contact", - "field": "message", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateField", - "model": "Contact", - "field": "createdAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Contact", - "field": "createdAt" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Contact", - "field": "createdAt" - }, - "directive": "default" - }, - "argument": "", - "value": "now()" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201018233330-add-simple-user-model/README.md b/api/prisma/migrations/20201018233330-add-simple-user-model/README.md deleted file mode 100644 index c8ec755..0000000 --- a/api/prisma/migrations/20201018233330-add-simple-user-model/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Migration `20201018233330-add-simple-user-model` - -This migration has been generated by Kurt Hutten at 10/19/2020, 10:33:30 AM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -CREATE TABLE "User" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "userName" TEXT NOT NULL, - "email" TEXT NOT NULL, - "issuer" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "image" TEXT, - "bio" TEXT -) - -CREATE UNIQUE INDEX "User.userName_unique" ON "User"("userName") - -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email") - -CREATE UNIQUE INDEX "User.issuer_unique" ON "User"("issuer") -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201011095227-create-contact..20201018233330-add-simple-user-model ---- datamodel.dml -+++ datamodel.dml -@@ -1,9 +1,7 @@ - datasource DS { -- // optionally set multiple providers -- // example: provider = ["sqlite", "postgresql"] -- provider = "sqlite" -- url = "***" -+ provider = ["sqlite", "postgresql"] -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -34,4 +32,17 @@ - email String - message String - createdAt DateTime @default(now()) - } -+ -+model User { -+ id Int @id @default(autoincrement()) -+ userName String @unique -+ email String @unique -+ issuer String @unique -+ -+ createdAt DateTime @default(now()) -+ updatedAt DateTime @updatedAt -+ -+ image String? // url maybe id or file storage service? cloudinary? -+ bio String? //mark down -+} -``` - - diff --git a/api/prisma/migrations/20201018233330-add-simple-user-model/schema.prisma b/api/prisma/migrations/20201018233330-add-simple-user-model/schema.prisma deleted file mode 100644 index 15e3468..0000000 --- a/api/prisma/migrations/20201018233330-add-simple-user-model/schema.prisma +++ /dev/null @@ -1,48 +0,0 @@ -datasource DS { - provider = ["sqlite", "postgresql"] - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} - -model Contact { - id Int @id @default(autoincrement()) - name String - email String - message String - createdAt DateTime @default(now()) -} - -model User { - id Int @id @default(autoincrement()) - userName String @unique - email String @unique - issuer String @unique - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - image String? // url maybe id or file storage service? cloudinary? - bio String? //mark down -} diff --git a/api/prisma/migrations/20201018233330-add-simple-user-model/steps.json b/api/prisma/migrations/20201018233330-add-simple-user-model/steps.json deleted file mode 100644 index 8ea741d..0000000 --- a/api/prisma/migrations/20201018233330-add-simple-user-model/steps.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "UpdateArgument", - "location": { - "tag": "Source", - "source": "DS" - }, - "argument": "provider", - "newValue": "[\"sqlite\", \"postgresql\"]" - }, - { - "tag": "CreateModel", - "model": "User" - }, - { - "tag": "CreateField", - "model": "User", - "field": "id", - "type": "Int", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "id" - }, - "directive": "id" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "id" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "User", - "field": "id" - }, - "directive": "default" - }, - "argument": "", - "value": "autoincrement()" - }, - { - "tag": "CreateField", - "model": "User", - "field": "userName", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "userName" - }, - "directive": "unique" - } - }, - { - "tag": "CreateField", - "model": "User", - "field": "email", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "email" - }, - "directive": "unique" - } - }, - { - "tag": "CreateField", - "model": "User", - "field": "issuer", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "issuer" - }, - "directive": "unique" - } - }, - { - "tag": "CreateField", - "model": "User", - "field": "createdAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "createdAt" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "User", - "field": "createdAt" - }, - "directive": "default" - }, - "argument": "", - "value": "now()" - }, - { - "tag": "CreateField", - "model": "User", - "field": "updatedAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "updatedAt" - }, - "directive": "updatedAt" - } - }, - { - "tag": "CreateField", - "model": "User", - "field": "image", - "type": "String", - "arity": "Optional" - }, - { - "tag": "CreateField", - "model": "User", - "field": "bio", - "type": "String", - "arity": "Optional" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201019072122-add-simplify-user-model/README.md b/api/prisma/migrations/20201019072122-add-simplify-user-model/README.md deleted file mode 100644 index 29d4e11..0000000 --- a/api/prisma/migrations/20201019072122-add-simplify-user-model/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Migration `20201019072122-add-simplify-user-model` - -This migration has been generated by Kurt Hutten at 10/19/2020, 6:21:22 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -DROP INDEX "User.issuer_unique" - -DROP INDEX "User.userName_unique" - -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_User" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "email" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "image" TEXT, - "bio" TEXT -); -INSERT INTO "new_User" ("id", "email", "createdAt", "updatedAt", "image", "bio") SELECT "id", "email", "createdAt", "updatedAt", "image", "bio" FROM "User"; -DROP TABLE "User"; -ALTER TABLE "new_User" RENAME TO "User"; -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201018233330-add-simple-user-model..20201019072122-add-simplify-user-model ---- datamodel.dml -+++ datamodel.dml -@@ -1,7 +1,7 @@ - datasource DS { - provider = ["sqlite", "postgresql"] -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -34,12 +34,12 @@ - createdAt DateTime @default(now()) - } - model User { -- id Int @id @default(autoincrement()) -- userName String @unique -- email String @unique -- issuer String @unique -+ id Int @id @default(autoincrement()) -+ email String @unique -+ // userName String @unique -+ // issuer String @unique - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -``` - - diff --git a/api/prisma/migrations/20201019072122-add-simplify-user-model/schema.prisma b/api/prisma/migrations/20201019072122-add-simplify-user-model/schema.prisma deleted file mode 100644 index 24140d8..0000000 --- a/api/prisma/migrations/20201019072122-add-simplify-user-model/schema.prisma +++ /dev/null @@ -1,48 +0,0 @@ -datasource DS { - provider = ["sqlite", "postgresql"] - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -model Post { - id Int @id @default(autoincrement()) - title String - body String - createdAt DateTime @default(now()) -} - -model Part { - id Int @id @default(autoincrement()) - title String - description String // markdown string - code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") - mainImage String // link to cloudinary - createdAt DateTime @default(now()) - // userId - //likes, comments, reactions -} - -model Contact { - id Int @id @default(autoincrement()) - name String - email String - message String - createdAt DateTime @default(now()) -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - // userName String @unique - // issuer String @unique - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - image String? // url maybe id or file storage service? cloudinary? - bio String? //mark down -} diff --git a/api/prisma/migrations/20201019072122-add-simplify-user-model/steps.json b/api/prisma/migrations/20201019072122-add-simplify-user-model/steps.json deleted file mode 100644 index 0285263..0000000 --- a/api/prisma/migrations/20201019072122-add-simplify-user-model/steps.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "DeleteField", - "model": "User", - "field": "userName" - }, - { - "tag": "DeleteField", - "model": "User", - "field": "issuer" - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201029214206-rejig-schema/README.md b/api/prisma/migrations/20201029214206-rejig-schema/README.md deleted file mode 100644 index 3014ffa..0000000 --- a/api/prisma/migrations/20201029214206-rejig-schema/README.md +++ /dev/null @@ -1,188 +0,0 @@ -# Migration `20201029214206-rejig-schema` - -This migration has been generated by Kurt Hutten at 10/30/2020, 8:42:06 AM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -# explanation - -The previous schema was really just thrown together to progress with parts of the client. -No relations had been included so this change in reality can be consider the initial schema. - -## Database Steps - -```sql -CREATE TABLE "PartReaction" ( - "emote" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "partId" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - - FOREIGN KEY ("userId") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, - FOREIGN KEY ("partId") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE -) - -CREATE TABLE "Comment" ( - "id" TEXT NOT NULL, - "text" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - - FOREIGN KEY ("id") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, - FOREIGN KEY ("id") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE, -PRIMARY KEY ("id") -) - -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Part" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "code" TEXT, - "mainImage" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "authorUserName" TEXT NOT NULL DEFAULT 'irevdev', - - FOREIGN KEY ("authorUserName") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, -PRIMARY KEY ("title","authorUserName") -); -INSERT INTO "new_Part" ("id", "title", "description", "mainImage", "createdAt", "code") SELECT "id", "title", "description", "mainImage", "createdAt", "code" FROM "Part"; -DROP TABLE "Part"; -ALTER TABLE "new_Part" RENAME TO "Part"; -CREATE UNIQUE INDEX "Part.id_unique" ON "Part"("id"); -CREATE UNIQUE INDEX "Part.title_authorUserName_unique" ON "Part"("title", "authorUserName"); -CREATE TABLE "new_User" ( - "userName" TEXT NOT NULL DEFAULT 'irevdev', - "email" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "image" TEXT, - "bio" TEXT, -PRIMARY KEY ("userName") -); -INSERT INTO "new_User" ("email", "createdAt", "updatedAt", "image", "bio") SELECT "email", "createdAt", "updatedAt", "image", "bio" FROM "User"; -DROP TABLE "User"; -ALTER TABLE "new_User" RENAME TO "User"; -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email"); -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON - -CREATE UNIQUE INDEX "PartReaction.emote_userId_partId_unique" ON "PartReaction"("emote", "userId", "partId") - -PRAGMA foreign_keys=off; -DROP TABLE "Post"; -PRAGMA foreign_keys=on - -PRAGMA foreign_keys=off; -DROP TABLE "Contact"; -PRAGMA foreign_keys=on -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201019072122-add-simplify-user-model..20201029214206-rejig-schema ---- datamodel.dml -+++ datamodel.dml -@@ -1,48 +1,76 @@ - datasource DS { - provider = ["sqlite", "postgresql"] -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" - binaryTargets = "native" - } --model Post { -- id Int @id @default(autoincrement()) -- title String -- body String -+// sqlLight does not suport enums so we can't use enums until we set up postgresql in dev mode -+// enum Role { -+// USER -+// ADMIN -+// } -+ -+// enum PartType { -+// CASCADESTUDIO -+// JSCAD -+// } -+ -+model User { -+ userName String @id @default("irevdev") -+ email String @unique -+ // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev -+ // maybe let netlify handle roles for now. -+ // role String @default("user") -+ - createdAt DateTime @default(now()) -+ updatedAt DateTime @updatedAt -+ -+ image String? // url maybe id or file storage service? cloudinary? -+ bio String? //mark down -+ Part Part[] -+ Reaction PartReaction[] -+ Comment Comment[] - } - model Part { -- id Int @id @default(autoincrement()) -- title String -- description String // markdown string -- code String @default("// Welcome to Cascade Studio! Here are some useful functions:\n// Translate(), Rotate(), Scale(), Union(), Difference(), Intersection()\n// Box(), Sphere(), Cylinder(), Cone(), Text3D(), Polygon()\n// Offset(), Extrude(), RotatedExtrude(), Revolve(), Pipe(), Loft(),\n// FilletEdges(), ChamferEdges(),\n// Slider(), Button(), Checkbox()\nlet holeRadius = Slider(\"Radius\", 30 , 20 , 40);\nlet sphere = Sphere(50);\nlet cylinderZ = Cylinder(holeRadius, 200, true);\nlet cylinderY = Rotate([0,1,0], 90, Cylinder(holeRadius, 200, true));\nlet cylinderX = Rotate([1,0,0], 90, Cylinder(holeRadius, 200, true));\nTranslate([0, 0, 50], Difference(sphere, [cylinderX, cylinderY, cylinderZ]));\n\nTranslate([-25, 0, 40], Text3D(\"Hi!\"));\n// Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace!") -- mainImage String // link to cloudinary -- createdAt DateTime @default(now()) -- // userId -- //likes, comments, reactions -+ id String @unique @default(uuid()) -+ title String -+ description String? // markdown string -+ code String? -+ mainImage String? // link to cloudinary -+ createdAt DateTime @default(now()) -+ updatedAt DateTime @default(now()) @updatedAt -+ author User @relation(fields: [authorUserName], references: [userName]) -+ authorUserName String @default("irevdev") -+ -+ Comment Comment[] -+ Reaction PartReaction[] -+ @@id([title, authorUserName]) -+ @@unique([title, authorUserName]) - } --model Contact { -- id Int @id @default(autoincrement()) -- name String -- email String -- message String -+model PartReaction { -+ emote String // an emoji -+ userId String -+ user User @relation(fields: [userId], references: [userName]) -+ partId String -+ part Part @relation(fields: [partId], references: [id]) -+ - createdAt DateTime @default(now()) -+ updatedAt DateTime @updatedAt -+ @@unique([emote, userId, partId]) - } --model User { -- id Int @id @default(autoincrement()) -- email String @unique -- // userName String @unique -- // issuer String @unique -+model Comment { -+ id String @id @default(uuid()) -+ text String // the comment, should I allow mark down? -+ user User @relation(fields: [id], references: [userName]) -+ part Part @relation(fields: [id], references: [id]) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -- -- image String? // url maybe id or file storage service? cloudinary? -- bio String? //mark down - } -``` - - diff --git a/api/prisma/migrations/20201029214206-rejig-schema/schema.prisma b/api/prisma/migrations/20201029214206-rejig-schema/schema.prisma deleted file mode 100644 index cfd2660..0000000 --- a/api/prisma/migrations/20201029214206-rejig-schema/schema.prisma +++ /dev/null @@ -1,76 +0,0 @@ -datasource DS { - provider = ["sqlite", "postgresql"] - url = "***" -} - -generator client { - provider = "prisma-client-js" - binaryTargets = "native" -} - -// sqlLight does not suport enums so we can't use enums until we set up postgresql in dev mode -// enum Role { -// USER -// ADMIN -// } - -// enum PartType { -// CASCADESTUDIO -// JSCAD -// } - -model User { - userName String @id @default(uuid()) - email String @unique - // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev - // maybe let netlify handle roles for now. - // role String @default("user") - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - image String? // url maybe id or file storage service? cloudinary? - bio String? //mark down - Part Part[] - Reaction PartReaction[] - Comment Comment[] -} - -model Part { - id String @unique @default(uuid()) - title String - description String? // markdown string - code String? - mainImage String? // link to cloudinary - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - author User @relation(fields: [authorUserName], references: [userName]) - authorUserName String - - Comment Comment[] - Reaction PartReaction[] - @@id([title, authorUserName]) - @@unique([title, authorUserName]) -} - -model PartReaction { - emote String // an emoji - userId String - user User @relation(fields: [userId], references: [userName]) - partId String - part Part @relation(fields: [partId], references: [id]) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - @@unique([emote, userId, partId]) -} - -model Comment { - id String @id @default(uuid()) - text String // the comment, should I allow mark down? - user User @relation(fields: [id], references: [userName]) - part Part @relation(fields: [id], references: [id]) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} diff --git a/api/prisma/migrations/20201030061957-rejig-schema/README.md b/api/prisma/migrations/20201030061957-rejig-schema/README.md deleted file mode 100644 index 45e5d74..0000000 --- a/api/prisma/migrations/20201030061957-rejig-schema/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Migration `20201030061957-rejig-schema` - -This migration has been generated by Kurt Hutten at 10/30/2020, 5:19:57 PM. -You can check out the [state of the schema](./schema.prisma) after the migration. - -## Database Steps - -```sql -CREATE TABLE "User" ( - "userName" TEXT NOT NULL, - "email" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "image" TEXT, - "bio" TEXT, -PRIMARY KEY ("userName") -) - -CREATE TABLE "Part" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "code" TEXT, - "mainImage" TEXT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - "authorUserName" TEXT NOT NULL, - - FOREIGN KEY ("authorUserName") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, -PRIMARY KEY ("title","authorUserName") -) - -CREATE TABLE "PartReaction" ( - "emote" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "partId" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - - FOREIGN KEY ("userId") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, - FOREIGN KEY ("partId") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE -) - -CREATE TABLE "Comment" ( - "id" TEXT NOT NULL, - "text" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL, - - FOREIGN KEY ("id") REFERENCES "User"("userName") ON DELETE CASCADE ON UPDATE CASCADE, - FOREIGN KEY ("id") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE, -PRIMARY KEY ("id") -) - -CREATE UNIQUE INDEX "User.email_unique" ON "User"("email") - -CREATE UNIQUE INDEX "Part.id_unique" ON "Part"("id") - -CREATE UNIQUE INDEX "Part.title_authorUserName_unique" ON "Part"("title", "authorUserName") - -CREATE UNIQUE INDEX "PartReaction.emote_userId_partId_unique" ON "PartReaction"("emote", "userId", "partId") -``` - -## Changes - -```diff -diff --git schema.prisma schema.prisma -migration 20201029214206-rejig-schema..20201030061957-rejig-schema ---- datamodel.dml -+++ datamodel.dml -@@ -1,7 +1,7 @@ - datasource DS { - provider = ["sqlite", "postgresql"] -- url = "***" -+ url = "***" - } - generator client { - provider = "prisma-client-js" -@@ -19,9 +19,9 @@ - // JSCAD - // } - model User { -- userName String @id @default(uuid()) -+ userName String @id - email String @unique - // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev - // maybe let netlify handle roles for now. - // role String @default("user") -``` - - diff --git a/api/prisma/migrations/20201030061957-rejig-schema/steps.json b/api/prisma/migrations/20201030061957-rejig-schema/steps.json deleted file mode 100644 index 17d5f9e..0000000 --- a/api/prisma/migrations/20201030061957-rejig-schema/steps.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "version": "0.3.14-fixed", - "steps": [ - { - "tag": "DeleteDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "updatedAt" - }, - "directive": "default" - } - }, - { - "tag": "DeleteDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "authorUserName" - }, - "directive": "default" - } - }, - { - "tag": "DeleteDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "userName" - }, - "directive": "default" - } - } - ] -} \ No newline at end of file diff --git a/api/prisma/migrations/20201101183848-db-init/README.md b/api/prisma/migrations/20201101183848-db-init/README.md new file mode 100644 index 0000000..29cd885 --- /dev/null +++ b/api/prisma/migrations/20201101183848-db-init/README.md @@ -0,0 +1,158 @@ +# Migration `20201101183848-db-init` + +This migration has been generated by Kurt Hutten at 11/2/2020, 5:38:48 AM. +You can check out the [state of the schema](./schema.prisma) after the migration. + +## Database Steps + +```sql +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "userName" TEXT NOT NULL, + "email" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "image" TEXT, + "bio" TEXT, +PRIMARY KEY ("id") +) + +CREATE TABLE "Part" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "code" TEXT, + "mainImage" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "userId" TEXT NOT NULL, + + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE, +PRIMARY KEY ("id") +) + +CREATE TABLE "PartReaction" ( + "id" TEXT NOT NULL, + "emote" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "partId" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY ("partId") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE, +PRIMARY KEY ("id") +) + +CREATE TABLE "Comment" ( + "id" TEXT NOT NULL, + "text" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "partId" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY ("partId") REFERENCES "Part"("id") ON DELETE CASCADE ON UPDATE CASCADE, +PRIMARY KEY ("id") +) + +CREATE UNIQUE INDEX "User.userName_unique" ON "User"("userName") + +CREATE UNIQUE INDEX "User.email_unique" ON "User"("email") + +CREATE UNIQUE INDEX "Part.title_userId_unique" ON "Part"("title", "userId") + +CREATE UNIQUE INDEX "PartReaction.emote_userId_partId_unique" ON "PartReaction"("emote", "userId", "partId") +``` + +## Changes + +```diff +diff --git schema.prisma schema.prisma +migration ..20201101183848-db-init +--- datamodel.dml ++++ datamodel.dml +@@ -1,0 +1,79 @@ ++datasource DS { ++ provider = ["sqlite", "postgresql"] ++ url = "***" ++} ++ ++generator client { ++ provider = "prisma-client-js" ++ binaryTargets = "native" ++} ++ ++// sqlLight does not suport enums so we can't use enums until we set up postgresql in dev mode ++// enum Role { ++// USER ++// ADMIN ++// } ++ ++// enum PartType { ++// CASCADESTUDIO ++// JSCAD ++// } ++ ++model User { ++ id String @id @default(uuid()) ++ userName String @unique // reffered to as userId in @relations ++ email String @unique ++ // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev ++ // maybe let netlify handle roles for now. ++ // role String @default("user") ++ ++ createdAt DateTime @default(now()) ++ updatedAt DateTime @updatedAt ++ ++ image String? // url maybe id or file storage service? cloudinary? ++ bio String? //mark down ++ Part Part[] ++ Reaction PartReaction[] ++ Comment Comment[] ++} ++ ++model Part { ++ id String @id @default(uuid()) ++ title String ++ description String? // markdown string ++ code String? ++ mainImage String? // link to cloudinary ++ createdAt DateTime @default(now()) ++ updatedAt DateTime @updatedAt ++ user User @relation(fields: [userId], references: [id]) ++ userId String ++ ++ Comment Comment[] ++ Reaction PartReaction[] ++ @@unique([title, userId]) ++} ++ ++model PartReaction { ++ id String @id @default(uuid()) ++ emote String // an emoji ++ user User @relation(fields: [userId], references: [id]) ++ userId String ++ part Part @relation(fields: [partId], references: [id]) ++ partId String ++ ++ createdAt DateTime @default(now()) ++ updatedAt DateTime @updatedAt ++ @@unique([emote, userId, partId]) ++} ++ ++model Comment { ++ id String @id @default(uuid()) ++ text String // the comment, should I allow mark down? ++ user User @relation(fields: [userId], references: [id]) ++ userId String ++ part Part @relation(fields: [partId], references: [id]) ++ partId String ++ ++ createdAt DateTime @default(now()) ++ updatedAt DateTime @updatedAt ++} +``` + + diff --git a/api/prisma/migrations/20201030061957-rejig-schema/schema.prisma b/api/prisma/migrations/20201101183848-db-init/schema.prisma similarity index 60% rename from api/prisma/migrations/20201030061957-rejig-schema/schema.prisma rename to api/prisma/migrations/20201101183848-db-init/schema.prisma index 5515849..f5d13ba 100644 --- a/api/prisma/migrations/20201030061957-rejig-schema/schema.prisma +++ b/api/prisma/migrations/20201101183848-db-init/schema.prisma @@ -20,7 +20,8 @@ generator client { // } model User { - userName String @id + id String @id @default(uuid()) + userName String @unique // reffered to as userId in @relations email String @unique // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev // maybe let netlify handle roles for now. @@ -37,28 +38,28 @@ model User { } model Part { - id String @unique @default(uuid()) - title String - description String? // markdown string - code String? - mainImage String? // link to cloudinary - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - author User @relation(fields: [authorUserName], references: [userName]) - authorUserName String + id String @id @default(uuid()) + title String + description String? // markdown string + code String? + mainImage String? // link to cloudinary + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId String Comment Comment[] Reaction PartReaction[] - @@id([title, authorUserName]) - @@unique([title, authorUserName]) + @@unique([title, userId]) } model PartReaction { + id String @id @default(uuid()) emote String // an emoji + user User @relation(fields: [userId], references: [id]) userId String - user User @relation(fields: [userId], references: [userName]) - partId String part Part @relation(fields: [partId], references: [id]) + partId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -66,10 +67,12 @@ model PartReaction { } model Comment { - id String @id @default(uuid()) - text String // the comment, should I allow mark down? - user User @relation(fields: [id], references: [userName]) - part Part @relation(fields: [id], references: [id]) + id String @id @default(uuid()) + text String // the comment, should I allow mark down? + user User @relation(fields: [userId], references: [id]) + userId String + part Part @relation(fields: [partId], references: [id]) + partId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/api/prisma/migrations/20201029214206-rejig-schema/steps.json b/api/prisma/migrations/20201101183848-db-init/steps.json similarity index 77% rename from api/prisma/migrations/20201029214206-rejig-schema/steps.json rename to api/prisma/migrations/20201101183848-db-init/steps.json index a0b86eb..ce0e48a 100644 --- a/api/prisma/migrations/20201029214206-rejig-schema/steps.json +++ b/api/prisma/migrations/20201101183848-db-init/steps.json @@ -1,6 +1,404 @@ { "version": "0.3.14-fixed", "steps": [ + { + "tag": "CreateSource", + "source": "DS" + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Source", + "source": "DS" + }, + "argument": "provider", + "value": "[\"sqlite\", \"postgresql\"]" + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Source", + "source": "DS" + }, + "argument": "url", + "value": "\"***\"" + }, + { + "tag": "CreateModel", + "model": "User" + }, + { + "tag": "CreateField", + "model": "User", + "field": "id", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "id" + }, + "directive": "id" + } + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "id" + }, + "directive": "default" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "User", + "field": "id" + }, + "directive": "default" + }, + "argument": "", + "value": "uuid()" + }, + { + "tag": "CreateField", + "model": "User", + "field": "userName", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "userName" + }, + "directive": "unique" + } + }, + { + "tag": "CreateField", + "model": "User", + "field": "email", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "email" + }, + "directive": "unique" + } + }, + { + "tag": "CreateField", + "model": "User", + "field": "createdAt", + "type": "DateTime", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "createdAt" + }, + "directive": "default" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "User", + "field": "createdAt" + }, + "directive": "default" + }, + "argument": "", + "value": "now()" + }, + { + "tag": "CreateField", + "model": "User", + "field": "updatedAt", + "type": "DateTime", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "User", + "field": "updatedAt" + }, + "directive": "updatedAt" + } + }, + { + "tag": "CreateField", + "model": "User", + "field": "image", + "type": "String", + "arity": "Optional" + }, + { + "tag": "CreateField", + "model": "User", + "field": "bio", + "type": "String", + "arity": "Optional" + }, + { + "tag": "CreateField", + "model": "User", + "field": "Part", + "type": "Part", + "arity": "List" + }, + { + "tag": "CreateField", + "model": "User", + "field": "Reaction", + "type": "PartReaction", + "arity": "List" + }, + { + "tag": "CreateField", + "model": "User", + "field": "Comment", + "type": "Comment", + "arity": "List" + }, + { + "tag": "CreateModel", + "model": "Part" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "id", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "Part", + "field": "id" + }, + "directive": "id" + } + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "Part", + "field": "id" + }, + "directive": "default" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "Part", + "field": "id" + }, + "directive": "default" + }, + "argument": "", + "value": "uuid()" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "title", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "description", + "type": "String", + "arity": "Optional" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "code", + "type": "String", + "arity": "Optional" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "mainImage", + "type": "String", + "arity": "Optional" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "createdAt", + "type": "DateTime", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "Part", + "field": "createdAt" + }, + "directive": "default" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "Part", + "field": "createdAt" + }, + "directive": "default" + }, + "argument": "", + "value": "now()" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "updatedAt", + "type": "DateTime", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "Part", + "field": "updatedAt" + }, + "directive": "updatedAt" + } + }, + { + "tag": "CreateField", + "model": "Part", + "field": "user", + "type": "User", + "arity": "Required" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "Part", + "field": "user" + }, + "directive": "relation" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "Part", + "field": "user" + }, + "directive": "relation" + }, + "argument": "fields", + "value": "[userId]" + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "Part", + "field": "user" + }, + "directive": "relation" + }, + "argument": "references", + "value": "[id]" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "userId", + "type": "String", + "arity": "Required" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "Comment", + "type": "Comment", + "arity": "List" + }, + { + "tag": "CreateField", + "model": "Part", + "field": "Reaction", + "type": "PartReaction", + "arity": "List" + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Model", + "model": "Part", + "arguments": [ + { + "name": "", + "value": "[title, userId]" + } + ] + }, + "directive": "unique" + } + }, { "tag": "CreateModel", "model": "PartReaction" @@ -8,14 +406,50 @@ { "tag": "CreateField", "model": "PartReaction", - "field": "emote", + "field": "id", "type": "String", "arity": "Required" }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "PartReaction", + "field": "id" + }, + "directive": "id" + } + }, + { + "tag": "CreateDirective", + "location": { + "path": { + "tag": "Field", + "model": "PartReaction", + "field": "id" + }, + "directive": "default" + } + }, + { + "tag": "CreateArgument", + "location": { + "tag": "Directive", + "path": { + "tag": "Field", + "model": "PartReaction", + "field": "id" + }, + "directive": "default" + }, + "argument": "", + "value": "uuid()" + }, { "tag": "CreateField", "model": "PartReaction", - "field": "userId", + "field": "emote", "type": "String", "arity": "Required" }, @@ -63,12 +497,12 @@ "directive": "relation" }, "argument": "references", - "value": "[userName]" + "value": "[id]" }, { "tag": "CreateField", "model": "PartReaction", - "field": "partId", + "field": "userId", "type": "String", "arity": "Required" }, @@ -118,6 +552,13 @@ "argument": "references", "value": "[id]" }, + { + "tag": "CreateField", + "model": "PartReaction", + "field": "partId", + "type": "String", + "arity": "Required" + }, { "tag": "CreateField", "model": "PartReaction", @@ -268,7 +709,7 @@ "directive": "relation" }, "argument": "fields", - "value": "[id]" + "value": "[userId]" }, { "tag": "CreateArgument", @@ -282,7 +723,14 @@ "directive": "relation" }, "argument": "references", - "value": "[userName]" + "value": "[id]" + }, + { + "tag": "CreateField", + "model": "Comment", + "field": "userId", + "type": "String", + "arity": "Required" }, { "tag": "CreateField", @@ -314,7 +762,7 @@ "directive": "relation" }, "argument": "fields", - "value": "[id]" + "value": "[partId]" }, { "tag": "CreateArgument", @@ -330,6 +778,13 @@ "argument": "references", "value": "[id]" }, + { + "tag": "CreateField", + "model": "Comment", + "field": "partId", + "type": "String", + "arity": "Required" + }, { "tag": "CreateField", "model": "Comment", @@ -379,328 +834,6 @@ }, "directive": "updatedAt" } - }, - { - "tag": "DeleteModel", - "model": "Post" - }, - { - "tag": "DeleteModel", - "model": "Contact" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "updatedAt", - "type": "DateTime", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "updatedAt" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "updatedAt" - }, - "directive": "default" - }, - "argument": "", - "value": "now()" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "updatedAt" - }, - "directive": "updatedAt" - } - }, - { - "tag": "CreateField", - "model": "Part", - "field": "author", - "type": "User", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "author" - }, - "directive": "relation" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "author" - }, - "directive": "relation" - }, - "argument": "fields", - "value": "[authorUserName]" - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "author" - }, - "directive": "relation" - }, - "argument": "references", - "value": "[userName]" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "authorUserName", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "authorUserName" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "authorUserName" - }, - "directive": "default" - }, - "argument": "", - "value": "\"irevdev\"" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "Comment", - "type": "Comment", - "arity": "List" - }, - { - "tag": "CreateField", - "model": "Part", - "field": "Reaction", - "type": "PartReaction", - "arity": "List" - }, - { - "tag": "UpdateField", - "model": "Part", - "field": "id", - "type": "String" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "unique" - } - }, - { - "tag": "UpdateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "default" - }, - "argument": "", - "newValue": "uuid()" - }, - { - "tag": "DeleteDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "id" - }, - "directive": "id" - } - }, - { - "tag": "UpdateField", - "model": "Part", - "field": "description", - "arity": "Optional" - }, - { - "tag": "UpdateField", - "model": "Part", - "field": "mainImage", - "arity": "Optional" - }, - { - "tag": "UpdateField", - "model": "Part", - "field": "code", - "arity": "Optional" - }, - { - "tag": "DeleteDirective", - "location": { - "path": { - "tag": "Field", - "model": "Part", - "field": "code" - }, - "directive": "default" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Model", - "model": "Part" - }, - "directive": "id" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Model", - "model": "Part" - }, - "directive": "id" - }, - "argument": "", - "value": "[title, authorUserName]" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Model", - "model": "Part", - "arguments": [ - { - "name": "", - "value": "[title, authorUserName]" - } - ] - }, - "directive": "unique" - } - }, - { - "tag": "CreateField", - "model": "User", - "field": "userName", - "type": "String", - "arity": "Required" - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "userName" - }, - "directive": "id" - } - }, - { - "tag": "CreateDirective", - "location": { - "path": { - "tag": "Field", - "model": "User", - "field": "userName" - }, - "directive": "default" - } - }, - { - "tag": "CreateArgument", - "location": { - "tag": "Directive", - "path": { - "tag": "Field", - "model": "User", - "field": "userName" - }, - "directive": "default" - }, - "argument": "", - "value": "\"irevdev\"" - }, - { - "tag": "CreateField", - "model": "User", - "field": "Part", - "type": "Part", - "arity": "List" - }, - { - "tag": "CreateField", - "model": "User", - "field": "Reaction", - "type": "PartReaction", - "arity": "List" - }, - { - "tag": "CreateField", - "model": "User", - "field": "Comment", - "type": "Comment", - "arity": "List" - }, - { - "tag": "DeleteField", - "model": "User", - "field": "id" } ] } \ No newline at end of file diff --git a/api/prisma/migrations/migrate.lock b/api/prisma/migrations/migrate.lock index 66735c0..3d49851 100644 --- a/api/prisma/migrations/migrate.lock +++ b/api/prisma/migrations/migrate.lock @@ -1,11 +1,3 @@ # Prisma Migrate lockfile v1 -20201009213512-create-posts -20201011043647-create-parts -20201011052155-add-code-to-part -20201011082558-add-code-not-needed-upon-create -20201011095227-create-contact -20201018233330-add-simple-user-model -20201019072122-add-simplify-user-model -20201029214206-rejig-schema -20201030061957-rejig-schema \ No newline at end of file +20201101183848-db-init \ No newline at end of file diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index a786c36..a8ac9dc 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -20,7 +20,8 @@ generator client { // } model User { - userName String @id + id String @id @default(uuid()) + userName String @unique // reffered to as userId in @relations email String @unique // role should probably be a list [] and also use enums, neither are supported by sqllight, so we need to set up postgresql in dev // maybe let netlify handle roles for now. @@ -37,28 +38,28 @@ model User { } model Part { - id String @unique @default(uuid()) - title String - description String? // markdown string - code String? - mainImage String? // link to cloudinary - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - author User @relation(fields: [authorUserName], references: [userName]) - authorUserName String + id String @id @default(uuid()) + title String + description String? // markdown string + code String? + mainImage String? // link to cloudinary + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + userId String Comment Comment[] Reaction PartReaction[] - @@id([title, authorUserName]) - @@unique([title, authorUserName]) + @@unique([title, userId]) } model PartReaction { + id String @id @default(uuid()) emote String // an emoji + user User @relation(fields: [userId], references: [id]) userId String - user User @relation(fields: [userId], references: [userName]) - partId String part Part @relation(fields: [partId], references: [id]) + partId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -66,10 +67,12 @@ model PartReaction { } model Comment { - id String @id @default(uuid()) - text String // the comment, should I allow mark down? - user User @relation(fields: [id], references: [userName]) - part Part @relation(fields: [id], references: [id]) + id String @id @default(uuid()) + text String // the comment, should I allow mark down? + user User @relation(fields: [userId], references: [id]) + userId String + part Part @relation(fields: [partId], references: [id]) + partId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/api/src/functions/identity-signup.js b/api/src/functions/identity-signup.js index 6b52938..f816d78 100644 --- a/api/src/functions/identity-signup.js +++ b/api/src/functions/identity-signup.js @@ -1,4 +1,4 @@ -import { createUserInsecure } from 'src/services/users/users.js' +// import { createUserInsecure } from 'src/services/users/users.js' export const handler = async (req, _context) => { const body = JSON.parse(req.body) @@ -66,7 +66,7 @@ export const handler = async (req, _context) => { bio: 'default bio' // full_name: user.user_metadata.full_name } - await createUserInsecure({input}) + // await createUserInsecure({input}) return { statusCode: 200, diff --git a/api/src/graphql/comments.sdl.js b/api/src/graphql/comments.sdl.js new file mode 100644 index 0000000..b36296b --- /dev/null +++ b/api/src/graphql/comments.sdl.js @@ -0,0 +1,35 @@ +export const schema = gql` + type Comment { + id: String! + text: String! + user: User! + userId: String! + part: Part! + partId: String! + createdAt: DateTime! + updatedAt: DateTime! + } + + type Query { + comments: [Comment!]! + comment(id: String!): Comment + } + + input CreateCommentInput { + text: String! + userId: String! + partId: String! + } + + input UpdateCommentInput { + text: String + userId: String + partId: String + } + + type Mutation { + createComment(input: CreateCommentInput!): Comment! + updateComment(id: String!, input: UpdateCommentInput!): Comment! + deleteComment(id: String!): Comment! + } +` diff --git a/api/src/graphql/partReactions.sdl.js b/api/src/graphql/partReactions.sdl.js new file mode 100644 index 0000000..7aba11f --- /dev/null +++ b/api/src/graphql/partReactions.sdl.js @@ -0,0 +1,38 @@ +export const schema = gql` + type PartReaction { + id: String! + emote: String! + user: User! + userId: String! + part: Part! + partId: String! + createdAt: DateTime! + updatedAt: DateTime! + } + + type Query { + partReactions: [PartReaction!]! + partReaction(id: String!): PartReaction + } + + input CreatePartReactionInput { + emote: String! + userId: String! + partId: String! + } + + input UpdatePartReactionInput { + emote: String + userId: String + partId: String + } + + type Mutation { + createPartReaction(input: CreatePartReactionInput!): PartReaction! + updatePartReaction( + id: String! + input: UpdatePartReactionInput! + ): PartReaction! + deletePartReaction(id: String!): PartReaction! + } +` diff --git a/api/src/graphql/parts.sdl.js b/api/src/graphql/parts.sdl.js new file mode 100644 index 0000000..c8054a4 --- /dev/null +++ b/api/src/graphql/parts.sdl.js @@ -0,0 +1,42 @@ +export const schema = gql` + type Part { + id: String! + title: String! + description: String + code: String + mainImage: String + createdAt: DateTime! + updatedAt: DateTime! + user: User! + userId: String! + Comment: [Comment]! + Reaction: [PartReaction]! + } + + type Query { + parts: [Part!]! + part(id: String!): Part + } + + input CreatePartInput { + title: String! + description: String + code: String + mainImage: String + userId: String! + } + + input UpdatePartInput { + title: String + description: String + code: String + mainImage: String + userId: String + } + + type Mutation { + createPart(input: CreatePartInput!): Part! + updatePart(id: String!, input: UpdatePartInput!): Part! + deletePart(id: String!): Part! + } +` diff --git a/api/src/graphql/users.sdl.js b/api/src/graphql/users.sdl.js new file mode 100644 index 0000000..4e25e97 --- /dev/null +++ b/api/src/graphql/users.sdl.js @@ -0,0 +1,39 @@ +export const schema = gql` + type User { + id: String! + userName: String! + email: String! + createdAt: DateTime! + updatedAt: DateTime! + image: String + bio: String + Part: [Part]! + Reaction: [PartReaction]! + Comment: [Comment]! + } + + type Query { + users: [User!]! + user(id: String!): User + } + + input CreateUserInput { + userName: String! + email: String! + image: String + bio: String + } + + input UpdateUserInput { + userName: String + email: String + image: String + bio: String + } + + type Mutation { + createUser(input: CreateUserInput!): User! + updateUser(id: String!, input: UpdateUserInput!): User! + deleteUser(id: String!): User! + } +` diff --git a/api/src/services/comments/comments.js b/api/src/services/comments/comments.js new file mode 100644 index 0000000..5c46fdf --- /dev/null +++ b/api/src/services/comments/comments.js @@ -0,0 +1,38 @@ +import { db } from 'src/lib/db' +import { foreignKeyReplacement } from 'src/services/helpers' + +export const comments = () => { + return db.comment.findMany() +} + +export const comment = ({ id }) => { + return db.comment.findOne({ + where: { id }, + }) +} + +export const createComment = ({ input }) => { + return db.comment.create({ + data: foreignKeyReplacement(input), + }) +} + +export const updateComment = ({ id, input }) => { + return db.comment.update({ + data: foreignKeyReplacement(input), + where: { id }, + }) +} + +export const deleteComment = ({ id }) => { + return db.comment.delete({ + where: { id }, + }) +} + +export const Comment = { + user: (_obj, { root }) => + db.comment.findOne({ where: { id: root.id } }).user(), + part: (_obj, { root }) => + db.comment.findOne({ where: { id: root.id } }).part(), +} diff --git a/api/src/services/comments/comments.test.js b/api/src/services/comments/comments.test.js new file mode 100644 index 0000000..108fd0f --- /dev/null +++ b/api/src/services/comments/comments.test.js @@ -0,0 +1,9 @@ +/* +import { comments } from './comments' +*/ + +describe('comments', () => { + it('returns true', () => { + expect(true).toBe(true) + }) +}) diff --git a/api/src/services/helpers.js b/api/src/services/helpers.js new file mode 100644 index 0000000..ed474f3 --- /dev/null +++ b/api/src/services/helpers.js @@ -0,0 +1,13 @@ +export const foreignKeyReplacement = (input) => { + let output = input + const foreignKeys = Object.keys(input).filter((k) => k.match(/Id$/)) + foreignKeys.forEach((key) => { + const modelName = key.replace(/Id$/, '') + const value = input[key] + delete output[key] + output = Object.assign(output, { + [modelName]: { connect: { id: value } }, + }) + }) + return output +} diff --git a/api/src/services/partReactions/partReactions.js b/api/src/services/partReactions/partReactions.js new file mode 100644 index 0000000..e7b526d --- /dev/null +++ b/api/src/services/partReactions/partReactions.js @@ -0,0 +1,38 @@ +import { db } from 'src/lib/db' +import { foreignKeyReplacement } from 'src/services/helpers' + +export const partReactions = () => { + return db.partReaction.findMany() +} + +export const partReaction = ({ id }) => { + return db.partReaction.findOne({ + where: { id }, + }) +} + +export const createPartReaction = ({ input }) => { + return db.partReaction.create({ + data: foreignKeyReplacement(input), + }) +} + +export const updatePartReaction = ({ id, input }) => { + return db.partReaction.update({ + data: foreignKeyReplacement(input), + where: { id }, + }) +} + +export const deletePartReaction = ({ id }) => { + return db.partReaction.delete({ + where: { id }, + }) +} + +export const PartReaction = { + user: (_obj, { root }) => + db.partReaction.findOne({ where: { id: root.id } }).user(), + part: (_obj, { root }) => + db.partReaction.findOne({ where: { id: root.id } }).part(), +} diff --git a/api/src/services/partReactions/partReactions.test.js b/api/src/services/partReactions/partReactions.test.js new file mode 100644 index 0000000..47d4f20 --- /dev/null +++ b/api/src/services/partReactions/partReactions.test.js @@ -0,0 +1,9 @@ +/* +import { partReactions } from './partReactions' +*/ + +describe('partReactions', () => { + it('returns true', () => { + expect(true).toBe(true) + }) +}) diff --git a/api/src/services/parts/parts.js b/api/src/services/parts/parts.js new file mode 100644 index 0000000..2c3cee1 --- /dev/null +++ b/api/src/services/parts/parts.js @@ -0,0 +1,40 @@ +import { db } from 'src/lib/db' +import { foreignKeyReplacement } from 'src/services/helpers' +import { user } from 'src/services/users/users' + +export const parts = () => { + return db.part.findMany() +} + +export const part = ({ id }) => { + return db.part.findOne({ + where: { id }, + }) +} + +export const createPart = async ({ input }) => { + return db.part.create({ + data: foreignKeyReplacement(input), + }) +} + +export const updatePart = ({ id, input }) => { + return db.part.update({ + data: foreignKeyReplacement(input), + where: { id }, + }) +} + +export const deletePart = ({ id }) => { + return db.part.delete({ + where: { id }, + }) +} + +export const Part = { + user: (_obj, { root }) => db.part.findOne({ where: { id: root.id } }).user(), + Comment: (_obj, { root }) => + db.part.findOne({ where: { id: root.id } }).Comment(), + Reaction: (_obj, { root }) => + db.part.findOne({ where: { id: root.id } }).Reaction(), +} diff --git a/api/src/services/parts/parts.test.js b/api/src/services/parts/parts.test.js new file mode 100644 index 0000000..e8b80ce --- /dev/null +++ b/api/src/services/parts/parts.test.js @@ -0,0 +1,9 @@ +/* +import { parts } from './parts' +*/ + +describe('parts', () => { + it('returns true', () => { + expect(true).toBe(true) + }) +}) diff --git a/api/src/services/users/users.js b/api/src/services/users/users.js new file mode 100644 index 0000000..9a10d66 --- /dev/null +++ b/api/src/services/users/users.js @@ -0,0 +1,38 @@ +import { db } from 'src/lib/db' + +export const users = () => { + return db.user.findMany() +} + +export const user = ({ id }) => { + return db.user.findOne({ + where: { id }, + }) +} + +export const createUser = ({ input }) => { + return db.user.create({ + data: input, + }) +} + +export const updateUser = ({ id, input }) => { + return db.user.update({ + data: input, + where: { id }, + }) +} + +export const deleteUser = ({ id }) => { + return db.user.delete({ + where: { id }, + }) +} + +export const User = { + Part: (_obj, { root }) => db.user.findOne({ where: { id: root.id } }).Part(), + Reaction: (_obj, { root }) => + db.user.findOne({ where: { id: root.id } }).Reaction(), + Comment: (_obj, { root }) => + db.user.findOne({ where: { id: root.id } }).Comment(), +} diff --git a/api/src/services/users/users.test.js b/api/src/services/users/users.test.js new file mode 100644 index 0000000..bac7cb4 --- /dev/null +++ b/api/src/services/users/users.test.js @@ -0,0 +1,9 @@ +/* +import { users } from './users' +*/ + +describe('users', () => { + it('returns true', () => { + expect(true).toBe(true) + }) +}) diff --git a/web/src/Routes.js b/web/src/Routes.js index c9ebd82..257a6ee 100644 --- a/web/src/Routes.js +++ b/web/src/Routes.js @@ -12,8 +12,24 @@ import { Router, Route, Private } from '@redwoodjs/router' const Routes = () => { return ( - - + + + + + + + + + + + + + + + + + + {/* */} ) diff --git a/web/src/components/Comment/Comment.js b/web/src/components/Comment/Comment.js new file mode 100644 index 0000000..4d928d2 --- /dev/null +++ b/web/src/components/Comment/Comment.js @@ -0,0 +1,103 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes, navigate } from '@redwoodjs/router' + +const DELETE_COMMENT_MUTATION = gql` + mutation DeleteCommentMutation($id: String!) { + deleteComment(id: $id) { + id + } + } +` + +const jsonDisplay = (obj) => { + return ( +
+      {JSON.stringify(obj, null, 2)}
+    
+ ) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const Comment = ({ comment }) => { + const { addMessage } = useFlash() + const [deleteComment] = useMutation(DELETE_COMMENT_MUTATION, { + onCompleted: () => { + navigate(routes.comments()) + addMessage('Comment deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete comment ' + id + '?')) { + deleteComment({ variables: { id } }) + } + } + + return ( + <> +
+
+

+ Comment {comment.id} Detail +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{comment.id}
Text{comment.text}
User id{comment.userId}
Part id{comment.partId}
Created at{timeTag(comment.createdAt)}
Updated at{timeTag(comment.updatedAt)}
+
+ + + ) +} + +export default Comment diff --git a/web/src/components/CommentCell/CommentCell.js b/web/src/components/CommentCell/CommentCell.js new file mode 100644 index 0000000..1c93fe8 --- /dev/null +++ b/web/src/components/CommentCell/CommentCell.js @@ -0,0 +1,22 @@ +import Comment from 'src/components/Comment' + +export const QUERY = gql` + query FIND_COMMENT_BY_ID($id: String!) { + comment: comment(id: $id) { + id + text + userId + partId + createdAt + updatedAt + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () =>
Comment not found
+ +export const Success = ({ comment }) => { + return +} diff --git a/web/src/components/CommentForm/CommentForm.js b/web/src/components/CommentForm/CommentForm.js new file mode 100644 index 0000000..e145dc5 --- /dev/null +++ b/web/src/components/CommentForm/CommentForm.js @@ -0,0 +1,83 @@ +import { + Form, + FormError, + FieldError, + Label, + TextField, + Submit, +} from '@redwoodjs/forms' + +const CommentForm = (props) => { + const onSubmit = (data) => { + props.onSave(data, props?.comment?.id) + } + + return ( +
+
+ + + + + + + + + + + + + + +
+ + Save + +
+ +
+ ) +} + +export default CommentForm diff --git a/web/src/components/Comments/Comments.js b/web/src/components/Comments/Comments.js new file mode 100644 index 0000000..f105938 --- /dev/null +++ b/web/src/components/Comments/Comments.js @@ -0,0 +1,109 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes } from '@redwoodjs/router' + +const DELETE_COMMENT_MUTATION = gql` + mutation DeleteCommentMutation($id: String!) { + deleteComment(id: $id) { + id + } + } +` + +const MAX_STRING_LENGTH = 150 + +const truncate = (text) => { + let output = text + if (text && text.length > MAX_STRING_LENGTH) { + output = output.substring(0, MAX_STRING_LENGTH) + '...' + } + return output +} + +const jsonTruncate = (obj) => { + return truncate(JSON.stringify(obj, null, 2)) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const CommentsList = ({ comments }) => { + const { addMessage } = useFlash() + const [deleteComment] = useMutation(DELETE_COMMENT_MUTATION, { + onCompleted: () => { + addMessage('Comment deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete comment ' + id + '?')) { + deleteComment({ variables: { id }, refetchQueries: ['COMMENTS'] }) + } + } + + return ( +
+ + + + + + + + + + + + + + {comments.map((comment) => ( + + + + + + + + + + ))} + +
IdTextUser idPart idCreated atUpdated at 
{truncate(comment.id)}{truncate(comment.text)}{truncate(comment.userId)}{truncate(comment.partId)}{timeTag(comment.createdAt)}{timeTag(comment.updatedAt)} + +
+
+ ) +} + +export default CommentsList diff --git a/web/src/components/CommentsCell/CommentsCell.js b/web/src/components/CommentsCell/CommentsCell.js new file mode 100644 index 0000000..eefd988 --- /dev/null +++ b/web/src/components/CommentsCell/CommentsCell.js @@ -0,0 +1,33 @@ +import { Link, routes } from '@redwoodjs/router' + +import Comments from 'src/components/Comments' + +export const QUERY = gql` + query COMMENTS { + comments { + id + text + userId + partId + createdAt + updatedAt + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () => { + return ( +
+ {'No comments yet. '} + + {'Create one?'} + +
+ ) +} + +export const Success = ({ comments }) => { + return +} diff --git a/web/src/components/EditCommentCell/EditCommentCell.js b/web/src/components/EditCommentCell/EditCommentCell.js new file mode 100644 index 0000000..3edac98 --- /dev/null +++ b/web/src/components/EditCommentCell/EditCommentCell.js @@ -0,0 +1,60 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import CommentForm from 'src/components/CommentForm' + +export const QUERY = gql` + query FIND_COMMENT_BY_ID($id: String!) { + comment: comment(id: $id) { + id + text + userId + partId + createdAt + updatedAt + } + } +` +const UPDATE_COMMENT_MUTATION = gql` + mutation UpdateCommentMutation($id: String!, $input: UpdateCommentInput!) { + updateComment(id: $id, input: $input) { + id + } + } +` + +export const Loading = () =>
Loading...
+ +export const Success = ({ comment }) => { + const { addMessage } = useFlash() + const [updateComment, { loading, error }] = useMutation( + UPDATE_COMMENT_MUTATION, + { + onCompleted: () => { + navigate(routes.comments()) + addMessage('Comment updated.', { classes: 'rw-flash-success' }) + }, + } + ) + + const onSave = (input, id) => { + updateComment({ variables: { id, input } }) + } + + return ( +
+
+

+ Edit Comment {comment.id} +

+
+
+ +
+
+ ) +} diff --git a/web/src/components/EditPartCell/EditPartCell.js b/web/src/components/EditPartCell/EditPartCell.js new file mode 100644 index 0000000..8b551ac --- /dev/null +++ b/web/src/components/EditPartCell/EditPartCell.js @@ -0,0 +1,52 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import PartForm from 'src/components/PartForm' + +export const QUERY = gql` + query FIND_PART_BY_ID($id: String!) { + part: part(id: $id) { + id + title + description + code + mainImage + createdAt + updatedAt + userId + } + } +` +const UPDATE_PART_MUTATION = gql` + mutation UpdatePartMutation($id: String!, $input: UpdatePartInput!) { + updatePart(id: $id, input: $input) { + id + } + } +` + +export const Loading = () =>
Loading...
+ +export const Success = ({ part }) => { + const { addMessage } = useFlash() + const [updatePart, { loading, error }] = useMutation(UPDATE_PART_MUTATION, { + onCompleted: () => { + navigate(routes.parts()) + addMessage('Part updated.', { classes: 'rw-flash-success' }) + }, + }) + + const onSave = (input, id) => { + updatePart({ variables: { id, input } }) + } + + return ( +
+
+

Edit Part {part.id}

+
+
+ +
+
+ ) +} diff --git a/web/src/components/EditPartReactionCell/EditPartReactionCell.js b/web/src/components/EditPartReactionCell/EditPartReactionCell.js new file mode 100644 index 0000000..2c23c50 --- /dev/null +++ b/web/src/components/EditPartReactionCell/EditPartReactionCell.js @@ -0,0 +1,63 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import PartReactionForm from 'src/components/PartReactionForm' + +export const QUERY = gql` + query FIND_PART_REACTION_BY_ID($id: String!) { + partReaction: partReaction(id: $id) { + id + emote + userId + partId + createdAt + updatedAt + } + } +` +const UPDATE_PART_REACTION_MUTATION = gql` + mutation UpdatePartReactionMutation( + $id: String! + $input: UpdatePartReactionInput! + ) { + updatePartReaction(id: $id, input: $input) { + id + } + } +` + +export const Loading = () =>
Loading...
+ +export const Success = ({ partReaction }) => { + const { addMessage } = useFlash() + const [updatePartReaction, { loading, error }] = useMutation( + UPDATE_PART_REACTION_MUTATION, + { + onCompleted: () => { + navigate(routes.partReactions()) + addMessage('PartReaction updated.', { classes: 'rw-flash-success' }) + }, + } + ) + + const onSave = (input, id) => { + updatePartReaction({ variables: { id, input } }) + } + + return ( +
+
+

+ Edit PartReaction {partReaction.id} +

+
+
+ +
+
+ ) +} diff --git a/web/src/components/EditUserCell/EditUserCell.js b/web/src/components/EditUserCell/EditUserCell.js new file mode 100644 index 0000000..7d3682b --- /dev/null +++ b/web/src/components/EditUserCell/EditUserCell.js @@ -0,0 +1,51 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import UserForm from 'src/components/UserForm' + +export const QUERY = gql` + query FIND_USER_BY_ID($id: String!) { + user: user(id: $id) { + id + userName + email + createdAt + updatedAt + image + bio + } + } +` +const UPDATE_USER_MUTATION = gql` + mutation UpdateUserMutation($id: String!, $input: UpdateUserInput!) { + updateUser(id: $id, input: $input) { + id + } + } +` + +export const Loading = () =>
Loading...
+ +export const Success = ({ user }) => { + const { addMessage } = useFlash() + const [updateUser, { loading, error }] = useMutation(UPDATE_USER_MUTATION, { + onCompleted: () => { + navigate(routes.users()) + addMessage('User updated.', { classes: 'rw-flash-success' }) + }, + }) + + const onSave = (input, id) => { + updateUser({ variables: { id, input } }) + } + + return ( +
+
+

Edit User {user.id}

+
+
+ +
+
+ ) +} diff --git a/web/src/components/IdePartCell/IdePartCell.js b/web/src/components/IdePartCell/IdePartCell.js index 3b95c0b..122ed88 100644 --- a/web/src/components/IdePartCell/IdePartCell.js +++ b/web/src/components/IdePartCell/IdePartCell.js @@ -1,6 +1,6 @@ import { useMutation, useFlash } from '@redwoodjs/web' import { navigate, routes } from '@redwoodjs/router' -import Part from 'src/components/Part' +// import Part from 'src/components/Part' export const QUERY = gql` query FIND_PART_BY_ID($id: Int!) { @@ -42,5 +42,6 @@ export const Success = ({ part }) => { console.log(id, input, 'wowow') updatePart({ variables: { id, input } }) } - return + return
TODO part
+ // return } diff --git a/web/src/components/NewComment/NewComment.js b/web/src/components/NewComment/NewComment.js new file mode 100644 index 0000000..750bba4 --- /dev/null +++ b/web/src/components/NewComment/NewComment.js @@ -0,0 +1,41 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import CommentForm from 'src/components/CommentForm' + +const CREATE_COMMENT_MUTATION = gql` + mutation CreateCommentMutation($input: CreateCommentInput!) { + createComment(input: $input) { + id + } + } +` + +const NewComment = () => { + const { addMessage } = useFlash() + const [createComment, { loading, error }] = useMutation( + CREATE_COMMENT_MUTATION, + { + onCompleted: () => { + navigate(routes.comments()) + addMessage('Comment created.', { classes: 'rw-flash-success' }) + }, + } + ) + + const onSave = (input) => { + createComment({ variables: { input } }) + } + + return ( +
+
+

New Comment

+
+
+ +
+
+ ) +} + +export default NewComment diff --git a/web/src/components/NewPart/NewPart.js b/web/src/components/NewPart/NewPart.js new file mode 100644 index 0000000..3b7e5ed --- /dev/null +++ b/web/src/components/NewPart/NewPart.js @@ -0,0 +1,38 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import PartForm from 'src/components/PartForm' + +const CREATE_PART_MUTATION = gql` + mutation CreatePartMutation($input: CreatePartInput!) { + createPart(input: $input) { + id + } + } +` + +const NewPart = () => { + const { addMessage } = useFlash() + const [createPart, { loading, error }] = useMutation(CREATE_PART_MUTATION, { + onCompleted: () => { + navigate(routes.parts()) + addMessage('Part created.', { classes: 'rw-flash-success' }) + }, + }) + + const onSave = (input) => { + createPart({ variables: { input } }) + } + + return ( +
+
+

New Part

+
+
+ +
+
+ ) +} + +export default NewPart diff --git a/web/src/components/NewPartReaction/NewPartReaction.js b/web/src/components/NewPartReaction/NewPartReaction.js new file mode 100644 index 0000000..8cbcba3 --- /dev/null +++ b/web/src/components/NewPartReaction/NewPartReaction.js @@ -0,0 +1,41 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import PartReactionForm from 'src/components/PartReactionForm' + +const CREATE_PART_REACTION_MUTATION = gql` + mutation CreatePartReactionMutation($input: CreatePartReactionInput!) { + createPartReaction(input: $input) { + id + } + } +` + +const NewPartReaction = () => { + const { addMessage } = useFlash() + const [createPartReaction, { loading, error }] = useMutation( + CREATE_PART_REACTION_MUTATION, + { + onCompleted: () => { + navigate(routes.partReactions()) + addMessage('PartReaction created.', { classes: 'rw-flash-success' }) + }, + } + ) + + const onSave = (input) => { + createPartReaction({ variables: { input } }) + } + + return ( +
+
+

New PartReaction

+
+
+ +
+
+ ) +} + +export default NewPartReaction diff --git a/web/src/components/NewUser/NewUser.js b/web/src/components/NewUser/NewUser.js new file mode 100644 index 0000000..6f89a18 --- /dev/null +++ b/web/src/components/NewUser/NewUser.js @@ -0,0 +1,38 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { navigate, routes } from '@redwoodjs/router' +import UserForm from 'src/components/UserForm' + +const CREATE_USER_MUTATION = gql` + mutation CreateUserMutation($input: CreateUserInput!) { + createUser(input: $input) { + id + } + } +` + +const NewUser = () => { + const { addMessage } = useFlash() + const [createUser, { loading, error }] = useMutation(CREATE_USER_MUTATION, { + onCompleted: () => { + navigate(routes.users()) + addMessage('User created.', { classes: 'rw-flash-success' }) + }, + }) + + const onSave = (input) => { + createUser({ variables: { input } }) + } + + return ( +
+
+

New User

+
+
+ +
+
+ ) +} + +export default NewUser diff --git a/web/src/components/Part/Part.js b/web/src/components/Part/Part.js new file mode 100644 index 0000000..4fe2e15 --- /dev/null +++ b/web/src/components/Part/Part.js @@ -0,0 +1,111 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes, navigate } from '@redwoodjs/router' + +const DELETE_PART_MUTATION = gql` + mutation DeletePartMutation($id: String!) { + deletePart(id: $id) { + id + } + } +` + +const jsonDisplay = (obj) => { + return ( +
+      {JSON.stringify(obj, null, 2)}
+    
+ ) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const Part = ({ part }) => { + const { addMessage } = useFlash() + const [deletePart] = useMutation(DELETE_PART_MUTATION, { + onCompleted: () => { + navigate(routes.parts()) + addMessage('Part deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete part ' + id + '?')) { + deletePart({ variables: { id } }) + } + } + + return ( + <> +
+
+

+ Part {part.id} Detail +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{part.id}
Title{part.title}
Description{part.description}
Code{part.code}
Main image{part.mainImage}
Created at{timeTag(part.createdAt)}
Updated at{timeTag(part.updatedAt)}
User id{part.userId}
+
+ + + ) +} + +export default Part diff --git a/web/src/components/PartCell/PartCell.js b/web/src/components/PartCell/PartCell.js new file mode 100644 index 0000000..3c69b24 --- /dev/null +++ b/web/src/components/PartCell/PartCell.js @@ -0,0 +1,24 @@ +import Part from 'src/components/Part' + +export const QUERY = gql` + query FIND_PART_BY_ID($id: String!) { + part: part(id: $id) { + id + title + description + code + mainImage + createdAt + updatedAt + userId + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () =>
Part not found
+ +export const Success = ({ part }) => { + return +} diff --git a/web/src/components/PartForm/ImageUploader.js b/web/src/components/PartForm/ImageUploader.js deleted file mode 100644 index 0314a13..0000000 --- a/web/src/components/PartForm/ImageUploader.js +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useCallback, useState } from "react"; -import { useDropzone } from "react-dropzone"; -import Button from "@material-ui/core/Button"; -import axios from 'axios' -import ReactCrop from 'react-image-crop' -import { Dialog } from '@material-ui/core' -import { Image as CloudinaryImage } from 'cloudinary-react' -import 'react-image-crop/dist/ReactCrop.css' -import Svg from 'src/components/Svg/Svg.js' - -const CLOUDINARY_UPLOAD_PRESET = "CadHub_project_images"; -const CLOUDINARY_UPLOAD_URL = "https://api.cloudinary.com/v1_1/irevdev/upload"; - -export default function ImageUploader({ onImageUpload, imageUrl }) { - const [isModalOpen, setIsModalOpen] = useState(false) - const [file, setFile] = useState() - const [cloudinaryId, setCloudinaryId] = useState(imageUrl) - const [imageObj, setImageObj] = useState() - const [crop, setCrop] = useState({ - aspect: 16 / 9, - unit: '%', - width: 100, - }); - async function handleImageUpload() { - const croppedFile = await getCroppedImg(imageObj, crop, 'avatar') - console.log(croppedFile) - const imageData = new FormData(); - imageData.append('upload_preset', CLOUDINARY_UPLOAD_PRESET); - imageData.append('file', croppedFile); - let upload = axios.post(CLOUDINARY_UPLOAD_URL, imageData) - try { - const { data } = await upload - if (data && data.public_id !== "") { - onImageUpload({cloudinaryPublicId: data.public_id}) - setCloudinaryId(data.public_id) - setIsModalOpen(false) - } - } catch (e) { - console.error('ERROR', e) - } - } - // Drag and Drop - const onDrop = useCallback(acceptedFiles => { - setIsModalOpen(true) - const fileReader = new FileReader() - fileReader.onload = () => { - setFile(fileReader.result) - } - fileReader.readAsDataURL(acceptedFiles[0]) - }, []); - - const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop }); - return ( -
-
- {cloudinaryId && } - - {cloudinaryId &&
- -
} - {!cloudinaryId && } - {!cloudinaryId &&
- Drop files here ... - or - upload - -
} -
- setIsModalOpen(false)} - > -
- setImageObj(image)} onChange={newCrop => setCrop(newCrop)} /> - -
-
-
- ); -} - -function getCroppedImg(image, crop, fileName) { - const canvas = document.createElement('canvas'); - const scaleX = image.naturalWidth / image.width; - const scaleY = image.naturalHeight / image.height; - canvas.width = crop.width; - canvas.height = crop.height; - const ctx = canvas.getContext('2d'); - ctx.drawImage( - image, - crop.x * scaleX, - crop.y * scaleY, - crop.width * scaleX, - crop.height * scaleY, - 0, - 0, - crop.width, - crop.height - ); - - // As Base64 string - // const base64Image = canvas.toDataURL('image/jpeg'); - - // As a blob - return new Promise((resolve, reject) => { - canvas.toBlob(blob => { - blob.name = fileName; - resolve(blob); - }, 'image/jpeg', 1); - }); -} - diff --git a/web/src/components/PartForm/PartForm.js b/web/src/components/PartForm/PartForm.js new file mode 100644 index 0000000..3fc1009 --- /dev/null +++ b/web/src/components/PartForm/PartForm.js @@ -0,0 +1,115 @@ +import { + Form, + FormError, + FieldError, + Label, + TextField, + Submit, +} from '@redwoodjs/forms' + +const PartForm = (props) => { + const onSubmit = (data) => { + props.onSave(data, props?.part?.id) + } + + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + Save + +
+ +
+ ) +} + +export default PartForm diff --git a/web/src/components/PartReaction/PartReaction.js b/web/src/components/PartReaction/PartReaction.js new file mode 100644 index 0000000..82f0645 --- /dev/null +++ b/web/src/components/PartReaction/PartReaction.js @@ -0,0 +1,103 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes, navigate } from '@redwoodjs/router' + +const DELETE_PART_REACTION_MUTATION = gql` + mutation DeletePartReactionMutation($id: String!) { + deletePartReaction(id: $id) { + id + } + } +` + +const jsonDisplay = (obj) => { + return ( +
+      {JSON.stringify(obj, null, 2)}
+    
+ ) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const PartReaction = ({ partReaction }) => { + const { addMessage } = useFlash() + const [deletePartReaction] = useMutation(DELETE_PART_REACTION_MUTATION, { + onCompleted: () => { + navigate(routes.partReactions()) + addMessage('PartReaction deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete partReaction ' + id + '?')) { + deletePartReaction({ variables: { id } }) + } + } + + return ( + <> +
+
+

+ PartReaction {partReaction.id} Detail +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{partReaction.id}
Emote{partReaction.emote}
User id{partReaction.userId}
Part id{partReaction.partId}
Created at{timeTag(partReaction.createdAt)}
Updated at{timeTag(partReaction.updatedAt)}
+
+ + + ) +} + +export default PartReaction diff --git a/web/src/components/PartReactionCell/PartReactionCell.js b/web/src/components/PartReactionCell/PartReactionCell.js new file mode 100644 index 0000000..102916c --- /dev/null +++ b/web/src/components/PartReactionCell/PartReactionCell.js @@ -0,0 +1,22 @@ +import PartReaction from 'src/components/PartReaction' + +export const QUERY = gql` + query FIND_PART_REACTION_BY_ID($id: String!) { + partReaction: partReaction(id: $id) { + id + emote + userId + partId + createdAt + updatedAt + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () =>
PartReaction not found
+ +export const Success = ({ partReaction }) => { + return +} diff --git a/web/src/components/PartReactionForm/PartReactionForm.js b/web/src/components/PartReactionForm/PartReactionForm.js new file mode 100644 index 0000000..5bcac9e --- /dev/null +++ b/web/src/components/PartReactionForm/PartReactionForm.js @@ -0,0 +1,83 @@ +import { + Form, + FormError, + FieldError, + Label, + TextField, + Submit, +} from '@redwoodjs/forms' + +const PartReactionForm = (props) => { + const onSubmit = (data) => { + props.onSave(data, props?.partReaction?.id) + } + + return ( +
+
+ + + + + + + + + + + + + + +
+ + Save + +
+ +
+ ) +} + +export default PartReactionForm diff --git a/web/src/components/PartReactions/PartReactions.js b/web/src/components/PartReactions/PartReactions.js new file mode 100644 index 0000000..2653abc --- /dev/null +++ b/web/src/components/PartReactions/PartReactions.js @@ -0,0 +1,112 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes } from '@redwoodjs/router' + +const DELETE_PART_REACTION_MUTATION = gql` + mutation DeletePartReactionMutation($id: String!) { + deletePartReaction(id: $id) { + id + } + } +` + +const MAX_STRING_LENGTH = 150 + +const truncate = (text) => { + let output = text + if (text && text.length > MAX_STRING_LENGTH) { + output = output.substring(0, MAX_STRING_LENGTH) + '...' + } + return output +} + +const jsonTruncate = (obj) => { + return truncate(JSON.stringify(obj, null, 2)) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const PartReactionsList = ({ partReactions }) => { + const { addMessage } = useFlash() + const [deletePartReaction] = useMutation(DELETE_PART_REACTION_MUTATION, { + onCompleted: () => { + addMessage('PartReaction deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete partReaction ' + id + '?')) { + deletePartReaction({ + variables: { id }, + refetchQueries: ['PART_REACTIONS'], + }) + } + } + + return ( +
+ + + + + + + + + + + + + + {partReactions.map((partReaction) => ( + + + + + + + + + + ))} + +
IdEmoteUser idPart idCreated atUpdated at 
{truncate(partReaction.id)}{truncate(partReaction.emote)}{truncate(partReaction.userId)}{truncate(partReaction.partId)}{timeTag(partReaction.createdAt)}{timeTag(partReaction.updatedAt)} + +
+
+ ) +} + +export default PartReactionsList diff --git a/web/src/components/PartReactionsCell/PartReactionsCell.js b/web/src/components/PartReactionsCell/PartReactionsCell.js new file mode 100644 index 0000000..5a8b8bf --- /dev/null +++ b/web/src/components/PartReactionsCell/PartReactionsCell.js @@ -0,0 +1,33 @@ +import { Link, routes } from '@redwoodjs/router' + +import PartReactions from 'src/components/PartReactions' + +export const QUERY = gql` + query PART_REACTIONS { + partReactions { + id + emote + userId + partId + createdAt + updatedAt + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () => { + return ( +
+ {'No partReactions yet. '} + + {'Create one?'} + +
+ ) +} + +export const Success = ({ partReactions }) => { + return +} diff --git a/web/src/components/Parts/Parts.js b/web/src/components/Parts/Parts.js new file mode 100644 index 0000000..9e25f6f --- /dev/null +++ b/web/src/components/Parts/Parts.js @@ -0,0 +1,113 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes } from '@redwoodjs/router' + +const DELETE_PART_MUTATION = gql` + mutation DeletePartMutation($id: String!) { + deletePart(id: $id) { + id + } + } +` + +const MAX_STRING_LENGTH = 150 + +const truncate = (text) => { + let output = text + if (text && text.length > MAX_STRING_LENGTH) { + output = output.substring(0, MAX_STRING_LENGTH) + '...' + } + return output +} + +const jsonTruncate = (obj) => { + return truncate(JSON.stringify(obj, null, 2)) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const PartsList = ({ parts }) => { + const { addMessage } = useFlash() + const [deletePart] = useMutation(DELETE_PART_MUTATION, { + onCompleted: () => { + addMessage('Part deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete part ' + id + '?')) { + deletePart({ variables: { id }, refetchQueries: ['PARTS'] }) + } + } + + return ( +
+ + + + + + + + + + + + + + + + {parts.map((part) => ( + + + + + + + + + + + + ))} + +
IdTitleDescriptionCodeMain imageCreated atUpdated atUser id 
{truncate(part.id)}{truncate(part.title)}{truncate(part.description)}{truncate(part.code)}{truncate(part.mainImage)}{timeTag(part.createdAt)}{timeTag(part.updatedAt)}{truncate(part.userId)} + +
+
+ ) +} + +export default PartsList diff --git a/web/src/components/PartsCell/PartsCell.js b/web/src/components/PartsCell/PartsCell.js new file mode 100644 index 0000000..3e087bd --- /dev/null +++ b/web/src/components/PartsCell/PartsCell.js @@ -0,0 +1,35 @@ +import { Link, routes } from '@redwoodjs/router' + +import Parts from 'src/components/Parts' + +export const QUERY = gql` + query PARTS { + parts { + id + title + description + code + mainImage + createdAt + updatedAt + userId + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () => { + return ( +
+ {'No parts yet. '} + + {'Create one?'} + +
+ ) +} + +export const Success = ({ parts }) => { + return +} diff --git a/web/src/components/User/User.js b/web/src/components/User/User.js new file mode 100644 index 0000000..20ba427 --- /dev/null +++ b/web/src/components/User/User.js @@ -0,0 +1,107 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes, navigate } from '@redwoodjs/router' + +const DELETE_USER_MUTATION = gql` + mutation DeleteUserMutation($id: String!) { + deleteUser(id: $id) { + id + } + } +` + +const jsonDisplay = (obj) => { + return ( +
+      {JSON.stringify(obj, null, 2)}
+    
+ ) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const User = ({ user }) => { + const { addMessage } = useFlash() + const [deleteUser] = useMutation(DELETE_USER_MUTATION, { + onCompleted: () => { + navigate(routes.users()) + addMessage('User deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete user ' + id + '?')) { + deleteUser({ variables: { id } }) + } + } + + return ( + <> +
+
+

+ User {user.id} Detail +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{user.id}
User name{user.userName}
Email{user.email}
Created at{timeTag(user.createdAt)}
Updated at{timeTag(user.updatedAt)}
Image{user.image}
Bio{user.bio}
+
+ + + ) +} + +export default User diff --git a/web/src/components/UserCell/UserCell.js b/web/src/components/UserCell/UserCell.js new file mode 100644 index 0000000..7c34e11 --- /dev/null +++ b/web/src/components/UserCell/UserCell.js @@ -0,0 +1,23 @@ +import User from 'src/components/User' + +export const QUERY = gql` + query FIND_USER_BY_ID($id: String!) { + user: user(id: $id) { + id + userName + email + createdAt + updatedAt + image + bio + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () =>
User not found
+ +export const Success = ({ user }) => { + return +} diff --git a/web/src/components/UserForm/UserForm.js b/web/src/components/UserForm/UserForm.js new file mode 100644 index 0000000..c34107d --- /dev/null +++ b/web/src/components/UserForm/UserForm.js @@ -0,0 +1,99 @@ +import { + Form, + FormError, + FieldError, + Label, + TextField, + Submit, +} from '@redwoodjs/forms' + +const UserForm = (props) => { + const onSubmit = (data) => { + props.onSave(data, props?.user?.id) + } + + return ( +
+
+ + + + + + + + + + + + + + + + + + +
+ + Save + +
+ +
+ ) +} + +export default UserForm diff --git a/web/src/components/Users/Users.js b/web/src/components/Users/Users.js new file mode 100644 index 0000000..6b240a4 --- /dev/null +++ b/web/src/components/Users/Users.js @@ -0,0 +1,111 @@ +import { useMutation, useFlash } from '@redwoodjs/web' +import { Link, routes } from '@redwoodjs/router' + +const DELETE_USER_MUTATION = gql` + mutation DeleteUserMutation($id: String!) { + deleteUser(id: $id) { + id + } + } +` + +const MAX_STRING_LENGTH = 150 + +const truncate = (text) => { + let output = text + if (text && text.length > MAX_STRING_LENGTH) { + output = output.substring(0, MAX_STRING_LENGTH) + '...' + } + return output +} + +const jsonTruncate = (obj) => { + return truncate(JSON.stringify(obj, null, 2)) +} + +const timeTag = (datetime) => { + return ( + + ) +} + +const checkboxInputTag = (checked) => { + return +} + +const UsersList = ({ users }) => { + const { addMessage } = useFlash() + const [deleteUser] = useMutation(DELETE_USER_MUTATION, { + onCompleted: () => { + addMessage('User deleted.', { classes: 'rw-flash-success' }) + }, + }) + + const onDeleteClick = (id) => { + if (confirm('Are you sure you want to delete user ' + id + '?')) { + deleteUser({ variables: { id }, refetchQueries: ['USERS'] }) + } + } + + return ( +
+ + + + + + + + + + + + + + + {users.map((user) => ( + + + + + + + + + + + ))} + +
IdUser nameEmailCreated atUpdated atImageBio 
{truncate(user.id)}{truncate(user.userName)}{truncate(user.email)}{timeTag(user.createdAt)}{timeTag(user.updatedAt)}{truncate(user.image)}{truncate(user.bio)} + +
+
+ ) +} + +export default UsersList diff --git a/web/src/components/UsersCell/UsersCell.js b/web/src/components/UsersCell/UsersCell.js new file mode 100644 index 0000000..64b62f2 --- /dev/null +++ b/web/src/components/UsersCell/UsersCell.js @@ -0,0 +1,34 @@ +import { Link, routes } from '@redwoodjs/router' + +import Users from 'src/components/Users' + +export const QUERY = gql` + query USERS { + users { + id + userName + email + createdAt + updatedAt + image + bio + } + } +` + +export const Loading = () =>
Loading...
+ +export const Empty = () => { + return ( +
+ {'No users yet. '} + + {'Create one?'} + +
+ ) +} + +export const Success = ({ users }) => { + return +} diff --git a/web/src/layouts/CommentsLayout/CommentsLayout.js b/web/src/layouts/CommentsLayout/CommentsLayout.js new file mode 100644 index 0000000..4ed9e72 --- /dev/null +++ b/web/src/layouts/CommentsLayout/CommentsLayout.js @@ -0,0 +1,23 @@ +import { Link, routes } from '@redwoodjs/router' +import { Flash } from '@redwoodjs/web' + +const CommentsLayout = (props) => { + return ( +
+ +
+

+ + Comments + +

+ +
+
New Comment + +
+
{props.children}
+
+ ) +} + +export default CommentsLayout diff --git a/web/src/layouts/MainLayout/MainLayout.js b/web/src/layouts/MainLayout/MainLayout.js index 9dcb960..7e00667 100644 --- a/web/src/layouts/MainLayout/MainLayout.js +++ b/web/src/layouts/MainLayout/MainLayout.js @@ -18,7 +18,7 @@ const MainLayout = ({ children }) => { - + @@ -35,9 +35,9 @@ const MainLayout = ({ children }) => {
  • - + {/* */} - + {/* */}
  • { isAuthenticated ? diff --git a/web/src/layouts/PartReactionsLayout/PartReactionsLayout.js b/web/src/layouts/PartReactionsLayout/PartReactionsLayout.js new file mode 100644 index 0000000..076c5b2 --- /dev/null +++ b/web/src/layouts/PartReactionsLayout/PartReactionsLayout.js @@ -0,0 +1,26 @@ +import { Link, routes } from '@redwoodjs/router' +import { Flash } from '@redwoodjs/web' + +const PartReactionsLayout = (props) => { + return ( +
    + +
    +

    + + PartReactions + +

    + +
    +
    New PartReaction + +
    +
    {props.children}
    +
    + ) +} + +export default PartReactionsLayout diff --git a/web/src/layouts/PartsLayout/PartsLayout.js b/web/src/layouts/PartsLayout/PartsLayout.js new file mode 100644 index 0000000..f0ecd0c --- /dev/null +++ b/web/src/layouts/PartsLayout/PartsLayout.js @@ -0,0 +1,23 @@ +import { Link, routes } from '@redwoodjs/router' +import { Flash } from '@redwoodjs/web' + +const PartsLayout = (props) => { + return ( +
    + +
    +

    + + Parts + +

    + +
    +
    New Part + +
    +
    {props.children}
    +
    + ) +} + +export default PartsLayout diff --git a/web/src/layouts/UsersLayout/UsersLayout.js b/web/src/layouts/UsersLayout/UsersLayout.js new file mode 100644 index 0000000..f4f055f --- /dev/null +++ b/web/src/layouts/UsersLayout/UsersLayout.js @@ -0,0 +1,23 @@ +import { Link, routes } from '@redwoodjs/router' +import { Flash } from '@redwoodjs/web' + +const UsersLayout = (props) => { + return ( +
    + +
    +

    + + Users + +

    + +
    +
    New User + +
    +
    {props.children}
    +
    + ) +} + +export default UsersLayout diff --git a/web/src/pages/CommentPage/CommentPage.js b/web/src/pages/CommentPage/CommentPage.js new file mode 100644 index 0000000..b4365f8 --- /dev/null +++ b/web/src/pages/CommentPage/CommentPage.js @@ -0,0 +1,12 @@ +import CommentsLayout from 'src/layouts/CommentsLayout' +import CommentCell from 'src/components/CommentCell' + +const CommentPage = ({ id }) => { + return ( + + + + ) +} + +export default CommentPage diff --git a/web/src/pages/CommentsPage/CommentsPage.js b/web/src/pages/CommentsPage/CommentsPage.js new file mode 100644 index 0000000..37336da --- /dev/null +++ b/web/src/pages/CommentsPage/CommentsPage.js @@ -0,0 +1,12 @@ +import CommentsLayout from 'src/layouts/CommentsLayout' +import CommentsCell from 'src/components/CommentsCell' + +const CommentsPage = () => { + return ( + + + + ) +} + +export default CommentsPage diff --git a/web/src/pages/EditCommentPage/EditCommentPage.js b/web/src/pages/EditCommentPage/EditCommentPage.js new file mode 100644 index 0000000..159f6af --- /dev/null +++ b/web/src/pages/EditCommentPage/EditCommentPage.js @@ -0,0 +1,12 @@ +import CommentsLayout from 'src/layouts/CommentsLayout' +import EditCommentCell from 'src/components/EditCommentCell' + +const EditCommentPage = ({ id }) => { + return ( + + + + ) +} + +export default EditCommentPage diff --git a/web/src/pages/EditPartPage/EditPartPage.js b/web/src/pages/EditPartPage/EditPartPage.js new file mode 100644 index 0000000..3634709 --- /dev/null +++ b/web/src/pages/EditPartPage/EditPartPage.js @@ -0,0 +1,12 @@ +import PartsLayout from 'src/layouts/PartsLayout' +import EditPartCell from 'src/components/EditPartCell' + +const EditPartPage = ({ id }) => { + return ( + + + + ) +} + +export default EditPartPage diff --git a/web/src/pages/EditPartReactionPage/EditPartReactionPage.js b/web/src/pages/EditPartReactionPage/EditPartReactionPage.js new file mode 100644 index 0000000..1ed29bd --- /dev/null +++ b/web/src/pages/EditPartReactionPage/EditPartReactionPage.js @@ -0,0 +1,12 @@ +import PartReactionsLayout from 'src/layouts/PartReactionsLayout' +import EditPartReactionCell from 'src/components/EditPartReactionCell' + +const EditPartReactionPage = ({ id }) => { + return ( + + + + ) +} + +export default EditPartReactionPage diff --git a/web/src/pages/EditUserPage/EditUserPage.js b/web/src/pages/EditUserPage/EditUserPage.js new file mode 100644 index 0000000..4cc6d38 --- /dev/null +++ b/web/src/pages/EditUserPage/EditUserPage.js @@ -0,0 +1,12 @@ +import UsersLayout from 'src/layouts/UsersLayout' +import EditUserCell from 'src/components/EditUserCell' + +const EditUserPage = ({ id }) => { + return ( + + + + ) +} + +export default EditUserPage diff --git a/web/src/pages/HomePage/HomePage.js b/web/src/pages/HomePage/HomePage.js index 94f1f89..8e247ce 100644 --- a/web/src/pages/HomePage/HomePage.js +++ b/web/src/pages/HomePage/HomePage.js @@ -1,5 +1,5 @@ import MainLayout from 'src/layouts/MainLayout' -import BlogPostsCell from 'src/components/BlogPostsCell' +// import BlogPostsCell from 'src/components/BlogPostsCell' import { initialize } from 'src/cascade/js/MainPage/CascadeMain' import { useEffect, useState } from 'react' @@ -27,7 +27,7 @@ Translate([-100, 0, 100], Text3D("cadhub.xyz")); // Don't forget to push imported or oc-defined shapes into sceneShapes to add them to the workspace! `; -const HomePage = () => { +const HomePage1 = () => { const [code, setCode] = useState(starterCode) useEffect(() => { const sickCallback = (code) => setCode(code) @@ -73,4 +73,12 @@ const HomePage = () => { ) } +const HomePage = () => { + return ( + + hi + + ) +} + export default HomePage diff --git a/web/src/pages/NewCommentPage/NewCommentPage.js b/web/src/pages/NewCommentPage/NewCommentPage.js new file mode 100644 index 0000000..d459c05 --- /dev/null +++ b/web/src/pages/NewCommentPage/NewCommentPage.js @@ -0,0 +1,12 @@ +import CommentsLayout from 'src/layouts/CommentsLayout' +import NewComment from 'src/components/NewComment' + +const NewCommentPage = () => { + return ( + + + + ) +} + +export default NewCommentPage diff --git a/web/src/pages/NewPartPage/NewPartPage.js b/web/src/pages/NewPartPage/NewPartPage.js new file mode 100644 index 0000000..4f39148 --- /dev/null +++ b/web/src/pages/NewPartPage/NewPartPage.js @@ -0,0 +1,12 @@ +import PartsLayout from 'src/layouts/PartsLayout' +import NewPart from 'src/components/NewPart' + +const NewPartPage = () => { + return ( + + + + ) +} + +export default NewPartPage diff --git a/web/src/pages/NewPartReactionPage/NewPartReactionPage.js b/web/src/pages/NewPartReactionPage/NewPartReactionPage.js new file mode 100644 index 0000000..931b1d2 --- /dev/null +++ b/web/src/pages/NewPartReactionPage/NewPartReactionPage.js @@ -0,0 +1,12 @@ +import PartReactionsLayout from 'src/layouts/PartReactionsLayout' +import NewPartReaction from 'src/components/NewPartReaction' + +const NewPartReactionPage = () => { + return ( + + + + ) +} + +export default NewPartReactionPage diff --git a/web/src/pages/NewUserPage/NewUserPage.js b/web/src/pages/NewUserPage/NewUserPage.js new file mode 100644 index 0000000..a3818b5 --- /dev/null +++ b/web/src/pages/NewUserPage/NewUserPage.js @@ -0,0 +1,12 @@ +import UsersLayout from 'src/layouts/UsersLayout' +import NewUser from 'src/components/NewUser' + +const NewUserPage = () => { + return ( + + + + ) +} + +export default NewUserPage diff --git a/web/src/pages/PartPage/PartPage.js b/web/src/pages/PartPage/PartPage.js new file mode 100644 index 0000000..e39c2fb --- /dev/null +++ b/web/src/pages/PartPage/PartPage.js @@ -0,0 +1,12 @@ +import PartsLayout from 'src/layouts/PartsLayout' +import PartCell from 'src/components/PartCell' + +const PartPage = ({ id }) => { + return ( + + + + ) +} + +export default PartPage diff --git a/web/src/pages/PartReactionPage/PartReactionPage.js b/web/src/pages/PartReactionPage/PartReactionPage.js new file mode 100644 index 0000000..9a014ef --- /dev/null +++ b/web/src/pages/PartReactionPage/PartReactionPage.js @@ -0,0 +1,12 @@ +import PartReactionsLayout from 'src/layouts/PartReactionsLayout' +import PartReactionCell from 'src/components/PartReactionCell' + +const PartReactionPage = ({ id }) => { + return ( + + + + ) +} + +export default PartReactionPage diff --git a/web/src/pages/PartReactionsPage/PartReactionsPage.js b/web/src/pages/PartReactionsPage/PartReactionsPage.js new file mode 100644 index 0000000..f6d927c --- /dev/null +++ b/web/src/pages/PartReactionsPage/PartReactionsPage.js @@ -0,0 +1,12 @@ +import PartReactionsLayout from 'src/layouts/PartReactionsLayout' +import PartReactionsCell from 'src/components/PartReactionsCell' + +const PartReactionsPage = () => { + return ( + + + + ) +} + +export default PartReactionsPage diff --git a/web/src/pages/PartsPage/PartsPage.js b/web/src/pages/PartsPage/PartsPage.js new file mode 100644 index 0000000..3d97fa8 --- /dev/null +++ b/web/src/pages/PartsPage/PartsPage.js @@ -0,0 +1,12 @@ +import PartsLayout from 'src/layouts/PartsLayout' +import PartsCell from 'src/components/PartsCell' + +const PartsPage = () => { + return ( + + + + ) +} + +export default PartsPage diff --git a/web/src/pages/UserPage/UserPage.js b/web/src/pages/UserPage/UserPage.js new file mode 100644 index 0000000..250b619 --- /dev/null +++ b/web/src/pages/UserPage/UserPage.js @@ -0,0 +1,12 @@ +import UsersLayout from 'src/layouts/UsersLayout' +import UserCell from 'src/components/UserCell' + +const UserPage = ({ id }) => { + return ( + + + + ) +} + +export default UserPage diff --git a/web/src/pages/UsersPage/UsersPage.js b/web/src/pages/UsersPage/UsersPage.js new file mode 100644 index 0000000..8f380ce --- /dev/null +++ b/web/src/pages/UsersPage/UsersPage.js @@ -0,0 +1,12 @@ +import UsersLayout from 'src/layouts/UsersLayout' +import UsersCell from 'src/components/UsersCell' + +const UsersPage = () => { + return ( + + + + ) +} + +export default UsersPage