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 971a7fb..49b9c37 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,7 @@ public class SpringFoxConfig { .or(PathSelectors.regex("/smartPlug.*")::apply) .or(PathSelectors.regex("/switch.*")::apply) .or(PathSelectors.regex("/motionSensor.*")::apply) + .or(PathSelectors.regex("/curtains.*")::apply) .or(PathSelectors.regex("/auth/profile.*")::apply); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/CurtainsController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/CurtainsController.java new file mode 100644 index 0000000..5095966 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/CurtainsController.java @@ -0,0 +1,56 @@ +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.CurtainsSaveRequest; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Curtains; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.CurtainsRepository; +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.*; + +@RestController +@EnableAutoConfiguration +@RequestMapping("/curtains") +public class CurtainsController { + @Autowired private CurtainsRepository curtainsService; + + @GetMapping + public List findAll() { + return toList(curtainsService.findAll()); + } + + @GetMapping("/{id}") + public Curtains findById(@PathVariable("id") long id) throws NotFoundException { + return curtainsService.findById(id).orElseThrow(NotFoundException::new); + } + + private Curtains save(Curtains newRL, CurtainsSaveRequest s) { + newRL.setName(s.getName()); + newRL.setRoomId(s.getRoomId()); + newRL.setOpenedAmount(s.getOpening()); + + return curtainsService.save(newRL); + } + + @PostMapping + public Curtains create(@Valid @RequestBody CurtainsSaveRequest curtain) { + return save(new Curtains(), curtain); + } + + @PutMapping + public Curtains update(@Valid @RequestBody CurtainsSaveRequest curtain) + throws NotFoundException { + return save( + curtainsService.findById(curtain.getId()).orElseThrow(NotFoundException::new), + curtain); + } + + @DeleteMapping("/{id}") + public void delete(@PathVariable("id") long id) { + curtainsService.deleteById(id); + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/CurtainsSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/CurtainsSaveRequest.java new file mode 100644 index 0000000..1dc9122 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/CurtainsSaveRequest.java @@ -0,0 +1,57 @@ +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 CurtainsSaveRequest { + /** The state of this switch */ + @NotNull + @Min(0) + @Max(100) + private int openedAmount; + + /** Device identifier */ + @NotNull private long id; + + /** + * The room this device belongs in, as a foreign key id. To use when updating and inserting from + * a REST call. + */ + @NotNull private Long roomId; + + /** The name of the device as assigned by the user (e.g. 'Master bedroom light') */ + @NotNull private String name; + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public int getOpening() { + return this.openedAmount; + } + + public void setOpening(int newOpening) { + this.openedAmount = newOpening; + } + + public void setId(long id) { + this.id = id; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Curtains.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Curtains.java new file mode 100644 index 0000000..cfc3c2f --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Curtains.java @@ -0,0 +1,41 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.models; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +@Entity +public class Curtains extends OutputDevice { + + /** + * it represents how much the curtains are opened, 0 is completely closed 100 is completely open + */ + @NotNull + @Column(nullable = false) + @Min(0) + @Max(100) + private int openedAmount; + + public Curtains() { + super("curtains"); + this.openedAmount = 0; + } + + /** return the current state of the curtain */ + public int getOpenedAmount() { + return this.openedAmount; + } + + /** sets the state to a desired one */ + public void setOpenedAmount(int newOpening) { + if (newOpening < 0) { + this.openedAmount = 0; + } else if (newOpening > 100) { + this.openedAmount = 100; + } else { + this.openedAmount = newOpening; + } + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/CurtainsRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/CurtainsRepository.java new file mode 100644 index 0000000..83f4d16 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/CurtainsRepository.java @@ -0,0 +1,3 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.models; + +public interface CurtainsRepository extends DeviceRepository {} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DeviceRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DeviceRepository.java index ef57a88..2496029 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DeviceRepository.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/DeviceRepository.java @@ -2,12 +2,11 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import java.util.List; import java.util.Optional; +import javax.transaction.Transactional; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -import javax.transaction.Transactional; - /** * DeviceRepository acts as a superclass for the other repositories so to mirror in the database the * class inheritance present among the various devices. diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/socket/SensorSocketEndpoint.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/socket/SensorSocketEndpoint.java index 655a773..b222cf5 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/socket/SensorSocketEndpoint.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/socket/SensorSocketEndpoint.java @@ -1,6 +1,5 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.socket; - import ch.usi.inf.sa4.sanmarinoes.smarthut.config.GsonConfig; import ch.usi.inf.sa4.sanmarinoes.smarthut.config.JWTTokenUtils; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Device; diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/CurtainsTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/CurtainsTests.java new file mode 100644 index 0000000..e49f736 --- /dev/null +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/CurtainsTests.java @@ -0,0 +1,45 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Curtains; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("Curtains tests") +public class CurtainsTests { + private Curtains curtains; + + @BeforeEach + public void createCurtains() { + this.curtains = new Curtains(); + } + + @Test + @DisplayName("State when just created") + public void initialState() { + assertEquals(0, this.curtains.getOpenedAmount()); + } + + @Test + @DisplayName("Check wether setting the opening works") + public void normalSet() { + this.curtains.setOpenedAmount(42); + assertEquals(42, this.curtains.getOpenedAmount()); + } + + @Test + @DisplayName("Set setting a negative number") + public void setNeg() { + this.curtains.setOpenedAmount(-1); + assertEquals(0, this.curtains.getOpenedAmount()); + } + + @Test + @DisplayName("Setting state to a number greater than 100") + public void setLarge() { + this.curtains.setOpenedAmount(32768); + assertEquals(100, this.curtains.getOpenedAmount()); + } +}