diff --git a/src/models/entities/Permission.ts b/src/models/entities/Permission.ts index b9e2777..86f7d6a 100644 --- a/src/models/entities/Permission.ts +++ b/src/models/entities/Permission.ts @@ -1,12 +1,11 @@ import { IsInt, - IsNotEmpty, - - IsString + IsNotEmpty } from "class-validator"; -import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; -import { User } from './User'; -import { UserGroup } from './UserGroup'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { PermissionAction } from '../enums/PermissionAction'; +import { PermissionTarget } from '../enums/PermissionTargets'; +import { Principal } from './Principal'; /** * Defines the Permission interface. */ @@ -20,30 +19,27 @@ export abstract class Permission { id: number; /** - * users + * The permissions principal */ - @OneToMany(() => User, user => user.permissions, { nullable: true }) - users: User[] - - /** - * groups - */ - @OneToMany(() => UserGroup, group => group.permissions, { nullable: true }) - groups: UserGroup[] + @ManyToOne(() => Principal, principal => principal.permissions) + principal: Principal[] /** * The target */ - @Column() + @Column({ + type: 'simple-enum', + enum: PermissionTarget + }) @IsNotEmpty() - @IsString() - target: string; + target: PermissionTarget; /** * The action type */ - @Column() - @IsNotEmpty() - @IsString() - action: string; + @Column({ + type: 'simple-enum', + enum: PermissionAction + }) + action: PermissionAction; } \ No newline at end of file diff --git a/src/models/entities/Principal.ts b/src/models/entities/Principal.ts new file mode 100644 index 0000000..f1242b5 --- /dev/null +++ b/src/models/entities/Principal.ts @@ -0,0 +1,24 @@ +import { IsInt, IsOptional } from 'class-validator'; +import { Entity, OneToMany, PrimaryGeneratedColumn, TableInheritance } from 'typeorm'; +import { Permission } from './Permission'; + +/** + * Defines a admin user. +*/ +@Entity() +@TableInheritance({ column: { name: "type", type: "varchar" } }) +export abstract class Principal { + /** + * autogenerated unique id (primary key). + */ + @PrimaryGeneratedColumn() + @IsInt() + id: number; + + /** +* permissions +*/ + @IsOptional() + @OneToMany(() => Permission, permission => permission.principal, { nullable: true }) + permissions?: Permission[]; +} \ No newline at end of file diff --git a/src/models/entities/User.ts b/src/models/entities/User.ts index ebc62b1..2b5b9b3 100644 --- a/src/models/entities/User.ts +++ b/src/models/entities/User.ts @@ -1,22 +1,16 @@ import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUUID } from "class-validator"; -import { Column, Entity, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { ChildEntity, Column, JoinTable, ManyToMany, OneToMany } from "typeorm"; import { config } from '../../config'; import { Permission } from './Permission'; +import { Principal } from './Principal'; import { UserAction } from './UserAction'; import { UserGroup } from './UserGroup'; /** * Defines a admin user. */ -@Entity() -export class User { - /** - * autogenerated unique id (primary key). - */ - @PrimaryGeneratedColumn() - @IsInt() - id: number; - +@ChildEntity() +export class User extends Principal { /** * uuid */ @@ -78,13 +72,6 @@ export class User { @IsNotEmpty() password: string; - /** - * permissions - */ - @IsOptional() - @ManyToOne(() => Permission, permission => permission.users, { nullable: true }) - permissions?: Permission[]; - /** * groups */ diff --git a/src/models/entities/UserGroup.ts b/src/models/entities/UserGroup.ts index e86b2a6..21dfe25 100644 --- a/src/models/entities/UserGroup.ts +++ b/src/models/entities/UserGroup.ts @@ -1,29 +1,16 @@ import { - IsInt, IsNotEmpty, IsOptional, IsString } from "class-validator"; -import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; -import { Permission } from "./Permission"; +import { ChildEntity, Column } from "typeorm"; +import { Principal } from './Principal'; /** * Defines the UserGroup interface. */ -@Entity() -export class UserGroup { - /** - * Autogenerated unique id (primary key). - */ - @PrimaryGeneratedColumn() - @IsInt() - id: number; - - /** - * permissions - */ - @ManyToOne(() => Permission, permission => permission.groups, { nullable: true }) - permissions: Permission[]; +@ChildEntity() +export class UserGroup extends Principal { /** * The group's name diff --git a/src/models/enums/PermissionAction.ts b/src/models/enums/PermissionAction.ts new file mode 100644 index 0000000..8ea9e65 --- /dev/null +++ b/src/models/enums/PermissionAction.ts @@ -0,0 +1,6 @@ +export enum PermissionAction { + READ = 'READ', + ADD = 'ADD', + UPDATE = 'UPDATE', + DELETE = 'DELETE' +} \ No newline at end of file diff --git a/src/models/enums/PermissionTargets.ts b/src/models/enums/PermissionTargets.ts new file mode 100644 index 0000000..9a6f040 --- /dev/null +++ b/src/models/enums/PermissionTargets.ts @@ -0,0 +1,8 @@ +export enum PermissionTarget { + RUNNER = 'RUNNER', + ORGANISATION = 'RUNNERORGANISATION', + TEAM = 'RUNNERTEAM', + TRACK = 'TRACK', + USER = 'USER', + GROUP = 'USERGROUP' +} \ No newline at end of file