diff --git a/README.md b/README.md index 7d690ee..8fb02a5 100644 --- a/README.md +++ b/README.md @@ -70,4 +70,25 @@ modules: ['@nuxtjs/supabase'] Follow these instructions to add google oath https://supabase.com/docs/guides/auth/social-login/auth-google -Then I frigged around trying to get the nuxt-supabase module to work properly for the oauth flow. It's a bit of a mess TBH. +Then I frigged around trying to get the nuxt-supabase module to work properly for the oauth flow. It's a bit of a mess TBH. Eventually I looked at the demo https://github.com/nuxt-modules/supabase/tree/main/demo like a chump and got it working + +Integrating Prisma... +This was a tricky decision I think. the Subabase client has some pseudo sql Ormy sort of features already +but Prisma has this awesome schema management support and autogeneration of a typed client.... and I already had a schema lying +around that was nearly what I needed and it was nice to be able to re-use it. + +``` +npm install prisma --save-dev +npx prisma init +``` +go to Supabase -> settings -> database -> connection string -> URI.. and copy the URI into the +DATABASE_URL setting created with prisma init. +still in database, go to 'Database password' and reset/set it and copy the password into the [YOUR-PASSWORD] placeholder in the URI + +Then I manually hand coded the schema.prisma file based on something else I already had. + +``` +npx prisma db push +npm install @prisma/client --save-dev +npx prisma generate +``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4f3b62c..89ea3ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,9 @@ "hasInstallScript": true, "devDependencies": { "@nuxtjs/supabase": "^0.3.0", - "nuxt": "^3.1.1" + "@prisma/client": "^4.9.0", + "nuxt": "^3.1.1", + "prisma": "^4.9.0" } }, "node_modules/@ampproject/remapping": { @@ -1237,6 +1239,40 @@ "pathe": "^1.0.0" } }, + "node_modules/@prisma/client": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.9.0.tgz", + "integrity": "sha512-bz6QARw54sWcbyR1lLnF2QHvRW5R/Jxnbbmwh3u+969vUKXtBkXgSgjDA85nji31ZBlf7+FrHDy5x+5ydGyQDg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.9.0.tgz", + "integrity": "sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw==", + "dev": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5.tgz", + "integrity": "sha512-M16aibbxi/FhW7z1sJCX8u+0DriyQYY5AyeTH7plQm9MLnURoiyn3CZBqAyIoQ+Z1pS77usCIibYJWSgleBMBA==", + "dev": true + }, "node_modules/@rollup/plugin-alias": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-4.0.3.tgz", @@ -6139,6 +6175,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prisma": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.9.0.tgz", + "integrity": "sha512-bS96oZ5oDFXYgoF2l7PJ3Mp1wWWfLOo8B/jAfbA2Pn0Wm5Z/owBHzaMQKS3i1CzVBDWWPVnOohmbJmjvkcHS5w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.9.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -9228,6 +9281,27 @@ "pathe": "^1.0.0" } }, + "@prisma/client": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.9.0.tgz", + "integrity": "sha512-bz6QARw54sWcbyR1lLnF2QHvRW5R/Jxnbbmwh3u+969vUKXtBkXgSgjDA85nji31ZBlf7+FrHDy5x+5ydGyQDg==", + "dev": true, + "requires": { + "@prisma/engines-version": "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5" + } + }, + "@prisma/engines": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.9.0.tgz", + "integrity": "sha512-t1pt0Gsp+HcgPJrHFc+d/ZSAaKKWar2G/iakrE07yeKPNavDP3iVKPpfXP22OTCHZUWf7OelwKJxQgKAm5hkgw==", + "dev": true + }, + "@prisma/engines-version": { + "version": "4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.9.0-42.ceb5c99003b99c9ee2c1d2e618e359c14aef2ea5.tgz", + "integrity": "sha512-M16aibbxi/FhW7z1sJCX8u+0DriyQYY5AyeTH7plQm9MLnURoiyn3CZBqAyIoQ+Z1pS77usCIibYJWSgleBMBA==", + "dev": true + }, "@rollup/plugin-alias": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-4.0.3.tgz", @@ -12875,6 +12949,15 @@ "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", "dev": true }, + "prisma": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.9.0.tgz", + "integrity": "sha512-bS96oZ5oDFXYgoF2l7PJ3Mp1wWWfLOo8B/jAfbA2Pn0Wm5Z/owBHzaMQKS3i1CzVBDWWPVnOohmbJmjvkcHS5w==", + "dev": true, + "requires": { + "@prisma/engines": "4.9.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", diff --git a/package.json b/package.json index 3f4c8f7..f1b7652 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ }, "devDependencies": { "@nuxtjs/supabase": "^0.3.0", - "nuxt": "^3.1.1" + "@prisma/client": "^4.9.0", + "nuxt": "^3.1.1", + "prisma": "^4.9.0" } } diff --git a/pages/dashboard.vue b/pages/dashboard.vue index b451e76..7852695 100644 --- a/pages/dashboard.vue +++ b/pages/dashboard.vue @@ -3,10 +3,13 @@ definePageMeta({ middleware: ['auth'], }); + + const notes = await $fetch('/api/notes') diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..c23bd3e --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,63 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + supabase_uid String + display_name String? + + membership Membership? + + @@map("users") +} + +model Membership { + id Int @id @default(autoincrement()) + user_id Int @unique + account_id Int + account Account @relation(fields: [account_id], references: [id]) + user User @relation(fields: [user_id], references: [id]) + + @@map("membership") +} + +model Account { + id Int @id @default(autoincrement()) + name String + current_period_ends DateTime @default(now()) + features String[] + plan_id Int + plan Plan @relation(fields: [plan_id], references: [id]) + members Membership[] + notes Note[] + + @@map("account") +} + +model Plan { + id Int @id @default(autoincrement()) + name String + features String[] + accounts Account[] + + @@map("plan") +} + +model Note { + id Int @id @default(autoincrement()) + account_id Int? + account Account? @relation(fields: [account_id], references: [id]) + + note_text String + + @@map("note") +} diff --git a/server/api/notes.ts b/server/api/notes.ts new file mode 100644 index 0000000..244994d --- /dev/null +++ b/server/api/notes.ts @@ -0,0 +1,25 @@ +import { PrismaClient } from '@prisma/client'; +import { serverSupabaseClient } from '#supabase/server'; + +const prisma = new PrismaClient(); + +export default defineEventHandler(async (event) => { + const client = serverSupabaseClient(event) + const user = await client.auth.getUser(); + + const dbUser = await prisma.user.findFirstOrThrow({ + where: { + supabase_uid: user.data.id // TODO - this shit is messy.. typing + }, + include: { + membership: true, // Return all fields + }, + }); + + const data = await prisma.note.findMany({ + where:{ + account_id: dbUser.membership?.account_id + } + }); + return data; +}) \ No newline at end of file