lang-database 11.0.1 → 12.0.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.0.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,191 @@
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
+ done Boolean @default(false)
35
+ currentInterval Int?
36
+ dueDate DateTime?
37
+
38
+
39
+ @@id([userId, cardId, reverse])
40
+ @@map("userCards")
41
+ }
42
+
43
+ model UserStat {
44
+ user User @relation(fields: [userId], references: [id])
45
+ userId String
46
+
47
+ lastAnswerTimestamp DateTime
48
+ dailyUsageSec Int
49
+ weeklyUsageSec Int
50
+ monthlyUsageSec Int
51
+ cardsDone Int
52
+
53
+ @@id([userId])
54
+ @@map("userStats")
55
+ }
56
+
57
+ model Category {
58
+ id String @id @default(cuid())
59
+ name String
60
+ order Int?
61
+ packs Pack[]
62
+ @@map("categories")
63
+ }
64
+
65
+ model Pack {
66
+ id String @id @default(cuid())
67
+ teacher Teacher @relation(fields: [teacherId], references: [id])
68
+ teacherId String
69
+ name String @default("")
70
+ shortDescription String @default("")
71
+ longDescription String @default("")
72
+ category Category? @relation(fields: [categoryId], references: [id])
73
+ categoryId String?
74
+ published Boolean @default(false)
75
+ currentPrice Decimal
76
+ public Boolean @default(false)
77
+ cards Card[]
78
+ users User[]
79
+ purchases Purchase[]
80
+ teams Team[]
81
+ @@map("packs")
82
+ }
83
+
84
+ model User {
85
+ id String @id @default(cuid())
86
+ email String @unique(map: "IX_Users_Email")
87
+ timestamp DateTime @default(now())
88
+ name String
89
+ password String?
90
+ googleUser GoogleUser?
91
+ achievements Achievement[]
92
+ purchases Purchase[]
93
+ packs Pack[]
94
+ userCards UserCard[]
95
+ userStat UserStat?
96
+ userAnswers UserAnswer[]
97
+ subscriptionExpire DateTime?
98
+ team Team? @relation(fields: [teamId], references: [id])
99
+ teamId String?
100
+ passwordActivated Boolean @default(false)
101
+ @@map("users")
102
+ }
103
+
104
+ model Achievement {
105
+ id String @id @default(cuid())
106
+ user User @relation(fields: [userId], references: [id])
107
+ userId String
108
+ badge Boolean
109
+ type AchievementType
110
+ info String
111
+ timestamp DateTime
112
+ dismissed Boolean @default(false)
113
+ @@map("achievements")
114
+ }
115
+
116
+ enum AchievementType {
117
+ Today15Min
118
+ Weekly15Min
119
+ Monthly15Min
120
+ CardDone
121
+ FiveCardsDone
122
+ DeckDone
123
+ DeckAlreadyKnown
124
+ @@map("AchievementType")
125
+ }
126
+
127
+ model Team {
128
+ id String @id @default(cuid())
129
+ name String
130
+ emailPattern String @default("")
131
+ additionalDecks Pack[]
132
+ members User[]
133
+ userCount Int
134
+ subscriptionExpire DateTime?
135
+ @@map("teams")
136
+ }
137
+
138
+ model Teacher {
139
+ id String @id @default(cuid())
140
+ email String @unique(map: "IX_teachers_Email")
141
+ name String
142
+ password String
143
+ packs Pack[]
144
+ @@map("teachers")
145
+ }
146
+
147
+ model GoogleUser {
148
+ id String @id
149
+ user User @relation(fields: [userId], references: [id])
150
+ userId String @unique
151
+ @@map("googleUsers")
152
+ }
153
+
154
+ model UserAnswer {
155
+ id String @id @default(cuid())
156
+ user User @relation(fields: [userId], references: [id])
157
+ userId String
158
+ card Card @relation(fields: [cardId], references: [id], onDelete: Cascade)
159
+ cardId String
160
+ reverse Boolean
161
+ answer Answer
162
+ timestamp DateTime
163
+ @@map("userAnswers")
164
+ }
165
+
166
+ enum Answer {
167
+ KNOWN
168
+ ALMOST_KNOWN
169
+ HARD
170
+ UNKNOWN
171
+ }
172
+
173
+ enum PurchaseStatus {
174
+ PENDING
175
+ APPROVED
176
+ }
177
+
178
+ model Purchase {
179
+ id String @id @default(cuid())
180
+ user User @relation(fields: [userId], references: [id])
181
+ userId String
182
+ pack Pack @relation(fields: [packId], references: [id])
183
+ packId String
184
+ currency String
185
+ amount Decimal
186
+ orderDate DateTime
187
+ paymentDate DateTime?
188
+ status PurchaseStatus
189
+
190
+ @@map("purchases")
191
+ }
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;