From 32dff04e8466c7049064fb266feada66899c3649 Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Mon, 18 Apr 2022 14:34:53 +0200 Subject: [PATCH] refactor backend names --- backend/src/app.module.ts | 8 +- .../image-db.module.ts} | 2 +- .../image-db.service.ts} | 0 .../preference-common.service.ts} | 0 .../preference-db.module.ts} | 14 +- .../preference-defaults.service.ts} | 2 +- .../sys-preference-db.service.ts} | 12 +- .../usr-preference-db.service.ts} | 12 +- .../role-db.module.ts} | 6 +- .../role-db.service.ts} | 4 +- .../user-db.module.ts} | 8 +- .../user-db.service.ts} | 10 +- .../src/collections/userdb/user-db.service.ts | 254 ++++++++++++++++++ ...onfig.module.ts => early-config.module.ts} | 6 +- ...service.ts => early-jwt.config.service.ts} | 0 ...vice.ts => serve-static.config.service.ts} | 0 ....service.ts => type-orm.config.service.ts} | 0 backend/src/config/late/jwt.config.service.ts | 2 +- ...config.module.ts => late-config.module.ts} | 8 +- backend/src/decorators/decorators.module.ts | 14 +- .../decorators/image-id/image-id.decorator.ts | 10 + .../image-id/image-id.pipe.ts} | 2 +- .../inject-request.decorator.ts} | 0 .../{ => multipart}/multipart.decorator.ts | 2 +- .../{ => multipart}/multipart.pipe.ts | 4 +- .../{ => multipart}/postfile.pipe.ts | 2 +- .../src/decorators/permissions.decorator.ts | 4 +- .../src/decorators/request-user.decorator.ts | 2 +- .../exception.filter.ts} | 0 backend/src/logger/logger.module.ts | 2 +- backend/src/main.ts | 4 +- backend/src/managers/auth/auth.module.ts | 8 +- ...localauth.guard.ts => local-auth.guard.ts} | 0 ...uth.strategy.ts => local-auth.strategy.ts} | 2 +- .../src/managers/auth/guards/main.guard.ts | 4 +- backend/src/managers/auth/guest.service.ts | 2 +- .../{demomanager.module.ts => demo.module.ts} | 8 +- ...demomanager.service.ts => demo.service.ts} | 6 +- .../image-processor.service.ts} | 2 +- backend/src/managers/image/image.module.ts | 12 + .../image.service.ts} | 4 +- .../imagemanager/imagemanager.module.ts | 12 - .../permissions.const.ts} | 0 .../roles.dto.ts => constants/roles.const.ts} | 2 +- .../special-users.const.ts} | 0 .../syspreferences.const.ts} | 0 .../usrpreferences.const.ts} | 0 .../image-upload.dto.ts} | 0 .../models/{requests => dto}/multipart.dto.ts | 0 backend/src/models/entities/index.ts | 4 +- backend/src/models/entities/role.entity.ts | 2 +- ...nce.entity.ts => sys-preference.entity.ts} | 0 ...nce.entity.ts => usr-preference.entity.ts} | 0 .../authrequest.dto.ts | 0 .../{FallBackMutex.ts => mutex-fallback.ts} | 6 +- .../validators/permissions.validator.ts | 2 +- .../api/experiment/experiment.controller.ts | 10 +- .../api/experiment/experiment.module.ts | 2 +- .../src/routes/api/info/info.controller.ts | 2 +- backend/src/routes/api/info/info.module.ts | 2 +- backend/src/routes/api/pref/pref.module.ts | 6 +- ...f.controller.ts => sys-pref.controller.ts} | 4 +- ...f.controller.ts => usr-pref.controller.ts} | 4 +- .../src/routes/api/roles/roles.controller.ts | 8 +- backend/src/routes/api/roles/roles.module.ts | 4 +- ...ontroller.ts => user-manage.controller.ts} | 6 +- .../src/routes/api/user/user.controller.ts | 4 +- backend/src/routes/api/user/user.module.ts | 2 +- ...oute.controller.ts => image.controller.ts} | 20 +- .../{imageroute.module.ts => image.module.ts} | 6 +- backend/src/routes/routes.module.ts | 2 +- 71 files changed, 404 insertions(+), 148 deletions(-) rename backend/src/collections/{imagedb/imagedb.module.ts => image-db/image-db.module.ts} (85%) rename backend/src/collections/{imagedb/imagedb.service.ts => image-db/image-db.service.ts} (100%) rename backend/src/collections/{preferencesdb/preferencecommon.service.ts => preference-db/preference-common.service.ts} (100%) rename backend/src/collections/{preferencesdb/preferencedb.module.ts => preference-db/preference-db.module.ts} (58%) rename backend/src/collections/{preferencesdb/preferencedefaults.service.ts => preference-db/preference-defaults.service.ts} (94%) rename backend/src/collections/{preferencesdb/syspreferencedb.service.ts => preference-db/sys-preference-db.service.ts} (92%) rename backend/src/collections/{preferencesdb/usrpreferencedb.service.ts => preference-db/usr-preference-db.service.ts} (93%) rename backend/src/collections/{roledb/roledb.module.ts => role-db/role-db.module.ts} (93%) rename backend/src/collections/{roledb/roledb.service.ts => role-db/role-db.service.ts} (97%) rename backend/src/collections/{userdb/userdb.module.ts => user-db/user-db.module.ts} (87%) rename backend/src/collections/{userdb/userdb.service.ts => user-db/user-db.service.ts} (95%) create mode 100644 backend/src/collections/userdb/user-db.service.ts rename backend/src/config/early/{earlyconfig.module.ts => early-config.module.ts} (79%) rename backend/src/config/early/{earlyjwt.config.service.ts => early-jwt.config.service.ts} (100%) rename backend/src/config/early/{servestatic.config.service.ts => serve-static.config.service.ts} (100%) rename backend/src/config/early/{typeorm.config.service.ts => type-orm.config.service.ts} (100%) rename backend/src/config/late/{lateconfig.module.ts => late-config.module.ts} (84%) create mode 100644 backend/src/decorators/image-id/image-id.decorator.ts rename backend/src/{routes/image/imageid.validator.ts => decorators/image-id/image-id.pipe.ts} (83%) rename backend/src/decorators/{injectrequest.decorator.ts => multipart/inject-request.decorator.ts} (100%) rename backend/src/decorators/{ => multipart}/multipart.decorator.ts (78%) rename backend/src/decorators/{ => multipart}/multipart.pipe.ts (94%) rename backend/src/decorators/{ => multipart}/postfile.pipe.ts (93%) rename backend/src/layers/{httpexception/httpexception.filter.ts => exception/exception.filter.ts} (100%) rename backend/src/managers/auth/guards/{localauth.guard.ts => local-auth.guard.ts} (100%) rename backend/src/managers/auth/guards/{localauth.strategy.ts => local-auth.strategy.ts} (92%) rename backend/src/managers/demo/{demomanager.module.ts => demo.module.ts} (79%) rename backend/src/managers/demo/{demomanager.service.ts => demo.service.ts} (77%) rename backend/src/managers/{imagemanager/imageprocessor.service.ts => image/image-processor.service.ts} (98%) create mode 100644 backend/src/managers/image/image.module.ts rename backend/src/managers/{imagemanager/imagemanager.service.ts => image/image.service.ts} (93%) delete mode 100644 backend/src/managers/imagemanager/imagemanager.module.ts rename backend/src/models/{dto/permissions.dto.ts => constants/permissions.const.ts} (100%) rename backend/src/models/{dto/roles.dto.ts => constants/roles.const.ts} (98%) rename backend/src/models/{dto/specialusers.dto.ts => constants/special-users.const.ts} (100%) rename backend/src/models/{dto/syspreferences.dto.ts => constants/syspreferences.const.ts} (100%) rename backend/src/models/{dto/usrpreferences.dto.ts => constants/usrpreferences.const.ts} (100%) rename backend/src/models/{requests/imageroute.dto.ts => dto/image-upload.dto.ts} (100%) rename backend/src/models/{requests => dto}/multipart.dto.ts (100%) rename backend/src/models/entities/{syspreference.entity.ts => sys-preference.entity.ts} (100%) rename backend/src/models/entities/{usrpreference.entity.ts => usr-preference.entity.ts} (100%) rename backend/src/models/{requests => interfaces}/authrequest.dto.ts (100%) rename backend/src/models/util/{FallBackMutex.ts => mutex-fallback.ts} (89%) rename backend/src/routes/api/pref/{syspref.controller.ts => sys-pref.controller.ts} (94%) rename backend/src/routes/api/pref/{usrpref.controller.ts => usr-pref.controller.ts} (95%) rename backend/src/routes/api/user/{usermanage.controller.ts => user-manage.controller.ts} (95%) rename backend/src/routes/image/{imageroute.controller.ts => image.controller.ts} (82%) rename backend/src/routes/image/{imageroute.module.ts => image.module.ts} (67%) diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 65790aa..b70a24d 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common'; import { ServeStaticModule } from '@nestjs/serve-static'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { EarlyConfigModule } from './config/early/earlyconfig.module'; -import { ServeStaticConfigService } from './config/early/servestatic.config.service'; -import { TypeOrmConfigService } from './config/early/typeorm.config.service'; +import { EarlyConfigModule } from './config/early/early-config.module'; +import { ServeStaticConfigService } from './config/early/serve-static.config.service'; +import { TypeOrmConfigService } from './config/early/type-orm.config.service'; import { PicsurLoggerModule } from './logger/logger.module'; import { AuthManagerModule } from './managers/auth/auth.module'; -import { DemoManagerModule } from './managers/demo/demomanager.module'; +import { DemoManagerModule } from './managers/demo/demo.module'; import { PicsurRoutesModule } from './routes/routes.module'; @Module({ diff --git a/backend/src/collections/imagedb/imagedb.module.ts b/backend/src/collections/image-db/image-db.module.ts similarity index 85% rename from backend/src/collections/imagedb/imagedb.module.ts rename to backend/src/collections/image-db/image-db.module.ts index 5ac5eac..0e2ee71 100644 --- a/backend/src/collections/imagedb/imagedb.module.ts +++ b/backend/src/collections/image-db/image-db.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EImageBackend } from '../../models/entities/image.entity'; -import { ImageDBService } from './imagedb.service'; +import { ImageDBService } from './image-db.service'; @Module({ imports: [TypeOrmModule.forFeature([EImageBackend])], diff --git a/backend/src/collections/imagedb/imagedb.service.ts b/backend/src/collections/image-db/image-db.service.ts similarity index 100% rename from backend/src/collections/imagedb/imagedb.service.ts rename to backend/src/collections/image-db/image-db.service.ts diff --git a/backend/src/collections/preferencesdb/preferencecommon.service.ts b/backend/src/collections/preference-db/preference-common.service.ts similarity index 100% rename from backend/src/collections/preferencesdb/preferencecommon.service.ts rename to backend/src/collections/preference-db/preference-common.service.ts diff --git a/backend/src/collections/preferencesdb/preferencedb.module.ts b/backend/src/collections/preference-db/preference-db.module.ts similarity index 58% rename from backend/src/collections/preferencesdb/preferencedb.module.ts rename to backend/src/collections/preference-db/preference-db.module.ts index 719bc48..56cae62 100644 --- a/backend/src/collections/preferencesdb/preferencedb.module.ts +++ b/backend/src/collections/preference-db/preference-db.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { EarlyConfigModule } from '../../config/early/earlyconfig.module'; -import { ESysPreferenceBackend } from '../../models/entities/syspreference.entity'; -import { EUsrPreferenceBackend } from '../../models/entities/usrpreference.entity'; -import { PreferenceCommonService } from './preferencecommon.service'; -import { PreferenceDefaultsService } from './preferencedefaults.service'; -import { SysPreferenceService } from './syspreferencedb.service'; -import { UsrPreferenceService } from './usrpreferencedb.service'; +import { EarlyConfigModule } from '../../config/early/early-config.module'; +import { ESysPreferenceBackend } from '../../models/entities/sys-preference.entity'; +import { EUsrPreferenceBackend } from '../../models/entities/usr-preference.entity'; +import { PreferenceCommonService } from './preference-common.service'; +import { PreferenceDefaultsService } from './preference-defaults.service'; +import { SysPreferenceService } from './sys-preference-db.service'; +import { UsrPreferenceService } from './usr-preference-db.service'; @Module({ imports: [ diff --git a/backend/src/collections/preferencesdb/preferencedefaults.service.ts b/backend/src/collections/preference-db/preference-defaults.service.ts similarity index 94% rename from backend/src/collections/preferencesdb/preferencedefaults.service.ts rename to backend/src/collections/preference-db/preference-defaults.service.ts index 37d52b8..93ead74 100644 --- a/backend/src/collections/preferencesdb/preferencedefaults.service.ts +++ b/backend/src/collections/preference-db/preference-defaults.service.ts @@ -3,7 +3,7 @@ import { PrefValueType } from 'picsur-shared/dist/dto/preferences.dto'; import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.dto'; import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.dto'; import { generateRandomString } from 'picsur-shared/dist/util/random'; -import { EarlyJwtConfigService } from '../../config/early/earlyjwt.config.service'; +import { EarlyJwtConfigService } from '../../config/early/early-jwt.config.service'; // This specific service is used to store default values for system preferences // It needs to be in a service because the values depend on the environment diff --git a/backend/src/collections/preferencesdb/syspreferencedb.service.ts b/backend/src/collections/preference-db/sys-preference-db.service.ts similarity index 92% rename from backend/src/collections/preferencesdb/syspreferencedb.service.ts rename to backend/src/collections/preference-db/sys-preference-db.service.ts index 91605cc..b9743fd 100644 --- a/backend/src/collections/preferencesdb/syspreferencedb.service.ts +++ b/backend/src/collections/preference-db/sys-preference-db.service.ts @@ -11,14 +11,14 @@ import { Repository } from 'typeorm'; import { SysPreferenceList, SysPreferenceValueTypes -} from '../../models/dto/syspreferences.dto'; +} from '../../models/constants/syspreferences.const'; import { ESysPreferenceBackend, ESysPreferenceSchema -} from '../../models/entities/syspreference.entity'; -import { FallBackMutex } from '../../models/util/FallBackMutex'; -import { PreferenceCommonService } from './preferencecommon.service'; -import { PreferenceDefaultsService } from './preferencedefaults.service'; +} from '../../models/entities/sys-preference.entity'; +import { MutexFallBack } from '../../models/util/mutex-fallback'; +import { PreferenceCommonService } from './preference-common.service'; +import { PreferenceDefaultsService } from './preference-defaults.service'; @Injectable() export class SysPreferenceService { @@ -66,7 +66,7 @@ export class SysPreferenceService { let foundSysPreference: ESysPreferenceBackend; try { - foundSysPreference = await FallBackMutex( + foundSysPreference = await MutexFallBack( 'fetchSysPrefrence', () => this.sysPreferenceRepository.findOne({ diff --git a/backend/src/collections/preferencesdb/usrpreferencedb.service.ts b/backend/src/collections/preference-db/usr-preference-db.service.ts similarity index 93% rename from backend/src/collections/preferencesdb/usrpreferencedb.service.ts rename to backend/src/collections/preference-db/usr-preference-db.service.ts index 5e5f21b..0f7d11c 100644 --- a/backend/src/collections/preferencesdb/usrpreferencedb.service.ts +++ b/backend/src/collections/preference-db/usr-preference-db.service.ts @@ -11,14 +11,14 @@ import { Repository } from 'typeorm'; import { UsrPreferenceList, UsrPreferenceValueTypes -} from '../../models/dto/usrpreferences.dto'; +} from '../../models/constants/usrpreferences.const'; import { EUsrPreferenceBackend, EUsrPreferenceSchema -} from '../../models/entities/usrpreference.entity'; -import { FallBackMutex } from '../../models/util/FallBackMutex'; -import { PreferenceCommonService } from './preferencecommon.service'; -import { PreferenceDefaultsService } from './preferencedefaults.service'; +} from '../../models/entities/usr-preference.entity'; +import { MutexFallBack } from '../../models/util/mutex-fallback'; +import { PreferenceCommonService } from './preference-common.service'; +import { PreferenceDefaultsService } from './preference-defaults.service'; @Injectable() export class UsrPreferenceService { @@ -71,7 +71,7 @@ export class UsrPreferenceService { let foundUsrPreference: EUsrPreferenceBackend; try { - foundUsrPreference = await FallBackMutex( + foundUsrPreference = await MutexFallBack( 'fetchUsrPrefrence', () => this.usrPreferenceRepository.findOne({ diff --git a/backend/src/collections/roledb/roledb.module.ts b/backend/src/collections/role-db/role-db.module.ts similarity index 93% rename from backend/src/collections/roledb/roledb.module.ts rename to backend/src/collections/role-db/role-db.module.ts index 52a254c..c6c903f 100644 --- a/backend/src/collections/roledb/roledb.module.ts +++ b/backend/src/collections/role-db/role-db.module.ts @@ -1,11 +1,11 @@ import { Logger, Module, OnModuleInit } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { HasFailed } from 'picsur-shared/dist/types'; -import { EarlyConfigModule } from '../../config/early/earlyconfig.module'; +import { EarlyConfigModule } from '../../config/early/early-config.module'; import { HostConfigService } from '../../config/early/host.config.service'; -import { ImmutableRolesList, SystemRoleDefaults, UndeletableRolesList } from '../../models/dto/roles.dto'; +import { ImmutableRolesList, SystemRoleDefaults, UndeletableRolesList } from '../../models/constants/roles.const'; import { ERoleBackend } from '../../models/entities/role.entity'; -import { RolesService } from './roledb.service'; +import { RolesService } from './role-db.service'; @Module({ imports: [EarlyConfigModule, TypeOrmModule.forFeature([ERoleBackend])], diff --git a/backend/src/collections/roledb/roledb.service.ts b/backend/src/collections/role-db/role-db.service.ts similarity index 97% rename from backend/src/collections/roledb/roledb.service.ts rename to backend/src/collections/role-db/role-db.service.ts index 8a07832..90593bb 100644 --- a/backend/src/collections/roledb/roledb.service.ts +++ b/backend/src/collections/role-db/role-db.service.ts @@ -9,11 +9,11 @@ import { } from 'picsur-shared/dist/types'; import { makeUnique } from 'picsur-shared/dist/util/unique'; import { In, Repository } from 'typeorm'; -import { Permissions } from '../../models/dto/permissions.dto'; +import { Permissions } from '../../models/constants/permissions.const'; import { ImmutableRolesList, UndeletableRolesList -} from '../../models/dto/roles.dto'; +} from '../../models/constants/roles.const'; import { ERoleBackend } from '../../models/entities/role.entity'; @Injectable() diff --git a/backend/src/collections/userdb/userdb.module.ts b/backend/src/collections/user-db/user-db.module.ts similarity index 87% rename from backend/src/collections/userdb/userdb.module.ts rename to backend/src/collections/user-db/user-db.module.ts index db08a91..715d980 100644 --- a/backend/src/collections/userdb/userdb.module.ts +++ b/backend/src/collections/user-db/user-db.module.ts @@ -3,11 +3,11 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { HasFailed } from 'picsur-shared/dist/types'; import { generateRandomString } from 'picsur-shared/dist/util/random'; import { AuthConfigService } from '../../config/early/auth.config.service'; -import { EarlyConfigModule } from '../../config/early/earlyconfig.module'; +import { EarlyConfigModule } from '../../config/early/early-config.module'; import { EUserBackend } from '../../models/entities/user.entity'; -import { PreferenceModule } from '../preferencesdb/preferencedb.module'; -import { RolesModule } from '../roledb/roledb.module'; -import { UsersService } from './userdb.service'; +import { PreferenceModule } from '../preference-db/preference-db.module'; +import { RolesModule } from '../role-db/role-db.module'; +import { UsersService } from './user-db.service'; @Module({ imports: [ diff --git a/backend/src/collections/userdb/userdb.service.ts b/backend/src/collections/user-db/user-db.service.ts similarity index 95% rename from backend/src/collections/userdb/userdb.service.ts rename to backend/src/collections/user-db/user-db.service.ts index 915f59b..787bc45 100644 --- a/backend/src/collections/userdb/userdb.service.ts +++ b/backend/src/collections/user-db/user-db.service.ts @@ -10,20 +10,20 @@ import { } from 'picsur-shared/dist/types'; import { makeUnique } from 'picsur-shared/dist/util/unique'; import { Repository } from 'typeorm'; -import { Permissions } from '../../models/dto/permissions.dto'; +import { Permissions } from '../../models/constants/permissions.const'; import { DefaultRolesList, SoulBoundRolesList -} from '../../models/dto/roles.dto'; +} from '../../models/constants/roles.const'; import { ImmutableUsersList, LockedLoginUsersList, UndeletableUsersList -} from '../../models/dto/specialusers.dto'; +} from '../../models/constants/special-users.const'; import { EUserBackend } from '../../models/entities/user.entity'; import { GetCols } from '../../models/util/collection'; -import { SysPreferenceService } from '../preferencesdb/syspreferencedb.service'; -import { RolesService } from '../roledb/roledb.service'; +import { SysPreferenceService } from '../preference-db/sys-preference-db.service'; +import { RolesService } from '../role-db/role-db.service'; @Injectable() export class UsersService { diff --git a/backend/src/collections/userdb/user-db.service.ts b/backend/src/collections/userdb/user-db.service.ts new file mode 100644 index 0000000..787bc45 --- /dev/null +++ b/backend/src/collections/userdb/user-db.service.ts @@ -0,0 +1,254 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import * as bcrypt from 'bcrypt'; +import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.dto'; +import { + AsyncFailable, + Fail, + HasFailed, + HasSuccess +} from 'picsur-shared/dist/types'; +import { makeUnique } from 'picsur-shared/dist/util/unique'; +import { Repository } from 'typeorm'; +import { Permissions } from '../../models/constants/permissions.const'; +import { + DefaultRolesList, + SoulBoundRolesList +} from '../../models/constants/roles.const'; +import { + ImmutableUsersList, + LockedLoginUsersList, + UndeletableUsersList +} from '../../models/constants/special-users.const'; +import { EUserBackend } from '../../models/entities/user.entity'; +import { GetCols } from '../../models/util/collection'; +import { SysPreferenceService } from '../preference-db/sys-preference-db.service'; +import { RolesService } from '../role-db/role-db.service'; + +@Injectable() +export class UsersService { + private readonly logger = new Logger('UsersService'); + + constructor( + @InjectRepository(EUserBackend) + private usersRepository: Repository, + private rolesService: RolesService, + private prefService: SysPreferenceService, + ) {} + + // Creation and deletion + + public async create( + username: string, + password: string, + roles?: string[], + // Add option to create "invalid" users, should only be used by system + byPassRoleCheck?: boolean, + ): AsyncFailable { + if (await this.exists(username)) return Fail('User already exists'); + + const strength = await this.getBCryptStrength(); + const hashedPassword = await bcrypt.hash(password, strength); + + let user = new EUserBackend(); + user.username = username; + user.hashedPassword = hashedPassword; + if (byPassRoleCheck) { + const rolesToAdd = roles ?? []; + user.roles = makeUnique(rolesToAdd); + } else { + // Strip soulbound roles and add default roles + const rolesToAdd = this.filterAddedRoles(roles ?? []); + user.roles = makeUnique([...DefaultRolesList, ...rolesToAdd]); + } + + try { + return await this.usersRepository.save(user); + } catch (e: any) { + return Fail(e?.message); + } + } + + public async delete(uuid: string): AsyncFailable { + const userToModify = await this.findOne(uuid); + if (HasFailed(userToModify)) return userToModify; + + if (UndeletableUsersList.includes(userToModify.username)) { + return Fail('Cannot delete system user'); + } + + try { + return await this.usersRepository.remove(userToModify); + } catch (e: any) { + return Fail(e?.message); + } + } + + // Updating + + public async setRoles( + uuid: string, + roles: string[], + ): AsyncFailable { + const userToModify = await this.findOne(uuid); + if (HasFailed(userToModify)) return userToModify; + + if (ImmutableUsersList.includes(userToModify.username)) { + // Just fail silently + this.logger.log("Can't modify system user"); + return userToModify; + } + + const rolesToKeep = userToModify.roles.filter((role) => + SoulBoundRolesList.includes(role), + ); + const rolesToAdd = this.filterAddedRoles(roles); + const newRoles = makeUnique([...rolesToKeep, ...rolesToAdd]); + userToModify.roles = newRoles; + + try { + return await this.usersRepository.save(userToModify); + } catch (e: any) { + return Fail(e?.message); + } + } + + public async removeRoleEveryone(role: string): AsyncFailable { + try { + await this.usersRepository + .createQueryBuilder('user') + .update() + .set({ + roles: () => 'ARRAY_REMOVE(roles, :role)', + }) + .where('roles @> ARRAY[:role]', { role }) + .execute(); + } catch (e) { + this.logger.error(e); + return Fail("Couldn't remove role from everyone"); + } + + return true; + } + + public async getPermissions(uuid: string): AsyncFailable { + const userToModify = await this.findOne(uuid); + if (HasFailed(userToModify)) return userToModify; + + return await this.rolesService.getPermissions(userToModify.roles); + } + + public async updatePassword( + uuid: string, + password: string, + ): AsyncFailable { + let userToModify = await this.findOne(uuid); + if (HasFailed(userToModify)) return userToModify; + + const strength = await this.getBCryptStrength(); + userToModify.hashedPassword = await bcrypt.hash(password, strength); + + try { + userToModify = await this.usersRepository.save(userToModify); + } catch (e: any) { + return Fail(e?.message); + } + + return userToModify; + } + + // Authentication + + async authenticate( + username: string, + password: string, + ): AsyncFailable { + const user = await this.findByUsername(username, true); + if (HasFailed(user)) return user; + + if (LockedLoginUsersList.includes(user.username)) { + // Error should be kept in backend + return Fail('Wrong username'); + } + + if (!(await bcrypt.compare(password, user.hashedPassword ?? ''))) + return Fail('Wrong password'); + + return await this.findOne(user.id ?? ''); + } + + // Listing + + public async findByUsername( + username: string, + // Also fetch fields that aren't normally sent to the client + // (e.g. hashed password) + getPrivate: boolean = false, + ): AsyncFailable { + try { + const found = await this.usersRepository.findOne({ + where: { username }, + select: getPrivate ? GetCols(this.usersRepository) : undefined, + }); + + if (!found) return Fail('User not found'); + return found; + } catch (e: any) { + return Fail(e?.message); + } + } + + public async findOne(uuid: string): AsyncFailable { + try { + const found = await this.usersRepository.findOne({ + where: { id: uuid }, + }); + + if (!found) return Fail('User not found'); + return found as EUserBackend; + } catch (e: any) { + return Fail(e?.message); + } + } + + public async findMany( + count: number, + page: number, + ): AsyncFailable { + if (count < 1 || page < 0) return Fail('Invalid page'); + if (count > 100) return Fail('Too many results'); + + try { + return await this.usersRepository.find({ + take: count, + skip: count * page, + }); + } catch (e: any) { + return Fail(e?.message); + } + } + + public async exists(username: string): Promise { + return HasSuccess(await this.findByUsername(username)); + } + + // Internal + + private filterAddedRoles(roles: string[]): string[] { + const filteredRoles = roles.filter( + (role) => !SoulBoundRolesList.includes(role), + ); + + return filteredRoles; + } + + private async getBCryptStrength(): Promise { + const result = await this.prefService.getNumberPreference( + SysPreference.BCryptStrength, + ); + if (HasFailed(result)) { + return 12; + } + return result; + } +} diff --git a/backend/src/config/early/earlyconfig.module.ts b/backend/src/config/early/early-config.module.ts similarity index 79% rename from backend/src/config/early/earlyconfig.module.ts rename to backend/src/config/early/early-config.module.ts index 082a709..7e40d3f 100644 --- a/backend/src/config/early/earlyconfig.module.ts +++ b/backend/src/config/early/early-config.module.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { AuthConfigService } from './auth.config.service'; -import { EarlyJwtConfigService } from './earlyjwt.config.service'; +import { EarlyJwtConfigService } from './early-jwt.config.service'; import { HostConfigService } from './host.config.service'; import { MultipartConfigService } from './multipart.config.service'; -import { ServeStaticConfigService } from './servestatic.config.service'; -import { TypeOrmConfigService } from './typeorm.config.service'; +import { ServeStaticConfigService } from './serve-static.config.service'; +import { TypeOrmConfigService } from './type-orm.config.service'; @Module({ imports: [ diff --git a/backend/src/config/early/earlyjwt.config.service.ts b/backend/src/config/early/early-jwt.config.service.ts similarity index 100% rename from backend/src/config/early/earlyjwt.config.service.ts rename to backend/src/config/early/early-jwt.config.service.ts diff --git a/backend/src/config/early/servestatic.config.service.ts b/backend/src/config/early/serve-static.config.service.ts similarity index 100% rename from backend/src/config/early/servestatic.config.service.ts rename to backend/src/config/early/serve-static.config.service.ts diff --git a/backend/src/config/early/typeorm.config.service.ts b/backend/src/config/early/type-orm.config.service.ts similarity index 100% rename from backend/src/config/early/typeorm.config.service.ts rename to backend/src/config/early/type-orm.config.service.ts diff --git a/backend/src/config/late/jwt.config.service.ts b/backend/src/config/late/jwt.config.service.ts index b820113..390894a 100644 --- a/backend/src/config/late/jwt.config.service.ts +++ b/backend/src/config/late/jwt.config.service.ts @@ -1,7 +1,7 @@ import { FactoryProvider, Injectable, Logger } from '@nestjs/common'; import { JwtModuleOptions, JwtOptionsFactory } from '@nestjs/jwt'; import { HasFailed } from 'picsur-shared/dist/types'; -import { SysPreferenceService } from '../../collections/preferencesdb/syspreferencedb.service'; +import { SysPreferenceService } from '../../collections/preference-db/sys-preference-db.service'; @Injectable() export class JwtConfigService implements JwtOptionsFactory { diff --git a/backend/src/config/late/lateconfig.module.ts b/backend/src/config/late/late-config.module.ts similarity index 84% rename from backend/src/config/late/lateconfig.module.ts rename to backend/src/config/late/late-config.module.ts index f9d6675..4c5c2eb 100644 --- a/backend/src/config/late/lateconfig.module.ts +++ b/backend/src/config/late/late-config.module.ts @@ -1,8 +1,8 @@ import { Logger, Module, OnModuleInit } from '@nestjs/common'; -import { PreferenceModule } from '../../collections/preferencesdb/preferencedb.module'; -import { SysPreferenceService } from '../../collections/preferencesdb/syspreferencedb.service'; -import { EarlyConfigModule } from '../early/earlyconfig.module'; -import { EarlyJwtConfigService } from '../early/earlyjwt.config.service'; +import { PreferenceModule } from '../../collections/preference-db/preference-db.module'; +import { SysPreferenceService } from '../../collections/preference-db/sys-preference-db.service'; +import { EarlyConfigModule } from '../early/early-config.module'; +import { EarlyJwtConfigService } from '../early/early-jwt.config.service'; import { JwtConfigService } from './jwt.config.service'; // This module contains all configservices that depend on the syspref module diff --git a/backend/src/decorators/decorators.module.ts b/backend/src/decorators/decorators.module.ts index 4cfd6f5..021bf37 100644 --- a/backend/src/decorators/decorators.module.ts +++ b/backend/src/decorators/decorators.module.ts @@ -1,15 +1,17 @@ import { Module } from '@nestjs/common'; -import { EarlyConfigModule } from '../config/early/earlyconfig.module'; -import { MultiPartPipe } from './multipart.pipe'; -import { PostFilePipe } from './postfile.pipe'; +import { EarlyConfigModule } from '../config/early/early-config.module'; +import { ImageIdPipe } from './image-id/image-id.pipe'; +import { MultiPartPipe } from './multipart/multipart.pipe'; +import { PostFilePipe } from './multipart/postfile.pipe'; @Module({ imports: [EarlyConfigModule], - providers: [MultiPartPipe, PostFilePipe], + providers: [MultiPartPipe, PostFilePipe, ImageIdPipe], exports: [ - MultiPartPipe, - PostFilePipe, + MultiPartPipe, + PostFilePipe, + ImageIdPipe, // EarlyConfigModule is exported here because the pipes are dependedant on the config // But these pipes dont resolve their dependencies via this module // So this way we force it to be "global" diff --git a/backend/src/decorators/image-id/image-id.decorator.ts b/backend/src/decorators/image-id/image-id.decorator.ts new file mode 100644 index 0000000..2ae47d9 --- /dev/null +++ b/backend/src/decorators/image-id/image-id.decorator.ts @@ -0,0 +1,10 @@ +import { + Param, + PipeTransform, + Type +} from '@nestjs/common'; +import { ImageIdPipe } from './image-id.pipe'; + +export const ImageIdParam = ( + ...pipes: (PipeTransform | Type>)[] +) => Param('id', ImageIdPipe, ...pipes); diff --git a/backend/src/routes/image/imageid.validator.ts b/backend/src/decorators/image-id/image-id.pipe.ts similarity index 83% rename from backend/src/routes/image/imageid.validator.ts rename to backend/src/decorators/image-id/image-id.pipe.ts index d2e5974..c776b46 100644 --- a/backend/src/routes/image/imageid.validator.ts +++ b/backend/src/decorators/image-id/image-id.pipe.ts @@ -7,7 +7,7 @@ import { import { UUIDRegex } from 'picsur-shared/dist/util/common-regex'; @Injectable() -export class ImageIdValidator implements PipeTransform { +export class ImageIdPipe implements PipeTransform { transform(value: string, metadata: ArgumentMetadata): string { if (UUIDRegex.test(value)) return value; throw new BadRequestException('Invalid image id'); diff --git a/backend/src/decorators/injectrequest.decorator.ts b/backend/src/decorators/multipart/inject-request.decorator.ts similarity index 100% rename from backend/src/decorators/injectrequest.decorator.ts rename to backend/src/decorators/multipart/inject-request.decorator.ts diff --git a/backend/src/decorators/multipart.decorator.ts b/backend/src/decorators/multipart/multipart.decorator.ts similarity index 78% rename from backend/src/decorators/multipart.decorator.ts rename to backend/src/decorators/multipart/multipart.decorator.ts index 8050737..7f17c22 100644 --- a/backend/src/decorators/multipart.decorator.ts +++ b/backend/src/decorators/multipart/multipart.decorator.ts @@ -1,4 +1,4 @@ -import { InjectRequest } from './injectrequest.decorator'; +import { InjectRequest } from './inject-request.decorator'; import { MultiPartPipe } from './multipart.pipe'; import { PostFilePipe } from './postfile.pipe'; diff --git a/backend/src/decorators/multipart.pipe.ts b/backend/src/decorators/multipart/multipart.pipe.ts similarity index 94% rename from backend/src/decorators/multipart.pipe.ts rename to backend/src/decorators/multipart/multipart.pipe.ts index 4f10d58..8317c8f 100644 --- a/backend/src/decorators/multipart.pipe.ts +++ b/backend/src/decorators/multipart/multipart.pipe.ts @@ -10,11 +10,11 @@ import { import { FastifyRequest } from 'fastify'; import { MultipartFields, MultipartFile } from 'fastify-multipart'; import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto'; -import { MultipartConfigService } from '../config/early/multipart.config.service'; +import { MultipartConfigService } from '../../config/early/multipart.config.service'; import { CreateMultiPartFieldDto, CreateMultiPartFileDto -} from '../models/requests/multipart.dto'; +} from '../../models/dto/multipart.dto'; @Injectable({ scope: Scope.REQUEST }) export class MultiPartPipe implements PipeTransform { diff --git a/backend/src/decorators/postfile.pipe.ts b/backend/src/decorators/multipart/postfile.pipe.ts similarity index 93% rename from backend/src/decorators/postfile.pipe.ts rename to backend/src/decorators/multipart/postfile.pipe.ts index e50e3e0..1d969fa 100644 --- a/backend/src/decorators/postfile.pipe.ts +++ b/backend/src/decorators/multipart/postfile.pipe.ts @@ -7,7 +7,7 @@ import { } from '@nestjs/common'; import { FastifyRequest } from 'fastify'; import { Multipart } from 'fastify-multipart'; -import { MultipartConfigService } from '../config/early/multipart.config.service'; +import { MultipartConfigService } from '../../config/early/multipart.config.service'; @Injectable({ scope: Scope.REQUEST }) export class PostFilePipe implements PipeTransform { diff --git a/backend/src/decorators/permissions.decorator.ts b/backend/src/decorators/permissions.decorator.ts index b8925c5..55e6791 100644 --- a/backend/src/decorators/permissions.decorator.ts +++ b/backend/src/decorators/permissions.decorator.ts @@ -1,7 +1,7 @@ import { SetMetadata, UseGuards } from '@nestjs/common'; import { CombineFCDecorators } from 'picsur-shared/dist/util/decorator'; -import { LocalAuthGuard } from '../managers/auth/guards/localauth.guard'; -import { Permissions } from '../models/dto/permissions.dto'; +import { LocalAuthGuard } from '../managers/auth/guards/local-auth.guard'; +import { Permissions } from '../models/constants/permissions.const'; export const RequiredPermissions = (...permissions: Permissions) => { return SetMetadata('permissions', permissions); diff --git a/backend/src/decorators/request-user.decorator.ts b/backend/src/decorators/request-user.decorator.ts index 380d6a6..3126971 100644 --- a/backend/src/decorators/request-user.decorator.ts +++ b/backend/src/decorators/request-user.decorator.ts @@ -1,5 +1,5 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common'; -import AuthFasityRequest from '../models/requests/authrequest.dto'; +import AuthFasityRequest from '../models/interfaces/authrequest.dto'; export const ReqUser = createParamDecorator( (input: any, ctx: ExecutionContext) => { diff --git a/backend/src/layers/httpexception/httpexception.filter.ts b/backend/src/layers/exception/exception.filter.ts similarity index 100% rename from backend/src/layers/httpexception/httpexception.filter.ts rename to backend/src/layers/exception/exception.filter.ts diff --git a/backend/src/logger/logger.module.ts b/backend/src/logger/logger.module.ts index 522eb27..2b4cfa5 100644 --- a/backend/src/logger/logger.module.ts +++ b/backend/src/logger/logger.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { EarlyConfigModule } from '../config/early/earlyconfig.module'; +import { EarlyConfigModule } from '../config/early/early-config.module'; import { PicsurLoggerService } from './logger.service'; @Module({ diff --git a/backend/src/main.ts b/backend/src/main.ts index 4f1062c..f99faca 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -6,9 +6,9 @@ import { import fastifyHelmet from 'fastify-helmet'; import * as multipart from 'fastify-multipart'; import { AppModule } from './app.module'; -import { UsersService } from './collections/userdb/userdb.service'; +import { UsersService } from './collections/user-db/user-db.service'; import { HostConfigService } from './config/early/host.config.service'; -import { MainExceptionFilter } from './layers/httpexception/httpexception.filter'; +import { MainExceptionFilter } from './layers/exception/exception.filter'; import { SuccessInterceptor } from './layers/success/success.interceptor'; import { ZodValidationPipe } from './layers/validate/zod-validator.pipe'; import { PicsurLoggerService } from './logger/logger.service'; diff --git a/backend/src/managers/auth/auth.module.ts b/backend/src/managers/auth/auth.module.ts index f7d121e..f842825 100644 --- a/backend/src/managers/auth/auth.module.ts +++ b/backend/src/managers/auth/auth.module.ts @@ -1,14 +1,14 @@ import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; -import { PreferenceModule } from '../../collections/preferencesdb/preferencedb.module'; -import { UsersModule } from '../../collections/userdb/userdb.module'; +import { PreferenceModule } from '../../collections/preference-db/preference-db.module'; +import { UsersModule } from '../../collections/user-db/user-db.module'; import { JwtConfigService, JwtSecretProvider } from '../../config/late/jwt.config.service'; -import { LateConfigModule } from '../../config/late/lateconfig.module'; +import { LateConfigModule } from '../../config/late/late-config.module'; import { AuthManagerService } from './auth.service'; import { GuestStrategy } from './guards/guest.strategy'; import { JwtStrategy } from './guards/jwt.strategy'; -import { LocalAuthStrategy } from './guards/localauth.strategy'; +import { LocalAuthStrategy } from './guards/local-auth.strategy'; import { GuestService } from './guest.service'; @Module({ diff --git a/backend/src/managers/auth/guards/localauth.guard.ts b/backend/src/managers/auth/guards/local-auth.guard.ts similarity index 100% rename from backend/src/managers/auth/guards/localauth.guard.ts rename to backend/src/managers/auth/guards/local-auth.guard.ts diff --git a/backend/src/managers/auth/guards/localauth.strategy.ts b/backend/src/managers/auth/guards/local-auth.strategy.ts similarity index 92% rename from backend/src/managers/auth/guards/localauth.strategy.ts rename to backend/src/managers/auth/guards/local-auth.strategy.ts index 2a45d3e..9edc2eb 100644 --- a/backend/src/managers/auth/guards/localauth.strategy.ts +++ b/backend/src/managers/auth/guards/local-auth.strategy.ts @@ -3,7 +3,7 @@ import { PassportStrategy } from '@nestjs/passport'; import { Strategy } from 'passport-local'; import { EUser } from 'picsur-shared/dist/entities/user.entity'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; -import { UsersService } from '../../../collections/userdb/userdb.service'; +import { UsersService } from '../../../collections/user-db/user-db.service'; import { EUserBackend2EUser } from '../../../models/transformers/user.transformer'; @Injectable() diff --git a/backend/src/managers/auth/guards/main.guard.ts b/backend/src/managers/auth/guards/main.guard.ts index 2388c5c..da022c3 100644 --- a/backend/src/managers/auth/guards/main.guard.ts +++ b/backend/src/managers/auth/guards/main.guard.ts @@ -9,8 +9,8 @@ import { Reflector } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; import { EUser, EUserSchema } from 'picsur-shared/dist/entities/user.entity'; import { Fail, Failable, HasFailed } from 'picsur-shared/dist/types'; -import { UsersService } from '../../../collections/userdb/userdb.service'; -import { Permissions } from '../../../models/dto/permissions.dto'; +import { UsersService } from '../../../collections/user-db/user-db.service'; +import { Permissions } from '../../../models/constants/permissions.const'; import { isPermissionsArray } from '../../../models/validators/permissions.validator'; // This guard extends both the jwt authenticator and the guest authenticator diff --git a/backend/src/managers/auth/guest.service.ts b/backend/src/managers/auth/guest.service.ts index aaa3345..d15411e 100644 --- a/backend/src/managers/auth/guest.service.ts +++ b/backend/src/managers/auth/guest.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { HasFailed } from 'picsur-shared/dist/types'; -import { UsersService } from '../../collections/userdb/userdb.service'; +import { UsersService } from '../../collections/user-db/user-db.service'; import { EUserBackend } from '../../models/entities/user.entity'; @Injectable() diff --git a/backend/src/managers/demo/demomanager.module.ts b/backend/src/managers/demo/demo.module.ts similarity index 79% rename from backend/src/managers/demo/demomanager.module.ts rename to backend/src/managers/demo/demo.module.ts index bbbb19f..b07de27 100644 --- a/backend/src/managers/demo/demomanager.module.ts +++ b/backend/src/managers/demo/demo.module.ts @@ -1,9 +1,9 @@ import { Logger, Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; -import { ImageDBModule } from '../../collections/imagedb/imagedb.module'; -import { RolesModule } from '../../collections/roledb/roledb.module'; -import { EarlyConfigModule } from '../../config/early/earlyconfig.module'; +import { ImageDBModule } from '../../collections/image-db/image-db.module'; +import { RolesModule } from '../../collections/role-db/role-db.module'; +import { EarlyConfigModule } from '../../config/early/early-config.module'; import { HostConfigService } from '../../config/early/host.config.service'; -import { DemoManagerService } from './demomanager.service'; +import { DemoManagerService } from './demo.service'; @Module({ imports: [ImageDBModule, EarlyConfigModule, RolesModule], diff --git a/backend/src/managers/demo/demomanager.service.ts b/backend/src/managers/demo/demo.service.ts similarity index 77% rename from backend/src/managers/demo/demomanager.service.ts rename to backend/src/managers/demo/demo.service.ts index 6820ba6..c25770a 100644 --- a/backend/src/managers/demo/demomanager.service.ts +++ b/backend/src/managers/demo/demo.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from '@nestjs/common'; -import { ImageDBService } from '../../collections/imagedb/imagedb.service'; -import { RolesService } from '../../collections/roledb/roledb.service'; -import { Permission } from '../../models/dto/permissions.dto'; +import { ImageDBService } from '../../collections/image-db/image-db.service'; +import { RolesService } from '../../collections/role-db/role-db.service'; +import { Permission } from '../../models/constants/permissions.const'; @Injectable() export class DemoManagerService { diff --git a/backend/src/managers/imagemanager/imageprocessor.service.ts b/backend/src/managers/image/image-processor.service.ts similarity index 98% rename from backend/src/managers/imagemanager/imageprocessor.service.ts rename to backend/src/managers/image/image-processor.service.ts index a1bd836..25ec460 100644 --- a/backend/src/managers/imagemanager/imageprocessor.service.ts +++ b/backend/src/managers/image/image-processor.service.ts @@ -9,7 +9,7 @@ import { import { AsyncFailable, Fail } from 'picsur-shared/dist/types'; import { QOIColorSpace, QOIdecode, QOIencode } from 'qoi-img'; import sharp from 'sharp'; -import { UsrPreferenceService } from '../../collections/preferencesdb/usrpreferencedb.service'; +import { UsrPreferenceService } from '../../collections/preference-db/usr-preference-db.service'; @Injectable() export class ImageProcessorService { diff --git a/backend/src/managers/image/image.module.ts b/backend/src/managers/image/image.module.ts new file mode 100644 index 0000000..899bf43 --- /dev/null +++ b/backend/src/managers/image/image.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { ImageDBModule } from '../../collections/image-db/image-db.module'; +import { PreferenceModule } from '../../collections/preference-db/preference-db.module'; +import { ImageProcessorService } from './image-processor.service'; +import { ImageManagerService } from './image.service'; + +@Module({ + imports: [ImageDBModule, PreferenceModule], + providers: [ImageManagerService, ImageProcessorService], + exports: [ImageManagerService], +}) +export class ImageManagerModule {} diff --git a/backend/src/managers/imagemanager/imagemanager.service.ts b/backend/src/managers/image/image.service.ts similarity index 93% rename from backend/src/managers/imagemanager/imagemanager.service.ts rename to backend/src/managers/image/image.service.ts index e1bb10b..fd6aea8 100644 --- a/backend/src/managers/imagemanager/imagemanager.service.ts +++ b/backend/src/managers/image/image.service.ts @@ -4,9 +4,9 @@ import { FullMime } from 'picsur-shared/dist/dto/mimes.dto'; import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types'; import { ParseMime } from 'picsur-shared/dist/util/parse-mime'; import { IsQOI } from 'qoi-img'; -import { ImageDBService } from '../../collections/imagedb/imagedb.service'; +import { ImageDBService } from '../../collections/image-db/image-db.service'; import { EImageBackend } from '../../models/entities/image.entity'; -import { ImageProcessorService } from './imageprocessor.service'; +import { ImageProcessorService } from './image-processor.service'; // Right now this service is mostly a wrapper for the imagedbservice. // But in the future the actual image logic will happend here diff --git a/backend/src/managers/imagemanager/imagemanager.module.ts b/backend/src/managers/imagemanager/imagemanager.module.ts deleted file mode 100644 index 6ad1a15..0000000 --- a/backend/src/managers/imagemanager/imagemanager.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ImageDBModule } from '../../collections/imagedb/imagedb.module'; -import { PreferenceModule } from '../../collections/preferencesdb/preferencedb.module'; -import { ImageManagerService } from './imagemanager.service'; -import { ImageProcessorService } from './imageprocessor.service'; - -@Module({ - imports: [ImageDBModule, PreferenceModule], - providers: [ImageManagerService, ImageProcessorService], - exports: [ImageManagerService], -}) -export class ImageManagerModule {} diff --git a/backend/src/models/dto/permissions.dto.ts b/backend/src/models/constants/permissions.const.ts similarity index 100% rename from backend/src/models/dto/permissions.dto.ts rename to backend/src/models/constants/permissions.const.ts diff --git a/backend/src/models/dto/roles.dto.ts b/backend/src/models/constants/roles.const.ts similarity index 98% rename from backend/src/models/dto/roles.dto.ts rename to backend/src/models/constants/roles.const.ts index f2b73e5..89ae128 100644 --- a/backend/src/models/dto/roles.dto.ts +++ b/backend/src/models/constants/roles.const.ts @@ -1,5 +1,5 @@ import tuple from 'picsur-shared/dist/types/tuple'; -import { Permission, Permissions, PermissionsList } from './permissions.dto'; +import { Permission, Permissions, PermissionsList } from './permissions.const'; // Config diff --git a/backend/src/models/dto/specialusers.dto.ts b/backend/src/models/constants/special-users.const.ts similarity index 100% rename from backend/src/models/dto/specialusers.dto.ts rename to backend/src/models/constants/special-users.const.ts diff --git a/backend/src/models/dto/syspreferences.dto.ts b/backend/src/models/constants/syspreferences.const.ts similarity index 100% rename from backend/src/models/dto/syspreferences.dto.ts rename to backend/src/models/constants/syspreferences.const.ts diff --git a/backend/src/models/dto/usrpreferences.dto.ts b/backend/src/models/constants/usrpreferences.const.ts similarity index 100% rename from backend/src/models/dto/usrpreferences.dto.ts rename to backend/src/models/constants/usrpreferences.const.ts diff --git a/backend/src/models/requests/imageroute.dto.ts b/backend/src/models/dto/image-upload.dto.ts similarity index 100% rename from backend/src/models/requests/imageroute.dto.ts rename to backend/src/models/dto/image-upload.dto.ts diff --git a/backend/src/models/requests/multipart.dto.ts b/backend/src/models/dto/multipart.dto.ts similarity index 100% rename from backend/src/models/requests/multipart.dto.ts rename to backend/src/models/dto/multipart.dto.ts diff --git a/backend/src/models/entities/index.ts b/backend/src/models/entities/index.ts index 76c98eb..c6a15ac 100644 --- a/backend/src/models/entities/index.ts +++ b/backend/src/models/entities/index.ts @@ -1,8 +1,8 @@ import { EImageBackend } from './image.entity'; import { ERoleBackend } from './role.entity'; -import { ESysPreferenceBackend } from './syspreference.entity'; +import { ESysPreferenceBackend } from './sys-preference.entity'; import { EUserBackend } from './user.entity'; -import { EUsrPreferenceBackend } from './usrpreference.entity'; +import { EUsrPreferenceBackend } from './usr-preference.entity'; export const EntityList = [ EImageBackend, diff --git a/backend/src/models/entities/role.entity.ts b/backend/src/models/entities/role.entity.ts index 24f35c8..6fd71c2 100644 --- a/backend/src/models/entities/role.entity.ts +++ b/backend/src/models/entities/role.entity.ts @@ -1,6 +1,6 @@ import { ERole } from 'picsur-shared/dist/entities/role.entity'; import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; -import { Permissions } from '../dto/permissions.dto'; +import { Permissions } from '../constants/permissions.const'; @Entity() export class ERoleBackend implements ERole { diff --git a/backend/src/models/entities/syspreference.entity.ts b/backend/src/models/entities/sys-preference.entity.ts similarity index 100% rename from backend/src/models/entities/syspreference.entity.ts rename to backend/src/models/entities/sys-preference.entity.ts diff --git a/backend/src/models/entities/usrpreference.entity.ts b/backend/src/models/entities/usr-preference.entity.ts similarity index 100% rename from backend/src/models/entities/usrpreference.entity.ts rename to backend/src/models/entities/usr-preference.entity.ts diff --git a/backend/src/models/requests/authrequest.dto.ts b/backend/src/models/interfaces/authrequest.dto.ts similarity index 100% rename from backend/src/models/requests/authrequest.dto.ts rename to backend/src/models/interfaces/authrequest.dto.ts diff --git a/backend/src/models/util/FallBackMutex.ts b/backend/src/models/util/mutex-fallback.ts similarity index 89% rename from backend/src/models/util/FallBackMutex.ts rename to backend/src/models/util/mutex-fallback.ts index e6df309..5f2c1c4 100644 --- a/backend/src/models/util/FallBackMutex.ts +++ b/backend/src/models/util/mutex-fallback.ts @@ -12,7 +12,7 @@ After that is done it will retry the first function again. const fallBackMap: Record> = {}; -export async function FallBackMutex< +export async function MutexFallBack< MF extends () => Promise, FF extends () => Promise, O, @@ -22,7 +22,7 @@ export async function FallBackMutex< if (fallBackMap[key] !== undefined) { await fallBackMap[key]; - return FallBackMutex(key, mainFunc, fallBackFunc); + return MutexFallBack(key, mainFunc, fallBackFunc); } fallBackMap[key] = fallBackFunc(); @@ -33,5 +33,5 @@ export async function FallBackMutex< .catch(() => { delete fallBackMap[key]; }); - return FallBackMutex(key, mainFunc, fallBackFunc); + return MutexFallBack(key, mainFunc, fallBackFunc); } diff --git a/backend/src/models/validators/permissions.validator.ts b/backend/src/models/validators/permissions.validator.ts index 973c4bd..52d3a8e 100644 --- a/backend/src/models/validators/permissions.validator.ts +++ b/backend/src/models/validators/permissions.validator.ts @@ -1,5 +1,5 @@ import { isPermissionsArray as isPArr } from 'picsur-shared/dist/validators/permissions.validator'; -import { Permissions, PermissionsList } from '../dto/permissions.dto'; +import { Permissions, PermissionsList } from '../constants/permissions.const'; export function isPermissionsArray(value: any): value is Permissions { return isPArr(value, PermissionsList); diff --git a/backend/src/routes/api/experiment/experiment.controller.ts b/backend/src/routes/api/experiment/experiment.controller.ts index 79e2698..fec174c 100644 --- a/backend/src/routes/api/experiment/experiment.controller.ts +++ b/backend/src/routes/api/experiment/experiment.controller.ts @@ -1,15 +1,10 @@ -import { - Controller, Get, - Request -} from '@nestjs/common'; +import { Controller, Get, Request } from '@nestjs/common'; import { UserInfoResponse } from 'picsur-shared/dist/dto/api/user-manage.dto'; import { Permission } from 'picsur-shared/dist/dto/permissions.dto'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { ReqUserID } from '../../../decorators/request-user.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import AuthFasityRequest from '../../../models/requests/authrequest.dto'; - - +import AuthFasityRequest from '../../../models/interfaces/authrequest.dto'; @Controller('api/experiment') @RequiredPermissions(Permission.Settings) @@ -20,7 +15,6 @@ export class ExperimentController { @Request() req: AuthFasityRequest, @ReqUserID() thing: string, ): Promise { - return req.user; } } diff --git a/backend/src/routes/api/experiment/experiment.module.ts b/backend/src/routes/api/experiment/experiment.module.ts index 90ca23e..844510f 100644 --- a/backend/src/routes/api/experiment/experiment.module.ts +++ b/backend/src/routes/api/experiment/experiment.module.ts @@ -5,6 +5,6 @@ import { ExperimentController } from './experiment.controller'; // TODO: remove when out of beta @Module({ - controllers: [ExperimentController] + controllers: [ExperimentController], }) export class ExperimentModule {} diff --git a/backend/src/routes/api/info/info.controller.ts b/backend/src/routes/api/info/info.controller.ts index 7597d10..a00787e 100644 --- a/backend/src/routes/api/info/info.controller.ts +++ b/backend/src/routes/api/info/info.controller.ts @@ -6,7 +6,7 @@ import { import { HostConfigService } from '../../../config/early/host.config.service'; import { NoPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import { PermissionsList } from '../../../models/dto/permissions.dto'; +import { PermissionsList } from '../../../models/constants/permissions.const'; @Controller('api/info') @NoPermissions() diff --git a/backend/src/routes/api/info/info.module.ts b/backend/src/routes/api/info/info.module.ts index f8c3f79..1f2c6b7 100644 --- a/backend/src/routes/api/info/info.module.ts +++ b/backend/src/routes/api/info/info.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { EarlyConfigModule } from '../../../config/early/earlyconfig.module'; +import { EarlyConfigModule } from '../../../config/early/early-config.module'; import { InfoController } from './info.controller'; @Module({ diff --git a/backend/src/routes/api/pref/pref.module.ts b/backend/src/routes/api/pref/pref.module.ts index b0e3a8a..d423f13 100644 --- a/backend/src/routes/api/pref/pref.module.ts +++ b/backend/src/routes/api/pref/pref.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; -import { PreferenceModule } from '../../../collections/preferencesdb/preferencedb.module'; -import { SysPrefController } from './syspref.controller'; -import { UsrPrefController } from './usrpref.controller'; +import { PreferenceModule } from '../../../collections/preference-db/preference-db.module'; +import { SysPrefController } from './sys-pref.controller'; +import { UsrPrefController } from './usr-pref.controller'; @Module({ imports: [PreferenceModule], diff --git a/backend/src/routes/api/pref/syspref.controller.ts b/backend/src/routes/api/pref/sys-pref.controller.ts similarity index 94% rename from backend/src/routes/api/pref/syspref.controller.ts rename to backend/src/routes/api/pref/sys-pref.controller.ts index 0f6d004..7ba3ae5 100644 --- a/backend/src/routes/api/pref/syspref.controller.ts +++ b/backend/src/routes/api/pref/sys-pref.controller.ts @@ -14,10 +14,10 @@ import { UpdatePreferenceResponse } from 'picsur-shared/dist/dto/api/pref.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { SysPreferenceService } from '../../../collections/preferencesdb/syspreferencedb.service'; +import { SysPreferenceService } from '../../../collections/preference-db/sys-preference-db.service'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import { Permission } from '../../../models/dto/permissions.dto'; +import { Permission } from '../../../models/constants/permissions.const'; @Controller('api/pref/sys') @RequiredPermissions(Permission.SysPrefManage) diff --git a/backend/src/routes/api/pref/usrpref.controller.ts b/backend/src/routes/api/pref/usr-pref.controller.ts similarity index 95% rename from backend/src/routes/api/pref/usrpref.controller.ts rename to backend/src/routes/api/pref/usr-pref.controller.ts index 952a4a2..ab37b43 100644 --- a/backend/src/routes/api/pref/usrpref.controller.ts +++ b/backend/src/routes/api/pref/usr-pref.controller.ts @@ -14,11 +14,11 @@ import { UpdatePreferenceResponse } from 'picsur-shared/dist/dto/api/pref.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { UsrPreferenceService } from '../../../collections/preferencesdb/usrpreferencedb.service'; +import { UsrPreferenceService } from '../../../collections/preference-db/usr-preference-db.service'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { ReqUserID } from '../../../decorators/request-user.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import { Permission } from '../../../models/dto/permissions.dto'; +import { Permission } from '../../../models/constants/permissions.const'; @Controller('api/pref/usr') @RequiredPermissions(Permission.Settings) diff --git a/backend/src/routes/api/roles/roles.controller.ts b/backend/src/routes/api/roles/roles.controller.ts index 61ed1a0..99582a8 100644 --- a/backend/src/routes/api/roles/roles.controller.ts +++ b/backend/src/routes/api/roles/roles.controller.ts @@ -19,17 +19,17 @@ import { SpecialRolesResponse } from 'picsur-shared/dist/dto/api/roles.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { RolesService } from '../../../collections/roledb/roledb.service'; -import { UsersService } from '../../../collections/userdb/userdb.service'; +import { RolesService } from '../../../collections/role-db/role-db.service'; +import { UsersService } from '../../../collections/user-db/user-db.service'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import { Permission } from '../../../models/dto/permissions.dto'; +import { Permission } from '../../../models/constants/permissions.const'; import { DefaultRolesList, ImmutableRolesList, SoulBoundRolesList, UndeletableRolesList -} from '../../../models/dto/roles.dto'; +} from '../../../models/constants/roles.const'; import { isPermissionsArray } from '../../../models/validators/permissions.validator'; @Controller('api/roles') diff --git a/backend/src/routes/api/roles/roles.module.ts b/backend/src/routes/api/roles/roles.module.ts index b1cf766..9e3b858 100644 --- a/backend/src/routes/api/roles/roles.module.ts +++ b/backend/src/routes/api/roles/roles.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; -import { RolesModule } from '../../../collections/roledb/roledb.module'; -import { UsersModule } from '../../../collections/userdb/userdb.module'; +import { RolesModule } from '../../../collections/role-db/role-db.module'; +import { UsersModule } from '../../../collections/user-db/user-db.module'; import { RolesController } from './roles.controller'; @Module({ diff --git a/backend/src/routes/api/user/usermanage.controller.ts b/backend/src/routes/api/user/user-manage.controller.ts similarity index 95% rename from backend/src/routes/api/user/usermanage.controller.ts rename to backend/src/routes/api/user/user-manage.controller.ts index 131af96..34363a4 100644 --- a/backend/src/routes/api/user/usermanage.controller.ts +++ b/backend/src/routes/api/user/user-manage.controller.ts @@ -20,15 +20,15 @@ import { UserUpdateResponse } from 'picsur-shared/dist/dto/api/user-manage.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { UsersService } from '../../../collections/userdb/userdb.service'; +import { UsersService } from '../../../collections/user-db/user-db.service'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; -import { Permission } from '../../../models/dto/permissions.dto'; +import { Permission } from '../../../models/constants/permissions.const'; import { ImmutableUsersList, LockedLoginUsersList, UndeletableUsersList -} from '../../../models/dto/specialusers.dto'; +} from '../../../models/constants/special-users.const'; import { EUserBackend2EUser } from '../../../models/transformers/user.transformer'; @Controller('api/user') diff --git a/backend/src/routes/api/user/user.controller.ts b/backend/src/routes/api/user/user.controller.ts index 65e2dc3..10ebeaf 100644 --- a/backend/src/routes/api/user/user.controller.ts +++ b/backend/src/routes/api/user/user.controller.ts @@ -15,7 +15,7 @@ import { } from 'picsur-shared/dist/dto/api/user.dto'; import { EUser } from 'picsur-shared/dist/entities/user.entity'; import { HasFailed } from 'picsur-shared/dist/types'; -import { UsersService } from '../../../collections/userdb/userdb.service'; +import { UsersService } from '../../../collections/user-db/user-db.service'; import { NoPermissions, RequiredPermissions, @@ -24,7 +24,7 @@ import { import { ReqUser, ReqUserID } from '../../../decorators/request-user.decorator'; import { Returns } from '../../../decorators/returns.decorator'; import { AuthManagerService } from '../../../managers/auth/auth.service'; -import { Permission } from '../../../models/dto/permissions.dto'; +import { Permission } from '../../../models/constants/permissions.const'; import { EUserBackend2EUser } from '../../../models/transformers/user.transformer'; @Controller('api/user') diff --git a/backend/src/routes/api/user/user.module.ts b/backend/src/routes/api/user/user.module.ts index b4ded0d..590f711 100644 --- a/backend/src/routes/api/user/user.module.ts +++ b/backend/src/routes/api/user/user.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { AuthManagerModule } from '../../../managers/auth/auth.module'; +import { UserManageController } from './user-manage.controller'; import { UserController } from './user.controller'; -import { UserManageController } from './usermanage.controller'; @Module({ imports: [AuthManagerModule], diff --git a/backend/src/routes/image/imageroute.controller.ts b/backend/src/routes/image/image.controller.ts similarity index 82% rename from backend/src/routes/image/imageroute.controller.ts rename to backend/src/routes/image/image.controller.ts index 5c09081..f3966d8 100644 --- a/backend/src/routes/image/imageroute.controller.ts +++ b/backend/src/routes/image/image.controller.ts @@ -4,23 +4,21 @@ import { Head, InternalServerErrorException, Logger, - NotFoundException, - Param, - Post, + NotFoundException, Post, Res } from '@nestjs/common'; import { FastifyReply } from 'fastify'; import { ImageMetaResponse } from 'picsur-shared/dist/dto/api/image.dto'; import { HasFailed } from 'picsur-shared/dist/types'; -import { MultiPart } from '../../decorators/multipart.decorator'; +import { ImageIdParam } from '../../decorators/image-id/image-id.decorator'; +import { MultiPart } from '../../decorators/multipart/multipart.decorator'; import { RequiredPermissions } from '../../decorators/permissions.decorator'; import { ReqUserID } from '../../decorators/request-user.decorator'; import { Returns } from '../../decorators/returns.decorator'; -import { ImageManagerService } from '../../managers/imagemanager/imagemanager.service'; -import { Permission } from '../../models/dto/permissions.dto'; -import { ImageUploadDto } from '../../models/requests/imageroute.dto'; +import { ImageManagerService } from '../../managers/image/image.service'; +import { Permission } from '../../models/constants/permissions.const'; +import { ImageUploadDto } from '../../models/dto/image-upload.dto'; import { EImageBackend2EImage } from '../../models/transformers/image.transformer'; -import { ImageIdValidator } from './imageid.validator'; // This is the only controller with CORS enabled @Controller('i') @@ -35,7 +33,7 @@ export class ImageController { // Usually passthrough is for manually sending the response, // But we need it here to set the mime type @Res({ passthrough: true }) res: FastifyReply, - @Param('id', ImageIdValidator) id: string, + @ImageIdParam() id: string, ): Promise { const image = await this.imagesService.retrieveComplete(id); if (HasFailed(image)) { @@ -50,7 +48,7 @@ export class ImageController { @Head(':id') async headImage( @Res({ passthrough: true }) res: FastifyReply, - @Param('id', ImageIdValidator) id: string, + @ImageIdParam() id: string, ) { const image = await this.imagesService.retrieveInfo(id); if (HasFailed(image)) { @@ -64,7 +62,7 @@ export class ImageController { @Get('meta/:id') @Returns(ImageMetaResponse) async getImageMeta( - @Param('id', ImageIdValidator) id: string, + @ImageIdParam() id: string, ): Promise { const image = await this.imagesService.retrieveInfo(id); if (HasFailed(image)) { diff --git a/backend/src/routes/image/imageroute.module.ts b/backend/src/routes/image/image.module.ts similarity index 67% rename from backend/src/routes/image/imageroute.module.ts rename to backend/src/routes/image/image.module.ts index 64b257d..c4ad70e 100644 --- a/backend/src/routes/image/imageroute.module.ts +++ b/backend/src/routes/image/image.module.ts @@ -1,9 +1,8 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import cors from 'cors'; import { DecoratorsModule } from '../../decorators/decorators.module'; -import { ImageManagerModule } from '../../managers/imagemanager/imagemanager.module'; -import { ImageIdValidator } from './imageid.validator'; -import { ImageController } from './imageroute.controller'; +import { ImageManagerModule } from '../../managers/image/image.module'; +import { ImageController } from './image.controller'; const corsConfig = cors({ // 48 hours @@ -12,7 +11,6 @@ const corsConfig = cors({ @Module({ imports: [ImageManagerModule, DecoratorsModule], - providers: [ImageIdValidator], controllers: [ImageController], }) export class ImageModule implements NestModule { diff --git a/backend/src/routes/routes.module.ts b/backend/src/routes/routes.module.ts index 8bc7306..2c5e866 100644 --- a/backend/src/routes/routes.module.ts +++ b/backend/src/routes/routes.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { PicsurApiModule } from './api/api.module'; -import { ImageModule } from './image/imageroute.module'; +import { ImageModule } from './image/image.module'; @Module({ imports: [PicsurApiModule, ImageModule],