diff --git a/src/main/angular/src/app/api/group/group.service.ts b/src/main/angular/src/app/api/group/group.service.ts index 586271b..b240b65 100644 --- a/src/main/angular/src/app/api/group/group.service.ts +++ b/src/main/angular/src/app/api/group/group.service.ts @@ -32,7 +32,7 @@ export class GroupService { this.api.postList(['Group', 'findAllCommon'], uuid, Group.fromJson, next); } - findAllJoined(next: Next) { + findAllJoined(next: Next): void { this.api.getList(['Group', 'findAllJoined'], Group.fromJson, next); } @@ -40,7 +40,7 @@ export class GroupService { this.api.getSingle(['Group', 'create'], Group.fromJson, next); } - changeTitle(group: Group, title: string, next?: Next) { + changeTitle(group: Group, title: string, next?: Next): void { const data = { uuid: group.uuid, title: title, @@ -48,7 +48,7 @@ export class GroupService { this.api.postSingle(['Group', 'changeTitle'], data, Group.fromJson, next); } - changePassword(group: Group, password: string, next?: Next) { + changePassword(group: Group, password: string, next?: Next): void { const data = { uuid: group.uuid, password: password, @@ -68,7 +68,7 @@ export class GroupService { this.api.postNone(['Group', 'leave'], group, next); } - goto(uuid: string) { + goto(uuid: string): void { this.router.navigate(['Group', uuid]); } @@ -76,5 +76,13 @@ export class GroupService { return new Subscribed(Group.sameUuid, (group, next) => this.api.subscribe(['Group', group.uuid], Group.fromJson, next)); } + gotoGroups(): void { + this.router.navigate(['Groups']); + } + + delete(group: Group, next: Next): void { + this.api.postNone(['Group', 'delete'], group.uuid, next); + } + } diff --git a/src/main/angular/src/app/pages/group/group/group.component.html b/src/main/angular/src/app/pages/group/group/group.component.html index fb311ca..bacbae2 100644 --- a/src/main/angular/src/app/pages/group/group/group.component.html +++ b/src/main/angular/src/app/pages/group/group/group.component.html @@ -68,6 +68,19 @@ +
+
+
+ Löschen +
+
+ +
+
+
+ diff --git a/src/main/angular/src/app/pages/group/group/group.component.ts b/src/main/angular/src/app/pages/group/group/group.component.ts index 357d10e..fa24ef5 100644 --- a/src/main/angular/src/app/pages/group/group/group.component.ts +++ b/src/main/angular/src/app/pages/group/group/group.component.ts @@ -80,18 +80,22 @@ export class GroupComponent implements OnInit, OnDestroy { this.group.unsubscribe(); } - protected changeTitle(group: Group, title: string) { + protected changeTitle(group: Group, title: string): void { this.groupService.changeTitle(group, title, group => this.group.value = group); } - protected changePassword(group: Group, password: string) { + protected changePassword(group: Group, password: string): void { this.groupService.changePassword(group, password, group => this.group.value = group); } - protected join(password: string) { + protected join(password: string): void { if (this.uuid) { this.groupService.join(this.uuid, password, group => this.group.value = group); } } + protected delete(group: Group): void { + this.groupService.delete(group, () => this.groupService.gotoGroups()); + } + } diff --git a/src/main/java/de/ph87/tools/group/Group.java b/src/main/java/de/ph87/tools/group/Group.java index ab508d1..9ed3fc9 100644 --- a/src/main/java/de/ph87/tools/group/Group.java +++ b/src/main/java/de/ph87/tools/group/Group.java @@ -26,6 +26,7 @@ public class Group extends GroupAbstract implements IWebSocketMessage { private String uuid = UUID.randomUUID().toString(); @Transient + @ToString.Exclude private GroupUuid _uuid; @NonNull @@ -37,9 +38,16 @@ public class Group extends GroupAbstract implements IWebSocketMessage { } @NonNull + @ToString.Exclude @ManyToOne(optional = false) private User owner; + @NonNull + @ToString.Include + public String ownerPublicUuid() { + return getOwner().getPublicUuid().toString(); + } + @NonNull @Column(nullable = false) private ZonedDateTime created = ZonedDateTime.now(); diff --git a/src/main/java/de/ph87/tools/group/GroupAccessService.java b/src/main/java/de/ph87/tools/group/GroupAccessService.java index 43ad36e..af00e0b 100644 --- a/src/main/java/de/ph87/tools/group/GroupAccessService.java +++ b/src/main/java/de/ph87/tools/group/GroupAccessService.java @@ -1,6 +1,7 @@ package de.ph87.tools.group; import de.ph87.tools.group.uuid.GroupUuid; +import de.ph87.tools.tools.numbers.NumbersRepository; import de.ph87.tools.user.User; import de.ph87.tools.user.UserService; import de.ph87.tools.user.uuid.UserPrivateUuid; @@ -23,7 +24,9 @@ public class GroupAccessService { private final UserService userService; - public boolean canAccess(@NonNull final GroupUuid groupUuid, @Nullable final UserPrivateUuid userPrivateUuid) { + private final NumbersRepository numbersRepository; + + public boolean canAccess(@Nullable final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { final User user = userService.accessOrNull(userPrivateUuid); if (user == null) { return false; @@ -32,6 +35,13 @@ public class GroupAccessService { return group.getUsers().contains(user); } + public void delete(@NonNull final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { + final GroupAccess groupAccess = accessAsOwner(userPrivateUuid, groupUuid); + numbersRepository.deleteAllByGroup(groupAccess.group); + groupRepository.delete(groupAccess.group); + log.info("Group deleted: group={}", groupAccess.group); + } + @NonNull public GroupAccess access(@NonNull final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { final User user = userService.access(userPrivateUuid); @@ -39,12 +49,13 @@ public class GroupAccessService { return new GroupAccess(user, group); } + @NonNull public GroupAccess accessAsOwner(@NonNull final UserPrivateUuid userPrivateUuid, @NonNull final GroupUuid groupUuid) { - final GroupAccess access = access(userPrivateUuid, groupUuid); - if (!access.group.isOwnedBy(access.user)) { + final GroupAccess groupAccess = access(userPrivateUuid, groupUuid); + if (!groupAccess.group.isOwnedBy(groupAccess.user)) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST); } - return access; + return groupAccess; } @NonNull diff --git a/src/main/java/de/ph87/tools/group/GroupController.java b/src/main/java/de/ph87/tools/group/GroupController.java index c42013b..77ef264 100644 --- a/src/main/java/de/ph87/tools/group/GroupController.java +++ b/src/main/java/de/ph87/tools/group/GroupController.java @@ -31,7 +31,12 @@ public class GroupController { @PostMapping("canAccess") public boolean canAccess(@Nullable final UserPrivateUuid privateUuid, @NonNull final GroupUuid groupUuid) { - return groupAccessService.canAccess(groupUuid, privateUuid); + return groupAccessService.canAccess(privateUuid, groupUuid); + } + + @PostMapping("delete") + public void delete(@NonNull final UserPrivateUuid privateUuid, @NonNull final GroupUuid groupUuid) { + groupAccessService.delete(privateUuid, groupUuid); } @PostMapping("get") diff --git a/src/main/java/de/ph87/tools/tools/numbers/NumbersRepository.java b/src/main/java/de/ph87/tools/tools/numbers/NumbersRepository.java index 35204da..06ec9df 100644 --- a/src/main/java/de/ph87/tools/tools/numbers/NumbersRepository.java +++ b/src/main/java/de/ph87/tools/tools/numbers/NumbersRepository.java @@ -11,4 +11,6 @@ public interface NumbersRepository extends ListCrudRepository { @NonNull Page findAllByGroup(@NonNull Group group, @NonNull Pageable pageable); + void deleteAllByGroup(@NonNull Group group); + }