diff --git a/src/main/angular/package-lock.json b/src/main/angular/package-lock.json index 0f0a484..d81d54f 100644 --- a/src/main/angular/package-lock.json +++ b/src/main/angular/package-lock.json @@ -1671,10 +1671,10 @@ "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@fortawesome/free-solid-svg-icons": { + "@fortawesome/free-regular-svg-icons": { "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.36" } diff --git a/src/main/angular/package.json b/src/main/angular/package.json index 771a98f..cc5f4a6 100644 --- a/src/main/angular/package.json +++ b/src/main/angular/package.json @@ -20,7 +20,7 @@ "@angular/router": "~12.2.0", "@fortawesome/angular-fontawesome": "^0.9.0", "@fortawesome/fontawesome-svg-core": "^1.2.35", - "@fortawesome/free-solid-svg-icons": "^5.15.3", + "@fortawesome/free-regular-svg-icons": "^5.15.4", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" diff --git a/src/main/angular/src/app/api/api.service.ts b/src/main/angular/src/app/api/api.service.ts index 2ffb588..5dc931b 100644 --- a/src/main/angular/src/app/api/api.service.ts +++ b/src/main/angular/src/app/api/api.service.ts @@ -10,6 +10,13 @@ export function NO_SORT(a: T, b: T): number { return 0; } +function errorInterceptor(errorHandler: (error: any) => void): ((error: any) => void) { + return error => { + console.error(error); + errorHandler(error); + }; +} + @Injectable({ providedIn: 'root' }) @@ -21,31 +28,24 @@ export class ApiService { // nothing } - getItem(path: string, fromJson: (json: any) => T, next: (item: T) => void = NO_OP, errorHandler: (error: any) => void = NO_OP) { - this.http.get(environment.apiBasePath + path).pipe(map(fromJson)).subscribe(next, this.getErrorHandler(errorHandler)); + getItem(path: string, fromJson: (json: any) => T, next: (item: T) => void = NO_OP, error: (error: any) => void = NO_OP) { + this.http.get(environment.apiBasePath + path).pipe(map(fromJson)).subscribe(next, errorInterceptor(error)); } - getList(path: string, fromJson: (json: any) => T, compare: (a: T, b: T) => number = NO_SORT, next: (list: T[]) => void = NO_OP, errorHandler: (error: any) => void = NO_OP) { - this.http.get(environment.apiBasePath + path).pipe(map(list => list.map(fromJson).sort(compare))).subscribe(next, this.getErrorHandler(errorHandler)); + getList(path: string, fromJson: (json: any) => T, compare: (a: T, b: T) => number = NO_SORT, next: (list: T[]) => void = NO_OP, error: (error: any) => void = NO_OP) { + this.http.get(environment.apiBasePath + path).pipe(map(list => list.map(fromJson).sort(compare))).subscribe(next, errorInterceptor(error)); } - postReturnNone(path: string, data: any, next: (_: void) => void = NO_OP, errorHandler: (error: any) => void = NO_OP) { - this.http.post(environment.apiBasePath + path, data).subscribe(next, this.getErrorHandler(errorHandler)); + postReturnNone(path: string, data: any, next: (_: void) => void = NO_OP, error: (error: any) => void = NO_OP) { + this.http.post(environment.apiBasePath + path, data).subscribe(next, errorInterceptor(error)); } - postReturnItem(path: string, data: any, fromJson: (json: any) => T, next: (item: T) => void = NO_OP, errorHandler: (error: any) => void = NO_OP) { - this.http.post(environment.apiBasePath + path, data).pipe(map(fromJson)).subscribe(next, this.getErrorHandler(errorHandler)); + postReturnItem(path: string, data: any, fromJson: (json: any) => T, next: (item: T) => void = NO_OP, error: (error: any) => void = NO_OP) { + this.http.post(environment.apiBasePath + path, data).pipe(map(fromJson)).subscribe(next, errorInterceptor(error)); } - postReturnList(path: string, data: any, fromJson: (json: any) => T, next: (list: T[]) => void = NO_OP, errorHandler: (error: any) => void = NO_OP) { - this.http.post(environment.apiBasePath + path, data).pipe(map(list => list.map(fromJson))).subscribe(next, this.getErrorHandler(errorHandler)); - } - - private getErrorHandler(errorHandler: (error: any) => void): ((error: any) => void) { - return error => { - console.error(error); - errorHandler(error); - }; + postReturnList(path: string, data: any, fromJson: (json: any) => T, next: (list: T[]) => void = NO_OP, error: (error: any) => void = NO_OP) { + this.http.post(environment.apiBasePath + path, data).pipe(map(list => list.map(fromJson))).subscribe(next, errorInterceptor(error)); } } diff --git a/src/main/angular/src/app/api/schedule/entry/schedule-entry.service.ts b/src/main/angular/src/app/api/schedule/entry/schedule-entry.service.ts index ee489b7..a2340ef 100644 --- a/src/main/angular/src/app/api/schedule/entry/schedule-entry.service.ts +++ b/src/main/angular/src/app/api/schedule/entry/schedule-entry.service.ts @@ -1,6 +1,7 @@ import {Injectable} from '@angular/core'; import {ScheduleEntry} from "./ScheduleEntry"; import {ApiService, NO_OP} from "../../api.service"; +import {Schedule} from "../Schedule"; @Injectable({ providedIn: 'root' @@ -13,12 +14,20 @@ export class ScheduleEntryService { // nothing } - findAll(next: (list: ScheduleEntry[]) => void, compare: (a: ScheduleEntry, b: ScheduleEntry) => number, errorHandler: (error: any) => void = NO_OP): void { - this.api.getList("scheduleEntry/findAll", ScheduleEntry.fromJson, compare, next, errorHandler); + findAll(next: (list: ScheduleEntry[]) => void, compare: (a: ScheduleEntry, b: ScheduleEntry) => number, error: (error: any) => void = NO_OP): void { + this.api.getList("scheduleEntry/findAll", ScheduleEntry.fromJson, compare, next, error); } - set(entry: ScheduleEntry, key: string, value: any, next: (item: ScheduleEntry) => void, errorHandler: (error: any) => void = NO_OP): void { - this.api.postReturnItem("schedule/entry/set/" + entry.id + "/" + key, value, ScheduleEntry.fromJson, next, errorHandler); + set(entry: ScheduleEntry, key: string, value: any, next: (item: ScheduleEntry) => void, error: (error: any) => void = NO_OP): void { + this.api.postReturnItem("schedule/entry/set/" + entry.id + "/" + key, value, ScheduleEntry.fromJson, next, error); + } + + create(schedule: Schedule, next: (item: ScheduleEntry) => void, error: (error: any) => void = NO_OP): void { + this.api.getItem("schedule/entry/create/" + schedule.id, ScheduleEntry.fromJson, next, error); + } + + delete(entry: ScheduleEntry, next: () => void, error: (error: any) => void = NO_OP): void { + this.api.getItem("schedule/entry/delete/" + entry.id, _ => _, next, error); } } diff --git a/src/main/angular/src/app/api/schedule/schedule.service.ts b/src/main/angular/src/app/api/schedule/schedule.service.ts index 0cbaaac..e2a4aa9 100644 --- a/src/main/angular/src/app/api/schedule/schedule.service.ts +++ b/src/main/angular/src/app/api/schedule/schedule.service.ts @@ -13,16 +13,24 @@ export class ScheduleService { // nothing } - findAll(next: (list: Schedule[]) => void, compare: (a: Schedule, b: Schedule) => number, errorHandler: (error: any) => void = NO_OP): void { - this.api.getList("schedule/findAll", Schedule.fromJson, compare, next, errorHandler); + findAll(next: (list: Schedule[]) => void, compare: (a: Schedule, b: Schedule) => number, error: (error: any) => void = NO_OP): void { + this.api.getList("schedule/findAll", Schedule.fromJson, compare, next, error); } - set(schedule: Schedule, key: string, value: any, next: (item: Schedule) => void, errorHandler: (error: any) => void = NO_OP): void { - this.api.postReturnItem("schedule/set/" + schedule.id + "/" + key, value, Schedule.fromJson, next, errorHandler); + set(schedule: Schedule, key: string, value: any, next: (item: Schedule) => void, error: (error: any) => void = NO_OP): void { + this.api.postReturnItem("schedule/set/" + schedule.id + "/" + key, value, Schedule.fromJson, next, error); } - findById(id: number, next: (item: Schedule) => void, errorHandler: (error: any) => void = NO_OP): void { - this.api.getItem("schedule/findById/" + id, Schedule.fromJson, next, errorHandler); + findById(id: number, next: (item: Schedule) => void, error: (error: any) => void = NO_OP): void { + this.api.getItem("schedule/findById/" + id, Schedule.fromJson, next, error); + } + + create(next: (item: Schedule) => void, error: (error: any) => void = NO_OP): void { + this.api.getItem("schedule/create/", Schedule.fromJson, next, error); + } + + delete(schedule: Schedule, next: () => void, error: (error: any) => void = NO_OP): void { + this.api.getItem("schedule/delete/" + schedule.id, _ => _, next, error); } } diff --git a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.html b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.html index 0e7db62..ef20ff0 100644 --- a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.html +++ b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.html @@ -2,14 +2,26 @@   Bezeichnung +   + - - + + + {{schedule.name}} + + + + + + +

+ +

diff --git a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.less b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.less index da84fc9..d287ae9 100644 --- a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.less +++ b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.less @@ -10,22 +10,6 @@ th { background-color: lightblue; } -tr.blank { - - th, td { - border: none; - } - -} - -tr.header { - - th:not(:first-child), td:not(:first-child) { - border: none; - } - -} - .empty { text-align: center; color: gray; @@ -57,7 +41,7 @@ tr.header { padding-right: 0; } -.minute { +.middle { border-right-width: 0; border-left-width: 0; padding-right: 0; @@ -69,11 +53,8 @@ tr.header { padding-left: 0; } -.middle { - border-right-width: 0; - border-left-width: 0; - padding-right: 0; - padding-left: 0; +.delete { + color: darkred; } .disabled { diff --git a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.ts b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.ts index a1cf64c..2eb230b 100644 --- a/src/main/angular/src/app/pages/schedule-list/schedule-list.component.ts +++ b/src/main/angular/src/app/pages/schedule-list/schedule-list.component.ts @@ -1,7 +1,7 @@ import {Component, OnInit} from '@angular/core'; import {ScheduleService} from "../../api/schedule/schedule.service"; import {Schedule} from "../../api/schedule/Schedule"; -import {faCheck, faTimes} from '@fortawesome/free-solid-svg-icons'; +import {faCheckCircle, faCircle, faTimesCircle} from '@fortawesome/free-regular-svg-icons'; @Component({ selector: 'app-schedule-list', @@ -10,8 +10,9 @@ import {faCheck, faTimes} from '@fortawesome/free-solid-svg-icons'; }) export class ScheduleListComponent implements OnInit { - readonly faCheck = faCheck; - readonly faTimes = faTimes; + readonly faCheckCircle = faCheckCircle; + readonly faCircle = faCircle; + readonly faTimes = faTimesCircle; readonly Schedule = Schedule; schedules: Schedule[] = []; @@ -27,10 +28,10 @@ export class ScheduleListComponent implements OnInit { } set(schedule: Schedule, key: string, value: any): void { - this.scheduleService.set(schedule, key, value, schedule => this.updateSchedule(schedule)); + this.scheduleService.set(schedule, key, value, schedule => this.addOrReplace(schedule)); } - private updateSchedule(schedule: Schedule): void { + private addOrReplace(schedule: Schedule): void { const index: number = this.schedules.findIndex(s => s.id === schedule.id); if (index < 0) { this.schedules.push(schedule); @@ -40,4 +41,16 @@ export class ScheduleListComponent implements OnInit { this.schedules = this.schedules.sort(Schedule.compareName) } + private remove(schedule: Schedule): void { + this.schedules.splice(this.schedules.findIndex(s => s.id === schedule.id), 1); + } + + create(): void { + this.scheduleService.create(schedule => this.addOrReplace(schedule)); + } + + delete(schedule: Schedule): void { + this.scheduleService.delete(schedule, () => this.remove(schedule)); + } + } diff --git a/src/main/angular/src/app/pages/schedule/schedule.component.html b/src/main/angular/src/app/pages/schedule/schedule.component.html index 04976b6..4e242eb 100644 --- a/src/main/angular/src/app/pages/schedule/schedule.component.html +++ b/src/main/angular/src/app/pages/schedule/schedule.component.html @@ -1,20 +1,20 @@ - + - - + + - + - + @@ -28,8 +28,9 @@ + - + @@ -119,7 +120,15 @@ + +
- +
  Mo DiUhrzeit Unschärfe Nächste Ausführung 
+ +
+

+ +

+
diff --git a/src/main/angular/src/app/pages/schedule/schedule.component.less b/src/main/angular/src/app/pages/schedule/schedule.component.less index da84fc9..28ec624 100644 --- a/src/main/angular/src/app/pages/schedule/schedule.component.less +++ b/src/main/angular/src/app/pages/schedule/schedule.component.less @@ -10,14 +10,6 @@ th { background-color: lightblue; } -tr.blank { - - th, td { - border: none; - } - -} - tr.header { th:not(:first-child), td:not(:first-child) { @@ -57,7 +49,7 @@ tr.header { padding-right: 0; } -.minute { +.middle { border-right-width: 0; border-left-width: 0; padding-right: 0; @@ -69,11 +61,8 @@ tr.header { padding-left: 0; } -.middle { - border-right-width: 0; - border-left-width: 0; - padding-right: 0; - padding-left: 0; +.delete { + color: darkred; } .disabled { diff --git a/src/main/angular/src/app/pages/schedule/schedule.component.ts b/src/main/angular/src/app/pages/schedule/schedule.component.ts index 7d7ad82..77718a5 100644 --- a/src/main/angular/src/app/pages/schedule/schedule.component.ts +++ b/src/main/angular/src/app/pages/schedule/schedule.component.ts @@ -3,7 +3,7 @@ import {ScheduleService} from "../../api/schedule/schedule.service"; import {Schedule} from "../../api/schedule/Schedule"; import {ScheduleEntry} from "../../api/schedule/entry/ScheduleEntry"; import {ScheduleEntryService} from "../../api/schedule/entry/schedule-entry.service"; -import {faCheck, faTimes} from '@fortawesome/free-solid-svg-icons'; +import {faCheckCircle, faCircle, faTimesCircle} from '@fortawesome/free-regular-svg-icons'; import {ActivatedRoute} from "@angular/router"; import {DataService} from "../../data.service"; @@ -14,10 +14,13 @@ import {DataService} from "../../data.service"; }) export class ScheduleComponent implements OnInit { - readonly faCheck = faCheck; - readonly faTimes = faTimes; + readonly faCheckCircle = faCheckCircle; + readonly faCircle = faCircle; + readonly faTimes = faTimesCircle; readonly Schedule = Schedule; + schedule!: Schedule; + constructor( readonly activatedRoute: ActivatedRoute, readonly scheduleService: ScheduleService, @@ -33,30 +36,38 @@ export class ScheduleComponent implements OnInit { } private setSchedule(schedule: Schedule): void { + this.schedule = schedule; this.dataService.schedule = schedule; } set(entry: ScheduleEntry | null, key: string, value: any): void { if (entry) { - this.scheduleEntryService.set(entry, key, value, entry => this.updateEntry(entry)); + this.scheduleEntryService.set(entry, key, value, entry => this.addOrReplace(entry)); } else { - if (this.dataService.schedule) { - this.scheduleService.set(this.dataService.schedule, key, value, schedule => this.dataService.schedule = schedule); - } + this.scheduleService.set(this.schedule, key, value, schedule => this.setSchedule(schedule)); } } - private updateEntry(entry: ScheduleEntry): void { - if (!this.dataService.schedule) { - return; - } - const index: number = this.dataService.schedule.entries.findIndex(s => s.id === entry.id); + private addOrReplace(entry: ScheduleEntry): void { + const index: number = this.schedule.entries.findIndex(s => s.id === entry.id); if (index < 0) { - this.dataService.schedule.entries.push(entry); + this.schedule.entries.push(entry); } else { - this.dataService.schedule.entries[index] = entry; + this.schedule.entries[index] = entry; } - this.dataService.schedule.entries = this.dataService.schedule.entries.sort(ScheduleEntry.compareId) + this.schedule.entries = this.schedule.entries.sort(ScheduleEntry.compareId) + } + + private remove(entry: ScheduleEntry): void { + this.schedule.entries.splice(this.schedule.entries.findIndex(e => e.id === entry.id), 1); + } + + create(): void { + this.scheduleEntryService.create(this.schedule, entry => this.addOrReplace(entry)); + } + + delete(entry: ScheduleEntry): void { + this.scheduleEntryService.delete(entry, () => this.remove(entry)); } } diff --git a/src/main/java/de/ph87/homeautomation/DemoDataService.java b/src/main/java/de/ph87/homeautomation/DemoDataService.java index 227544b..525b475 100644 --- a/src/main/java/de/ph87/homeautomation/DemoDataService.java +++ b/src/main/java/de/ph87/homeautomation/DemoDataService.java @@ -46,6 +46,7 @@ public class DemoDataService { if (scheduleRepository.count() == 0) { final Schedule scheduleEgFlurLicht = new Schedule(); + scheduleEgFlurLicht.setEnabled(true); scheduleEgFlurLicht.setName("EG Flur Licht"); createTime(scheduleEgFlurLicht, 11, 30, 0, MIN30, new PropertyEntry(eg_flur_licht_schalten, true)); createTime(scheduleEgFlurLicht, 12, 30, 0, MIN30, new PropertyEntry(eg_flur_licht_schalten, false)); @@ -58,6 +59,7 @@ public class DemoDataService { scheduleRepository.save(scheduleEgFlurLicht); final Schedule scheduleEgAmbiente = new Schedule(); + scheduleEgAmbiente.setEnabled(true); scheduleEgAmbiente.setName("EG Ambiente"); createTime(scheduleEgAmbiente, 7, 15, 0, MIN30, new PropertyEntry(eg_ambiente_schalten, true)); createTime(scheduleEgAmbiente, 9, 30, 0, MIN30, new PropertyEntry(eg_ambiente_schalten, false)); @@ -66,6 +68,7 @@ public class DemoDataService { scheduleRepository.save(scheduleEgAmbiente); final Schedule scheduleOgAmbiente = new Schedule(); + scheduleOgAmbiente.setEnabled(true); scheduleOgAmbiente.setName("OG Ambiente"); createTime(scheduleOgAmbiente, 7, 15, 0, MIN30, new PropertyEntry(og_ambiente_schalten, true)); createTime(scheduleOgAmbiente, 9, 30, 0, MIN30, new PropertyEntry(og_ambiente_schalten, false)); @@ -74,24 +77,28 @@ public class DemoDataService { scheduleRepository.save(scheduleOgAmbiente); final Schedule scheduleWohnzimmerRollladen = new Schedule(); + scheduleWohnzimmerRollladen.setEnabled(true); scheduleWohnzimmerRollladen.setName("Rollläden Wohnzimmer"); createSunrise(scheduleWohnzimmerRollladen, Zenith.CIVIL, 0, new PropertyEntry(wohnzimmer_rollladen_position_anfahren, 0)); createSunset(scheduleWohnzimmerRollladen, Zenith.CIVIL, 0, new PropertyEntry(wohnzimmer_rollladen_position_anfahren, 100)); scheduleRepository.save(scheduleWohnzimmerRollladen); final Schedule scheduleSchlafzimmerRollladen = new Schedule(); + scheduleSchlafzimmerRollladen.setEnabled(true); scheduleSchlafzimmerRollladen.setName("Rollläden Schlafzimmer"); createTime(scheduleSchlafzimmerRollladen, 7, 0, 0, 0, new PropertyEntry(schlafzimmer_rollladen_position_anfahren, 0)); createSunset(scheduleSchlafzimmerRollladen, Zenith.CIVIL, 0, new PropertyEntry(schlafzimmer_rollladen_position_anfahren, 100)); scheduleRepository.save(scheduleSchlafzimmerRollladen); final Schedule scheduleFlurRollladen = new Schedule(); + scheduleFlurRollladen.setEnabled(true); scheduleFlurRollladen.setName("Rollläden Flur"); createSunrise(scheduleFlurRollladen, Zenith.CIVIL, 0, new PropertyEntry(flur_rollladen_position_anfahren, 0)); createSunset(scheduleFlurRollladen, Zenith.CIVIL, 0, new PropertyEntry(flur_rollladen_position_anfahren, 100)); scheduleRepository.save(scheduleFlurRollladen); final Schedule scheduleBadLichtMitte = new Schedule(); + scheduleBadLichtMitte.setEnabled(true); scheduleBadLichtMitte.setName("Bad Licht Mitte"); createTime(scheduleBadLichtMitte, 10, 30, 0, MIN30, new PropertyEntry(bad_licht_mitteschalten, true)); createTime(scheduleBadLichtMitte, 11, 30, 0, MIN30, new PropertyEntry(bad_licht_mitteschalten, false)); @@ -115,23 +122,24 @@ public class DemoDataService { private ScheduleEntry createRelative(final Schedule schedule, final int inSeconds, final int fuzzySeconds, final Map.Entry... entries) { final ZonedDateTime now = ZonedDateTime.now().plusSeconds(inSeconds).withNano(0); - return create(schedule, ScheduleEntryType.TIME, null, now.getHour(), now.getMinute(), now.getSecond(), fuzzySeconds, entries); + return newScheduleEntry(schedule, ScheduleEntryType.TIME, null, now.getHour(), now.getMinute(), now.getSecond(), fuzzySeconds, entries); } private ScheduleEntry createTime(final Schedule schedule, final int hour, final int minute, final int second, final int fuzzySeconds, final Map.Entry... entries) { - return create(schedule, ScheduleEntryType.TIME, null, hour, minute, second, fuzzySeconds, entries); + return newScheduleEntry(schedule, ScheduleEntryType.TIME, null, hour, minute, second, fuzzySeconds, entries); } private ScheduleEntry createSunrise(final Schedule schedule, final Zenith zenith, final int fuzzySeconds, final Map.Entry... entries) { - return create(schedule, ScheduleEntryType.SUNRISE, zenith, 0, 0, 0, fuzzySeconds, entries); + return newScheduleEntry(schedule, ScheduleEntryType.SUNRISE, zenith, 0, 0, 0, fuzzySeconds, entries); } private ScheduleEntry createSunset(final Schedule schedule, final Zenith zenith, final int fuzzySeconds, final Map.Entry... entries) { - return create(schedule, ScheduleEntryType.SUNSET, zenith, 0, 0, 0, fuzzySeconds, entries); + return newScheduleEntry(schedule, ScheduleEntryType.SUNSET, zenith, 0, 0, 0, fuzzySeconds, entries); } - private ScheduleEntry create(final Schedule schedule, final ScheduleEntryType type, final Zenith zenith, final int hour, final int minute, final int second, final int fuzzySeconds, final Map.Entry... entries) { + private ScheduleEntry newScheduleEntry(final Schedule schedule, final ScheduleEntryType type, final Zenith zenith, final int hour, final int minute, final int second, final int fuzzySeconds, final Map.Entry... entries) { final ScheduleEntry entry = new ScheduleEntry(); + entry.setEnabled(true); entry.setType(type); if (zenith != null) { entry.setZenith(zenith.degrees().doubleValue()); diff --git a/src/main/java/de/ph87/homeautomation/schedule/Schedule.java b/src/main/java/de/ph87/homeautomation/schedule/Schedule.java index 20b7e4c..1cbd7e9 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/Schedule.java +++ b/src/main/java/de/ph87/homeautomation/schedule/Schedule.java @@ -21,12 +21,11 @@ public class Schedule { @Setter(AccessLevel.NONE) private Long id; - private boolean enabled = true; + private boolean enabled = false; @Column(nullable = false, unique = true) private String name; - // TODO move ownership of relation to ScheduleEntry ??? @ToString.Exclude @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) private Set entries = new HashSet<>(); diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleController.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleController.java index 0648337..3fb9040 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleController.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleController.java @@ -30,6 +30,16 @@ public class ScheduleController { return scheduleReadService.findAllNextExecutionDtos(); } + @GetMapping("create") + public ScheduleDto create() { + return scheduleWriteService.create(); + } + + @GetMapping("delete/{id}") + public void delete(@PathVariable final long id) { + scheduleWriteService.delete(id); + } + @PostMapping("set/{id}/enabled") public ScheduleDto setEnabled(@PathVariable final long id, @RequestBody final boolean enabled) { return scheduleWriteService.set(id, Schedule::setEnabled, enabled); diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleReadService.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleReadService.java index 105c33a..73fec31 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleReadService.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleReadService.java @@ -24,7 +24,7 @@ public class ScheduleReadService { private final ScheduleMapper scheduleMapper; - public Schedule get(final long id) { + public Schedule getById(final long id) { return scheduleRepository.findById(id).orElseThrow(() -> new NotFoundException("Schedule.id=%d", id)); } @@ -51,7 +51,7 @@ public class ScheduleReadService { } public ScheduleDto getDtoById(final long id) { - return scheduleMapper.toDto(get(id)); + return scheduleMapper.toDto(getById(id)); } } diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleRepository.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleRepository.java index 60df4c4..263ac21 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleRepository.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleRepository.java @@ -11,4 +11,6 @@ public interface ScheduleRepository extends CrudRepository { Schedule getByEntriesContaining(ScheduleEntry entry); + boolean existsByName(String name); + } diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleWriteService.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleWriteService.java index 1dffbfc..13fa84f 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleWriteService.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleWriteService.java @@ -14,17 +14,40 @@ import java.util.function.BiConsumer; @RequiredArgsConstructor public class ScheduleWriteService { + public static final String NAME_PREFIX = "Neu "; + private final ScheduleReadService scheduleReadService; private final ScheduleCalculationService scheduleCalculationService; private final ScheduleMapper scheduleMapper; + private final ScheduleRepository scheduleRepository; + public ScheduleDto set(final long id, final BiConsumer setter, final T value) { - final Schedule schedule = scheduleReadService.get(id); + final Schedule schedule = scheduleReadService.getById(id); setter.accept(schedule, value); scheduleCalculationService.calculateSchedule(schedule, ZonedDateTime.now()); return scheduleMapper.toDto(schedule); } + public ScheduleDto create() { + final Schedule entry = new Schedule(); + entry.setName(generateUnusedName()); + return scheduleMapper.toDto(scheduleRepository.save(entry)); + } + + private String generateUnusedName() { + int index = 0; + String name = null; + while (name == null || scheduleRepository.existsByName(name)) { + name = ScheduleWriteService.NAME_PREFIX + ++index; + } + return name; + } + + public void delete(final long id) { + scheduleRepository.deleteById(id); + } + } diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java index 432a9b2..01bcbfe 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntry.java @@ -23,7 +23,7 @@ public class ScheduleEntry { @Setter(AccessLevel.NONE) private Long id; - private boolean enabled = true; + private boolean enabled = false; private boolean monday = true; @@ -40,15 +40,15 @@ public class ScheduleEntry { private boolean sunday = true; @Column(nullable = false) - private ScheduleEntryType type = null; + private ScheduleEntryType type = ScheduleEntryType.TIME; private double zenith = Zenith.CIVIL.degrees().doubleValue(); - private int hour; + private int hour = 0; - private int minute; + private int minute = 0; - private int second; + private int second = 0; private int fuzzySeconds = 0; diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java index c5800a9..5034f89 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryController.java @@ -10,6 +10,16 @@ public class ScheduleEntryController { private final ScheduleEntryWriteService scheduleEntryWriteService; + @GetMapping("create/{scheduleId}") + public ScheduleEntryDto create(@PathVariable final long scheduleId) { + return scheduleEntryWriteService.create(scheduleId); + } + + @GetMapping("delete/{id}") + public void delete(@PathVariable final long id) { + scheduleEntryWriteService.delete(id); + } + @PostMapping("set/{id}/enabled") public ScheduleEntryDto setEnabled(@PathVariable final long id, @RequestBody final boolean value) { return scheduleEntryWriteService.set(id, ScheduleEntry::setEnabled, value); diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryReadService.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryReadService.java index 88ead63..1e19c1d 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryReadService.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryReadService.java @@ -17,7 +17,7 @@ public class ScheduleEntryReadService { private final ScheduleEntryRepository scheduleEntryRepository; - public ScheduleEntry get(final long id) { + public ScheduleEntry getById(final long id) { return scheduleEntryRepository.findById(id).orElseThrow(() -> new NotFoundException("ScheduleEntry.id=%d", id)); } diff --git a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriteService.java b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriteService.java index fd6670b..94a6c64 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriteService.java +++ b/src/main/java/de/ph87/homeautomation/schedule/entry/ScheduleEntryWriteService.java @@ -25,12 +25,27 @@ public class ScheduleEntryWriteService { private final ScheduleEntryMapper scheduleEntryMapper; + private final ScheduleEntryRepository scheduleEntryRepository; + public ScheduleEntryDto set(final long id, final BiConsumer setter, final T value) { - final ScheduleEntry entry = scheduleEntryReadService.get(id); + final ScheduleEntry entry = scheduleEntryReadService.getById(id); setter.accept(entry, value); final Schedule schedule = scheduleReadService.getByEntry(entry); scheduleCalculationService.calculateSchedule(schedule, ZonedDateTime.now()); return scheduleEntryMapper.toDto(entry); } + public ScheduleEntryDto create(final long scheduleId) { + final Schedule schedule = scheduleReadService.getById(scheduleId); + final ScheduleEntry entry = new ScheduleEntry(); + schedule.getEntries().add(scheduleEntryRepository.save(entry)); + return scheduleEntryMapper.toDto(entry); + } + + public void delete(final long id) { + final ScheduleEntry entry = scheduleEntryReadService.getById(id); + scheduleReadService.getByEntry(entry).getEntries().remove(entry); + scheduleEntryRepository.delete(entry); + } + }