From d4f896e398a97bdf9817ad4d2a76b9d93c316456 Mon Sep 17 00:00:00 2001 From: Bastian Wagner Date: Sun, 8 Sep 2024 12:42:08 +0200 Subject: [PATCH] ui --- idp/src/application/user/user.controller.ts | 21 ++++++- idp/src/application/user/user.module.ts | 6 +- idp/src/application/user/user.service.ts | 1 + idp/src/auth/auth.module.ts | 2 + idp/src/client/client.module.ts | 4 +- idp/src/client/client.service.ts | 34 +++++++++- idp/src/core/database/database.module.ts | 3 +- idp/src/model/client.entity.ts | 5 +- idp/src/model/redirect-uri.entity.ts | 21 ++++++- .../components/card/card.component.html | 19 ++++-- .../components/card/card.component.scss | 9 +-- .../components/card/card.component.spec.ts | 10 +-- .../components/card/card.component.ts | 26 +++++++- .../client-admins.component.html | 17 +++++ .../client-admins.component.scss | 21 +++++++ .../client-admins.component.spec.ts | 23 +++++++ .../client-admins/client-admins.component.ts | 36 +++++++++++ .../client-redirect-uris.component.html | 28 +++++++++ .../client-redirect-uris.component.scss | 21 +++++++ .../client-redirect-uris.component.spec.ts | 23 +++++++ .../client-redirect-uris.component.ts | 63 +++++++++++++++++++ .../create-client.component.html | 11 ++-- .../create-client/create-client.component.ts | 6 +- .../app/dashboard/dashboard.component.html | 7 ++- .../src/app/dashboard/dashboard.component.ts | 22 ++++++- idp_client/src/app/model/client.interface.ts | 3 +- idp_client/src/styles.scss | 1 + 27 files changed, 403 insertions(+), 40 deletions(-) create mode 100644 idp_client/src/app/dashboard/components/client-admins/client-admins.component.html create mode 100644 idp_client/src/app/dashboard/components/client-admins/client-admins.component.scss create mode 100644 idp_client/src/app/dashboard/components/client-admins/client-admins.component.spec.ts create mode 100644 idp_client/src/app/dashboard/components/client-admins/client-admins.component.ts create mode 100644 idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.html create mode 100644 idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.scss create mode 100644 idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.spec.ts create mode 100644 idp_client/src/app/dashboard/components/client-redirect-uris/client-redirect-uris.component.ts diff --git a/idp/src/application/user/user.controller.ts b/idp/src/application/user/user.controller.ts index c5f1033..51289a6 100644 --- a/idp/src/application/user/user.controller.ts +++ b/idp/src/application/user/user.controller.ts @@ -1,10 +1,20 @@ -import { Body, Controller, Delete, Get, Param, Post, Req, UseGuards } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Req, + UseGuards, +} from '@nestjs/common'; import { UserService } from './user.service'; import { AuthGuard, Roles, RolesGuard } from 'src/core/secure/guards'; import { Client } from 'src/model/client.entity'; import { AuthenticatedRequest } from 'src/model'; import { CreateClientDto } from 'src/model/dto/create-client.dto'; import { ClientService } from 'src/client/client.service'; +import { RedirectUri } from 'src/model/redirect-uri.entity'; @UseGuards(AuthGuard, RolesGuard) @Controller('app/user') @@ -42,4 +52,13 @@ export class UserController { deleteClient(@Req() req: AuthenticatedRequest, @Param('id') id) { return this.clientService.deleteClient(req.user, id); } + + @Post('clients/:id/redirect') + saveUris( + @Req() req: AuthenticatedRequest, + @Param('id') id, + @Body() uris: RedirectUri[], + ): Promise { + return this.clientService.saveRedirectUris(req.user, id, uris); + } } diff --git a/idp/src/application/user/user.module.ts b/idp/src/application/user/user.module.ts index 4536de8..d9904e4 100644 --- a/idp/src/application/user/user.module.ts +++ b/idp/src/application/user/user.module.ts @@ -2,12 +2,12 @@ import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { SecureModule } from 'src/core/secure/secure.module'; import { UserService } from './user.service'; -import { ClientRepository } from 'src/model/client.entity'; import { ClientService } from 'src/client/client.service'; +import { DatabaseModule } from 'src/core/database/database.module'; @Module({ controllers: [UserController], - imports: [SecureModule], - providers: [UserService, ClientRepository, ClientService], + imports: [SecureModule, DatabaseModule], + providers: [UserService, ClientService], }) export class UserModule {} diff --git a/idp/src/application/user/user.service.ts b/idp/src/application/user/user.service.ts index 49ed7f2..b71c112 100644 --- a/idp/src/application/user/user.service.ts +++ b/idp/src/application/user/user.service.ts @@ -10,6 +10,7 @@ export class UserService { return this.clientRepository.find({ where: { admins: { id: user.id } }, relations: ['admins'], + order: { createdAt: 'ASC' }, }); } } diff --git a/idp/src/auth/auth.module.ts b/idp/src/auth/auth.module.ts index 7aac194..bce61ab 100644 --- a/idp/src/auth/auth.module.ts +++ b/idp/src/auth/auth.module.ts @@ -16,6 +16,7 @@ import { LoggerModule } from 'src/core/logger.module'; import { SessionKey, SessionKeyRepository } from 'src/model/session-key.entity'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { Role, RoleRepository } from 'src/model/role.entity'; +import { DatabaseModule } from 'src/core/database/database.module'; @Module({ providers: [ @@ -47,6 +48,7 @@ import { Role, RoleRepository } from 'src/model/role.entity'; Role, ]), LoggerModule, + DatabaseModule, ], }) export class AuthModule {} diff --git a/idp/src/client/client.module.ts b/idp/src/client/client.module.ts index 2b440ca..a219528 100644 --- a/idp/src/client/client.module.ts +++ b/idp/src/client/client.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common'; import { NestjsFormDataModule } from 'nestjs-form-data'; -import { TypeOrmModule } from '@nestjs/typeorm'; import { LoggerModule } from 'src/core/logger.module'; import { ClientController } from './client.controller'; +import { DatabaseModule } from 'src/core/database/database.module'; @Module({ providers: [], controllers: [ClientController], - imports: [NestjsFormDataModule, TypeOrmModule.forFeature([]), LoggerModule], + imports: [NestjsFormDataModule, DatabaseModule, LoggerModule], }) export class ClientModule {} diff --git a/idp/src/client/client.service.ts b/idp/src/client/client.service.ts index 1ab3315..7cb57c3 100644 --- a/idp/src/client/client.service.ts +++ b/idp/src/client/client.service.ts @@ -1,12 +1,15 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { v4 as uuidv4 } from 'uuid'; import { Client, ClientRepository } from 'src/model/client.entity'; -import { RedirectUri } from 'src/model/redirect-uri.entity'; +import { RedirectRepository, RedirectUri } from 'src/model/redirect-uri.entity'; import { User } from 'src/model/user.entity'; @Injectable() export class ClientService { - constructor(private clientRepo: ClientRepository) {} + constructor( + private clientRepo: ClientRepository, + private uriRepo: RedirectRepository, + ) {} async createClient( user: User, @@ -71,9 +74,36 @@ export class ClientService { }); if (client) { + await this.uriRepo.remove(client.redirectUris); + return this.clientRepo.remove(client); } throw new HttpException('client not found', HttpStatus.BAD_REQUEST); } + + async saveRedirectUris( + user: User, + clientId: string, + uris: RedirectUri[], + ): Promise { + const client = await this.clientRepo.findOne({ + where: { id: clientId, admins: { id: user.id } }, + }); + + if (!client) { + throw new HttpException('client not found', HttpStatus.NOT_FOUND); + } + console.log(uris); + uris.map((u) => { + u.client = client; + }); + const redirects = await this.uriRepo.save(uris); + client.redirectUris = redirects; + await this.clientRepo.save(client); + return this.uriRepo.find({ + where: { client: { id: clientId } }, + order: { createdAt: 'ASC' }, + }); + } } diff --git a/idp/src/core/database/database.module.ts b/idp/src/core/database/database.module.ts index 54a21ff..0868b36 100644 --- a/idp/src/core/database/database.module.ts +++ b/idp/src/core/database/database.module.ts @@ -5,7 +5,7 @@ import { AuthorizationCodeRepository, } from 'src/model/auth-code.entity'; import { Client, ClientRepository } from 'src/model/client.entity'; -import { RedirectUri } from 'src/model/redirect-uri.entity'; +import { RedirectRepository, RedirectUri } from 'src/model/redirect-uri.entity'; import { SessionKey, SessionKeyRepository } from 'src/model/session-key.entity'; import { User, UserRepository } from 'src/model/user.entity'; @@ -15,6 +15,7 @@ const REPOSITORIES = [ ClientRepository, AuthorizationCodeRepository, SessionKeyRepository, + RedirectRepository, ]; @Module({ diff --git a/idp/src/model/client.entity.ts b/idp/src/model/client.entity.ts index e084112..789578c 100644 --- a/idp/src/model/client.entity.ts +++ b/idp/src/model/client.entity.ts @@ -9,6 +9,7 @@ import { OneToMany, ManyToMany, JoinTable, + CreateDateColumn, } from 'typeorm'; import { RedirectUri } from './redirect-uri.entity'; import { AuthorizationCode } from './auth-code.entity'; @@ -19,6 +20,9 @@ export class Client { @PrimaryGeneratedColumn('uuid') id: string; + @CreateDateColumn({ name: 'created_at' }) + createdAt?: Date; + @Column() clientName: string; @@ -30,7 +34,6 @@ export class Client { description: string; @OneToMany(() => RedirectUri, (uri) => uri.client, { - cascade: true, eager: true, }) redirectUris: RedirectUri[]; diff --git a/idp/src/model/redirect-uri.entity.ts b/idp/src/model/redirect-uri.entity.ts index fc6d2e6..a084254 100644 --- a/idp/src/model/redirect-uri.entity.ts +++ b/idp/src/model/redirect-uri.entity.ts @@ -1,14 +1,33 @@ -import { Entity, PrimaryGeneratedColumn, ManyToOne, Column } from 'typeorm'; +import { + Entity, + PrimaryGeneratedColumn, + ManyToOne, + Column, + DataSource, + Repository, + CreateDateColumn, +} from 'typeorm'; import { Client } from './client.entity'; +import { Injectable } from '@nestjs/common'; @Entity() export class RedirectUri { @PrimaryGeneratedColumn('uuid') id: string; + @CreateDateColumn({ name: 'created_at' }) + createdAt?: Date; + @ManyToOne(() => Client, (client) => client.redirectUris) client: Client; @Column() uri: string; } + +@Injectable() +export class RedirectRepository extends Repository { + constructor(dataSource: DataSource) { + super(RedirectUri, dataSource.createEntityManager()); + } +} diff --git a/idp_client/src/app/dashboard/components/card/card.component.html b/idp_client/src/app/dashboard/components/card/card.component.html index e966094..a1fe357 100644 --- a/idp_client/src/app/dashboard/components/card/card.component.html +++ b/idp_client/src/app/dashboard/components/card/card.component.html @@ -1,9 +1,18 @@ -
{{ client.clientName }}
+
+ {{ client.clientName }} +
+
shield_person
{{ client.admins.length }}
+
link
{{ client.redirectUris.length }}
+
+
{{ client.description }}
-