diff --git a/src/main.ts b/src/main.ts index 41f7564..863d019 100644 --- a/src/main.ts +++ b/src/main.ts @@ -46,6 +46,6 @@ async function bootstrap() { app.setBaseViewsDir(join(__dirname, '..', 'views')); app.setViewEngine('pug'); - await app.listen(3000); + await app.listen(3000, '0.0.0.0'); } bootstrap(); diff --git a/src/modules/config/config.interfaces.ts b/src/modules/config/config.interfaces.ts index 4c3ae27..eeeb209 100644 --- a/src/modules/config/config.interfaces.ts +++ b/src/modules/config/config.interfaces.ts @@ -1,3 +1,5 @@ +import { DataSourceOptions } from 'typeorm'; + export interface SMTPConfiguration { host: string; port: number; @@ -29,4 +31,5 @@ export interface Configuration { app: AppConfiguration; email: EmailConfiguration; jwt: JWTConfiguration; + database: DataSourceOptions; } diff --git a/src/modules/config/config.providers.ts b/src/modules/config/config.providers.ts index d428b97..a7b8555 100644 --- a/src/modules/config/config.providers.ts +++ b/src/modules/config/config.providers.ts @@ -17,6 +17,7 @@ export const configProviders: Provider[] = [ useValue: { app: { base_url: 'http://localhost:3000', + // generate the following with crypto.randomBytes(256 / 8).toString('hex') session_secret: 'change me!', challenge_secret: 'change me!', }, @@ -37,23 +38,37 @@ export const configProviders: Provider[] = [ issuer: 'localhost', expiration: 3600, }, + database: { + type: 'mysql', + host: 'localhost', + port: 3306, + username: 'root', + password: 'root', + database: 'icyauth', + entities: [__dirname + '/../**/*.entity{.ts,.js}'], + synchronize: true, + migrations: ['migration/*.js'], + cli: { + migrationsDir: 'migration', + }, + }, } as Configuration, }, { provide: 'CONFIGURATION', useFactory: async ( - path: string, - def: Configuration, + configPath: string, + defaultConfig: Configuration, ): Promise => { try { - const file = await readFile(path, { encoding: 'utf-8' }); + const file = await readFile(configPath, { encoding: 'utf-8' }); return { - ...def, + ...defaultConfig, ...JSON.parse(JSON.stringify(toml.parse(file))), }; } catch (e: any) { console.error('Failed to load configuration:', e.message); - return def; + return defaultConfig; } }, inject: ['CONFIG_PATH', 'DEFAULT_CONFIG'], diff --git a/src/modules/objects/database/database.providers.ts b/src/modules/objects/database/database.providers.ts index 604a8cd..91c2491 100644 --- a/src/modules/objects/database/database.providers.ts +++ b/src/modules/objects/database/database.providers.ts @@ -1,14 +1,16 @@ -import { Provider } from '@nestjs/common'; +import { FactoryProvider } from '@nestjs/common'; import { ConfigurationService } from 'src/modules/config/config.service'; -import { ConnectionOptions, createConnection } from 'typeorm'; +import { DataSource, DataSourceOptions } from 'typeorm'; -export const databaseProviders: Provider[] = [ +export const databaseProviders: FactoryProvider>[] = [ { - provide: 'DATABASE_CONNECTION', + provide: 'DATA_SOURCE', useFactory: async (config: ConfigurationService) => { - return await createConnection({ - ...config.get('database'), + const dataSource = new DataSource({ + ...config.get('database'), }); + + return dataSource.initialize(); }, inject: [ConfigurationService], }, diff --git a/src/modules/objects/document/document.providers.ts b/src/modules/objects/document/document.providers.ts index 0b2c027..3cc8872 100644 --- a/src/modules/objects/document/document.providers.ts +++ b/src/modules/objects/document/document.providers.ts @@ -1,6 +1,6 @@ import { Provider } from '@nestjs/common'; import { join } from 'path'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { Document } from './document.entity'; @@ -11,7 +11,7 @@ export const documentProviders: Provider[] = [ }, { provide: 'DOCUMENT_REPOSITORY', - useFactory: (connection: Connection) => connection.getRepository(Document), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => dataSource.getRepository(Document), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/oauth2-client/oauth2-client.providers.ts b/src/modules/objects/oauth2-client/oauth2-client.providers.ts index b290483..dae4a08 100644 --- a/src/modules/objects/oauth2-client/oauth2-client.providers.ts +++ b/src/modules/objects/oauth2-client/oauth2-client.providers.ts @@ -1,5 +1,5 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { OAuth2ClientAuthorization } from './oauth2-client-authorization.entity'; import { OAuth2ClientURL } from './oauth2-client-url.entity'; import { OAuth2Client } from './oauth2-client.entity'; @@ -7,20 +7,20 @@ import { OAuth2Client } from './oauth2-client.entity'; export const clientProviders: Provider[] = [ { provide: 'CLIENT_REPOSITORY', - useFactory: (connection: Connection) => - connection.getRepository(OAuth2Client), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => + dataSource.getRepository(OAuth2Client), + inject: ['DATA_SOURCE'], }, { provide: 'CLIENT_URL_REPOSITORY', - useFactory: (connection: Connection) => - connection.getRepository(OAuth2ClientURL), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => + dataSource.getRepository(OAuth2ClientURL), + inject: ['DATA_SOURCE'], }, { provide: 'CLIENT_AUTHORIZATION_REPOSITORY', - useFactory: (connection: Connection) => - connection.getRepository(OAuth2ClientAuthorization), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => + dataSource.getRepository(OAuth2ClientAuthorization), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/oauth2-token/oauth2-token.providers.ts b/src/modules/objects/oauth2-token/oauth2-token.providers.ts index e785741..5ca44df 100644 --- a/src/modules/objects/oauth2-token/oauth2-token.providers.ts +++ b/src/modules/objects/oauth2-token/oauth2-token.providers.ts @@ -1,12 +1,12 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { OAuth2Token } from './oauth2-token.entity'; export const tokenProviders: Provider[] = [ { provide: 'TOKEN_REPOSITORY', - useFactory: (connection: Connection) => - connection.getRepository(OAuth2Token), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => + dataSource.getRepository(OAuth2Token), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/privilege/privilege.providers.ts b/src/modules/objects/privilege/privilege.providers.ts index d50f36d..c1a5394 100644 --- a/src/modules/objects/privilege/privilege.providers.ts +++ b/src/modules/objects/privilege/privilege.providers.ts @@ -1,11 +1,11 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { Privilege } from './privilege.entity'; export const privilegeProviders: Provider[] = [ { provide: 'PRIVILEGE_REPOSITORY', - useFactory: (connection: Connection) => connection.getRepository(Privilege), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => dataSource.getRepository(Privilege), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/upload/upload.providers.ts b/src/modules/objects/upload/upload.providers.ts index 9fa9027..0f690a0 100644 --- a/src/modules/objects/upload/upload.providers.ts +++ b/src/modules/objects/upload/upload.providers.ts @@ -1,11 +1,11 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { Upload } from './upload.entity'; export const uploadProviders: Provider[] = [ { provide: 'UPLOAD_REPOSITORY', - useFactory: (connection: Connection) => connection.getRepository(Upload), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => dataSource.getRepository(Upload), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/user-token/user-token.providers.ts b/src/modules/objects/user-token/user-token.providers.ts index 6160856..78ac427 100644 --- a/src/modules/objects/user-token/user-token.providers.ts +++ b/src/modules/objects/user-token/user-token.providers.ts @@ -1,11 +1,11 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { UserToken } from './user-token.entity'; export const userTokenProviders: Provider[] = [ { provide: 'USER_TOKEN_REPOSITORY', - useFactory: (connection: Connection) => connection.getRepository(UserToken), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => dataSource.getRepository(UserToken), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/objects/user/user.providers.ts b/src/modules/objects/user/user.providers.ts index 7f384ae..f9abafe 100644 --- a/src/modules/objects/user/user.providers.ts +++ b/src/modules/objects/user/user.providers.ts @@ -1,11 +1,11 @@ import { Provider } from '@nestjs/common'; -import { Connection } from 'typeorm'; +import { DataSource } from 'typeorm'; import { User } from './user.entity'; export const userProviders: Provider[] = [ { provide: 'USER_REPOSITORY', - useFactory: (connection: Connection) => connection.getRepository(User), - inject: ['DATABASE_CONNECTION'], + useFactory: (dataSource: DataSource) => dataSource.getRepository(User), + inject: ['DATA_SOURCE'], }, ]; diff --git a/src/modules/utility/services/form-utility.service.ts b/src/modules/utility/services/form-utility.service.ts index 9adc18a..f4c512b 100644 --- a/src/modules/utility/services/form-utility.service.ts +++ b/src/modules/utility/services/form-utility.service.ts @@ -8,6 +8,11 @@ export class FormUtilityService { public passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\w\W]{8,}$/; public usernameRegex = /^[a-zA-Z0-9_\-.]{3,26}$/; + /** + * Merge array of objects into single object + * @param flash Array of objects + * @returns Merged object + */ public mergeObjectArray(flash: Record[]): Record { return flash.reduce>( (obj, item) => ({ ...obj, ...item }), @@ -15,6 +20,12 @@ export class FormUtilityService { ); } + /** + * Trim values of specified keys of an object + * @param entry Object + * @param fields Fields to strip spaces from + * @returns Object with trimmed values + */ public trimmed(entry: T, fields: string[]): T { return fields.reduce( (object, key) => ({ ...object, [key]: object[key]?.trim() }),