diff --git a/api/.env.defaults b/api/.env.defaults index ec63f0099d8e332beeb98eebeb534786a303b01a..eda459d2a6ba95e8411351356b098bd25da6d0ca 100644 --- a/api/.env.defaults +++ b/api/.env.defaults @@ -14,10 +14,3 @@ AUTH_JWT_SECRET=SecretForDevPurposeOnly AUTH_JWT_TOKEN_EXPIRES_IN=2d AUTH_COOKIE_SAME_SITE=strict AUTH_COOKIE_SECURE=true - -#DB -DB_HOST=localhost -DB_PORT=5454 -DB_USERNAME=postgres -DB_PASSWORD=pass123 -DB_NAME=postgres diff --git a/api/ormconfig.ts b/api/ormconfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..27afa05b4dda41d61eeae90c870720df0fd9fa92 --- /dev/null +++ b/api/ormconfig.ts @@ -0,0 +1,20 @@ +import { ConfigModule } from '@nestjs/config'; +import dbConfiguration from './src/config/db.config'; + +ConfigModule.forRoot({ + isGlobal: true, + envFilePath: ['.env', '.env.defaults'], + load: [dbConfiguration], +}); + +const config = { + ...dbConfiguration(), + entities: ['dist/**/*.entity.js', 'dist/**/*.model.js'], + migrations: ['dist/migrations/*{.ts,.js}'], + migrationsRun: false, + cli: { + migrationsDir: 'src/migrations', + }, +}; + +export default config; diff --git a/api/package.json b/api/package.json index 142d29fc53b88f607a56e402253edafcad98d9c7..50b06683499367df8fe7320b083a7c8120de2702 100644 --- a/api/package.json +++ b/api/package.json @@ -20,7 +20,10 @@ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest.e2e-config.ts", "test:we2e": "jest --watch --config ./test/jest.e2e-config.ts", - "prepare": "cd .. && husky install api/.husky" + "prepare": "cd .. && husky install api/.husky", + "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js", + "typeorm:migration:generate": "npm run typeorm -- migration:generate -n", + "typeorm:migration:run": "npm run typeorm -- migration:run" }, "dependencies": { "@nestjs/apollo": "^10.0.6", diff --git a/api/src/config/db.config.ts b/api/src/config/db.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..346dbffe42c0724fe8cf6aa15b6376bab4113c87 --- /dev/null +++ b/api/src/config/db.config.ts @@ -0,0 +1,12 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('database', () => { + return { + type: 'postgres', + host: process.env.DB_HOST || 'localhost', + port: +process.env.DB_PORT || 5432, + username: process.env.DB_USERNAME || 'postgres', + password: process.env.DB_PASSWORD || 'pass123', + database: process.env.DB_NAME || 'postgres', + }; +}); diff --git a/api/src/engine/models/category.model.ts b/api/src/engine/models/category.model.ts index 921ebfce8d518a66a484bf44d04cf330b8091915..2000d8f655368b17f99c6c7eee5540b32d94b9a0 100644 --- a/api/src/engine/models/category.model.ts +++ b/api/src/engine/models/category.model.ts @@ -1,5 +1,5 @@ import { ObjectType } from '@nestjs/graphql'; -import { Entity } from './entity.model'; +import { BaseModel } from './entity.model'; @ObjectType() -export class Category extends Entity {} +export class Category extends BaseModel {} diff --git a/api/src/engine/models/dataset.model.ts b/api/src/engine/models/dataset.model.ts index a15340b0281906705dfc12e32a8af5db4165a27f..74bf78d13631da85366cf288fc22a6ed3f9b919b 100644 --- a/api/src/engine/models/dataset.model.ts +++ b/api/src/engine/models/dataset.model.ts @@ -1,8 +1,8 @@ import { Field, ObjectType } from '@nestjs/graphql'; -import { Entity } from './entity.model'; +import { BaseModel } from './entity.model'; @ObjectType() -export class Dataset extends Entity { +export class Dataset extends BaseModel { @Field({ nullable: true, defaultValue: false }) isLongitudinal?: boolean; } diff --git a/api/src/engine/models/domain.model.ts b/api/src/engine/models/domain.model.ts index 1cfef22fb86343d0c521ada3e1e7c7ebc5e7e001..9fe826291a9f0932a30c6125e73a5f80d3c15981 100644 --- a/api/src/engine/models/domain.model.ts +++ b/api/src/engine/models/domain.model.ts @@ -1,11 +1,11 @@ import { Field, ObjectType } from '@nestjs/graphql'; import { Dataset } from './dataset.model'; -import { Entity } from './entity.model'; +import { BaseModel } from './entity.model'; import { Group } from './group.model'; import { Variable } from './variable.model'; @ObjectType() -export class Domain extends Entity { +export class Domain extends BaseModel { @Field({ nullable: true }) description?: string; diff --git a/api/src/engine/models/entity.model.ts b/api/src/engine/models/entity.model.ts index 32183fd7e970410a1ee3f479cef4d691d56fb7a7..7641f7b186d79b210a505197d039d71b9dccb6f2 100644 --- a/api/src/engine/models/entity.model.ts +++ b/api/src/engine/models/entity.model.ts @@ -2,7 +2,7 @@ import { Field, InputType, ObjectType } from '@nestjs/graphql'; @InputType() @ObjectType() -export class Entity { +export class BaseModel { @Field() id: string; diff --git a/api/src/engine/models/group.model.ts b/api/src/engine/models/group.model.ts index 6a23f1983398f81eeca84731c3d8cfe4b92b599a..11be6a14bd2e671a4363b742f380e6fa54470f1c 100644 --- a/api/src/engine/models/group.model.ts +++ b/api/src/engine/models/group.model.ts @@ -1,8 +1,8 @@ import { Field, ObjectType } from '@nestjs/graphql'; -import { Entity } from './entity.model'; +import { BaseModel } from './entity.model'; @ObjectType() -export class Group extends Entity { +export class Group extends BaseModel { @Field({ nullable: true }) description?: string; diff --git a/api/src/engine/models/variable.model.ts b/api/src/engine/models/variable.model.ts index bd54afed70a025ce6c5673bf0627a657d77926cb..c48a32b127870e08c4fcf48e34d10716e1b1018e 100644 --- a/api/src/engine/models/variable.model.ts +++ b/api/src/engine/models/variable.model.ts @@ -1,10 +1,10 @@ import { Field, ObjectType } from '@nestjs/graphql'; import { Category } from './category.model'; -import { Entity } from './entity.model'; +import { BaseModel } from './entity.model'; import { Group } from './group.model'; @ObjectType() -export class Variable extends Entity { +export class Variable extends BaseModel { @Field({ nullable: true }) type?: string; diff --git a/api/src/main.ts b/api/src/main.ts index e33633323795e658f72a120ce67e44dec64a1e1b..6e6fe7b0003a717eba3198989da8e91eaf85afa2 100644 --- a/api/src/main.ts +++ b/api/src/main.ts @@ -19,6 +19,6 @@ async function bootstrap() { app.use(cookieParser()); - await app.listen(process.env.GATEWAY_PORT); + await app.listen(process.env.GATEWAY_PORT || 8081); } bootstrap(); diff --git a/api/src/main/app.module.ts b/api/src/main/app.module.ts index 1555caaa8bcc0a04abeb20da660200561c83e6d2..56ef2df6fe32a0198a818a8b035418c44e54ad76 100644 --- a/api/src/main/app.module.ts +++ b/api/src/main/app.module.ts @@ -1,11 +1,12 @@ import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; +import { ConfigModule, ConfigService } from '@nestjs/config'; import { GraphQLModule } from '@nestjs/graphql'; import { TypeOrmModule } from '@nestjs/typeorm'; import { GraphQLError } from 'graphql'; import { join } from 'path'; import { AuthModule } from 'src/auth/auth.module'; +import dbConfig from 'src/config/db.config'; import { EngineModule } from 'src/engine/engine.module'; import { FilesModule } from 'src/files/files.module'; import { UsersModule } from 'src/users/users.module'; @@ -17,6 +18,7 @@ import { AppService } from './app.service'; ConfigModule.forRoot({ isGlobal: true, envFilePath: ['.env', '.env.defaults'], + load: [dbConfig], }), GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, @@ -44,15 +46,16 @@ import { AppService } from './app.service'; type: process.env.ENGINE_TYPE, baseurl: process.env.ENGINE_BASE_URL, }), - TypeOrmModule.forRoot({ - type: 'postgres', // type of our database - host: process.env.DB_HOST, // database host - port: parseInt(process.env.DB_PORT), // database host - username: process.env.DB_USERNAME, // username - password: process.env.DB_PASSWORD, // user password - database: process.env.DB_NAME, // name of our database, - autoLoadEntities: true, // models will be loaded automatically - synchronize: process.env.NODE_ENV !== 'production', // your entities will be synced with the database(recommended: disable in prod) + TypeOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: (config: ConfigService) => ({ + ...config.get('database'), + migrations: ['dist/migrations/*{.ts,.js}'], + migrationsRun: process.env.NODE_ENV !== 'dev', + synchronize: process.env.NODE_ENV === 'dev', + loggerLevel: 'debug', + autoLoadEntities: true, + }), }), AuthModule, UsersModule, diff --git a/api/src/migrations/1648306965760-initSetup.ts b/api/src/migrations/1648306965760-initSetup.ts new file mode 100644 index 0000000000000000000000000000000000000000..ec93742f987c89ca11ed9da5a7667adedcdd97ee --- /dev/null +++ b/api/src/migrations/1648306965760-initSetup.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class initSetup1648306965760 implements MigrationInterface { + name = 'initSetup1648306965760'; + + public async up(queryRunner: QueryRunner): Promise<void> { + await queryRunner.query( + `CREATE TABLE "user" ("id" character varying NOT NULL, "agreeNDA" boolean DEFAULT false, CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`, + ); + } + + public async down(queryRunner: QueryRunner): Promise<void> { + await queryRunner.query(`DROP TABLE "user"`); + } +} diff --git a/api/src/users/models/user.model.ts b/api/src/users/models/user.model.ts index fc6305264def3c8452e8fea306b8679378d90dc6..980d7c1af5d7ca2a15cf997e316fd6ca51c29480 100644 --- a/api/src/users/models/user.model.ts +++ b/api/src/users/models/user.model.ts @@ -1,7 +1,7 @@ import { Field, ObjectType } from '@nestjs/graphql'; import { Entity, PrimaryColumn, Column } from 'typeorm'; -@Entity() +@Entity({ name: 'user' }) @ObjectType() export class User { @PrimaryColumn() @@ -17,7 +17,7 @@ export class User { @Field({ nullable: true }) email?: string; - @Column() + @Column({ nullable: true, default: false }) @Field({ nullable: true }) agreeNDA?: boolean; diff --git a/api/src/users/users.service.ts b/api/src/users/users.service.ts index 273abf6de249a4f618f1039d4f00bc6cc29cfcd4..d74ca14ce1d5096305d790d189eb6666b032733b 100644 --- a/api/src/users/users.service.ts +++ b/api/src/users/users.service.ts @@ -33,11 +33,11 @@ export class UsersService { * @returns The updated user. */ async update(id: string, data: UpdateUserInput): Promise<InternalUser> { - const test = { + const updateData = { id, ...data, }; - return await this.userRepository.save(test); + return await this.userRepository.save(updateData); } } diff --git a/api/tsconfig.build.json b/api/tsconfig.build.json index 64f86c6bd2bb30e3d22e752295eb7c7923fc191e..8580c553488175bd3256a4616337e0219afac00c 100644 --- a/api/tsconfig.build.json +++ b/api/tsconfig.build.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] + "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "ormconfig.ts"] }