From 8b3cf7bbb940f38071158403a26139e35bfdb1a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Tue, 29 Oct 2024 11:14:13 +0100 Subject: [PATCH] database --- application.properties | 2 +- .../src/app/api/Session/AbstractSession.ts | 20 --- .../app/api/Session/AbstractSessionService.ts | 70 -------- .../app/api/Session/sessionFromJsonOrNull.ts | 14 -- .../angular/src/app/api/User/UserCommon.ts | 9 +- .../angular/src/app/api/User/UserPrivate.ts | 10 +- .../angular/src/app/api/User/user.service.ts | 7 +- src/main/angular/src/app/api/group/Group.ts | 35 ++++ .../angular/src/app/api/group/GroupService.ts | 70 ++++++++ .../src/app/api/tools/Numbers/Numbers.ts | 30 ++++ .../tools/Numbers/Session/NumbersSession.ts | 40 ----- .../Session/numbers-session.service.ts | 21 --- .../app/api/tools/Numbers/numbers.service.ts | 19 +++ src/main/angular/src/app/app.component.html | 2 +- src/main/angular/src/app/app.component.ts | 4 +- src/main/angular/src/app/app.routes.ts | 8 +- .../pages/group/group/group.component.html | 38 +++++ .../pages/group/group/group.component.less | 1 + .../app/pages/group/group/group.component.ts | 77 +++++++++ .../pages/group/groups/groups.component.html | 19 +++ .../pages/group/groups/groups.component.less | 1 + .../pages/group/groups/groups.component.ts | 34 ++++ .../group-list/group-list.component.html | 10 ++ .../group-list/group-list.component.less} | 2 +- .../shared/group-list/group-list.component.ts | 40 +++++ .../app/pages/profile/profile.component.html | 2 +- .../app/pages/profile/profile.component.ts | 4 +- .../overview/numbers-overview.component.html | 25 --- .../overview/numbers-overview.component.less | 1 - .../overview/numbers-overview.component.ts | 36 ---- .../session/numbers-session.component.html | 38 ----- .../session/numbers-session.component.less | 1 - .../session/numbers-session.component.ts | 76 --------- .../session-list/session-list.component.html | 10 -- .../session-list/session-list.component.ts | 32 ---- .../src/app/pages/user/user.component.html | 2 +- .../src/app/pages/user/user.component.ts | 4 +- src/main/angular/src/tile.less | 5 + .../AbstractSession.java => group/Group.java} | 26 +-- .../GroupChangePasswordInbound.java} | 4 +- .../GroupChangeTitleRequest.java} | 4 +- .../de/ph87/tools/group/GroupController.java | 54 ++++++ .../java/de/ph87/tools/group/GroupDto.java | 46 +++++ .../GroupJoinRequest.java} | 4 +- .../java/de/ph87/tools/group/GroupMapper.java | 57 +++++++ .../ph87/tools/group/GroupOfUserService.java | 52 ++++++ .../de/ph87/tools/group/GroupRepository.java | 24 +++ .../de/ph87/tools/group/GroupService.java | 124 ++++++++++++++ .../session/AbstractSessionController.java | 160 ------------------ .../tools/session/AbstractSessionDto.java | 60 ------- .../de/ph87/tools/tools/numbers/Numbers.java | 49 ++++++ .../tools/numbers/NumbersController.java | 32 +--- .../ph87/tools/tools/numbers/NumbersDto.java | 27 +++ .../tools/tools/numbers/NumbersSession.java | 13 -- .../tools/numbers/NumbersSessionDto.java | 16 -- src/main/java/de/ph87/tools/user/User.java | 23 +-- .../de/ph87/tools/user/UserCommonDto.java | 13 +- .../de/ph87/tools/user/UserController.java | 4 +- .../de/ph87/tools/user/UserPrivateDto.java | 18 +- .../de/ph87/tools/user/UserPrivateMapper.java | 38 +++++ .../de/ph87/tools/user/UserPublicMapper.java | 30 ++++ .../de/ph87/tools/user/UserRepository.java | 9 + .../java/de/ph87/tools/user/UserService.java | 114 ++++++++----- src/main/resources/application.properties | 4 + 64 files changed, 1024 insertions(+), 800 deletions(-) delete mode 100644 src/main/angular/src/app/api/Session/AbstractSession.ts delete mode 100644 src/main/angular/src/app/api/Session/AbstractSessionService.ts delete mode 100644 src/main/angular/src/app/api/Session/sessionFromJsonOrNull.ts create mode 100644 src/main/angular/src/app/api/group/Group.ts create mode 100644 src/main/angular/src/app/api/group/GroupService.ts create mode 100644 src/main/angular/src/app/api/tools/Numbers/Numbers.ts delete mode 100644 src/main/angular/src/app/api/tools/Numbers/Session/NumbersSession.ts delete mode 100644 src/main/angular/src/app/api/tools/Numbers/Session/numbers-session.service.ts create mode 100644 src/main/angular/src/app/api/tools/Numbers/numbers.service.ts create mode 100644 src/main/angular/src/app/pages/group/group/group.component.html create mode 100644 src/main/angular/src/app/pages/group/group/group.component.less create mode 100644 src/main/angular/src/app/pages/group/group/group.component.ts create mode 100644 src/main/angular/src/app/pages/group/groups/groups.component.html create mode 100644 src/main/angular/src/app/pages/group/groups/groups.component.less create mode 100644 src/main/angular/src/app/pages/group/groups/groups.component.ts create mode 100644 src/main/angular/src/app/pages/group/shared/group-list/group-list.component.html rename src/main/angular/src/app/pages/{tools/numbers/shared/session-list/session-list.component.less => group/shared/group-list/group-list.component.less} (66%) create mode 100644 src/main/angular/src/app/pages/group/shared/group-list/group-list.component.ts delete mode 100644 src/main/angular/src/app/pages/tools/numbers/overview/numbers-overview.component.html delete mode 100644 src/main/angular/src/app/pages/tools/numbers/overview/numbers-overview.component.less delete mode 100644 src/main/angular/src/app/pages/tools/numbers/overview/numbers-overview.component.ts delete mode 100644 src/main/angular/src/app/pages/tools/numbers/session/numbers-session.component.html delete mode 100644 src/main/angular/src/app/pages/tools/numbers/session/numbers-session.component.less delete mode 100644 src/main/angular/src/app/pages/tools/numbers/session/numbers-session.component.ts delete mode 100644 src/main/angular/src/app/pages/tools/numbers/shared/session-list/session-list.component.html delete mode 100644 src/main/angular/src/app/pages/tools/numbers/shared/session-list/session-list.component.ts rename src/main/java/de/ph87/tools/{session/AbstractSession.java => group/Group.java} (73%) rename src/main/java/de/ph87/tools/{session/SessionChangePasswordInbound.java => group/GroupChangePasswordInbound.java} (75%) rename src/main/java/de/ph87/tools/{session/SessionChangeTitleInbound.java => group/GroupChangeTitleRequest.java} (75%) create mode 100644 src/main/java/de/ph87/tools/group/GroupController.java create mode 100644 src/main/java/de/ph87/tools/group/GroupDto.java rename src/main/java/de/ph87/tools/{session/SessionJoinInbound.java => group/GroupJoinRequest.java} (77%) create mode 100644 src/main/java/de/ph87/tools/group/GroupMapper.java create mode 100644 src/main/java/de/ph87/tools/group/GroupOfUserService.java create mode 100644 src/main/java/de/ph87/tools/group/GroupRepository.java create mode 100644 src/main/java/de/ph87/tools/group/GroupService.java delete mode 100644 src/main/java/de/ph87/tools/session/AbstractSessionController.java delete mode 100644 src/main/java/de/ph87/tools/session/AbstractSessionDto.java create mode 100644 src/main/java/de/ph87/tools/tools/numbers/Numbers.java create mode 100644 src/main/java/de/ph87/tools/tools/numbers/NumbersDto.java delete mode 100644 src/main/java/de/ph87/tools/tools/numbers/NumbersSession.java delete mode 100644 src/main/java/de/ph87/tools/tools/numbers/NumbersSessionDto.java create mode 100644 src/main/java/de/ph87/tools/user/UserPrivateMapper.java create mode 100644 src/main/java/de/ph87/tools/user/UserPublicMapper.java diff --git a/application.properties b/application.properties index 8ca9a0a..e5a2708 100644 --- a/application.properties +++ b/application.properties @@ -5,4 +5,4 @@ spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password #- -spring.jpa.hibernate.ddl-auto=update +#spring.jpa.hibernate.ddl-auto=create diff --git a/src/main/angular/src/app/api/Session/AbstractSession.ts b/src/main/angular/src/app/api/Session/AbstractSession.ts deleted file mode 100644 index 142b8e2..0000000 --- a/src/main/angular/src/app/api/Session/AbstractSession.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {UserPublic} from "../User/UserPublic"; - -export abstract class AbstractSession { - - protected constructor( - readonly type: string, - readonly typeDisplayName: string, - readonly uuid: string, - readonly owner: UserPublic, - readonly created: Date, - readonly title: string, - readonly password: string, - readonly users: UserPublic[], - readonly initial: boolean, - ) { - // - - } - -} - diff --git a/src/main/angular/src/app/api/Session/AbstractSessionService.ts b/src/main/angular/src/app/api/Session/AbstractSessionService.ts deleted file mode 100644 index d51e116..0000000 --- a/src/main/angular/src/app/api/Session/AbstractSessionService.ts +++ /dev/null @@ -1,70 +0,0 @@ -import {ApiService} from "../common/api.service"; -import {FromJson, Next} from "../common/types"; -import {AbstractSession} from "./AbstractSession"; -import {Router} from "@angular/router"; -import {UserService} from "../User/user.service"; -import {validateBoolean} from "../common/validators"; - -export abstract class AbstractSessionService { - - protected constructor( - protected readonly api: ApiService, - protected readonly router: Router, - protected readonly userService: UserService, - readonly apiPath: any[], - readonly routerPath: any[], - readonly fromJson: FromJson, - ) { - // - - } - - canAccess(uuid: string, next: Next): void { - this.api.postSingle([...this.apiPath, 'canAccess'], uuid, validateBoolean, next); - } - - get(uuid: string, next: Next): void { - this.api.postSingle([...this.apiPath, 'get'], uuid, this.fromJson, next); - } - - create(next: Next): void { - this.api.getSingle([...this.apiPath, 'create'], this.fromJson, session => { - next(session); - this.userService.refresh(); - }); - } - - changeTitle(session: SESSION, title: string, next?: Next) { - const data = { - uuid: session.uuid, - title: title, - }; - this.api.postSingle([...this.apiPath, 'changeTitle'], data, this.fromJson, next); - } - - changePassword(session: SESSION, password: string, next?: Next) { - const data = { - uuid: session.uuid, - password: password, - }; - this.api.postSingle([...this.apiPath, 'changePassword'], data, this.fromJson, next); - } - - join(uuid: string, password: string, next: Next): void { - const data = { - uuid: uuid, - password: password, - }; - this.api.postSingle([...this.apiPath, 'join'], data, this.fromJson, next); - } - - leave(session: SESSION, next: Next): void { - this.api.postNone([...this.apiPath, 'leave'], session, next); - } - - goto(session: SESSION) { - const url = '/' + this.routerPath.join('/'); - this.router.navigate([url, {uuid: session.uuid}]); - } - -} - diff --git a/src/main/angular/src/app/api/Session/sessionFromJsonOrNull.ts b/src/main/angular/src/app/api/Session/sessionFromJsonOrNull.ts deleted file mode 100644 index 96960be..0000000 --- a/src/main/angular/src/app/api/Session/sessionFromJsonOrNull.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {AbstractSession} from "./AbstractSession"; -import {validateString} from "../common/validators"; -import {NumbersSession} from "../tools/Numbers/Session/NumbersSession"; - -export function sessionFromJsonOrNull(json: any): AbstractSession | null { - const type = validateString(json['type']); - switch (type) { - case 'Numbers': - return NumbersSession.fromJson(json); - default: - console.error("Not implemented: AbstractSession.type=" + type); - return null; - } -} diff --git a/src/main/angular/src/app/api/User/UserCommon.ts b/src/main/angular/src/app/api/User/UserCommon.ts index c21bf41..69a129f 100644 --- a/src/main/angular/src/app/api/User/UserCommon.ts +++ b/src/main/angular/src/app/api/User/UserCommon.ts @@ -1,6 +1,5 @@ -import {validateListIgnoreNullItems, validateString} from "../common/validators"; -import {AbstractSession} from "../Session/AbstractSession"; -import {sessionFromJsonOrNull} from "../Session/sessionFromJsonOrNull"; +import {validateList, validateString} from "../common/validators"; +import {Group} from "../group/Group"; import {UserPublic} from "./UserPublic"; export class UserCommon extends UserPublic { @@ -8,7 +7,7 @@ export class UserCommon extends UserPublic { constructor( publicUuid: string, name: string, - readonly commonSessions: AbstractSession[], + readonly commonGroups: Group[], ) { super(publicUuid, name); } @@ -17,7 +16,7 @@ export class UserCommon extends UserPublic { return new UserCommon( validateString(json['publicUuid']), validateString(json['name']), - validateListIgnoreNullItems(json['commonSessions'], sessionFromJsonOrNull), + validateList(json['commonGroups'], Group.fromJson), ); } diff --git a/src/main/angular/src/app/api/User/UserPrivate.ts b/src/main/angular/src/app/api/User/UserPrivate.ts index 4b51507..290d3ec 100644 --- a/src/main/angular/src/app/api/User/UserPrivate.ts +++ b/src/main/angular/src/app/api/User/UserPrivate.ts @@ -1,7 +1,5 @@ -import {validateDate, validateListIgnoreNullItems, validateString} from "../common/validators"; -import {AbstractSession} from "../Session/AbstractSession"; - -import {sessionFromJsonOrNull} from "../Session/sessionFromJsonOrNull"; +import {validateDate, validateList, validateString} from "../common/validators"; +import {Group} from "../group/Group"; export class UserPrivate { @@ -9,7 +7,7 @@ export class UserPrivate { readonly privateUuid: string, readonly publicUuid: string, readonly created: Date, - readonly sessions: AbstractSession[], + readonly groups: Group[], readonly name: string, ) { // - @@ -20,7 +18,7 @@ export class UserPrivate { validateString(json['privateUuid']), validateString(json['publicUuid']), validateDate(json['created']), - validateListIgnoreNullItems(json['sessions'], sessionFromJsonOrNull), + validateList(json['groups'], Group.fromJson), validateString(json['name']), ); } diff --git a/src/main/angular/src/app/api/User/user.service.ts b/src/main/angular/src/app/api/User/user.service.ts index 89917ae..9b0a562 100644 --- a/src/main/angular/src/app/api/User/user.service.ts +++ b/src/main/angular/src/app/api/User/user.service.ts @@ -6,7 +6,7 @@ import {UserCommon} from "./UserCommon"; import {UserPublic} from "./UserPublic"; import {Router} from "@angular/router"; import {BehaviorSubject, Subscription} from "rxjs"; -import {AbstractSession} from "../Session/AbstractSession"; +import {Group} from "../group/Group"; import {StompService} from "@stomp/ng2-stompjs"; @Injectable({ @@ -60,8 +60,7 @@ export class UserService { return this.subject.subscribe(next); } - owns(session: AbstractSession): boolean { - return this.user?.publicUuid === session.owner.publicUuid; + owns(group: Group): boolean { + return this.user?.publicUuid === group.owner.publicUuid; } - } diff --git a/src/main/angular/src/app/api/group/Group.ts b/src/main/angular/src/app/api/group/Group.ts new file mode 100644 index 0000000..281ab33 --- /dev/null +++ b/src/main/angular/src/app/api/group/Group.ts @@ -0,0 +1,35 @@ +import {UserPublic} from "../User/UserPublic"; +import {validateBoolean, validateDate, validateList, validateString} from "../common/validators"; + +export class Group { + + protected constructor( + readonly uuid: string, + readonly owner: UserPublic, + readonly created: Date, + readonly title: string, + readonly password: string, + readonly users: UserPublic[], + readonly initial: boolean, + ) { + // - + } + + static fromJson(json: any): Group { + return new Group( + validateString(json['uuid']), + UserPublic.fromJson(json['owner']), + validateDate(json['created']), + validateString(json['title']), + validateString(json['password']), + validateList(json['users'], UserPublic.fromJson), + validateBoolean(json['initial']), + ); + } + + static compareCreated(a: Group, b: Group): number { + return a.created.getTime() - b.created.getTime(); + } + +} + diff --git a/src/main/angular/src/app/api/group/GroupService.ts b/src/main/angular/src/app/api/group/GroupService.ts new file mode 100644 index 0000000..72c4ea0 --- /dev/null +++ b/src/main/angular/src/app/api/group/GroupService.ts @@ -0,0 +1,70 @@ +import {ApiService} from "../common/api.service"; +import {Next} from "../common/types"; +import {Group} from "./Group"; +import {Router} from "@angular/router"; +import {UserService} from "../User/user.service"; +import {validateBoolean} from "../common/validators"; +import {Injectable} from "@angular/core"; + +@Injectable({ + providedIn: 'root' +}) +export class GroupService { + + protected constructor( + protected readonly api: ApiService, + protected readonly router: Router, + protected readonly userService: UserService, + ) { + // - + } + + canAccess(uuid: string, next: Next): void { + this.api.postSingle(['Group', 'canAccess'], uuid, validateBoolean, next); + } + + get(uuid: string, next: Next): void { + this.api.postSingle(['Group', 'get'], uuid, Group.fromJson, next); + } + + create(next: Next): void { + this.api.getSingle(['Group', 'create'], Group.fromJson, group => { + next(group); + this.userService.refresh(); + }); + } + + changeTitle(group: Group, title: string, next?: Next) { + const data = { + uuid: group.uuid, + title: title, + }; + this.api.postSingle(['Group', 'changeTitle'], data, Group.fromJson, next); + } + + changePassword(group: Group, password: string, next?: Next) { + const data = { + uuid: group.uuid, + password: password, + }; + this.api.postSingle(['Group', 'changePassword'], data, Group.fromJson, next); + } + + join(uuid: string, password: string, next: Next): void { + const data = { + uuid: uuid, + password: password, + }; + this.api.postSingle(['Group', 'join'], data, Group.fromJson, next); + } + + leave(group: Group, next: Next): void { + this.api.postNone(['Group', 'leave'], group, next); + } + + goto(group: Group) { + this.router.navigate(['Group', {uuid: group.uuid}]); + } + +} + diff --git a/src/main/angular/src/app/api/tools/Numbers/Numbers.ts b/src/main/angular/src/app/api/tools/Numbers/Numbers.ts new file mode 100644 index 0000000..e5cd9ad --- /dev/null +++ b/src/main/angular/src/app/api/tools/Numbers/Numbers.ts @@ -0,0 +1,30 @@ +import {UserPublic} from "../../User/UserPublic"; +import {validateBoolean, validateDate, validateList, validateString} from "../../common/validators"; + +export class Numbers { + + constructor( + readonly uuid: string, + readonly title: string, + readonly owner: UserPublic, + readonly created: Date, + readonly password: string, + readonly users: UserPublic[], + readonly initial: boolean, + ) { + // - + } + + static fromJson(json: any): Numbers { + return new Numbers( + validateString(json['uuid']), + validateString(json['title']), + UserPublic.fromJson(json['owner']), + validateDate(json['created']), + validateString(json['password']), + validateList(json['users'], UserPublic.fromJson), + validateBoolean(json['initial']), + ); + } + +} diff --git a/src/main/angular/src/app/api/tools/Numbers/Session/NumbersSession.ts b/src/main/angular/src/app/api/tools/Numbers/Session/NumbersSession.ts deleted file mode 100644 index c784f3f..0000000 --- a/src/main/angular/src/app/api/tools/Numbers/Session/NumbersSession.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {UserPublic} from "../../../User/UserPublic"; -import {validateBoolean, validateDate, validateList, validateString} from "../../../common/validators"; -import {AbstractSession} from "../../../Session/AbstractSession"; - -export class NumbersSession extends AbstractSession { - - static readonly TYPE = 'Numbers'; - - static readonly TYPE_DISPLAY_NAME = 'Nummern'; - - constructor( - type: string, - uuid: string, - title: string, - owner: UserPublic, - created: Date, - password: string, - users: UserPublic[], - initial: boolean, - ) { - if (type !== NumbersSession.TYPE) { - throw new Error(); - } - super(NumbersSession.TYPE, NumbersSession.TYPE_DISPLAY_NAME, uuid, owner, created, title, password, users, initial); - } - - static fromJson(json: any): NumbersSession { - return new NumbersSession( - validateString(json['type']), - validateString(json['uuid']), - validateString(json['title']), - UserPublic.fromJson(json['owner']), - validateDate(json['created']), - validateString(json['password']), - validateList(json['users'], UserPublic.fromJson), - validateBoolean(json['initial']), - ); - } - -} diff --git a/src/main/angular/src/app/api/tools/Numbers/Session/numbers-session.service.ts b/src/main/angular/src/app/api/tools/Numbers/Session/numbers-session.service.ts deleted file mode 100644 index 923311f..0000000 --- a/src/main/angular/src/app/api/tools/Numbers/Session/numbers-session.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import {Injectable} from '@angular/core'; -import {AbstractSessionService} from "../../../Session/AbstractSessionService"; -import {NumbersSession} from "./NumbersSession"; -import {ApiService} from "../../../common/api.service"; -import {Router} from "@angular/router"; -import {UserService} from "../../../User/user.service"; - -@Injectable({ - providedIn: 'root' -}) -export class NumbersSessionService extends AbstractSessionService { - - constructor( - api: ApiService, - router: Router, - userService: UserService - ) { - super(api, router, userService, ['Numbers'], ['Numbers', 'Session'], NumbersSession.fromJson); - } - -} diff --git a/src/main/angular/src/app/api/tools/Numbers/numbers.service.ts b/src/main/angular/src/app/api/tools/Numbers/numbers.service.ts new file mode 100644 index 0000000..3863d7e --- /dev/null +++ b/src/main/angular/src/app/api/tools/Numbers/numbers.service.ts @@ -0,0 +1,19 @@ +import {Injectable} from '@angular/core'; +import {ApiService} from "../../common/api.service"; +import {Router} from "@angular/router"; +import {UserService} from "../../User/user.service"; + +@Injectable({ + providedIn: 'root' +}) +export class NumbersService { + + constructor( + protected readonly api: ApiService, + protected readonly router: Router, + protected readonly userService: UserService + ) { + // - + } + +} diff --git a/src/main/angular/src/app/app.component.html b/src/main/angular/src/app/app.component.html index d2a99a1..40eb67e 100644 --- a/src/main/angular/src/app/app.component.html +++ b/src/main/angular/src/app/app.component.html @@ -1,7 +1,7 @@