diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java index 193c18b..2f45d22 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java @@ -75,6 +75,9 @@ public class SpringFoxConfig { .or(PathSelectors.regex("/securityCamera.*")::apply) .or(PathSelectors.regex("/sensor.*")::apply) .or(PathSelectors.regex("/smartPlug.*")::apply) + .or(PathSelectors.regex("/scene.*")::apply) + .or(PathSelectors.regex("/switchableState.*")::apply) + .or(PathSelectors.regex("/dimmableState.*")::apply) .or(PathSelectors.regex("/switch.*")::apply) .or(PathSelectors.regex("/motionSensor.*")::apply) .or(PathSelectors.regex("/curtains.*")::apply) diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableStateController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableStateController.java new file mode 100644 index 0000000..d866d78 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableStateController.java @@ -0,0 +1,33 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.DimmableStateSaveRequest; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableState; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableStateRepository; +import javax.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.web.bind.annotation.*; + +@RestController +@EnableAutoConfiguration +@RequestMapping("/dimmableState") +public class DimmableStateController { + + @Autowired private DimmableStateRepository dimmableStateRepository; + + @PutMapping + public DimmableState update(@Valid @RequestBody DimmableStateSaveRequest ss) + throws NotFoundException { + final DimmableState initial = + dimmableStateRepository.findById(ss.getId()).orElseThrow(NotFoundException::new); + initial.setIntensity(ss.getIntensity()); + dimmableStateRepository.save(initial); + return initial; + } + + @DeleteMapping("/{id}") + public void delete(@PathVariable("id") long id) { + dimmableStateRepository.deleteById(id); + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java index c2c82eb..2b4c9c1 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SceneController.java @@ -5,8 +5,8 @@ import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SceneSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; - import java.security.Principal; +import java.util.ArrayList; import java.util.List; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; @@ -29,15 +29,19 @@ public class SceneController { @Autowired SceneRepository sceneService; @Autowired UserRepository userService; @Autowired StateRepository> stateService; + @Autowired DeviceRepository deviceRepository; @GetMapping - public List findAll() { - return toList(sceneService.findAll()); + public List findAll(Principal principal) { + return toList(sceneService.findByUsername(principal.getName())); } @GetMapping("/{id}") - public @ResponseBody Scene findById(@PathVariable("id") long id) throws NotFoundException { - return sceneService.findById(id).orElseThrow(NotFoundException::new); + public @ResponseBody Scene findById(@PathVariable("id") long id, Principal principal) + throws NotFoundException { + return sceneService + .findByIdAndUsername(id, principal.getName()) + .orElseThrow(NotFoundException::new); } @PostMapping @@ -55,6 +59,25 @@ public class SceneController { return sceneService.save(newScene); } + @PostMapping("/{id}/apply") + public @ResponseBody List apply(@PathVariable("id") long id, final Principal principal) + throws NotFoundException { + final Scene newScene = + sceneService + .findByIdAndUsername(id, principal.getName()) + .orElseThrow(NotFoundException::new); + + final List updated = new ArrayList<>(); + + for (final State s : newScene.getStates()) { + s.apply(); + updated.add(s.getDevice()); + } + deviceRepository.saveAll(updated); + + return updated; + } + @PutMapping("/{id}") public @ResponseBody Scene update( @PathVariable("id") long id, @RequestBody SceneSaveRequest s, final Principal principal) @@ -81,7 +104,7 @@ public class SceneController { * Returns a List of all Devices that are associated to a given scene (identified by its * id). */ - @GetMapping(path = "/{sceneId}/devices") + @GetMapping(path = "/{sceneId}/states") public List> getDevices(@PathVariable("sceneId") long sceneId) { Iterable> states = stateService.findBySceneId(sceneId); return toList(states); diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java index 65786e8..ed6f30c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchableStateController.java @@ -1,19 +1,14 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; -import static ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils.toList; - import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchableStateSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableState; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.SwitchableStateRepository; -import java.util.List; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -24,41 +19,20 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/switchableState") public class SwitchableStateController { - @Autowired private SwitchableStateRepository switchableStateService; - - @GetMapping - public List> findAll() { - return toList(switchableStateService.findAll()); - } - - @GetMapping("/{id}") - public SwitchableState findById(@PathVariable("id") long id) throws NotFoundException { - return switchableStateService.findById(id).orElseThrow(NotFoundException::new); - } - - private SwitchableState save(SwitchableState initial, SwitchableStateSaveRequest ss) { - initial.setDeviceId(ss.getDeviceId()); - initial.setSceneId(ss.getSceneId()); - initial.setOn(ss.isOn()); - - return switchableStateService.save(initial); - } - - @PostMapping - public SwitchableState create(@Valid @RequestBody SwitchableStateSaveRequest dl) { - return save(new SwitchableState<>(), dl); - } + @Autowired private SwitchableStateRepository switchableStateRepository; @PutMapping public SwitchableState update(@Valid @RequestBody SwitchableStateSaveRequest ss) throws NotFoundException { - return save( - switchableStateService.findById(ss.getId()).orElseThrow(NotFoundException::new), - ss); + final SwitchableState initial = + switchableStateRepository.findById(ss.getId()).orElseThrow(NotFoundException::new); + initial.setOn(ss.isOn()); + switchableStateRepository.save(initial); + return initial; } @DeleteMapping("/{id}") public void delete(@PathVariable("id") long id) { - switchableStateService.deleteById(id); + switchableStateRepository.deleteById(id); } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableStateSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableStateSaveRequest.java new file mode 100644 index 0000000..ebf99eb --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableStateSaveRequest.java @@ -0,0 +1,28 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +public class DimmableStateSaveRequest { + + /** Device id (used only for update requests) */ + @NotNull private Long id; + + @NotNull + @Min(0) + @Max(100) + private Integer intensity = 0; + + public Integer getIntensity() { + return intensity; + } + + public void setIntensity(Integer intensity) { + this.intensity = intensity; + } + + public Long getId() { + return id; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchableStateSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchableStateSaveRequest.java index a22d7b0..ab03f27 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchableStateSaveRequest.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchableStateSaveRequest.java @@ -5,30 +5,10 @@ import javax.validation.constraints.NotNull; public class SwitchableStateSaveRequest { /** Device id (used only for update requests) */ - private Long id; - - @NotNull private Long deviceId; - - @NotNull private Long sceneId; + @NotNull private Long id; @NotNull private boolean on; - public Long getDeviceId() { - return deviceId; - } - - public void setDeviceId(Long deviceId) { - this.deviceId = deviceId; - } - - public Long getSceneId() { - return sceneId; - } - - public void setSceneId(Long sceneId) { - this.sceneId = sceneId; - } - public boolean isOn() { return on; } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ThermostatStateSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ThermostatStateSaveRequest.java deleted file mode 100644 index 2a7912b..0000000 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ThermostatStateSaveRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; - -import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Thermostat; -import javax.validation.constraints.NotNull; - -public class ThermostatStateSaveRequest { - - /** Device id (used only for update requests) */ - private Long id; - - @NotNull private Long deviceId; - - @NotNull private Long sceneId; - - private Thermostat.Mode mode; - - public Thermostat.Mode getMode() { - return mode; - } - - public void setMode(Thermostat.Mode mode) { - this.mode = mode; - } - - public Long getDeviceId() { - return deviceId; - } - - public void setDeviceId(Long deviceId) { - this.deviceId = deviceId; - } - - public Long getSceneId() { - return sceneId; - } - - public void setSceneId(Long sceneId) { - this.sceneId = sceneId; - } - - public Long getId() { - return id; - } -} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java index 8a4da95..4bfd828 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Dimmable.java @@ -1,23 +1,20 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude; - +import java.util.Set; import javax.persistence.*; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import java.util.Set; @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class Dimmable extends Switchable { - public static final Connector - KNOB_DIMMER_DIMMABLE_CONNECTOR = + public static final Connector KNOB_DIMMER_DIMMABLE_CONNECTOR = Connector.basic(KnobDimmer::getOutputs, Dimmable::getDimmers); - public static final Connector - BUTTON_DIMMER_DIMMABLE_CONNECTOR = + public static final Connector BUTTON_DIMMER_DIMMABLE_CONNECTOR = Connector.basic(ButtonDimmer::getOutputs, Dimmable::getDimmers); protected Dimmable(String kind) { @@ -79,4 +76,13 @@ public class Dimmable extends Switchable { public void readStateAndSet(DimmableState state) { setIntensity(state.getIntensity()); } + + @Override + public DimmableState cloneState() { + final DimmableState newState = new DimmableState<>(); + newState.setDeviceId(getId()); + newState.setDevice(this); + newState.setIntensity(getIntensity()); + return newState; + } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/OutputDevice.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/OutputDevice.java index 56e68c5..69e24ca 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/OutputDevice.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/OutputDevice.java @@ -12,4 +12,6 @@ public abstract class OutputDevice extends Device { public OutputDevice(String kind) { super(kind, FlowType.OUTPUT); } + + public abstract State cloneState(); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SceneRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SceneRepository.java index 513ed9c..de08a53 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SceneRepository.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SceneRepository.java @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; @@ -15,4 +16,7 @@ public interface SceneRepository extends CrudRepository { */ @Query("SELECT r FROM Room r JOIN r.user u WHERE r.id = ?1 AND u.username = ?2") Optional findByIdAndUsername(Long id, String username); + + @Query("SELECT r FROM Room r JOIN r.user u WHERE u.username = ?1") + List findByUsername(String username); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java index 318ae98..e68e75c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switchable.java @@ -1,9 +1,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonExclude; -import javax.persistence.*; import java.util.HashSet; import java.util.Set; +import javax.persistence.*; /** A device that can be turned either on or off */ @Entity @@ -42,4 +42,13 @@ public abstract class Switchable extends OutputDevice { public void readStateAndSet(SwitchableState state) { setOn(state.isOn()); } + + @Override + public State cloneState() { + final SwitchableState newState = new SwitchableState<>(); + newState.setDeviceId(getId()); + newState.setDevice(this); + newState.setOn(isOn()); + return newState; + } }