From 9bcf09ff4fa371f89ec4e992ab807cf75c3bf77f Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Fri, 1 Apr 2022 12:04:49 +0200 Subject: [PATCH] move to required ids --- .../src/collections/roledb/roledb.module.ts | 2 +- .../src/collections/roledb/roledb.service.ts | 30 +++++++++---------- backend/src/managers/auth/auth.service.ts | 5 +--- backend/src/models/entities/image.entity.ts | 2 +- backend/src/models/entities/role.entity.ts | 2 +- .../models/entities/syspreference.entity.ts | 2 +- backend/src/models/entities/user.entity.ts | 2 +- .../models/entities/usrpreference.entity.ts | 2 +- .../settings-roles-edit.component.ts | 2 -- frontend/src/app/services/api/info.service.ts | 30 ++++++++++--------- shared/src/dto/idobject.dto.ts | 2 +- shared/src/dto/jwt.dto.ts | 6 ++-- shared/src/entities/image.entity.ts | 2 +- shared/src/entities/role.entity.ts | 2 +- shared/src/entities/syspreference.entity.ts | 2 +- shared/src/entities/user.entity.ts | 2 +- shared/src/entities/usrpreference.ts | 2 +- shared/src/validators/entity-id.validator.ts | 5 ++-- 18 files changed, 48 insertions(+), 54 deletions(-) diff --git a/backend/src/collections/roledb/roledb.module.ts b/backend/src/collections/roledb/roledb.module.ts index c743be0..52a254c 100644 --- a/backend/src/collections/roledb/roledb.module.ts +++ b/backend/src/collections/roledb/roledb.module.ts @@ -32,7 +32,7 @@ export class RolesModule implements OnModuleInit { } private async nukeRoles() { - this.logger.error('Nuking system roles'); + this.logger.warn('Nuking system roles'); const result = await this.rolesService.nukeSystemRoles(true); if (HasFailed(result)) { this.logger.error(`Failed to nuke roles because: ${result.getReason()}`); diff --git a/backend/src/collections/roledb/roledb.service.ts b/backend/src/collections/roledb/roledb.service.ts index 6f72f63..a261c84 100644 --- a/backend/src/collections/roledb/roledb.service.ts +++ b/backend/src/collections/roledb/roledb.service.ts @@ -43,10 +43,8 @@ export class RolesService { } } - public async delete( - role: string | ERoleBackend, - ): AsyncFailable { - const roleToModify = await this.resolve(role); + public async delete(name: string): AsyncFailable { + const roleToModify = await this.findOne(name); if (HasFailed(roleToModify)) return roleToModify; if (UndeletableRolesList.includes(roleToModify.name)) { @@ -75,10 +73,10 @@ export class RolesService { } public async addPermissions( - role: string | ERoleBackend, + name: string, permissions: Permissions, ): AsyncFailable { - const roleToModify = await this.resolve(role); + const roleToModify = await this.findOne(name); if (HasFailed(roleToModify)) return roleToModify; const newPermissions = makeUnique([ @@ -90,10 +88,10 @@ export class RolesService { } public async removePermissions( - role: string | ERoleBackend, + name: string, permissions: Permissions, ): AsyncFailable { - const roleToModify = await this.resolve(role); + const roleToModify = await this.findOne(name); if (HasFailed(roleToModify)) return roleToModify; const newPermissions = roleToModify.permissions.filter( @@ -149,8 +147,8 @@ export class RolesService { } } - public async exists(username: string): Promise { - return HasSuccess(await this.findOne(username)); + public async exists(name: string): Promise { + return HasSuccess(await this.findOne(name)); } public async nukeSystemRoles(IAmSure: boolean = false): AsyncFailable { @@ -168,18 +166,18 @@ export class RolesService { } private async resolve( - user: string | ERoleBackend, + role: string | ERoleBackend, ): AsyncFailable { - if (typeof user === 'string') { - return await this.findOne(user); + if (typeof role === 'string') { + return await this.findOne(role); } else { - user = plainToClass(ERoleBackend, user); - const errors = await strictValidate(user); + role = plainToClass(ERoleBackend, role); + const errors = await strictValidate(role); if (errors.length > 0) { this.logger.warn(errors); return Fail('Invalid role'); } - return user; + return role; } } } diff --git a/backend/src/managers/auth/auth.service.ts b/backend/src/managers/auth/auth.service.ts index 54a7ae7..df6dd3c 100644 --- a/backend/src/managers/auth/auth.service.ts +++ b/backend/src/managers/auth/auth.service.ts @@ -14,10 +14,7 @@ export class AuthManagerService { async createToken(user: EUserBackend): AsyncFailable { const jwtData: JwtDataDto = plainToClass(JwtDataDto, { - user: { - username: user.username, - roles: user.roles, - }, + user, }); // Validate to be sure, this makes client experience better diff --git a/backend/src/models/entities/image.entity.ts b/backend/src/models/entities/image.entity.ts index a863952..a869f56 100644 --- a/backend/src/models/entities/image.entity.ts +++ b/backend/src/models/entities/image.entity.ts @@ -4,7 +4,7 @@ import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class EImageBackend extends EImage { @PrimaryGeneratedColumn("uuid") - override id?: string; + override id: string; @Index() @Column({ unique: true, nullable: false }) diff --git a/backend/src/models/entities/role.entity.ts b/backend/src/models/entities/role.entity.ts index 0632857..2cd21ea 100644 --- a/backend/src/models/entities/role.entity.ts +++ b/backend/src/models/entities/role.entity.ts @@ -5,7 +5,7 @@ import { Permissions } from '../dto/permissions.dto'; @Entity() export class ERoleBackend extends ERole { @PrimaryGeneratedColumn("uuid") - override id?: string; + override id: string; @Index() @Column({ nullable: false, unique: true }) diff --git a/backend/src/models/entities/syspreference.entity.ts b/backend/src/models/entities/syspreference.entity.ts index cf8c12f..44dd11c 100644 --- a/backend/src/models/entities/syspreference.entity.ts +++ b/backend/src/models/entities/syspreference.entity.ts @@ -4,7 +4,7 @@ import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class ESysPreferenceBackend extends ESysPreference { @PrimaryGeneratedColumn("uuid") - override id?: string; + override id: string; @Index() @Column({ nullable: false, unique: true }) diff --git a/backend/src/models/entities/user.entity.ts b/backend/src/models/entities/user.entity.ts index 4dfd137..9d14bf8 100644 --- a/backend/src/models/entities/user.entity.ts +++ b/backend/src/models/entities/user.entity.ts @@ -6,7 +6,7 @@ import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class EUserBackend extends EUser { @PrimaryGeneratedColumn("uuid") - override id?: string; + override id: string; @Index() @Column({ nullable: false, unique: true }) diff --git a/backend/src/models/entities/usrpreference.entity.ts b/backend/src/models/entities/usrpreference.entity.ts index 1cd6419..502d319 100644 --- a/backend/src/models/entities/usrpreference.entity.ts +++ b/backend/src/models/entities/usrpreference.entity.ts @@ -3,7 +3,7 @@ import { Column, Index, PrimaryGeneratedColumn } from 'typeorm'; export class EUsrPreferenceBackend extends EUsrPreference { @PrimaryGeneratedColumn("uuid") - override id?: string; + override id: string; @Index() @Column({ nullable: false, unique: true }) diff --git a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts index 9fac206..36b93ef 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts +++ b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts @@ -55,8 +55,6 @@ export class SettingsRolesEditComponent implements OnInit { this.mode = EditMode.add; return; } - - // Set data thats already known this.mode = EditMode.edit; this.model.putRoleName(rolename); diff --git a/frontend/src/app/services/api/info.service.ts b/frontend/src/app/services/api/info.service.ts index 2d02897..e5c0e34 100644 --- a/frontend/src/app/services/api/info.service.ts +++ b/frontend/src/app/services/api/info.service.ts @@ -4,11 +4,10 @@ import { isSemVer } from 'class-validator'; import { InfoResponse } from 'picsur-shared/dist/dto/api/info.dto'; import { AsyncFailable, - Fail, - Failable, - HasFailed + Fail, HasFailed } from 'picsur-shared/dist/types'; import { BehaviorSubject } from 'rxjs'; +import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto'; import { UtilService } from 'src/app/util/util.service'; import pkg from '../../../../package.json'; import { ServerInfo } from '../../models/dto/server-info.dto'; @@ -28,12 +27,7 @@ export class InfoService { private infoSubject = new BehaviorSubject(new ServerInfo()); constructor(private api: ApiService, private utilService: UtilService) { - this.init().catch(this.logger.error); - } - - private async init() { - await this.pollInfo(); - this.checkCompatibility(); + this.checkCompatibility().catch(this.logger.error); } public async pollInfo(): AsyncFailable { @@ -52,8 +46,8 @@ export class InfoService { // If either version starts with 0. it has to be exactly the same // If both versions start with something else, they have to match the first part - public isCompatibleWithServer(): Failable { - const info = this.infoSubject.getValue(); + public async isCompatibleWithServer(): AsyncFailable { + const info = await this.pollInfo(); if (HasFailed(info)) return info; const serverVersion = info.version; @@ -81,10 +75,18 @@ export class InfoService { } } - private checkCompatibility(): void { - const isCompatible = this.isCompatibleWithServer(); + private async checkCompatibility() { + const isCompatible = await this.isCompatibleWithServer(); - if (HasFailed(isCompatible) || !isCompatible) { + if (HasFailed(isCompatible)) { + this.utilService.showSnackBar( + 'There was an error checking compatibility', + SnackBarType.Warning + ); + return; + } + + if (!isCompatible) { this.utilService .showDialog({ title: 'Server is not compatible', diff --git a/shared/src/dto/idobject.dto.ts b/shared/src/dto/idobject.dto.ts index dfea5a9..2d050cb 100644 --- a/shared/src/dto/idobject.dto.ts +++ b/shared/src/dto/idobject.dto.ts @@ -2,5 +2,5 @@ import { EntityID } from '../validators/entity-id.validator'; export class EntityIDObject { @EntityID() - id: number; + id: string; } diff --git a/shared/src/dto/jwt.dto.ts b/shared/src/dto/jwt.dto.ts index 599449f..f30704f 100644 --- a/shared/src/dto/jwt.dto.ts +++ b/shared/src/dto/jwt.dto.ts @@ -1,12 +1,12 @@ import { Type } from 'class-transformer'; import { IsDefined, IsInt, IsOptional, ValidateNested } from 'class-validator'; -import { NameRolesUser } from '../entities/user.entity'; +import { EUser } from '../entities/user.entity'; export class JwtDataDto { @IsDefined() @ValidateNested() - @Type(() => NameRolesUser) - user: NameRolesUser; + @Type(() => EUser) + user: EUser; @IsOptional() @IsInt() diff --git a/shared/src/entities/image.entity.ts b/shared/src/entities/image.entity.ts index 403f0e1..16b1861 100644 --- a/shared/src/entities/image.entity.ts +++ b/shared/src/entities/image.entity.ts @@ -4,7 +4,7 @@ import { EntityID } from '../validators/entity-id.validator'; export class EImage { @EntityID() - id?: string; + id: string; @IsHash('sha256') hash: string; diff --git a/shared/src/entities/role.entity.ts b/shared/src/entities/role.entity.ts index 0eaa3da..d828ec3 100644 --- a/shared/src/entities/role.entity.ts +++ b/shared/src/entities/role.entity.ts @@ -19,5 +19,5 @@ export class RoleNamePermsObject extends RoleNameObject { export class ERole extends RoleNamePermsObject { @EntityID() - id?: string; + id: string; } diff --git a/shared/src/entities/syspreference.entity.ts b/shared/src/entities/syspreference.entity.ts index 1d7b797..7a8838b 100644 --- a/shared/src/entities/syspreference.entity.ts +++ b/shared/src/entities/syspreference.entity.ts @@ -3,7 +3,7 @@ import { EntityID } from '../validators/entity-id.validator'; export class ESysPreference { @EntityID() - id?: string; + id: string; @IsNotEmpty() @IsString() diff --git a/shared/src/entities/user.entity.ts b/shared/src/entities/user.entity.ts index 0c7a4d0..cd7b27a 100644 --- a/shared/src/entities/user.entity.ts +++ b/shared/src/entities/user.entity.ts @@ -28,7 +28,7 @@ export class NameRolesUser extends UsernameUser { // Actual entity that goes in the db export class EUser extends NameRolesUser { @EntityID() - id?: string; + id: string; @IsOptional() @Exclude() diff --git a/shared/src/entities/usrpreference.ts b/shared/src/entities/usrpreference.ts index 2377cde..ad81164 100644 --- a/shared/src/entities/usrpreference.ts +++ b/shared/src/entities/usrpreference.ts @@ -4,7 +4,7 @@ import { IsPosInt } from '../validators/positive-int.validator'; export class EUsrPreference { @EntityID() - id?: string; + id: string; @IsNotEmpty() @IsString() diff --git a/shared/src/validators/entity-id.validator.ts b/shared/src/validators/entity-id.validator.ts index ff2e0f5..9071cbd 100644 --- a/shared/src/validators/entity-id.validator.ts +++ b/shared/src/validators/entity-id.validator.ts @@ -1,5 +1,4 @@ -import { IsNotEmpty, IsOptional, IsUUID } from 'class-validator'; +import { IsNotEmpty, IsUUID } from 'class-validator'; import { CombinePDecorators } from '../util/decorator'; -export const EntityID = CombinePDecorators(IsOptional(), IsUUID('4')); -export const EntityIDRequired = CombinePDecorators(IsNotEmpty(), IsUUID('4')); +export const EntityID = CombinePDecorators(IsNotEmpty(), IsUUID('4'));