-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschema.ts
127 lines (102 loc) · 4.18 KB
/
schema.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { pgTable, serial, text, integer, pgEnum, boolean, timestamp } from "drizzle-orm/pg-core"
import { relations } from "drizzle-orm"
export const courses = pgTable("courses", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
imageSrc: text("image_src").notNull()
})
export const coursesRelation = relations(courses, ({ many }) => ({
userProgress: many(userProgress),
units: many(units)
}))
export const units = pgTable("units", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
description: text("description").notNull(),
courseId: integer("course_id").references(() => courses.id, { onDelete: "cascade" }).notNull(),
order: integer("order").notNull(),
})
export const unitsRelations = relations(units, ({ many, one }) => ({
course: one(courses, {
fields: [units.courseId],
references: [courses.id],
}),
lessons: many(lessons)
}))
export const lessons = pgTable("lessons", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
unitId: integer("unit_id").references(() => units.id, { onDelete: "cascade" }).notNull(),
order: integer("order").notNull(),
})
export const lessonsRelations = relations(lessons, ({ one, many }) => ({
unit: one(units, {
fields: [lessons.unitId],
references: [units.id],
}),
challenges: many(challenges),
}))
export const challengesEnum = pgEnum("type", ["SELECT", "ASSIST"])
export const challenges = pgTable("challenges", {
id: serial("id").primaryKey(),
lessonId: integer("lesson_id").references(() => lessons.id, { onDelete: "cascade" }).notNull(),
type: challengesEnum("type").notNull(),
question: text("question").notNull(),
order: integer("order").notNull(),
})
export const challengesRelations = relations(challenges, ({ one, many }) => ({
lesson: one(lessons, {
fields: [challenges.lessonId],
references: [lessons.id],
}),
challengeOptions: many(challengeOptions),
challengeProgress: many(challengeProgress),
}))
export const challengeOptions = pgTable("challenge_options", {
id: serial("id").primaryKey(),
challengeId: integer("challenge_id").references(() => challenges.id, { onDelete: "cascade" }).notNull(),
text: text("text").notNull(),
correct: boolean("correct").notNull(),
imageSrc: text("image_src"),
audioSrc: text("audio_src"),
})
export const challengeOptionsRelations = relations(challengeOptions, ({ one }) => ({
challenge: one(challenges, {
fields: [challengeOptions.challengeId],
references: [challenges.id],
})
}))
export const challengeProgress = pgTable("challenge_progress", {
id: serial("id").primaryKey(),
userId: text("user_id").notNull(), //TODO confirm this does not break
challengeId: integer("challenge_id").references(() => challenges.id, { onDelete: "cascade" }).notNull(),
completed: boolean("completed").notNull().default(false),
})
export const challengeProgressRelations = relations(challengeProgress, ({ one }) => ({
challenge: one(challenges, {
fields: [challengeProgress.challengeId],
references: [challenges.id],
})
}))
export const userProgress = pgTable("user_progress", {
userId: text("user_id").primaryKey(),
userName: text("user_name").notNull().default("User"),
userImageSrc: text("user_image_src").notNull().default("/mascot.svg"),
activeCourseId: integer("active_course_id").references(() => courses.id, { onDelete: "cascade" }),
hearts: integer("hearts").notNull().default(5),
points: integer("points").notNull().default(0),
})
export const userProgressRelations = relations(userProgress, ({ one }) => ({
activeCourse: one(courses, {
fields: [userProgress.activeCourseId],
references: [courses.id]
})
}))
export const userSubscription = pgTable("user_subscription", {
id: serial("id").primaryKey(),
userId: text("user_id").notNull().unique(),
stripeCustomerId: text("stripe_customer_id").notNull().unique(),
stripeSubscriptionId: text("stripe_subscription_id").notNull().unique(),
stripePriceId: text("stripe_price_id").notNull(),
stripeCurrentPeriodEnd: timestamp("stripe_current_period_end").notNull(),
})