From ca77e2674fbe66658c080c6e6965c5efb9848bca Mon Sep 17 00:00:00 2001 From: austinkelsay Date: Tue, 24 Sep 2024 09:36:28 -0500 Subject: [PATCH] Fix duplicate purchases bug --- .../migration.sql | 3 +++ prisma/schema.prisma | 14 ++++++----- .../content/lists/ProgressListItem.js | 2 +- .../content/lists/PurchasedListItem.js | 21 +++++++++++++++- src/components/profile/UserSettings.js | 1 - src/db/models/userModels.js | 24 ++++++++++++++++--- 6 files changed, 53 insertions(+), 12 deletions(-) rename prisma/migrations/{20240921214957_init => 20240924141738_init}/migration.sql (98%) diff --git a/prisma/migrations/20240921214957_init/migration.sql b/prisma/migrations/20240924141738_init/migration.sql similarity index 98% rename from prisma/migrations/20240921214957_init/migration.sql rename to prisma/migrations/20240924141738_init/migration.sql index 13baa0a..39ff9b7 100644 --- a/prisma/migrations/20240921214957_init/migration.sql +++ b/prisma/migrations/20240924141738_init/migration.sql @@ -226,6 +226,9 @@ CREATE UNIQUE INDEX "Course_noteId_key" ON "Course"("noteId"); -- CreateIndex CREATE UNIQUE INDEX "UserLesson_userId_lessonId_key" ON "UserLesson"("userId", "lessonId"); +-- CreateIndex +CREATE UNIQUE INDEX "Purchase_userId_courseId_key" ON "Purchase"("userId", "courseId"); + -- CreateIndex CREATE UNIQUE INDEX "UserCourse_userId_courseId_key" ON "UserCourse"("userId", "courseId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1d0b241..5c2265a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -184,16 +184,18 @@ model UserLesson { } model Purchase { - id String @id @default(uuid()) - user User @relation(fields: [userId], references: [id]) + id String @id @default(uuid()) userId String - course Course? @relation(fields: [courseId], references: [id]) courseId String? - resource Resource? @relation(fields: [resourceId], references: [id]) resourceId String? amountPaid Int - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + user User @relation(fields: [userId], references: [id]) + course Course? @relation(fields: [courseId], references: [id]) + resource Resource? @relation(fields: [resourceId], references: [id]) + + @@unique([userId, courseId]) } model UserCourse { diff --git a/src/components/content/lists/ProgressListItem.js b/src/components/content/lists/ProgressListItem.js index 2fef8ee..e589f61 100644 --- a/src/components/content/lists/ProgressListItem.js +++ b/src/components/content/lists/ProgressListItem.js @@ -33,7 +33,7 @@ const ProgressListItem = ({ dTag, category }) => { const encodeNaddr = () => { return nip19.naddrEncode({ pubkey: event.pubkey, - identifier: dTag, + identifier: event.id, kind: 30004, relayUrls: appConfig.defaultRelayUrls }) diff --git a/src/components/content/lists/PurchasedListItem.js b/src/components/content/lists/PurchasedListItem.js index 1148e11..e542489 100644 --- a/src/components/content/lists/PurchasedListItem.js +++ b/src/components/content/lists/PurchasedListItem.js @@ -2,10 +2,13 @@ import React, { useEffect, useState } from "react"; import { useNDKContext } from "@/context/NDKContext"; import { parseEvent } from "@/utils/nostr"; import { ProgressSpinner } from "primereact/progressspinner"; +import { nip19 } from "nostr-tools"; +import appConfig from "@/config/appConfig"; const PurchasedListItem = ({ eventId, category }) => { const { ndk } = useNDKContext(); const [event, setEvent] = useState(null); + const [naddr, setNaddr] = useState(null); useEffect(() => { const fetchEvent = async () => { @@ -24,7 +27,23 @@ const PurchasedListItem = ({ eventId, category }) => { fetchEvent(); }, [eventId, ndk]); - return !event || !ndk ? : ({event.title}); + useEffect(() => { + if (event) { + console.log("event", event); + encodeNaddr(); + } + }, [event]); + + const encodeNaddr = () => { + setNaddr(nip19.naddrEncode({ + pubkey: event.pubkey, + identifier: event.id, + kind: event.kind, + relayUrls: appConfig.defaultRelayUrls + })) + } + + return !event || !ndk ? : ({event.title}); } export default PurchasedListItem; \ No newline at end of file diff --git a/src/components/profile/UserSettings.js b/src/components/profile/UserSettings.js index 6d2e752..72a76a8 100644 --- a/src/components/profile/UserSettings.js +++ b/src/components/profile/UserSettings.js @@ -248,7 +248,6 @@ const UserSettings = () => { { - console.log("rowData", rowData); return }} header="Name" diff --git a/src/db/models/userModels.js b/src/db/models/userModels.js index e29e9ea..73aabab 100644 --- a/src/db/models/userModels.js +++ b/src/db/models/userModels.js @@ -104,9 +104,27 @@ export const addCoursePurchaseToUser = async (userId, purchaseData) => { where: { id: userId }, data: { purchased: { - create: { - courseId: purchaseData.courseId, - amountPaid: purchaseData.amountPaid, + upsert: { + where: { + userId_courseId: { + userId: userId, + courseId: purchaseData.courseId, + }, + }, + create: { + courseId: purchaseData.courseId, + amountPaid: purchaseData.amountPaid, + }, + update: { + amountPaid: purchaseData.amountPaid, + }, + }, + }, + }, + include: { + purchased: { + include: { + course: true, }, }, },