feat(backend): Databank initialiseren
Verbinding met databank aangemaakt, eerste entities toegevoegd, centrale API aangemaakt om omgevingsvariabelen voor onze app op te vragen.
This commit is contained in:
		
							parent
							
								
									c07bb959cf
								
							
						
					
					
						commit
						62a278a6e0
					
				
					 8 changed files with 86 additions and 10 deletions
				
			
		
							
								
								
									
										6
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -43,6 +43,9 @@ build/Release | ||||||
| node_modules/ | node_modules/ | ||||||
| jspm_packages/ | jspm_packages/ | ||||||
| 
 | 
 | ||||||
|  | # package-lock.json | ||||||
|  | backend/package-lock.json | ||||||
|  | 
 | ||||||
| # Snowpack dependency directory (https://snowpack.dev/) | # Snowpack dependency directory (https://snowpack.dev/) | ||||||
| web_modules/ | web_modules/ | ||||||
| 
 | 
 | ||||||
|  | @ -641,7 +644,8 @@ FodyWeavers.xsd | ||||||
| .LSOverride | .LSOverride | ||||||
| 
 | 
 | ||||||
| # Icon must end with two \r | # Icon must end with two \r | ||||||
| Icon | Icon | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # Thumbnails | # Thumbnails | ||||||
| ._* | ._* | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								backend/src/entities/users/student.entity.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								backend/src/entities/users/student.entity.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | import {User} from "./user.entity"; | ||||||
|  | import { Entity } from '@mikro-orm/core'; | ||||||
|  | 
 | ||||||
|  | @Entity() | ||||||
|  | export class Student extends User { | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								backend/src/entities/users/teacher.entity.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/src/entities/users/teacher.entity.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | import { Entity } from '@mikro-orm/core'; | ||||||
|  | import {User} from "./user.entity"; | ||||||
|  | 
 | ||||||
|  | @Entity() | ||||||
|  | export class Teacher extends User { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| import { Entity, PrimaryKey, Property } from '@mikro-orm/core'; | import { Entity, PrimaryKey, Property } from '@mikro-orm/core'; | ||||||
| 
 | 
 | ||||||
| @Entity() | @Entity({abstract: true}) | ||||||
| export class User { | export class User { | ||||||
|     @PrimaryKey({ type: 'number' }) |     @PrimaryKey({type: "string"}) | ||||||
|     id!: number; |     username!: string; | ||||||
| 
 | 
 | ||||||
|     @Property() |     @Property() | ||||||
|     firstName: string = ''; |     firstName: string = ''; | ||||||
|  | @ -1,9 +1,14 @@ | ||||||
| import { Options } from '@mikro-orm/core'; | import {Options} from '@mikro-orm/core'; | ||||||
| import { PostgreSqlDriver } from '@mikro-orm/postgresql'; | import {PostgreSqlDriver} from "@mikro-orm/postgresql"; | ||||||
|  | import {EnvVars, getEnvVar, getNumericEnvVar} from "./util/envvars"; | ||||||
| 
 | 
 | ||||||
| const config: Options = { | const config: Options = { | ||||||
|     driver: PostgreSqlDriver, |     driver: PostgreSqlDriver, | ||||||
|     dbName: 'dwengo', |     host: getEnvVar(EnvVars.DbHost, {required: true}), | ||||||
|  |     port: getNumericEnvVar(EnvVars.DbPort, {defaultValue: 5432}), | ||||||
|  |     dbName: getEnvVar(EnvVars.DbName, {defaultValue: "dwengo"}), | ||||||
|  |     user: getEnvVar(EnvVars.DbUsername, {required: true}), | ||||||
|  |     password: getEnvVar(EnvVars.DbPassword, {required: true}), | ||||||
|     entities: ['dist/**/*.entity.js'], |     entities: ['dist/**/*.entity.js'], | ||||||
|     entitiesTs: ['src/**/*.entity.ts'], |     entitiesTs: ['src/**/*.entity.ts'], | ||||||
|     debug: true, |     debug: true, | ||||||
|  |  | ||||||
|  | @ -1,6 +1,19 @@ | ||||||
| import { MikroORM } from '@mikro-orm/core'; | import { MikroORM } from '@mikro-orm/core'; | ||||||
| import config from './mikro-orm.config.js'; | import config from './mikro-orm.config.js'; | ||||||
|  | import {EnvVars, getEnvVar} from "./util/envvars"; | ||||||
| 
 | 
 | ||||||
| export default async function initORM() { | export default async function initORM() { | ||||||
|     await MikroORM.init(config); |     const orm = await MikroORM.init(config); | ||||||
|  | 
 | ||||||
|  |     // Update the database scheme if necessary and enabled.
 | ||||||
|  |     if (getEnvVar(EnvVars.DbUpdate)) { | ||||||
|  |         await orm.schema.updateSchema(); | ||||||
|  |     } else { | ||||||
|  |         const diff = await orm.schema.getUpdateSchemaSQL(); | ||||||
|  |         if (diff) { | ||||||
|  |             throw Error("The database structure needs to be updated in order to fit the new database structure " + | ||||||
|  |                 "of the app. In order to do so automatically, set the environment variable DWENGO_DB_UPDATE to true. " + | ||||||
|  |                 "The following queries will then be executed:\n" + diff) | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								backend/src/util/envvars.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								backend/src/util/envvars.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | const PREFIX = "DWENGO_"; | ||||||
|  | const DB_PREFIX = PREFIX + "DB_"; | ||||||
|  | 
 | ||||||
|  | type EnvVar = {[key: string]: {name: string, required?: boolean, defaultValue?: boolean}}; | ||||||
|  | 
 | ||||||
|  | export const EnvVars: EnvVar = { | ||||||
|  |     DbHost: {key: DB_PREFIX + "HOST", required: true}, | ||||||
|  |     DbPort: {key: DB_PREFIX + "PORT", defaultValue: 5432}, | ||||||
|  |     DbName: {key: DB_PREFIX + "NAME", defaultValue: "dwengo"}, | ||||||
|  |     DbUsername: {key: DB_PREFIX + "USERNAME", required: true}, | ||||||
|  |     DbPassword: {key: DB_PREFIX + "PASSWORD", required: true}, | ||||||
|  |     DbUpdate: {key: DB_PREFIX + "UPDATE", defaultValue: false}, | ||||||
|  | } as const; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Returns the value of the given environment variable if it is set. | ||||||
|  |  * Otherwise, | ||||||
|  |  * - throw an error if the environment variable was required, | ||||||
|  |  * - return the default value if there is one and it was not required, | ||||||
|  |  * - return an empty string if the environment variable is not required and there is also no default. | ||||||
|  |  * @param envVar The properties of the environment variable (from the EnvVar object). | ||||||
|  |  */ | ||||||
|  | export function getEnvVar(envVar: EnvVar): string { | ||||||
|  |     const value: string | undefined = process.env[envVar.key]; | ||||||
|  |     if (value) { | ||||||
|  |         return value; | ||||||
|  |     } else if (envVar.required) { | ||||||
|  |         throw new Error(`Missing environment variable: ${envVar.key}`); | ||||||
|  |     } else { | ||||||
|  |         return envVar.defaultValue || ""; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function getNumericEnvVar(envVar: EnvVar): number { | ||||||
|  |     const valueString = getEnvVar(envVar); | ||||||
|  |     const value = parseInt(valueString); | ||||||
|  |     if (isNaN(value)) { | ||||||
|  |         throw new Error(`Invalid value for environment variable ${envVar.key}: ${valueString}. Expected a number.`) | ||||||
|  |     } else { | ||||||
|  |         return value; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -6,8 +6,7 @@ services: | ||||||
|       POSTGRES_PASSWORD: postgres |       POSTGRES_PASSWORD: postgres | ||||||
|       POSTGRES_DB: postgres |       POSTGRES_DB: postgres | ||||||
|     ports: |     ports: | ||||||
|       - "5432:5432" |       - "5431:5432" | ||||||
|     network_mode: "host" |  | ||||||
|     volumes: |     volumes: | ||||||
|         - postgres_data:/var/lib/postgresql/data |         - postgres_data:/var/lib/postgresql/data | ||||||
|         - ./backend/config/db/init.sql:/docker-entrypoint-initdb.d/init.sql |         - ./backend/config/db/init.sql:/docker-entrypoint-initdb.d/init.sql | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 Gerald Schmittinger
						Gerald Schmittinger