Add proof of concept config system

Signed-off-by: David Mehren <git@herrmehren.de>
Co-authored-by: Yannick Bungers <git@innay.de>
This commit is contained in:
David Mehren 2020-10-30 22:35:12 +01:00
parent 2516f8a1b5
commit c55f7060be
No known key found for this signature in database
GPG key ID: 185982BA4C42B7C3
4 changed files with 140 additions and 1 deletions

View file

@ -5,6 +5,7 @@
*/
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PublicApiModule } from './api/public/public-api.module';
import { AuthorsModule } from './authors/authors.module';
@ -17,6 +18,7 @@ import { NotesModule } from './notes/notes.module';
import { PermissionsModule } from './permissions/permissions.module';
import { RevisionsModule } from './revisions/revisions.module';
import { UsersModule } from './users/users.module';
import appConfig from './config/app.config';
@Module({
imports: [
@ -26,6 +28,9 @@ import { UsersModule } from './users/users.module';
autoLoadEntities: true,
synchronize: true,
}),
ConfigModule.forRoot({
load: [appConfig],
}),
NotesModule,
UsersModule,
RevisionsModule,

60
src/config/app.config.ts Normal file
View file

@ -0,0 +1,60 @@
/*
* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { registerAs } from '@nestjs/config';
import * as Joi from 'joi';
export interface AppConfig {
port: number;
media: {
backend: {
use: string;
filesystem: {
uploadPath: string;
};
};
};
}
const schema = Joi.object({
port: Joi.number(),
media: {
backend: {
use: Joi.string().valid('filesystem'),
filesystem: {
uploadPath: Joi.when('...use', {
is: Joi.valid('filesystem'),
then: Joi.string(),
otherwise: Joi.optional(),
}),
},
},
},
});
export default registerAs('appConfig', async () => {
const appConfig = schema.validate(
{
port: parseInt(process.env.PORT) || undefined,
media: {
backend: {
use: process.env.HD_MEDIA_BACKEND,
filesystem: {
uploadPath: process.env.HD_MEDIA_BACKEND_FILESYSTEM_UPLOAD_PATH,
},
},
},
},
{
abortEarly: false,
presence: 'required',
},
);
if (appConfig.error) {
throw new Error(appConfig.error.toString());
}
return appConfig.value;
});