delete Group

This commit is contained in:
Patrick Haßel 2024-11-05 13:09:08 +01:00
parent baa42f0cc8
commit 3881f9b15f
7 changed files with 63 additions and 12 deletions

View File

@ -32,7 +32,7 @@ export class GroupService {
this.api.postList(['Group', 'findAllCommon'], uuid, Group.fromJson, next);
}
findAllJoined(next: Next<Group[]>) {
findAllJoined(next: Next<Group[]>): 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<Group>) {
changeTitle(group: Group, title: string, next?: Next<Group>): 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<Group>) {
changePassword(group: Group, password: string, next?: Next<Group>): 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>(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>): void {
this.api.postNone(['Group', 'delete'], group.uuid, next);
}
}

View File

@ -68,6 +68,19 @@
</div>
</div>
<div class="tile" *ngIf="userService.iOwn(group.value)">
<div class="tileInner">
<div class="tileTitle">
Löschen
</div>
<div class="tileContent">
<button (click)="delete(group.value)">
Löschen
</button>
</div>
</div>
</div>
</ng-container>
</div>

View File

@ -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());
}
}

View File

@ -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();

View File

@ -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

View File

@ -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")

View File

@ -11,4 +11,6 @@ public interface NumbersRepository extends ListCrudRepository<Numbers, String> {
@NonNull
Page<Numbers> findAllByGroup(@NonNull Group group, @NonNull Pageable pageable);
void deleteAllByGroup(@NonNull Group group);
}