lang-database 11.0.1 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  -- CreateEnum
2
- CREATE TYPE "AchievementType" AS ENUM ('Today15Min', 'Weekly15Min', 'Monthly15Min', 'CardDone', 'DeckDone', 'DeckAlreadyKnown', 'FiveCardsDone');
2
+ CREATE TYPE "AchievementType" AS ENUM ('Today15Min', 'Weekly15Min', 'Monthly15Min', 'CardDone', 'FiveCardsDone', 'DeckDone', 'DeckAlreadyKnown');
3
3
 
4
4
  -- CreateEnum
5
5
  CREATE TYPE "Answer" AS ENUM ('KNOWN', 'ALMOST_KNOWN', 'HARD', 'UNKNOWN');
@@ -9,85 +9,98 @@ CREATE TYPE "PurchaseStatus" AS ENUM ('PENDING', 'APPROVED');
9
9
 
10
10
  -- CreateTable
11
11
  CREATE TABLE "cards" (
12
- "id" STRING NOT NULL,
13
- "packId" STRING NOT NULL,
14
- "front" STRING NOT NULL,
15
- "back" STRING NOT NULL,
12
+ "id" TEXT NOT NULL,
13
+ "packId" TEXT NOT NULL,
14
+ "front" TEXT NOT NULL,
15
+ "back" TEXT NOT NULL,
16
+ "info" TEXT NOT NULL DEFAULT '',
16
17
  "lastUpdate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
17
- "speechGenerated" BOOL NOT NULL DEFAULT false,
18
- "info" STRING NOT NULL DEFAULT '',
18
+ "speechGenerated" BOOLEAN NOT NULL DEFAULT false,
19
19
 
20
20
  CONSTRAINT "cards_pkey" PRIMARY KEY ("id")
21
21
  );
22
22
 
23
23
  -- CreateTable
24
24
  CREATE TABLE "userCards" (
25
- "userId" STRING NOT NULL,
26
- "cardId" STRING NOT NULL,
27
- "currentInterval" INT4,
25
+ "userId" TEXT NOT NULL,
26
+ "cardId" TEXT NOT NULL,
27
+ "reverse" BOOLEAN NOT NULL,
28
+ "done" BOOLEAN NOT NULL DEFAULT false,
29
+ "currentInterval" INTEGER,
28
30
  "dueDate" TIMESTAMP(3),
29
- "done" BOOL NOT NULL DEFAULT false,
30
- "reverse" BOOL NOT NULL DEFAULT false,
31
31
 
32
32
  CONSTRAINT "userCards_pkey" PRIMARY KEY ("userId","cardId","reverse")
33
33
  );
34
34
 
35
+ -- CreateTable
36
+ CREATE TABLE "userStats" (
37
+ "userId" TEXT NOT NULL,
38
+ "lastAnswerTimestamp" TIMESTAMP(3) NOT NULL,
39
+ "dailyUsageSec" INTEGER NOT NULL,
40
+ "weeklyUsageSec" INTEGER NOT NULL,
41
+ "monthlyUsageSec" INTEGER NOT NULL,
42
+ "cardsDone" INTEGER NOT NULL,
43
+
44
+ CONSTRAINT "userStats_pkey" PRIMARY KEY ("userId")
45
+ );
46
+
35
47
  -- CreateTable
36
48
  CREATE TABLE "categories" (
37
- "id" STRING NOT NULL,
38
- "name" STRING NOT NULL,
49
+ "id" TEXT NOT NULL,
50
+ "name" TEXT NOT NULL,
51
+ "order" INTEGER,
39
52
 
40
53
  CONSTRAINT "categories_pkey" PRIMARY KEY ("id")
41
54
  );
42
55
 
43
56
  -- CreateTable
44
57
  CREATE TABLE "packs" (
45
- "id" STRING NOT NULL,
46
- "teacherId" STRING NOT NULL,
47
- "name" STRING NOT NULL DEFAULT '',
48
- "shortDescription" STRING NOT NULL DEFAULT '',
49
- "longDescription" STRING NOT NULL DEFAULT '',
50
- "categoryId" STRING,
51
- "published" BOOL NOT NULL DEFAULT false,
58
+ "id" TEXT NOT NULL,
59
+ "teacherId" TEXT NOT NULL,
60
+ "name" TEXT NOT NULL DEFAULT '',
61
+ "shortDescription" TEXT NOT NULL DEFAULT '',
62
+ "longDescription" TEXT NOT NULL DEFAULT '',
63
+ "categoryId" TEXT,
64
+ "published" BOOLEAN NOT NULL DEFAULT false,
52
65
  "currentPrice" DECIMAL(65,30) NOT NULL,
53
- "public" BOOL NOT NULL DEFAULT false,
66
+ "public" BOOLEAN NOT NULL DEFAULT false,
54
67
 
55
68
  CONSTRAINT "packs_pkey" PRIMARY KEY ("id")
56
69
  );
57
70
 
58
71
  -- CreateTable
59
72
  CREATE TABLE "users" (
60
- "id" STRING NOT NULL,
61
- "email" STRING NOT NULL,
62
- "name" STRING NOT NULL,
63
- "password" STRING,
64
- "teamId" STRING,
65
- "passwordActivated" BOOL NOT NULL DEFAULT false,
73
+ "id" TEXT NOT NULL,
74
+ "email" TEXT NOT NULL,
66
75
  "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
76
+ "name" TEXT NOT NULL,
77
+ "password" TEXT,
67
78
  "subscriptionExpire" TIMESTAMP(3),
79
+ "teamId" TEXT,
80
+ "passwordActivated" BOOLEAN NOT NULL DEFAULT false,
68
81
 
69
82
  CONSTRAINT "users_pkey" PRIMARY KEY ("id")
70
83
  );
71
84
 
72
85
  -- CreateTable
73
86
  CREATE TABLE "achievements" (
74
- "id" STRING NOT NULL,
75
- "userId" STRING NOT NULL,
76
- "badge" BOOL NOT NULL,
87
+ "id" TEXT NOT NULL,
88
+ "userId" TEXT NOT NULL,
89
+ "badge" BOOLEAN NOT NULL,
77
90
  "type" "AchievementType" NOT NULL,
78
- "info" STRING NOT NULL,
91
+ "info" TEXT NOT NULL,
79
92
  "timestamp" TIMESTAMP(3) NOT NULL,
80
- "dismissed" BOOL NOT NULL DEFAULT false,
93
+ "dismissed" BOOLEAN NOT NULL DEFAULT false,
81
94
 
82
95
  CONSTRAINT "achievements_pkey" PRIMARY KEY ("id")
83
96
  );
84
97
 
85
98
  -- CreateTable
86
99
  CREATE TABLE "teams" (
87
- "id" STRING NOT NULL,
88
- "name" STRING NOT NULL,
89
- "emailPattern" STRING NOT NULL DEFAULT '',
90
- "userCount" INT4 NOT NULL,
100
+ "id" TEXT NOT NULL,
101
+ "name" TEXT NOT NULL,
102
+ "emailPattern" TEXT NOT NULL DEFAULT '',
103
+ "userCount" INTEGER NOT NULL,
91
104
  "subscriptionExpire" TIMESTAMP(3),
92
105
 
93
106
  CONSTRAINT "teams_pkey" PRIMARY KEY ("id")
@@ -95,40 +108,40 @@ CREATE TABLE "teams" (
95
108
 
96
109
  -- CreateTable
97
110
  CREATE TABLE "teachers" (
98
- "id" STRING NOT NULL,
99
- "email" STRING NOT NULL,
100
- "name" STRING NOT NULL,
101
- "password" STRING NOT NULL,
111
+ "id" TEXT NOT NULL,
112
+ "email" TEXT NOT NULL,
113
+ "name" TEXT NOT NULL,
114
+ "password" TEXT NOT NULL,
102
115
 
103
116
  CONSTRAINT "teachers_pkey" PRIMARY KEY ("id")
104
117
  );
105
118
 
106
119
  -- CreateTable
107
120
  CREATE TABLE "googleUsers" (
108
- "id" STRING NOT NULL,
109
- "userId" STRING NOT NULL,
121
+ "id" TEXT NOT NULL,
122
+ "userId" TEXT NOT NULL,
110
123
 
111
124
  CONSTRAINT "googleUsers_pkey" PRIMARY KEY ("id")
112
125
  );
113
126
 
114
127
  -- CreateTable
115
128
  CREATE TABLE "userAnswers" (
116
- "id" STRING NOT NULL,
117
- "userId" STRING NOT NULL,
118
- "cardId" STRING NOT NULL,
119
- "timestamp" TIMESTAMP(3) NOT NULL,
129
+ "id" TEXT NOT NULL,
130
+ "userId" TEXT NOT NULL,
131
+ "cardId" TEXT NOT NULL,
132
+ "reverse" BOOLEAN NOT NULL,
120
133
  "answer" "Answer" NOT NULL,
121
- "reverse" BOOL NOT NULL DEFAULT false,
134
+ "timestamp" TIMESTAMP(3) NOT NULL,
122
135
 
123
136
  CONSTRAINT "userAnswers_pkey" PRIMARY KEY ("id")
124
137
  );
125
138
 
126
139
  -- CreateTable
127
140
  CREATE TABLE "purchases" (
128
- "id" STRING NOT NULL,
129
- "userId" STRING NOT NULL,
130
- "packId" STRING NOT NULL,
131
- "currency" STRING NOT NULL,
141
+ "id" TEXT NOT NULL,
142
+ "userId" TEXT NOT NULL,
143
+ "packId" TEXT NOT NULL,
144
+ "currency" TEXT NOT NULL,
132
145
  "amount" DECIMAL(65,30) NOT NULL,
133
146
  "orderDate" TIMESTAMP(3) NOT NULL,
134
147
  "paymentDate" TIMESTAMP(3),
@@ -138,15 +151,19 @@ CREATE TABLE "purchases" (
138
151
  );
139
152
 
140
153
  -- CreateTable
141
- CREATE TABLE "_PackToTeam" (
142
- "A" STRING NOT NULL,
143
- "B" STRING NOT NULL
154
+ CREATE TABLE "_PackToUser" (
155
+ "A" TEXT NOT NULL,
156
+ "B" TEXT NOT NULL,
157
+
158
+ CONSTRAINT "_PackToUser_AB_pkey" PRIMARY KEY ("A","B")
144
159
  );
145
160
 
146
161
  -- CreateTable
147
- CREATE TABLE "_PackToUser" (
148
- "A" STRING NOT NULL,
149
- "B" STRING NOT NULL
162
+ CREATE TABLE "_PackToTeam" (
163
+ "A" TEXT NOT NULL,
164
+ "B" TEXT NOT NULL,
165
+
166
+ CONSTRAINT "_PackToTeam_AB_pkey" PRIMARY KEY ("A","B")
150
167
  );
151
168
 
152
169
  -- CreateIndex
@@ -155,9 +172,6 @@ CREATE UNIQUE INDEX "cards_packId_front_key" ON "cards"("packId", "front");
155
172
  -- CreateIndex
156
173
  CREATE UNIQUE INDEX "cards_packId_back_key" ON "cards"("packId", "back");
157
174
 
158
- -- CreateIndex
159
- CREATE UNIQUE INDEX "userCards_userId_cardId_key" ON "userCards"("userId", "cardId");
160
-
161
175
  -- CreateIndex
162
176
  CREATE UNIQUE INDEX "IX_Users_Email" ON "users"("email");
163
177
 
@@ -168,32 +182,29 @@ CREATE UNIQUE INDEX "IX_teachers_Email" ON "teachers"("email");
168
182
  CREATE UNIQUE INDEX "googleUsers_userId_key" ON "googleUsers"("userId");
169
183
 
170
184
  -- CreateIndex
171
- CREATE UNIQUE INDEX "_PackToTeam_AB_unique" ON "_PackToTeam"("A", "B");
185
+ CREATE INDEX "_PackToUser_B_index" ON "_PackToUser"("B");
172
186
 
173
187
  -- CreateIndex
174
188
  CREATE INDEX "_PackToTeam_B_index" ON "_PackToTeam"("B");
175
189
 
176
- -- CreateIndex
177
- CREATE UNIQUE INDEX "_PackToUser_AB_unique" ON "_PackToUser"("A", "B");
178
-
179
- -- CreateIndex
180
- CREATE INDEX "_PackToUser_B_index" ON "_PackToUser"("B");
181
-
182
190
  -- AddForeignKey
183
191
  ALTER TABLE "cards" ADD CONSTRAINT "cards_packId_fkey" FOREIGN KEY ("packId") REFERENCES "packs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
184
192
 
185
193
  -- AddForeignKey
186
- ALTER TABLE "userCards" ADD CONSTRAINT "userCards_cardId_fkey" FOREIGN KEY ("cardId") REFERENCES "cards"("id") ON DELETE CASCADE ON UPDATE CASCADE;
194
+ ALTER TABLE "userCards" ADD CONSTRAINT "userCards_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
187
195
 
188
196
  -- AddForeignKey
189
- ALTER TABLE "userCards" ADD CONSTRAINT "userCards_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
197
+ ALTER TABLE "userCards" ADD CONSTRAINT "userCards_cardId_fkey" FOREIGN KEY ("cardId") REFERENCES "cards"("id") ON DELETE CASCADE ON UPDATE CASCADE;
190
198
 
191
199
  -- AddForeignKey
192
- ALTER TABLE "packs" ADD CONSTRAINT "packs_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
200
+ ALTER TABLE "userStats" ADD CONSTRAINT "userStats_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
193
201
 
194
202
  -- AddForeignKey
195
203
  ALTER TABLE "packs" ADD CONSTRAINT "packs_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "teachers"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
196
204
 
205
+ -- AddForeignKey
206
+ ALTER TABLE "packs" ADD CONSTRAINT "packs_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
207
+
197
208
  -- AddForeignKey
198
209
  ALTER TABLE "users" ADD CONSTRAINT "users_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "teams"("id") ON DELETE SET NULL ON UPDATE CASCADE;
199
210
 
@@ -203,23 +214,17 @@ ALTER TABLE "achievements" ADD CONSTRAINT "achievements_userId_fkey" FOREIGN KEY
203
214
  -- AddForeignKey
204
215
  ALTER TABLE "googleUsers" ADD CONSTRAINT "googleUsers_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
205
216
 
206
- -- AddForeignKey
207
- ALTER TABLE "userAnswers" ADD CONSTRAINT "userAnswers_cardId_fkey" FOREIGN KEY ("cardId") REFERENCES "cards"("id") ON DELETE CASCADE ON UPDATE CASCADE;
208
-
209
217
  -- AddForeignKey
210
218
  ALTER TABLE "userAnswers" ADD CONSTRAINT "userAnswers_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
211
219
 
212
220
  -- AddForeignKey
213
- ALTER TABLE "purchases" ADD CONSTRAINT "purchases_packId_fkey" FOREIGN KEY ("packId") REFERENCES "packs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
221
+ ALTER TABLE "userAnswers" ADD CONSTRAINT "userAnswers_cardId_fkey" FOREIGN KEY ("cardId") REFERENCES "cards"("id") ON DELETE CASCADE ON UPDATE CASCADE;
214
222
 
215
223
  -- AddForeignKey
216
224
  ALTER TABLE "purchases" ADD CONSTRAINT "purchases_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
217
225
 
218
226
  -- AddForeignKey
219
- ALTER TABLE "_PackToTeam" ADD CONSTRAINT "_PackToTeam_A_fkey" FOREIGN KEY ("A") REFERENCES "packs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
220
-
221
- -- AddForeignKey
222
- ALTER TABLE "_PackToTeam" ADD CONSTRAINT "_PackToTeam_B_fkey" FOREIGN KEY ("B") REFERENCES "teams"("id") ON DELETE CASCADE ON UPDATE CASCADE;
227
+ ALTER TABLE "purchases" ADD CONSTRAINT "purchases_packId_fkey" FOREIGN KEY ("packId") REFERENCES "packs"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
223
228
 
224
229
  -- AddForeignKey
225
230
  ALTER TABLE "_PackToUser" ADD CONSTRAINT "_PackToUser_A_fkey" FOREIGN KEY ("A") REFERENCES "packs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -227,3 +232,8 @@ ALTER TABLE "_PackToUser" ADD CONSTRAINT "_PackToUser_A_fkey" FOREIGN KEY ("A")
227
232
  -- AddForeignKey
228
233
  ALTER TABLE "_PackToUser" ADD CONSTRAINT "_PackToUser_B_fkey" FOREIGN KEY ("B") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
229
234
 
235
+ -- AddForeignKey
236
+ ALTER TABLE "_PackToTeam" ADD CONSTRAINT "_PackToTeam_A_fkey" FOREIGN KEY ("A") REFERENCES "packs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
237
+
238
+ -- AddForeignKey
239
+ ALTER TABLE "_PackToTeam" ADD CONSTRAINT "_PackToTeam_B_fkey" FOREIGN KEY ("B") REFERENCES "teams"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,3 +1,3 @@
1
1
  # Please do not edit this file manually
2
2
  # It should be added in your version-control system (i.e. Git)
3
- provider = "cockroachdb"
3
+ provider = "postgresql"
package/package.json CHANGED
@@ -1,36 +1,36 @@
1
- {
2
- "name": "lang-database",
3
- "version": "11.0.1",
4
- "description": "",
5
- "main": "index.js",
6
- "types": "index.d.ts",
7
- "scripts": {
8
- "create-migration": "npx prisma migrate dev --create-only",
9
- "generate": "npx prisma generate",
10
- "push-dev-dbs": "npm run push-dev-db && npm run push-local-db && npm run push-test-db",
11
- "push-prod-db": "copy .env-prod .env && prisma db push --skip-generate",
12
- "push-dev-db": "copy .env-dev .env && prisma db push --skip-generate",
13
- "push-local-db": "copy .env-local .env && prisma db push --skip-generate",
14
- "push-test-db": "copy .env-test .env && prisma db push --skip-generate",
15
- "test": "echo \"Error: no test specified\" && exit 1",
16
- "postinstall": "npm run generate"
17
- },
18
- "repository": {
19
- "type": "git",
20
- "url": "https://bitbucket.org/syke80/lang-database.git"
21
- },
22
- "keywords": [],
23
- "author": "",
24
- "license": "ISC",
25
- "bugs": {
26
- "url": "https://bitbucket.org/syke80/lang-database/issues"
27
- },
28
- "homepage": "https://bitbucket.org/syke80/lang-database#readme",
29
- "devDependencies": {
30
- "@prisma/client": "^5.11.0",
31
- "prisma": "^5.11.0"
32
- },
33
- "peerDependencies": {
34
- "@prisma/client": ">=5"
35
- }
36
- }
1
+ {
2
+ "name": "lang-database",
3
+ "version": "12.1.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "scripts": {
8
+ "create-migration": "npx prisma migrate dev --create-only",
9
+ "generate": "npx prisma generate",
10
+ "push-dev-dbs": "npm run push-dev-db && npm run push-local-db && npm run push-test-db",
11
+ "push-prod-db": "copy .env-prod .env && prisma db push --skip-generate",
12
+ "push-dev-db": "copy .env-dev .env && prisma db push --skip-generate",
13
+ "push-local-db": "copy .env-local .env && prisma db push --skip-generate",
14
+ "push-test-db": "copy .env-test .env && prisma db push --skip-generate",
15
+ "test": "echo \"Error: no test specified\" && exit 1",
16
+ "postinstall": "npm run generate"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://bitbucket.org/syke80/lang-database.git"
21
+ },
22
+ "keywords": [],
23
+ "author": "",
24
+ "license": "ISC",
25
+ "bugs": {
26
+ "url": "https://bitbucket.org/syke80/lang-database/issues"
27
+ },
28
+ "homepage": "https://bitbucket.org/syke80/lang-database#readme",
29
+ "devDependencies": {
30
+ "@prisma/client": "^6.0.1",
31
+ "prisma": "^6.0.1"
32
+ },
33
+ "peerDependencies": {
34
+ "@prisma/client": ">=5"
35
+ }
36
+ }
package/schema.prisma CHANGED
@@ -1,175 +1,207 @@
1
- generator client {
2
- provider = "prisma-client-js"
3
- }
4
-
5
- datasource db {
6
- provider = "cockroachdb"
7
- url = env("DATABASE_URL")
8
- shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
9
- }
10
-
11
- model Card {
12
- id String @id @default(cuid())
13
- pack Pack @relation(fields: [packId], references: [id])
14
- packId String
15
- front String
16
- back String
17
- info String @default("")
18
- lastUpdate DateTime @default(now())
19
- userCards UserCard[]
20
- speechGenerated Boolean @default(false)
21
- answers UserAnswer[]
22
-
23
- @@unique([packId, front])
24
- @@unique([packId, back])
25
- @@map("cards")
26
- }
27
-
28
- model UserCard {
29
- user User @relation(fields: [userId], references: [id])
30
- userId String
31
- card Card @relation(fields: [cardId], references: [id], onDelete: Cascade)
32
- cardId String
33
- reverse Boolean
34
- currentInterval Int?
35
- dueDate DateTime?
36
- done Boolean @default(false)
37
-
38
- @@id([userId, cardId, reverse])
39
- @@map("userCards")
40
- }
41
-
42
- model Category {
43
- id String @id @default(cuid())
44
- name String
45
- order Int?
46
- packs Pack[]
47
- @@map("categories")
48
- }
49
-
50
- model Pack {
51
- id String @id @default(cuid())
52
- teacher Teacher @relation(fields: [teacherId], references: [id])
53
- teacherId String
54
- name String @default("")
55
- shortDescription String @default("")
56
- longDescription String @default("")
57
- category Category? @relation(fields: [categoryId], references: [id])
58
- categoryId String?
59
- published Boolean @default(false)
60
- currentPrice Decimal
61
- public Boolean @default(false)
62
- cards Card[]
63
- users User[]
64
- purchases Purchase[]
65
- teams Team[]
66
- @@map("packs")
67
- }
68
-
69
- model User {
70
- id String @id @default(cuid())
71
- email String @unique(map: "IX_Users_Email")
72
- timestamp DateTime @default(now())
73
- name String
74
- password String?
75
- googleUser GoogleUser?
76
- achievements Achievement[]
77
- purchases Purchase[]
78
- packs Pack[]
79
- userCards UserCard[]
80
- userAnswers UserAnswer[]
81
- subscriptionExpire DateTime?
82
- team Team? @relation(fields: [teamId], references: [id])
83
- teamId String?
84
- passwordActivated Boolean @default(false)
85
- @@map("users")
86
- }
87
-
88
- model Achievement {
89
- id String @id @default(cuid())
90
- user User @relation(fields: [userId], references: [id])
91
- userId String
92
- badge Boolean
93
- type AchievementType
94
- info String
95
- timestamp DateTime
96
- dismissed Boolean @default(false)
97
- @@map("achievements")
98
- }
99
-
100
- enum AchievementType {
101
- Today15Min
102
- Weekly15Min
103
- Monthly15Min
104
- CardDone
105
- FiveCardsDone
106
- DeckDone
107
- DeckAlreadyKnown
108
- @@map("AchievementType")
109
- }
110
-
111
- model Team {
112
- id String @id @default(cuid())
113
- name String
114
- emailPattern String @default("")
115
- additionalDecks Pack[]
116
- members User[]
117
- userCount Int
118
- subscriptionExpire DateTime?
119
- @@map("teams")
120
- }
121
-
122
- model Teacher {
123
- id String @id @default(cuid())
124
- email String @unique(map: "IX_teachers_Email")
125
- name String
126
- password String
127
- packs Pack[]
128
- @@map("teachers")
129
- }
130
-
131
- model GoogleUser {
132
- id String @id
133
- user User @relation(fields: [userId], references: [id])
134
- userId String @unique
135
- @@map("googleUsers")
136
- }
137
-
138
- model UserAnswer {
139
- id String @id @default(cuid())
140
- user User @relation(fields: [userId], references: [id])
141
- userId String
142
- card Card @relation(fields: [cardId], references: [id], onDelete: Cascade)
143
- cardId String
144
- reverse Boolean
145
- answer Answer
146
- timestamp DateTime
147
- @@map("userAnswers")
148
- }
149
-
150
- enum Answer {
151
- KNOWN
152
- ALMOST_KNOWN
153
- HARD
154
- UNKNOWN
155
- }
156
-
157
- enum PurchaseStatus {
158
- PENDING
159
- APPROVED
160
- }
161
-
162
- model Purchase {
163
- id String @id @default(cuid())
164
- user User @relation(fields: [userId], references: [id])
165
- userId String
166
- pack Pack @relation(fields: [packId], references: [id])
167
- packId String
168
- currency String
169
- amount Decimal
170
- orderDate DateTime
171
- paymentDate DateTime?
172
- status PurchaseStatus
173
-
174
- @@map("purchases")
175
- }
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("DATABASE_URL")
8
+ shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
9
+ }
10
+
11
+ model Card {
12
+ id String @id @default(cuid())
13
+ pack Pack @relation(fields: [packId], references: [id])
14
+ packId String
15
+ front String
16
+ back String
17
+ info String @default("")
18
+ lastUpdate DateTime @default(now())
19
+ userCards UserCard[]
20
+ speechGenerated Boolean @default(false)
21
+ answers UserAnswer[]
22
+
23
+ @@unique([packId, front])
24
+ @@unique([packId, back])
25
+ @@map("cards")
26
+ }
27
+
28
+ model UserCard {
29
+ user User @relation(fields: [userId], references: [id])
30
+ userId String
31
+ card Card @relation(fields: [cardId], references: [id], onDelete: Cascade)
32
+ cardId String
33
+ reverse Boolean
34
+
35
+ done Boolean @default(false)
36
+ currentInterval Int? @db.SmallInt
37
+ dueDate DateTime?
38
+
39
+ @@id([userId, cardId, reverse])
40
+ @@map("userCards")
41
+ }
42
+
43
+ model UserDeck {
44
+ user User @relation(fields: [userId], references: [id])
45
+ userId String
46
+ deck Pack @relation(fields: [deckId], references: [id], onDelete: Cascade)
47
+ deckId String
48
+ reverse Boolean
49
+
50
+ allCards Int @db.SmallInt
51
+ newCards Int @db.SmallInt
52
+ inProgressCards Int @db.SmallInt
53
+ doneCards Int @db.SmallInt
54
+
55
+ @@id([userId, deckId, reverse])
56
+ @@map("userDecks")
57
+ }
58
+
59
+ model UserStat {
60
+ user User @relation(fields: [userId], references: [id])
61
+ userId String
62
+
63
+ lastAnswerTimestamp DateTime
64
+ dailyUsageSec Int
65
+ weeklyUsageSec Int
66
+ monthlyUsageSec Int
67
+ cardsDone Int
68
+
69
+ @@id([userId])
70
+ @@map("userStats")
71
+ }
72
+
73
+ model Category {
74
+ id String @id @default(cuid())
75
+ name String
76
+ order Int? @db.SmallInt
77
+ packs Pack[]
78
+ @@map("categories")
79
+ }
80
+
81
+ model Pack {
82
+ id String @id @default(cuid())
83
+ teacher Teacher @relation(fields: [teacherId], references: [id])
84
+ teacherId String
85
+ name String @default("")
86
+ shortDescription String @default("")
87
+ longDescription String @default("")
88
+ category Category? @relation(fields: [categoryId], references: [id])
89
+ categoryId String?
90
+ published Boolean @default(false)
91
+ currentPrice Decimal
92
+ public Boolean @default(false)
93
+ userDecks UserDeck[]
94
+ cards Card[]
95
+ purchases Purchase[]
96
+ teams Team[]
97
+ @@map("packs")
98
+ }
99
+
100
+ model User {
101
+ id String @id @default(cuid())
102
+ email String @unique(map: "IX_Users_Email")
103
+ timestamp DateTime @default(now())
104
+ name String
105
+ password String?
106
+ googleUser GoogleUser?
107
+ achievements Achievement[]
108
+ purchases Purchase[]
109
+ userCards UserCard[]
110
+ userDecks UserDeck[]
111
+ userStat UserStat?
112
+ userAnswers UserAnswer[]
113
+ subscriptionExpire DateTime?
114
+ team Team? @relation(fields: [teamId], references: [id])
115
+ teamId String?
116
+ passwordActivated Boolean @default(false)
117
+ @@map("users")
118
+ }
119
+
120
+ model Achievement {
121
+ id String @id @default(cuid())
122
+ user User @relation(fields: [userId], references: [id])
123
+ userId String
124
+ badge Boolean
125
+ type AchievementType
126
+ info String
127
+ timestamp DateTime
128
+ dismissed Boolean @default(false)
129
+ @@map("achievements")
130
+ }
131
+
132
+ enum AchievementType {
133
+ Today15Min
134
+ Weekly15Min
135
+ Monthly15Min
136
+ CardDone
137
+ FiveCardsDone
138
+ DeckDone
139
+ DeckAlreadyKnown
140
+ @@map("AchievementType")
141
+ }
142
+
143
+ model Team {
144
+ id String @id @default(cuid())
145
+ name String
146
+ emailPattern String @default("")
147
+ additionalDecks Pack[]
148
+ members User[]
149
+ userCount Int
150
+ subscriptionExpire DateTime?
151
+ @@map("teams")
152
+ }
153
+
154
+ model Teacher {
155
+ id String @id @default(cuid())
156
+ email String @unique(map: "IX_teachers_Email")
157
+ name String
158
+ password String
159
+ packs Pack[]
160
+ @@map("teachers")
161
+ }
162
+
163
+ model GoogleUser {
164
+ id String @id
165
+ user User @relation(fields: [userId], references: [id])
166
+ userId String @unique
167
+ @@map("googleUsers")
168
+ }
169
+
170
+ model UserAnswer {
171
+ id String @id @default(cuid())
172
+ user User @relation(fields: [userId], references: [id])
173
+ userId String
174
+ card Card @relation(fields: [cardId], references: [id], onDelete: Cascade)
175
+ cardId String
176
+ reverse Boolean
177
+ answer Answer
178
+ timestamp DateTime
179
+ @@map("userAnswers")
180
+ }
181
+
182
+ enum Answer {
183
+ KNOWN
184
+ ALMOST_KNOWN
185
+ HARD
186
+ UNKNOWN
187
+ }
188
+
189
+ enum PurchaseStatus {
190
+ PENDING
191
+ APPROVED
192
+ }
193
+
194
+ model Purchase {
195
+ id String @id @default(cuid())
196
+ user User @relation(fields: [userId], references: [id])
197
+ userId String
198
+ pack Pack @relation(fields: [packId], references: [id])
199
+ packId String
200
+ currency String
201
+ amount Decimal
202
+ orderDate DateTime
203
+ paymentDate DateTime?
204
+ status PurchaseStatus
205
+
206
+ @@map("purchases")
207
+ }
package/.env.removed DELETED
@@ -1,17 +0,0 @@
1
- # DATABASE_URL=postgresql://attila:A8JpZy_JhOM5uZm7QvIzAQ@free-tier7.aws-eu-west-1.cockroachlabs.cloud:26257/ezfraze-dev?sslmode=verify-full&options=--cluster%3Dday-bee-3717
2
- DATABASE_URL=postgresql://attila:A8JpZy_JhOM5uZm7QvIzAQ@free-tier7.aws-eu-west-1.cockroachlabs.cloud:26257/ezfraze-prod-v2?sslmode=verify-full&options=--cluster%3Dday-bee-3717
3
- # DATABASE_URL="postgresql://postgres:password@localhost:5432/ezfraze"
4
- JWT_KEY=This is my jwt key
5
- GOOGLE_CLIENT_ID=161628947473-h1575jmkaiqrgpo78nemsu2u4vk143ka.apps.googleusercontent.com
6
-
7
- MAILERSEND_API_TOKEN=mlsn.90e8e408adf939502e682bf19949ee35f40eb1e6642333ab9870b371cc6e7de3
8
- MAILERSEND_ACTVATION_TEMPLATE_ID=3z0vklonwwv47qrx
9
-
10
- SPEECH_BUCKET_NAME=ezfraze-speech-sandbox
11
-
12
- CHECKOUT_COM_SECRET_API_KEY=sk_sbox_y5bn577ag2jqybphho3vsm6gpim
13
- CHECKOUT_COM_PAYMENT_URL=https://api.sandbox.checkout.com/payments
14
- CHECKOUT_COM_PROCESSING_CHANNEL=pc_zj4dltodkn6uldfeyeisnol63q
15
- PORT=6061
16
-
17
- SUBSCRIPTION_DISABLED=true
@@ -1,8 +0,0 @@
1
- -- DropIndex
2
- DROP INDEX "userCards_userId_cardId_key" CASCADE;
3
-
4
- -- AlterTable
5
- ALTER TABLE "categories" ADD COLUMN "order" INT4;
6
-
7
- -- AlterTable
8
- ALTER TABLE "userCards" ALTER COLUMN "reverse" DROP DEFAULT;
@@ -1,2 +0,0 @@
1
- -- AlterTable
2
- ALTER TABLE "userAnswers" ALTER COLUMN "reverse" DROP DEFAULT;