keys
This commit is contained in:
@@ -7,6 +7,7 @@ import { AuthModule } from './modules/auth/auth.module';
|
||||
import { AuthGuard } from './core/guards/auth.guard';
|
||||
import { UserModule } from './modules/user/user.module';
|
||||
import { RoleModule } from './modules/role/role.module';
|
||||
import { KeyModule } from './modules/key/key.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -18,6 +19,7 @@ import { RoleModule } from './modules/role/role.module';
|
||||
AuthModule,
|
||||
UserModule,
|
||||
RoleModule,
|
||||
KeyModule,
|
||||
],
|
||||
controllers: [AppController],
|
||||
providers: [AppService, AuthGuard],
|
||||
|
||||
8
api/src/model/dto/create-key-system.dto.ts
Normal file
8
api/src/model/dto/create-key-system.dto.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { IsNotEmpty, MaxLength, MinLength } from 'class-validator';
|
||||
|
||||
export class CreateKeySystemDto {
|
||||
@IsNotEmpty()
|
||||
@MinLength(2)
|
||||
@MaxLength(255)
|
||||
name: string;
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
export * from './login.dto';
|
||||
export * from './auth-code.dto';
|
||||
export * from './create-key-system.dto';
|
||||
|
||||
32
api/src/model/entitites/cylinder.entity.ts
Normal file
32
api/src/model/entitites/cylinder.entity.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { Key } from './key.entity';
|
||||
import { KeySystem } from './system.entity';
|
||||
|
||||
@Entity()
|
||||
export class Cylinder {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@Column({ nullable: false, unique: true })
|
||||
name: string;
|
||||
|
||||
@OneToMany(() => Key, (key) => key.cylinder)
|
||||
keys: Key[];
|
||||
|
||||
@ManyToOne(() => KeySystem, (sys) => sys.cylinders)
|
||||
system: KeySystem;
|
||||
|
||||
@CreateDateColumn({ name: 'created_at' })
|
||||
createdAt: Date;
|
||||
|
||||
@UpdateDateColumn({ name: 'updatet_at' })
|
||||
updatedAt: Date;
|
||||
}
|
||||
@@ -1,3 +1,6 @@
|
||||
export * from './sso.user.entity';
|
||||
export * from './user.entity';
|
||||
export * from './role.entity';
|
||||
export * from './cylinder.entity';
|
||||
export * from './key.entity';
|
||||
export * from './key_activity.entity';
|
||||
|
||||
34
api/src/model/entitites/key.entity.ts
Normal file
34
api/src/model/entitites/key.entity.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
ManyToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { Cylinder } from './cylinder.entity';
|
||||
import { IKey } from '../interface/key.interface';
|
||||
|
||||
@Entity()
|
||||
export class Key implements IKey {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
name: string;
|
||||
|
||||
@Column({ name: 'key_number', unique: true })
|
||||
nr: number;
|
||||
|
||||
@Column({ name: 'handed_out', default: false })
|
||||
handedOut: boolean;
|
||||
|
||||
@ManyToOne(() => Cylinder, (cylinder) => cylinder.keys)
|
||||
cylinder: Cylinder;
|
||||
|
||||
@CreateDateColumn({ name: 'created_at' })
|
||||
createdAt: Date;
|
||||
|
||||
@UpdateDateColumn({ name: 'updatet_at' })
|
||||
updatedAt: Date;
|
||||
}
|
||||
37
api/src/model/entitites/key_activity.entity.ts
Normal file
37
api/src/model/entitites/key_activity.entity.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
ManyToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
} from 'typeorm';
|
||||
import { User } from './user.entity';
|
||||
import { IKey } from '../interface/key.interface';
|
||||
import { Cylinder } from './cylinder.entity';
|
||||
|
||||
@Entity()
|
||||
export class KeyActivity implements IKey {
|
||||
@PrimaryGeneratedColumn()
|
||||
primaryId: number;
|
||||
|
||||
@Column()
|
||||
id: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
name: string;
|
||||
|
||||
@Column({ name: 'key_number' })
|
||||
nr: number;
|
||||
|
||||
@Column({ name: 'handed_out', default: false })
|
||||
handedOut: boolean;
|
||||
|
||||
@ManyToOne(() => Cylinder)
|
||||
cylinder: Cylinder;
|
||||
|
||||
@CreateDateColumn({ name: 'created_at' })
|
||||
createdAt: Date;
|
||||
|
||||
@ManyToOne(() => User)
|
||||
user: User;
|
||||
}
|
||||
35
api/src/model/entitites/system.entity.ts
Normal file
35
api/src/model/entitites/system.entity.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import {
|
||||
Column,
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinTable,
|
||||
ManyToMany,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
import { IKeySystem } from '../interface';
|
||||
import { User } from './user.entity';
|
||||
import { Cylinder } from './cylinder.entity';
|
||||
|
||||
@Entity()
|
||||
export class KeySystem implements IKeySystem {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@CreateDateColumn({ name: 'created_at' })
|
||||
createdAt: Date;
|
||||
|
||||
@Column({ nullable: false, unique: true })
|
||||
name: string;
|
||||
|
||||
@ManyToMany(() => User, (manager) => manager.systems)
|
||||
@JoinTable()
|
||||
managers: User[];
|
||||
|
||||
@OneToMany(() => Cylinder, (cylinder) => cylinder.system)
|
||||
cylinders: Cylinder[];
|
||||
|
||||
@UpdateDateColumn({ name: 'updatet_at' })
|
||||
updatedAt: Date;
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
CreateDateColumn,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToMany,
|
||||
ManyToOne,
|
||||
OneToOne,
|
||||
PrimaryGeneratedColumn,
|
||||
@@ -12,6 +13,7 @@ import { IUser } from '../interface';
|
||||
import { SSOUser } from './sso.user.entity';
|
||||
import { IsEmail } from 'class-validator';
|
||||
import { Role } from './role.entity';
|
||||
import { KeySystem } from './system.entity';
|
||||
|
||||
@Entity()
|
||||
export class User implements IUser {
|
||||
@@ -46,6 +48,9 @@ export class User implements IUser {
|
||||
@Transform(({ value }) => value.name)
|
||||
role: Role;
|
||||
|
||||
@ManyToMany(() => KeySystem, (system) => system.managers)
|
||||
systems: KeySystem[];
|
||||
|
||||
accessToken?: string;
|
||||
refreshToken?: string;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
import { Request } from 'express';
|
||||
import { User } from '../entitites';
|
||||
|
||||
export interface AuthenticatedRequest extends Request {
|
||||
user: User;
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
export * from './user.interface';
|
||||
export * from './external-access-token.payload.interface';
|
||||
export * from './payload.interface';
|
||||
export * from './key-system.interface';
|
||||
|
||||
7
api/src/model/interface/key-system.interface.ts
Normal file
7
api/src/model/interface/key-system.interface.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import { IUser } from './user.interface';
|
||||
|
||||
export interface IKeySystem {
|
||||
id: string;
|
||||
name: string;
|
||||
managers: IUser[];
|
||||
}
|
||||
10
api/src/model/interface/key.interface.ts
Normal file
10
api/src/model/interface/key.interface.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Cylinder } from '../entitites';
|
||||
|
||||
export interface IKey {
|
||||
id: string;
|
||||
name: string;
|
||||
nr: number;
|
||||
handedOut: boolean;
|
||||
cylinder: Cylinder;
|
||||
createdAt: Date;
|
||||
}
|
||||
10
api/src/model/repositories/cylinder.repository.ts
Normal file
10
api/src/model/repositories/cylinder.repository.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Repository, DataSource } from 'typeorm';
|
||||
import { Cylinder } from '../entitites';
|
||||
|
||||
@Injectable()
|
||||
export class CylinderRepository extends Repository<Cylinder> {
|
||||
constructor(dataSource: DataSource) {
|
||||
super(Cylinder, dataSource.createEntityManager());
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
export * from './user.repository';
|
||||
export * from './ssouser.repository';
|
||||
export * from './role.repository';
|
||||
export * from './system.repository';
|
||||
export * from './cylinder.repository';
|
||||
export * from './key.repository';
|
||||
export * from './key_activity.repository';
|
||||
|
||||
10
api/src/model/repositories/key.repository.ts
Normal file
10
api/src/model/repositories/key.repository.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Repository, DataSource } from 'typeorm';
|
||||
import { Key } from '../entitites';
|
||||
|
||||
@Injectable()
|
||||
export class KeyRepository extends Repository<Key> {
|
||||
constructor(dataSource: DataSource) {
|
||||
super(Key, dataSource.createEntityManager());
|
||||
}
|
||||
}
|
||||
10
api/src/model/repositories/key_activity.repository.ts
Normal file
10
api/src/model/repositories/key_activity.repository.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Repository, DataSource } from 'typeorm';
|
||||
import { KeyActivity } from '../entitites';
|
||||
|
||||
@Injectable()
|
||||
export class KeyActivityRepository extends Repository<KeyActivity> {
|
||||
constructor(dataSource: DataSource) {
|
||||
super(KeyActivity, dataSource.createEntityManager());
|
||||
}
|
||||
}
|
||||
10
api/src/model/repositories/system.repository.ts
Normal file
10
api/src/model/repositories/system.repository.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Repository, DataSource } from 'typeorm';
|
||||
import { KeySystem } from '../entitites/system.entity';
|
||||
|
||||
@Injectable()
|
||||
export class KeySystemRepository extends Repository<KeySystem> {
|
||||
constructor(dataSource: DataSource) {
|
||||
super(KeySystem, dataSource.createEntityManager());
|
||||
}
|
||||
}
|
||||
40
api/src/modules/key/key.controller.ts
Normal file
40
api/src/modules/key/key.controller.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Req,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { KeyService } from './key.service';
|
||||
import { AuthenticatedRequest } from 'src/model/interface/authenticated-request.interface';
|
||||
import { AuthGuard } from 'src/core/guards/auth.guard';
|
||||
import { Key } from 'src/model/entitites';
|
||||
import { CreateKeySystemDto } from 'src/model/dto/create-key-system.dto';
|
||||
|
||||
@UseGuards(AuthGuard)
|
||||
@Controller('key')
|
||||
export class KeyController {
|
||||
constructor(private service: KeyService) {}
|
||||
|
||||
@Get()
|
||||
getKeys(@Req() req: AuthenticatedRequest) {
|
||||
return this.service.getUsersKeys(req.user);
|
||||
}
|
||||
|
||||
@Put()
|
||||
updateKey(@Req() req: AuthenticatedRequest, @Body() key: Key) {
|
||||
return this.service.updateKey(req.user, key);
|
||||
}
|
||||
|
||||
@Get('cylinder')
|
||||
getCylinders(@Req() req: AuthenticatedRequest) {
|
||||
return this.service.getUsersCylinders(req.user);
|
||||
}
|
||||
|
||||
@Post('system')
|
||||
createKeySystem(@Req() req: AuthenticatedRequest, @Body() body: CreateKeySystemDto) {
|
||||
return this.service.createKeySystem(req.user, body);
|
||||
}
|
||||
}
|
||||
12
api/src/modules/key/key.module.ts
Normal file
12
api/src/modules/key/key.module.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { KeyController } from './key.controller';
|
||||
import { KeyService } from './key.service';
|
||||
import { DatabaseModule } from 'src/shared/database/database.module';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
controllers: [KeyController],
|
||||
providers: [KeyService],
|
||||
imports: [DatabaseModule, AuthModule],
|
||||
})
|
||||
export class KeyModule {}
|
||||
77
api/src/modules/key/key.service.ts
Normal file
77
api/src/modules/key/key.service.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { CreateKeySystemDto } from 'src/model/dto';
|
||||
import { Cylinder, Key, User } from 'src/model/entitites';
|
||||
import {
|
||||
CylinderRepository,
|
||||
KeyActivityRepository,
|
||||
KeyRepository,
|
||||
KeySystemRepository,
|
||||
} from 'src/model/repositories';
|
||||
|
||||
@Injectable()
|
||||
export class KeyService {
|
||||
constructor(
|
||||
private readonly keyrepository: KeyRepository,
|
||||
private readonly cylinderRepository: CylinderRepository,
|
||||
private readonly systemRepo: KeySystemRepository,
|
||||
private activityRepo: KeyActivityRepository,
|
||||
) {}
|
||||
|
||||
async getUsersKeys(user: User): Promise<Key[]> {
|
||||
return this.keyrepository.find({
|
||||
where: { cylinder: { system: { managers: { id: user.id } } } },
|
||||
relations: ['cylinder', 'cylinder.system'],
|
||||
});
|
||||
}
|
||||
|
||||
async updateKey(user: User, key: Key) {
|
||||
if (!user || !user.id) {
|
||||
throw new HttpException('forbidden', HttpStatus.FORBIDDEN);
|
||||
}
|
||||
await this.keyrepository.findOneOrFail({
|
||||
where: { cylinder: { system: { managers: { id: user.id } } } },
|
||||
});
|
||||
|
||||
const original = await this.keyrepository.findOne({
|
||||
where: { id: key.id },
|
||||
relations: ['cylinder'],
|
||||
});
|
||||
this.saveLog(original, user);
|
||||
return this.keyrepository.save(this.keyrepository.create(key));
|
||||
}
|
||||
|
||||
private saveLog(key: Key, user: User) {
|
||||
const l = this.activityRepo.create({
|
||||
cylinder: key.cylinder,
|
||||
handedOut: key.handedOut,
|
||||
name: key.name,
|
||||
id: key.id,
|
||||
nr: key.nr,
|
||||
user: user,
|
||||
});
|
||||
this.activityRepo.save(l);
|
||||
}
|
||||
|
||||
async getUsersCylinders(user: User): Promise<Cylinder[]> {
|
||||
if (!user || !user.id) {
|
||||
throw new HttpException('forbidden', HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
return this.cylinderRepository.find({
|
||||
where: { system: { managers: { id: user.id } } },
|
||||
order: { name: { direction: 'ASC' } },
|
||||
relations: ['system'],
|
||||
});
|
||||
}
|
||||
|
||||
async createKeySystem(user: User, systemDTO: CreateKeySystemDto) {
|
||||
const sys = this.systemRepo.create(systemDTO);
|
||||
sys.managers = [user];
|
||||
try {
|
||||
const res = await this.systemRepo.save(sys);
|
||||
return res;
|
||||
} catch (e) {
|
||||
throw new HttpException(e.code, HttpStatus.UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,27 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Role, SSOUser, User } from 'src/model/entitites';
|
||||
import { RoleRepository, SsoUserRepository, UserRepository } from 'src/model/repositories';
|
||||
import { Cylinder, Key, KeyActivity, Role, SSOUser, User } from 'src/model/entitites';
|
||||
import { KeySystem } from 'src/model/entitites/system.entity';
|
||||
import {
|
||||
CylinderRepository,
|
||||
KeyActivityRepository,
|
||||
KeyRepository,
|
||||
KeySystemRepository,
|
||||
RoleRepository,
|
||||
SsoUserRepository,
|
||||
UserRepository,
|
||||
} from 'src/model/repositories';
|
||||
|
||||
const ENTITIES = [User, SSOUser, Role];
|
||||
const REPOSITORIES = [UserRepository, SsoUserRepository, RoleRepository];
|
||||
const ENTITIES = [User, SSOUser, Role, KeySystem, Key, Cylinder, KeyActivity];
|
||||
const REPOSITORIES = [
|
||||
UserRepository,
|
||||
SsoUserRepository,
|
||||
RoleRepository,
|
||||
KeySystemRepository,
|
||||
KeyRepository,
|
||||
CylinderRepository,
|
||||
KeyActivityRepository,
|
||||
];
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
|
||||
Reference in New Issue
Block a user