From f6acfd83d13bd2e0c606c71445bb154192420f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Wed, 5 Jul 2023 23:45:27 +0200 Subject: [PATCH] Bulk duplicate --- .../angular/src/app/api/bulk/BulkService.ts | 4 ++ .../pages/bulk/list/bulk-list.component.html | 5 +++ .../pages/bulk/list/bulk-list.component.ts | 7 ++- .../angular/src/environments/environment.ts | 2 +- .../de/ph87/homeautomation/bulk/Bulk.java | 32 +++++++------- .../homeautomation/bulk/BulkController.java | 22 ++++++---- .../homeautomation/bulk/BulkRepository.java | 18 ++++---- .../ph87/homeautomation/bulk/BulkWriter.java | 43 ++++++++++++------- .../homeautomation/bulk/entry/BulkEntry.java | 30 +++++++------ 9 files changed, 100 insertions(+), 63 deletions(-) diff --git a/src/main/angular/src/app/api/bulk/BulkService.ts b/src/main/angular/src/app/api/bulk/BulkService.ts index 4a7c526..ca02c0c 100644 --- a/src/main/angular/src/app/api/bulk/BulkService.ts +++ b/src/main/angular/src/app/api/bulk/BulkService.ts @@ -66,6 +66,10 @@ export class BulkService implements ISearchService { this.api.getReturnItem("bulk/run/" + bulk.id, _ => _, next); } + duplicate(bulk: Bulk, next: (item: Bulk) => void): void { + this.api.getReturnItem("bulk/duplicate/" + bulk.id, _ => _, next); + } + setEntry(entry: BulkEntry, key: string, value: any, next: (result: BulkEntry) => void = NO_OP): void { this.api.putReturnItem("BulkEntry/" + entry.id + "/set/" + key, value, next); } diff --git a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html index d622ead..d762c07 100644 --- a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html +++ b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html @@ -8,6 +8,7 @@ Bezeichnung     +   @@ -24,6 +25,10 @@ + + + + diff --git a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts index 361146f..4740b21 100644 --- a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts +++ b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts @@ -1,7 +1,7 @@ import {Component, OnInit} from '@angular/core'; import {BulkService} from "../../../api/bulk/BulkService"; import {Bulk} from "../../../api/bulk/Bulk"; -import {faCheckCircle, faCircle, faPlayCircle, faTimesCircle} from "@fortawesome/free-regular-svg-icons"; +import {faCheckCircle, faCircle, faCopy, faPlayCircle, faTimesCircle} from "@fortawesome/free-regular-svg-icons"; @Component({ selector: 'app-bulk-list', @@ -60,10 +60,15 @@ export class BulkListComponent implements OnInit { } } + duplicate(bulk: Bulk): void { + this.bulkService.duplicate(bulk, bulk => this.addOrReplace(bulk)); + } + delete(bulk: Bulk): void { if (confirm("Zeitplan \"" + bulk.name + "\" wirklich löschen?")) { this.bulkService.delete(bulk, () => this.remove(bulk)); } } + protected readonly faCopy = faCopy; } diff --git a/src/main/angular/src/environments/environment.ts b/src/main/angular/src/environments/environment.ts index 5e41d22..eb18ddd 100644 --- a/src/main/angular/src/environments/environment.ts +++ b/src/main/angular/src/environments/environment.ts @@ -4,7 +4,7 @@ import {getBaseUrl} from "./UrlHelper"; -const PROD: boolean = true; +const PROD: boolean = false; export const environment = { production: false, diff --git a/src/main/java/de/ph87/homeautomation/bulk/Bulk.java b/src/main/java/de/ph87/homeautomation/bulk/Bulk.java index fcb64a2..45eadfa 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/Bulk.java +++ b/src/main/java/de/ph87/homeautomation/bulk/Bulk.java @@ -1,14 +1,10 @@ package de.ph87.homeautomation.bulk; -import de.ph87.homeautomation.bulk.entry.BulkEntry; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import de.ph87.homeautomation.bulk.entry.*; +import lombok.*; import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Entity @Getter @@ -16,33 +12,39 @@ import java.util.List; @NoArgsConstructor @SuppressWarnings("FieldMayBeFinal") public class Bulk { - + @Id @GeneratedValue private long id; - + @Version private long version; - + @Setter private boolean enabled; - + @Setter @Column(nullable = false, unique = true) private String name; - + @ToString.Exclude @OneToMany(cascade = CascadeType.ALL) private List entries = new ArrayList<>(); - + @ToString.Include public int entryCount() { return entries.size(); } - + + public Bulk(final Bulk original, final String name) { + this.enabled = original.isEnabled(); + this.name = name; + this.entries = original.getEntries().stream().map(BulkEntry::new).toList(); + } + public Bulk(final BulkCreateDto dto) { this.enabled = dto.isEnabled(); this.name = dto.getName(); } - + } diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkController.java b/src/main/java/de/ph87/homeautomation/bulk/BulkController.java index c690841..5d5975d 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/BulkController.java +++ b/src/main/java/de/ph87/homeautomation/bulk/BulkController.java @@ -1,12 +1,11 @@ package de.ph87.homeautomation.bulk; -import de.ph87.homeautomation.shared.ISearchController; -import de.ph87.homeautomation.shared.SearchResult; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; +import de.ph87.homeautomation.shared.*; +import lombok.*; +import org.springframework.data.domain.*; import org.springframework.web.bind.annotation.*; -import java.util.List; +import java.util.*; @RestController @RequestMapping("bulk") @@ -26,22 +25,27 @@ public class BulkController implements ISearchController { public Page filter(@RequestBody final BulkFilter filter) { return bulkReader.filter(filter); } - + @GetMapping("delete/{id}") public void delete(@PathVariable final long id) { bulkWriter.delete(id); } - + @GetMapping("run/{id}") public void run(@PathVariable final long id) { bulkWriter.run(id); } - + + @GetMapping("duplicate/{id}") + public BulkDto duplicate(@PathVariable final long id) { + return bulkWriter.duplicate(id); + } + @PostMapping("set/{id}/name") public BulkDto name(@PathVariable final long id, @RequestBody final String name) { return bulkWriter.set(id, bulk -> bulk.setName(name)); } - + @PostMapping("set/{id}/enabled") public BulkDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) { return bulkWriter.set(id, bulk -> bulk.setEnabled(enabled)); diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java b/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java index 522ca4c..180fe96 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java +++ b/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java @@ -1,19 +1,19 @@ package de.ph87.homeautomation.bulk; -import de.ph87.homeautomation.property.Property; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import de.ph87.homeautomation.property.*; +import org.springframework.data.jpa.repository.*; -import java.util.List; -import java.util.Optional; +import java.util.*; public interface BulkRepository extends JpaRepository, JpaSpecificationExecutor { - + @Deprecated(since = "Use 'filter' instead", forRemoval = true) List findAllByNameLikeIgnoreCase(String term); - + Optional findByEntries_Id(long id); - + List findDistinctByEntries_Property(Property property); - + + boolean existsByName(String name); + } diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java b/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java index 87fc401..0ff6f87 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java +++ b/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java @@ -1,52 +1,65 @@ package de.ph87.homeautomation.bulk; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import lombok.*; +import lombok.extern.slf4j.*; +import org.springframework.stereotype.*; +import org.springframework.transaction.annotation.*; -import java.util.function.Consumer; +import java.util.function.*; @Slf4j @Service @Transactional @RequiredArgsConstructor public class BulkWriter { - + private final BulkRepository bulkRepository; - + private final BulkReader bulkReader; - + private final BulkMapper bulkMapper; - + private final BulkExecutor bulkExecutor; - + public Bulk create(final BulkCreateDto dto) { final Bulk bulk = bulkRepository.save(new Bulk(dto)); log.info("Bulk created: {}", bulk); return bulk; } - + public void delete(final long id) { final Bulk bulk = bulkReader.getById(id); bulkRepository.delete(bulk); log.info("Bulk deleted: {}", bulk); } - + public void run(final long id) { final Bulk bulk = bulkReader.getById(id); bulkExecutor.execute(bulk); } - + + public BulkDto duplicate(final long id) { + final Bulk original = bulkReader.getById(id); + int number = 1; + while (true) { + final String copyName = original.getName() + " Kopie " + number; + if (!bulkRepository.existsByName(copyName)) { + final Bulk copy = bulkRepository.save(new Bulk(original, copyName)); + log.info("Bulk duplicated: {}", copy); + return bulkMapper.toDto(copy); + } + } + } + public BulkDto set(final long id, final Consumer consumer) { final Bulk bulk = bulkReader.getById(id); consumer.accept(bulk); log.info("Changed Bulk: {}", bulk); return bulkMapper.toDto(bulk); } - + public BulkDto createDto(final BulkCreateDto dto) { return bulkMapper.toDto(create(dto)); } - + } diff --git a/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java b/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java index 898c43f..3672c6e 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java +++ b/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java @@ -1,10 +1,7 @@ package de.ph87.homeautomation.bulk.entry; -import de.ph87.homeautomation.property.Property; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import de.ph87.homeautomation.property.*; +import lombok.*; import javax.persistence.*; @@ -13,32 +10,39 @@ import javax.persistence.*; @ToString @NoArgsConstructor public class BulkEntry { - + @Id @GeneratedValue private long id; - + @Version private long version; - + @Setter private boolean enabled; - + @Setter private int position; - + @Setter @ManyToOne private Property property; - + @Setter @Column(name = "value_") private double value; - + public BulkEntry(final BulkEntryCreateDto dto, final Property property) { this.position = dto.getPosition(); this.property = property; this.value = dto.getValue(); } - + + @SuppressWarnings("CopyConstructorMissesField") + public BulkEntry(final BulkEntry original) { + this.position = original.getPosition(); + this.property = original.getProperty(); + this.value = original.getValue(); + } + }