mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-06 18:31:00 +00:00
Unique purchases
This commit is contained in:
parent
2282819ac5
commit
50eea8f872
@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- A unique constraint covering the columns `[userId,courseId,resourceId]` on the table `Purchase` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- DropIndex
|
||||||
|
DROP INDEX "Purchase_userId_courseId_key";
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Purchase_userId_courseId_resourceId_key" ON "Purchase"("userId", "courseId", "resourceId");
|
@ -1,14 +1,14 @@
|
|||||||
// datasource db {
|
|
||||||
// provider = "postgresql"
|
|
||||||
// url = env("DATABASE_URL")
|
|
||||||
// }
|
|
||||||
|
|
||||||
datasource db {
|
datasource db {
|
||||||
provider = "postgresql"
|
provider = "postgresql"
|
||||||
url = env("POSTGRES_PRISMA_URL")
|
url = env("DATABASE_URL")
|
||||||
directUrl = env("POSTGRES_URL_NON_POOLING")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// datasource db {
|
||||||
|
// provider = "postgresql"
|
||||||
|
// url = env("POSTGRES_PRISMA_URL")
|
||||||
|
// directUrl = env("POSTGRES_URL_NON_POOLING")
|
||||||
|
// }
|
||||||
|
|
||||||
generator client {
|
generator client {
|
||||||
provider = "prisma-client-js"
|
provider = "prisma-client-js"
|
||||||
}
|
}
|
||||||
@ -202,7 +202,7 @@ model Purchase {
|
|||||||
course Course? @relation(fields: [courseId], references: [id])
|
course Course? @relation(fields: [courseId], references: [id])
|
||||||
resource Resource? @relation(fields: [resourceId], references: [id])
|
resource Resource? @relation(fields: [resourceId], references: [id])
|
||||||
|
|
||||||
@@unique([userId, courseId])
|
@@unique([userId, courseId, resourceId])
|
||||||
}
|
}
|
||||||
|
|
||||||
model UserCourse {
|
model UserCourse {
|
||||||
|
@ -99,21 +99,21 @@ const HeroBanner = () => {
|
|||||||
)}
|
)}
|
||||||
<div className="mb-8 flex flex-row">
|
<div className="mb-8 flex flex-row">
|
||||||
<AvatarGroup>
|
<AvatarGroup>
|
||||||
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/amyelsner.png"} size="large" shape="circle" />
|
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/amyelsner.png"} size={isMobile ? "normal" : "large"} shape="circle" />
|
||||||
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/asiyajavayant.png"} size="large" shape="circle" />
|
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/asiyajavayant.png"} size={isMobile ? "normal" : "large"} shape="circle" />
|
||||||
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/onyamalimba.png"} size="large" shape="circle" />
|
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/onyamalimba.png"} size={isMobile ? "normal" : "large"} shape="circle" />
|
||||||
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/ionibowcher.png"} size="large" shape="circle" />
|
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/ionibowcher.png"} size={isMobile ? "normal" : "large"} shape="circle" />
|
||||||
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/xuxuefeng.png"} size="large" shape="circle" />
|
<Avatar image={"https://primefaces.org/cdn/primereact/images/avatar/xuxuefeng.png"} size={isMobile ? "normal" : "large"} shape="circle" />
|
||||||
<Avatar label="500+" shape="circle" size="large" className="text-base" />
|
<Avatar label="500+" shape="circle" size={isMobile ? "normal" : "large"} className={`${isMobile ? 'text-sm' : 'text-base'}`} />
|
||||||
</AvatarGroup>
|
</AvatarGroup>
|
||||||
<div className="flex flex-col justify-between my-2 ml-4">
|
<div className="flex flex-col justify-between my-2 ml-4">
|
||||||
<div className="flex flex-row gap-2">
|
<div className="flex flex-row gap-2">
|
||||||
{Array.from({ length: 5 }).map((_, index) => (
|
{Array.from({ length: 5 }).map((_, index) => (
|
||||||
<i key={index} className="pi pi-star-fill text-yellow-500" />
|
<i key={index} className={`pi pi-star-fill text-yellow-500 ${isMobile ? 'text-base' : 'text-2xl'}`} />
|
||||||
))}
|
))}
|
||||||
<p className="text-sm">4.9</p>
|
<p className={`text-sm ${isMobile ? 'text-base' : 'text-2xl'}`}>4.87</p>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-sm">from 500+ students</span>
|
<span className={`text-sm ${isMobile ? 'text-base' : 'text-2xl'}`}>500+ students enrolled</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-x-4">
|
<div className="space-x-4">
|
||||||
|
@ -83,10 +83,22 @@ export const addResourcePurchaseToUser = async (userId, purchaseData) => {
|
|||||||
where: { id: userId },
|
where: { id: userId },
|
||||||
data: {
|
data: {
|
||||||
purchased: {
|
purchased: {
|
||||||
|
upsert: {
|
||||||
|
where: {
|
||||||
|
userId_courseId_resourceId: {
|
||||||
|
userId: userId,
|
||||||
|
courseId: null,
|
||||||
|
resourceId: purchaseData.resourceId,
|
||||||
|
},
|
||||||
|
},
|
||||||
create: {
|
create: {
|
||||||
resourceId: purchaseData.resourceId,
|
resourceId: purchaseData.resourceId,
|
||||||
amountPaid: purchaseData.amountPaid,
|
amountPaid: purchaseData.amountPaid,
|
||||||
},
|
},
|
||||||
|
update: {
|
||||||
|
amountPaid: purchaseData.amountPaid,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
@ -106,9 +118,10 @@ export const addCoursePurchaseToUser = async (userId, purchaseData) => {
|
|||||||
purchased: {
|
purchased: {
|
||||||
upsert: {
|
upsert: {
|
||||||
where: {
|
where: {
|
||||||
userId_courseId: {
|
userId_courseId_resourceId: {
|
||||||
userId: userId,
|
userId: userId,
|
||||||
courseId: purchaseData.courseId,
|
courseId: purchaseData.courseId,
|
||||||
|
resourceId: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
create: {
|
create: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user