package de.ph87.homeautomation.property; import de.ph87.homeautomation.channel.ChannelService; import de.ph87.homeautomation.shared.ISearchController; import de.ph87.homeautomation.shared.SearchResult; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; @RestController @RequestMapping("property") @RequiredArgsConstructor public class PropertyController implements ISearchController { private final PropertyWriteService propertyWriteService; private final PropertyReadService propertyReadService; private final ChannelService channelService; @GetMapping("create") public PropertyDto create() { return propertyWriteService.create(); } @GetMapping("findAll") public List findAll() { return propertyReadService.findAllDto(); } @PostMapping("set/{id}/type") public PropertyDto setPropertyType(@PathVariable final long id, @RequestBody final String propertyType) { return propertyWriteService.set(id, Property::setType, PropertyType.valueOf(propertyType)); } @PostMapping("set/{id}/title") public PropertyDto setPropertyTitle(@PathVariable final long id, @RequestBody final String propertyTitle) { return propertyWriteService.set(id, Property::setTitle, propertyTitle); } @PostMapping("set/{id}/value") public PropertyDto setValue(@PathVariable final long id, @RequestBody final double value) { return propertyWriteService.set(id, propertyWriteService::writeToChannel, value); } @PostMapping("set/{id}/readChannel") public PropertyDto setReadChannel(@PathVariable final long id, @RequestBody(required = false) final Long channelId) { return propertyWriteService.set(id, (p, v) -> p.setReadChannel(channelService.getById(v)), channelId); } @PostMapping("set/{id}/writeChannel") public PropertyDto setWriteChannel(@PathVariable final long id, @RequestBody(required = false) final Long channelId) { return propertyWriteService.set(id, (p, v) -> p.setWriteChannel(channelService.getById(v)), channelId); } @PostMapping("toggle/{id}") public PropertyDto setValue(@PathVariable final long id) { final boolean oldState = getOldStateBoolean(id, false); return propertyWriteService.set(id, propertyWriteService::writeToChannel, oldState ? 0.0 : 1.0); } private boolean getOldStateBoolean(final long id, final boolean orElse) { final Double oldValue = propertyReadService.getDtoById(id).getValue(); if (oldValue == null || oldValue.isNaN()) { return orElse; } return oldValue > 0.0; } @Override @GetMapping("getById/{id}") public SearchResult getById(@PathVariable final long id) { return toSearchResult(propertyReadService.getDtoById(id)); } @Override @PostMapping("searchLike") public List searchLike(@RequestBody final String term) { return propertyReadService.findAllDtoLike("%" + term + "%").stream().map(this::toSearchResult).collect(Collectors.toList()); } private SearchResult toSearchResult(final PropertyDto propertyDto) { return new SearchResult(propertyDto.getId(), propertyDto.getTitle()); } }