Skip to content

Commit 20de0ee

Browse files
committed
feat: rewrite of backend for implement new libnest
1 parent 7457540 commit 20de0ee

File tree

192 files changed

+8666
-7363
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

192 files changed

+8666
-7363
lines changed

apps/api/Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ FROM base AS runner
2727
COPY --from=installer /app/apps/api/dist/ /app/dist/
2828
COPY --from=installer /app/apps/api/public/ /app/public/
2929
COPY --from=installer /app/apps/api/dist/runtime/ /runtime/
30-
COPY --from=installer /app/apps/api/dist/prisma/client/ /.prisma/client/
3130

3231
RUN echo '{ "type": "module" }' > package.json
3332
RUN echo '{ "type": "module" }' > /runtime/package.json

apps/api/libnest.config.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/* eslint-disable @typescript-eslint/no-empty-object-type */
2+
/* eslint-disable @typescript-eslint/consistent-type-definitions */
3+
4+
import * as fs from 'node:fs/promises';
5+
import * as path from 'node:path';
6+
import * as url from 'node:url';
7+
8+
import { defineUserConfig } from '@douglasneuroinformatics/libnest/user-config';
9+
import type { InferUserConfig } from '@douglasneuroinformatics/libnest/user-config';
10+
import { getReleaseInfo } from '@opendatacapture/release-info';
11+
12+
declare module '@douglasneuroinformatics/libnest/user-config' {
13+
export interface UserConfig extends InferUserConfig<typeof config> {}
14+
}
15+
16+
const config = defineUserConfig({
17+
build: {
18+
onComplete: async () => {
19+
const runtimeV1Dir = path.dirname(
20+
url.fileURLToPath(import.meta.resolve('@opendatacapture/runtime-v1/package.json'))
21+
);
22+
await fs.cp(path.join(runtimeV1Dir, 'dist'), path.join(import.meta.dirname, 'dist/runtime/v1'), {
23+
recursive: true
24+
});
25+
},
26+
outfile: path.resolve(import.meta.dirname, 'dist/app.js')
27+
},
28+
entry: () => import('./src/main.js'),
29+
globals: {
30+
__RELEASE__: await getReleaseInfo()
31+
}
32+
});
33+
34+
export default config;

apps/api/package.json

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,32 @@
55
"private": true,
66
"license": "Apache-2.0",
77
"scripts": {
8-
"_dev": "NODE_ENV=development env-cmd -f ../../.env node --enable-source-maps --import @swc-node/register/esm-register --watch src/main.ts",
9-
"_dev:test": "NODE_ENV=test env-cmd -f ../../.env node --enable-source-maps --import @swc-node/register/esm-register --watch src/main.ts",
10-
"build": "NODE_ENV=production tsx scripts/build.ts",
8+
"build": "rm -rf dist && NODE_ENV=production libnest build -c libnest.config.ts",
119
"db:generate": "prisma generate",
12-
"dev": "NODE_ENV=development env-cmd -f ../../.env tsx scripts/dev.ts",
13-
"dev:test": "NODE_ENV=test env-cmd -f ../../.env tsx scripts/dev.ts",
10+
"dev": "NODE_ENV=development NODE_OPTIONS='--conditions=development' env-cmd -f ../../.env libnest dev -c libnest.config.ts",
11+
"dev:test": "NODE_ENV=test env-cmd -f ../../.env libnest dev -c libnest.config.ts",
1412
"format": "prettier --write src",
1513
"lint": "tsc && eslint --fix src",
1614
"start": "NODE_ENV=production env-cmd -f ../../.env node dist/app.js",
17-
"start:inspect": "NODE_ENV=production env-cmd -f ../../.env node --inspect dist/app.js",
18-
"start:profile": "NODE_ENV=production env-cmd -f ../../.env node --prof dist/app.js",
1915
"test": "env-cmd -f ../../.env vitest"
2016
},
2117
"dependencies": {
2218
"@casl/ability": "catalog:",
2319
"@casl/prisma": "catalog:",
2420
"@douglasneuroinformatics/libcrypto": "catalog:",
25-
"@douglasneuroinformatics/libjs": "catalog:",
26-
"@douglasneuroinformatics/libnest": "catalog:",
21+
"@douglasneuroinformatics/libjs": "^2.4.0",
22+
"@douglasneuroinformatics/libnest": "^2.3.1",
2723
"@douglasneuroinformatics/libpasswd": "catalog:",
2824
"@douglasneuroinformatics/libstats": "catalog:",
2925
"@faker-js/faker": "^9.4.0",
30-
"@nestjs/axios": "^3.0.3",
31-
"@nestjs/common": "^10.4.1",
32-
"@nestjs/config": "^3.2.3",
33-
"@nestjs/core": "^10.4.1",
34-
"@nestjs/jwt": "^10.2.0",
35-
"@nestjs/mapped-types": "2.1.0",
36-
"@nestjs/passport": "^10.0.3",
37-
"@nestjs/platform-express": "^10.4.1",
38-
"@nestjs/swagger": "^7.4.0",
39-
"@nestjs/throttler": "^6.3.0",
26+
"@nestjs/axios": "^4.0.0",
27+
"@nestjs/common": "^11.0.11",
28+
"@nestjs/config": "^4.0.0",
29+
"@nestjs/core": "^11.0.11",
30+
"@nestjs/mapped-types": "^2.1.0",
31+
"@nestjs/passport": "^11.0.5",
32+
"@nestjs/platform-express": "^11.0.11",
33+
"@nestjs/swagger": "^11.0.6",
4034
"@opendatacapture/demo": "workspace:*",
4135
"@opendatacapture/instrument-library": "workspace:*",
4236
"@opendatacapture/instrument-utils": "workspace:*",
@@ -47,23 +41,22 @@
4741
"@opendatacapture/subject-utils": "workspace:*",
4842
"@prisma/client": "catalog:",
4943
"axios": "catalog:",
50-
"express": "^4.21.2",
44+
"express": "^5.0.1",
5145
"lodash-es": "workspace:lodash-es__4.x@*",
52-
"mongodb": "^6.12.0",
46+
"mongodb": "^6.15.0",
47+
"neverthrow": "^8.2.0",
5348
"passport": "^0.7.0",
5449
"passport-jwt": "4.0.1",
5550
"reflect-metadata": "^0.1.14",
56-
"rxjs": "^7.8.1",
51+
"rxjs": "^7.8.2",
5752
"ts-pattern": "workspace:ts-pattern__5.x@*",
5853
"zod": "workspace:zod__3.23.x@*"
5954
},
6055
"devDependencies": {
6156
"@douglasneuroinformatics/esbuild-plugin-prisma": "catalog:",
62-
"@nestjs/testing": "^10.4.1",
57+
"@nestjs/testing": "^11.0.11",
6358
"@opendatacapture/instrument-stubs": "workspace:*",
64-
"@types/express": "^4.17.21",
65-
"@types/passport": "^1.0.17",
66-
"@types/passport-jwt": "^4.0.1",
59+
"@types/express": "^5.0.0",
6760
"@types/supertest": "^6.0.2",
6861
"concurrently": "^9.1.2",
6962
"esbuild": "catalog:",
@@ -75,7 +68,10 @@
7568
"type-fest": "workspace:type-fest__4.x@*"
7669
},
7770
"imports": {
78-
"#runtime/*": "./dist/runtime/*"
71+
"#runtime/v1/*": {
72+
"development": "../../runtime/v1/dist/*",
73+
"default": "./dist/runtime/v1/*"
74+
}
7975
},
8076
"trustedDependencies": [
8177
"prisma"

apps/api/prisma/schema.prisma

Lines changed: 82 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
generator client {
22
provider = "prisma-client-js"
3-
output = "../node_modules/@prisma/generated-client"
3+
// output = "../node_modules/@prisma/generated-client"
44
binaryTargets = ["native", "debian-openssl-1.1.x"]
55
}
66

@@ -27,22 +27,24 @@ type EncryptionKeyPair {
2727
privateKey Bytes
2828
}
2929

30-
model AssignmentModel {
31-
createdAt DateTime @default(now()) @db.Date
32-
updatedAt DateTime @updatedAt @db.Date
33-
id String @id @map("_id")
30+
model Assignment {
31+
createdAt DateTime @default(now()) @db.Date
32+
updatedAt DateTime @updatedAt @db.Date
33+
id String @id @map("_id")
3434
completedAt DateTime?
3535
expiresAt DateTime
36-
group GroupModel? @relation(fields: [groupId], references: [id])
37-
groupId String? @db.ObjectId
38-
instrument InstrumentModel @relation(fields: [instrumentId], references: [id])
36+
group Group? @relation(fields: [groupId], references: [id])
37+
groupId String? @db.ObjectId
38+
instrument Instrument @relation(fields: [instrumentId], references: [id])
3939
instrumentId String
40-
instrumentRecord InstrumentRecordModel?
40+
instrumentRecord InstrumentRecord?
4141
status AssignmentStatus
42-
subject SubjectModel @relation(fields: [subjectId], references: [id])
42+
subject Subject @relation(fields: [subjectId], references: [id])
4343
subjectId String
4444
url String
4545
encryptionKeyPair EncryptionKeyPair
46+
47+
@@map("AssignmentModel")
4648
}
4749

4850
// Groups
@@ -68,44 +70,48 @@ type GroupSettings {
6870
idValidationRegexErrorMessage ErrorMessage?
6971
}
7072

71-
model GroupModel {
72-
createdAt DateTime @default(now()) @db.Date
73-
updatedAt DateTime @updatedAt @db.Date
74-
id String @id @default(auto()) @map("_id") @db.ObjectId
73+
model Group {
74+
createdAt DateTime @default(now()) @db.Date
75+
updatedAt DateTime @updatedAt @db.Date
76+
id String @id @default(auto()) @map("_id") @db.ObjectId
7577
accessibleInstrumentIds String[]
76-
accessibleInstruments InstrumentModel[] @relation(fields: [accessibleInstrumentIds], references: [id])
77-
assignments AssignmentModel[]
78-
instrumentRecords InstrumentRecordModel[]
79-
name String @unique
78+
accessibleInstruments Instrument[] @relation(fields: [accessibleInstrumentIds], references: [id])
79+
assignments Assignment[]
80+
instrumentRecords InstrumentRecord[]
81+
name String @unique
8082
settings GroupSettings
81-
sessions SessionModel[]
82-
subjects SubjectModel[] @relation(fields: [subjectIds], references: [id])
83+
sessions Session[]
84+
subjects Subject[] @relation(fields: [subjectIds], references: [id])
8385
subjectIds String[]
8486
type GroupType
85-
userIds String[] @db.ObjectId
86-
users UserModel[] @relation(fields: [userIds], references: [id])
87+
userIds String[] @db.ObjectId
88+
users User[] @relation(fields: [userIds], references: [id])
89+
90+
@@map("GroupModel")
8791
}
8892

8993
/// Instrument Records
9094

91-
model InstrumentRecordModel {
92-
createdAt DateTime @default(now()) @db.Date
93-
updatedAt DateTime @updatedAt @db.Date
94-
id String @id @default(auto()) @map("_id") @db.ObjectId
95+
model InstrumentRecord {
96+
createdAt DateTime @default(now()) @db.Date
97+
updatedAt DateTime @updatedAt @db.Date
98+
id String @id @default(auto()) @map("_id") @db.ObjectId
9599
/// [ComputedMeasures]
96100
computedMeasures Json?
97101
data Json?
98-
date DateTime @db.Date
99-
group GroupModel? @relation(fields: [groupId], references: [id])
100-
groupId String? @db.ObjectId
101-
subject SubjectModel @relation(fields: [subjectId], references: [id])
102+
date DateTime @db.Date
103+
group Group? @relation(fields: [groupId], references: [id])
104+
groupId String? @db.ObjectId
105+
subject Subject @relation(fields: [subjectId], references: [id])
102106
subjectId String
103-
instrument InstrumentModel @relation(fields: [instrumentId], references: [id])
107+
instrument Instrument @relation(fields: [instrumentId], references: [id])
104108
instrumentId String
105-
assignment AssignmentModel? @relation(fields: [assignmentId], references: [id])
106-
assignmentId String? @unique
107-
session SessionModel @relation(fields: [sessionId], references: [id])
108-
sessionId String @db.ObjectId
109+
assignment Assignment? @relation(fields: [assignmentId], references: [id])
110+
assignmentId String? @unique
111+
session Session @relation(fields: [sessionId], references: [id])
112+
sessionId String @db.ObjectId
113+
114+
@@map("InstrumentRecordModel")
109115
}
110116

111117
// Instruments
@@ -121,15 +127,17 @@ type InstrumentInternal {
121127
edition Float
122128
}
123129

124-
model InstrumentModel {
125-
createdAt DateTime @default(now()) @db.Date
126-
updatedAt DateTime @updatedAt @db.Date
127-
id String @id @map("_id")
128-
assignments AssignmentModel[]
130+
model Instrument {
131+
createdAt DateTime @default(now()) @db.Date
132+
updatedAt DateTime @updatedAt @db.Date
133+
id String @id @map("_id")
134+
assignments Assignment[]
129135
bundle String
130-
groups GroupModel[] @relation(fields: [groupIds], references: [id])
131-
groupIds String[] @db.ObjectId
132-
records InstrumentRecordModel[]
136+
groups Group[] @relation(fields: [groupIds], references: [id])
137+
groupIds String[] @db.ObjectId
138+
records InstrumentRecord[]
139+
140+
@@map("InstrumentModel")
133141
}
134142

135143
// Subjects
@@ -139,19 +147,21 @@ enum Sex {
139147
FEMALE
140148
}
141149

142-
model SubjectModel {
143-
createdAt DateTime @default(now()) @db.Date
144-
updatedAt DateTime @updatedAt @db.Date
145-
id String @id @map("_id")
146-
dateOfBirth DateTime? @db.Date
150+
model Subject {
151+
createdAt DateTime @default(now()) @db.Date
152+
updatedAt DateTime @updatedAt @db.Date
153+
id String @id @map("_id")
154+
dateOfBirth DateTime? @db.Date
147155
firstName String?
148-
groupIds String[] @db.ObjectId
149-
groups GroupModel[] @relation(fields: [groupIds], references: [id])
156+
groupIds String[] @db.ObjectId
157+
groups Group[] @relation(fields: [groupIds], references: [id])
150158
lastName String?
151-
sessions SessionModel[]
159+
sessions Session[]
152160
sex Sex?
153-
instrumentRecords InstrumentRecordModel[]
154-
assignments AssignmentModel[]
161+
instrumentRecords InstrumentRecord[]
162+
assignments Assignment[]
163+
164+
@@map("SubjectModel")
155165
}
156166

157167
enum BasePermissionLevel {
@@ -184,20 +194,22 @@ type AuthRule {
184194
subject AppSubject
185195
}
186196

187-
model UserModel {
197+
model User {
188198
createdAt DateTime @default(now()) @db.Date
189199
updatedAt DateTime @updatedAt @db.Date
190200
id String @id @default(auto()) @map("_id") @db.ObjectId
191201
basePermissionLevel BasePermissionLevel?
192202
additionalPermissions AuthRule[]
193203
firstName String
194204
groupIds String[] @db.ObjectId
195-
groups GroupModel[] @relation(fields: [groupIds], references: [id])
205+
groups Group[] @relation(fields: [groupIds], references: [id])
196206
lastName String
197-
password String
207+
hashedPassword String @map("password")
198208
username String
199209
sex Sex?
200210
dateOfBirth DateTime? @db.Date
211+
212+
@@map("UserModel")
201213
}
202214

203215
enum SessionType {
@@ -206,26 +218,30 @@ enum SessionType {
206218
REMOTE
207219
}
208220

209-
model SessionModel {
210-
createdAt DateTime @default(now()) @db.Date
211-
updatedAt DateTime @updatedAt @db.Date
212-
id String @id @default(auto()) @map("_id") @db.ObjectId
213-
date DateTime @db.Date
214-
group GroupModel? @relation(fields: [groupId], references: [id])
215-
groupId String? @db.ObjectId
216-
instrumentRecords InstrumentRecordModel[]
217-
subject SubjectModel @relation(fields: [subjectId], references: [id])
221+
model Session {
222+
createdAt DateTime @default(now()) @db.Date
223+
updatedAt DateTime @updatedAt @db.Date
224+
id String @id @default(auto()) @map("_id") @db.ObjectId
225+
date DateTime @db.Date
226+
group Group? @relation(fields: [groupId], references: [id])
227+
groupId String? @db.ObjectId
228+
instrumentRecords InstrumentRecord[]
229+
subject Subject? @relation(fields: [subjectId], references: [id])
218230
subjectId String
219231
type SessionType
232+
233+
@@map("SessionModel")
220234
}
221235

222236
// Setup
223237

224-
model SetupStateModel {
238+
model SetupState {
225239
createdAt DateTime @default(now()) @db.Date
226240
updatedAt DateTime @updatedAt @db.Date
227241
id String @id @default(auto()) @map("_id") @db.ObjectId
228242
isDemo Boolean
229243
isExperimentalFeaturesEnabled Boolean?
230244
isSetup Boolean
245+
246+
@@map("SetupStateModel")
231247
}

0 commit comments

Comments
 (0)