diff --git a/build.gradle b/build.gradle index 728859b..d511c0b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'org.springframework.security:spring-security-web' implementation 'org.postgresql:postgresql' diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/Service/EmailSenderService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/Service/EmailSenderService.java new file mode 100644 index 0000000..a51eb5a --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/Service/EmailSenderService.java @@ -0,0 +1,23 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service("emailSenderService") +public class EmailSenderService { + + private JavaMailSender javaMailSender; + + @Autowired + public EmailSenderService(JavaMailSender javaMailSender) { + this.javaMailSender = javaMailSender; + } + + @Async + public void sendEmail(SimpleMailMessage email) { + javaMailSender.send(email); + } +} 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 ae950b2..a8c86a5 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 @@ -67,7 +67,9 @@ public class SpringFoxConfig { * @return A predicate that tests whether a path must be included or not */ private Predicate paths() { - return regexPredicate("/auth.*").or(regexPredicate("/room.*")); + return regexPredicate("/auth.*") + .or(regexPredicate("/room.*")) + .or(regexPredicate("/register.*")); } /** diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/WebSecurityConfig.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/WebSecurityConfig.java index bb548f0..e38d0df 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/WebSecurityConfig.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/WebSecurityConfig.java @@ -54,6 +54,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { "/auth/login", "/auth/register", "/swagger-ui.html", + "/register", + "/register/confirm-account", "/v2/api-docs", "/webjars/**", "/swagger-resources/**", diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/AuthenticationController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/AuthenticationController.java index e4c575e..cc9ed2e 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/AuthenticationController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/AuthenticationController.java @@ -29,8 +29,6 @@ public class AuthenticationController { private final JWTUserDetailsService userDetailsService; - private final UserRepository users; - private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); public AuthenticationController( @@ -43,7 +41,6 @@ public class AuthenticationController { this.userRepository = userRepository; this.jwtTokenUtil = jwtTokenUtil; this.userDetailsService = userDetailsService; - this.users = users; } @PostMapping("/login") @@ -55,13 +52,6 @@ public class AuthenticationController { return new JWTResponse(token); } - @PostMapping("/register") - public User register(@Valid @RequestBody User user) { - user.setPassword(encoder.encode(user.getPassword())); - users.save(user); - return user; - } - @Authorization(value = "Bearer") @PatchMapping("/update") public User update( diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java index c94f5cc..34e536b 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/ButtonDimmerController.java @@ -2,6 +2,7 @@ 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.ButtonDimmerSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ButtonDimmer; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ButtonDimmerRepository; import java.util.List; @@ -9,14 +10,7 @@ import java.util.Optional; 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; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -35,13 +29,20 @@ public class ButtonDimmerController { } @PostMapping - public ButtonDimmer save(@Valid @RequestBody ButtonDimmer bd) { - return buttonDimmerService.save(bd); + public ButtonDimmer create(@Valid @RequestBody final ButtonDimmerSaveRequest bd) { + ButtonDimmer newBD = new ButtonDimmer(); + newBD.setLights(bd.getLights()); + newBD.setId(bd.getId()); + newBD.setName(bd.getName()); + newBD.setRoom(bd.getRoom()); + newBD.setRoomId(bd.getRoomId()); + + return buttonDimmerService.save(newBD); } @PutMapping - public ButtonDimmer update(@Valid @RequestBody ButtonDimmer bd) { - return buttonDimmerService.save(bd); + public ButtonDimmer update(@Valid @RequestBody ButtonDimmerSaveRequest bd) { + return this.create(bd); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableLightController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableLightController.java index 2f6900a..9ab5f29 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableLightController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/DimmableLightController.java @@ -2,6 +2,7 @@ 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.DimmableLightSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLightRepository; import java.util.List; @@ -9,14 +10,7 @@ import java.util.Optional; 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; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -36,13 +30,20 @@ public class DimmableLightController { } @PostMapping - public DimmableLight save(@Valid @RequestBody DimmableLight dl) { - return dimmableLightService.save(dl); + public DimmableLight create(@Valid @RequestBody DimmableLightSaveRequest dl) { + DimmableLight newDL = new DimmableLight(); + newDL.setIntensity(dl.getIntensity()); + newDL.setId(dl.getId()); + newDL.setName(dl.getName()); + newDL.setRoom(dl.getRoom()); + newDL.setRoomId(dl.getRoomId()); + + return dimmableLightService.save(newDL); } @PutMapping - public DimmableLight update(@Valid @RequestBody DimmableLight dl) { - return dimmableLightService.save(dl); + public DimmableLight update(@Valid @RequestBody DimmableLightSaveRequest dl) { + return this.create(dl); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java index 0a23301..49c889b 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/KnobDimmerController.java @@ -2,6 +2,7 @@ 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.KnobDimmerSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmer; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.KnobDimmerRepository; import java.util.List; @@ -9,14 +10,7 @@ import java.util.Optional; 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; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -36,13 +30,20 @@ public class KnobDimmerController { } @PostMapping - public KnobDimmer save(@Valid @RequestBody KnobDimmer kd) { - return knobDimmerService.save(kd); + public KnobDimmer create(@Valid @RequestBody KnobDimmerSaveRequest kd) { + KnobDimmer newKD = new KnobDimmer(); + newKD.setLights(kd.getLights()); + newKD.setId(kd.getId()); + newKD.setName(kd.getName()); + newKD.setRoom(kd.getRoom()); + newKD.setRoomId(kd.getRoomId()); + + return knobDimmerService.save(newKD); } @PutMapping - public KnobDimmer update(@Valid @RequestBody KnobDimmer kd) { - return knobDimmerService.save(kd); + public KnobDimmer update(@Valid @RequestBody KnobDimmerSaveRequest kd) { + return this.create(kd); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/MotionSensorController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/MotionSensorController.java index 5b6b947..d4bfb2a 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/MotionSensorController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/MotionSensorController.java @@ -2,6 +2,7 @@ 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.MotionSensorSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.MotionSensor; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.MotionSensorRepository; import java.util.List; @@ -9,14 +10,7 @@ import java.util.Optional; 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; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -36,13 +30,20 @@ public class MotionSensorController { } @PostMapping - public MotionSensor save(@Valid @RequestBody MotionSensor ms) { - return motionSensorService.save(ms); + public MotionSensor create(@Valid @RequestBody MotionSensorSaveRequest ms) { + MotionSensor newMS = new MotionSensor(); + newMS.setDetected(ms.isDetected()); + newMS.setId(ms.getId()); + newMS.setName(ms.getName()); + newMS.setRoom(ms.getRoom()); + newMS.setRoomId(ms.getRoomId()); + + return motionSensorService.save(newMS); } @PutMapping - public MotionSensor update(@Valid @RequestBody MotionSensor ms) { - return motionSensorService.save(ms); + public MotionSensor update(@Valid @RequestBody MotionSensorSaveRequest ms) { + return this.create(ms); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightController.java index 6b50312..de00240 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RegularLightController.java @@ -2,6 +2,7 @@ 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.RegularLightSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLight; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.RegularLightRepository; import java.util.List; @@ -36,13 +37,20 @@ public class RegularLightController { } @PostMapping - public RegularLight save(@Valid @RequestBody RegularLight rl) { - return regularLightService.save(rl); + public RegularLight create(@Valid @RequestBody RegularLightSaveRequest rl) { + RegularLight newRL = new RegularLight(); + newRL.setId(rl.getId()); + newRL.setName(rl.getName()); + newRL.setRoom(rl.getRoom()); + newRL.setRoomId(rl.getRoomId()); + newRL.setOn(rl.isOn()); + + return regularLightService.save(newRL); } @PutMapping - public RegularLight update(@Valid @RequestBody RegularLight rl) { - return regularLightService.save(rl); + public RegularLight update(@Valid @RequestBody RegularLightSaveRequest rl) { + return this.create(rl); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SensorController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SensorController.java index 8a9ce92..fd4437b 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SensorController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SensorController.java @@ -2,6 +2,7 @@ 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.SensorSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; import java.util.List; @@ -28,13 +29,21 @@ public class SensorController { } @PostMapping - public Sensor save(@Valid @RequestBody Sensor s) { - return sensorRepository.save(s); + public Sensor create(@Valid @RequestBody SensorSaveRequest s) { + Sensor newSensor = new Sensor(); + newSensor.setSensor(s.getSensor()); + newSensor.setValue(s.getValue()); + newSensor.setId(s.getId()); + newSensor.setName(s.getName()); + newSensor.setRoom(s.getRoom()); + newSensor.setRoomId(s.getRoomId()); + + return sensorRepository.save(newSensor); } @PutMapping - public Sensor update(@Valid @RequestBody Sensor s) { - return sensorRepository.save(s); + public Sensor update(@Valid @RequestBody SensorSaveRequest s) { + return this.create(s); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SmartPlugController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SmartPlugController.java index 64dc6b5..c50ddc3 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SmartPlugController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SmartPlugController.java @@ -2,6 +2,7 @@ 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.SmartPlugSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; import java.util.List; @@ -28,13 +29,20 @@ public class SmartPlugController { } @PostMapping - public SmartPlug save(@Valid @RequestBody SmartPlug sp) { - return smartPlugRepository.save(sp); + public SmartPlug create(@Valid @RequestBody SmartPlugSaveRequest sp) { + SmartPlug newSP = new SmartPlug(); + newSP.setOn(sp.isOn()); + newSP.setId(sp.getId()); + newSP.setName(sp.getName()); + newSP.setRoom(sp.getRoom()); + newSP.setRoomId(sp.getRoomId()); + + return smartPlugRepository.save(newSP); } @PutMapping - public SmartPlug update(@Valid @RequestBody SmartPlug sp) { - return smartPlugRepository.save(sp); + public SmartPlug update(@Valid @RequestBody SmartPlugSaveRequest sp) { + return this.create(sp); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchController.java index d13fdc2..5207710 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SwitchController.java @@ -2,6 +2,7 @@ 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.SwitchSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; import java.util.List; @@ -28,13 +29,20 @@ public class SwitchController { } @PostMapping - public Switch save(@Valid @RequestBody Switch s) { - return switchRepository.save(s); + public Switch create(@Valid @RequestBody SwitchSaveRequest s) { + Switch newSwitch = new Switch(); + newSwitch.setId(s.getId()); + newSwitch.setName(s.getName()); + newSwitch.setRoom(s.getRoom()); + newSwitch.setRoomId(s.getRoomId()); + newSwitch.setOn(s.isOn()); + + return switchRepository.save(newSwitch); } @PutMapping - public Switch update(@Valid @RequestBody Switch s) { - return switchRepository.save(s); + public Switch update(@Valid @RequestBody SwitchSaveRequest s) { + return this.create(s); } @DeleteMapping("/{id}") diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java new file mode 100644 index 0000000..e238f16 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java @@ -0,0 +1,98 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.OkResponse; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.UserRegistrationRequest; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateRegistrationException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.EmailTokenNotFoundException; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ConfirmationToken; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ConfirmationTokenRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.User; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.UserRepository; +import ch.usi.inf.sa4.sanmarinoes.smarthut.service.EmailSenderService; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@EnableAutoConfiguration +@RequestMapping("/register") +public class UserAccountController { + + @Autowired private UserRepository userRepository; + + @Autowired private ConfirmationTokenRepository confirmationTokenRepository; + + @Autowired private EmailSenderService emailSenderService; + + @Autowired private BCryptPasswordEncoder encoder; + + @PostMapping + public OkResponse registerUser(@Valid @RequestBody UserRegistrationRequest registrationData) + throws DuplicateRegistrationException { + final User existingEmailUser = + userRepository.findByEmailIgnoreCase(registrationData.getEmail()); + final User existingUsernameUser = + userRepository.findByUsername(registrationData.getUsername()); + + // Check if an User with the same email already exists + if (existingEmailUser != null || existingUsernameUser != null) { + throw new DuplicateRegistrationException(); + } else { + final User toSave = new User(); + // disable the user (it will be enabled on email confiration) + toSave.setEnabled(false); + + // encode user's password + toSave.setPassword(encoder.encode(registrationData.getPassword())); + + // set other fields + toSave.setName(registrationData.getName()); + toSave.setUsername(registrationData.getUsername()); + toSave.setEmail(registrationData.getEmail()); + userRepository.save(toSave); + + ConfirmationToken confirmationToken = new ConfirmationToken(toSave); + + confirmationTokenRepository.save(confirmationToken); + + SimpleMailMessage mailMessage = new SimpleMailMessage(); + mailMessage.setTo(registrationData.getEmail()); + mailMessage.setSubject("Complete Registration!"); + mailMessage.setFrom("smarthut.sm@gmail.com"); + mailMessage.setText( + "To confirm your account, please click here : " + + "http://localhost:8080/register/confirm-account?token=" + + confirmationToken.getConfirmationToken()); + + emailSenderService.sendEmail(mailMessage); + + return new OkResponse(); + } + } + + @GetMapping(value = "/confirm-account") + public OkResponse confirmUserAccount(@RequestParam("token") @NotNull String confirmationToken) + throws EmailTokenNotFoundException { + final ConfirmationToken token = + confirmationTokenRepository.findByConfirmationToken(confirmationToken); + + if (token != null) { + final User user = userRepository.findByEmailIgnoreCase(token.getUser().getEmail()); + user.setEnabled(true); + userRepository.save(user); + // TODO: redirect to frontend + return new OkResponse(); + } else { + throw new EmailTokenNotFoundException(); + } + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ButtonDimmerSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ButtonDimmerSaveRequest.java new file mode 100644 index 0000000..ce49970 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ButtonDimmerSaveRequest.java @@ -0,0 +1,67 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +public class ButtonDimmerSaveRequest { + @Lob private Set lights = new HashSet(); + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 Set getLights() { + return this.lights; + } + + public void setLights(Set newLights) { + this.lights = newLights; + } + + public void setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableLightSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableLightSaveRequest.java new file mode 100644 index 0000000..43b5a97 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableLightSaveRequest.java @@ -0,0 +1,73 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +public class DimmableLightSaveRequest { + + /** The light intensity value. Goes from 0 (off) to 100 (on) */ + @NotNull + @Min(1) + @Max(100) + private Integer intensity = 0; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public Integer getIntensity() { + return intensity; + } + + public void setIntensity(Integer intensity) throws IllegalArgumentException { + if (intensity < 0 || intensity > 100) { + throw new IllegalArgumentException("The intensity level can't go below 0 or above 100"); + } + this.intensity = intensity; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java new file mode 100644 index 0000000..530ab90 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java @@ -0,0 +1,67 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Lob; +import javax.validation.constraints.NotNull; + +public class KnobDimmerSaveRequest { + @Lob private Set lights = new HashSet(); + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public void setLights(Set lights) { + this.lights = lights; + } + + public Set getLights() { + return lights; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/MotionSensorSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/MotionSensorSaveRequest.java new file mode 100644 index 0000000..9fa3c7e --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/MotionSensorSaveRequest.java @@ -0,0 +1,63 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import javax.validation.constraints.NotNull; + +public class MotionSensorSaveRequest { + private boolean detected; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public boolean isDetected() { + return detected; + } + + public void setDetected(boolean detected) { + this.detected = detected; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/OkResponse.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/OkResponse.java new file mode 100644 index 0000000..e3de94e --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/OkResponse.java @@ -0,0 +1,6 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +/** A dummy DTO to return when there is no data to return */ +public class OkResponse { + private boolean success = true; +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RegularLightSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RegularLightSaveRequest.java new file mode 100644 index 0000000..fb7fc78 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RegularLightSaveRequest.java @@ -0,0 +1,64 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import javax.validation.constraints.NotNull; + +public class RegularLightSaveRequest { + /** The state of this switch */ + private boolean on; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public boolean isOn() { + return on; + } + + public void setOn(boolean on) { + this.on = on; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SensorSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SensorSaveRequest.java new file mode 100644 index 0000000..cbc29b0 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SensorSaveRequest.java @@ -0,0 +1,97 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Sensor; +import com.google.gson.annotations.SerializedName; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.validation.constraints.NotNull; + +public class SensorSaveRequest { + + /** Type of sensor, i.e. of the thing the sensor measures. */ + public enum SensorType { + /** A sensor that measures temperature in degrees celsius */ + @SerializedName("TEMPERATURE") + TEMPERATURE, + + /** A sensor that measures relative humidity in percentage points */ + @SerializedName("HUMIDITY") + HUMIDITY, + + /** A sensor that measures light in degrees */ + @SerializedName("LIGHT") + LIGHT + } + + /** The value of this sensor according to its sensor type */ + private int value; + + /** The type of this sensor */ + @NotNull + @Enumerated(value = EnumType.STRING) + private Sensor.SensorType sensor; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public Sensor.SensorType getSensor() { + return sensor; + } + + public void setSensor(Sensor.SensorType sensor) { + this.sensor = sensor; + } + + public int getValue() { + return this.value; + } + + public void setValue(int newValue) { + this.value = newValue; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SmartPlugSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SmartPlugSaveRequest.java new file mode 100644 index 0000000..3dbb72b --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SmartPlugSaveRequest.java @@ -0,0 +1,64 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import javax.validation.constraints.NotNull; + +public class SmartPlugSaveRequest { + /** Whether the smart plug is on */ + @NotNull private boolean on; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public boolean isOn() { + return on; + } + + public void setOn(boolean on) { + this.on = on; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchSaveRequest.java new file mode 100644 index 0000000..ff365fc --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchSaveRequest.java @@ -0,0 +1,64 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Room; +import javax.validation.constraints.NotNull; + +public class SwitchSaveRequest { + /** The state of this switch */ + private boolean on; + + /** Device identifier */ + private long id; + + /** The room this device belongs in */ + private Room room; + + /** + * 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 setId(long id) { + this.id = id; + } + + public void setRoom(Room room) { + this.room = room; + } + + public void setRoomId(Long roomId) { + this.roomId = roomId; + } + + public void setName(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public Room getRoom() { + return room; + } + + public Long getRoomId() { + return roomId; + } + + public String getName() { + return name; + } + + public boolean isOn() { + return on; + } + + public void setOn(boolean on) { + this.on = on; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/UserRegistrationRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/UserRegistrationRequest.java new file mode 100644 index 0000000..b41720a --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/UserRegistrationRequest.java @@ -0,0 +1,67 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import javax.validation.constraints.*; + +public class UserRegistrationRequest { + + /** The full name of the user */ + @NotNull + @NotEmpty(message = "Please provide a full name") + private String name; + + /** The full name of the user */ + @NotNull + @NotEmpty(message = "Please provide a username") + private String username; + + /** A properly salted way to store the password */ + @NotNull + @NotEmpty(message = "Please provide a password") + @Size( + min = 6, + max = 255, + message = "Your password should be at least 6 characters long and up to 255 chars long") + private String password; + + /** + * The user's email (validated according to criteria used in >input type="email"<> + * , technically not RFC 5322 compliant + */ + @NotNull + @NotEmpty(message = "Please provide an email") + @Email(message = "Please provide a valid email address") + @Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address") + private String email; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java new file mode 100644 index 0000000..302c07e --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java @@ -0,0 +1,11 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.error; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.BAD_REQUEST) +public class DuplicateRegistrationException extends Exception { + public DuplicateRegistrationException() { + super("Email or username already belonging to another user"); + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/EmailTokenNotFoundException.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/EmailTokenNotFoundException.java new file mode 100644 index 0000000..b3e38b1 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/EmailTokenNotFoundException.java @@ -0,0 +1,11 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.error; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.BAD_REQUEST) +public class EmailTokenNotFoundException extends Exception { + public EmailTokenNotFoundException() { + super("Email verification token not found in DB"); + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java index e666c3e..9ff5af2 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java @@ -11,4 +11,54 @@ public class ButtonDimmer extends Dimmer { public ButtonDimmer() { super("button-dimmer"); } + + /** Increases the current intensity level of the dimmable light by 1 */ + public void increaseIntensity() { + for (DimmableLight dl : lights) { + dl.setIntensity(dl.getIntensity() + 1); + } + } + + /** Decreases the current intensity level of the dimmable light by 1 */ + public void decreaseIntensity() { + for (DimmableLight dl : lights) { + dl.setIntensity(dl.getIntensity() - 1); + } + } + + /** + * Adds a DimmableLight to this set of DimmableLights + * + * @param dl The DimmableLight to be added + */ + public void addLight(DimmableLight dl) { + lights.add(dl); + } + + /** + * Removes the given DimmableLight + * + * @param dl The DimmableLight to be removed + */ + public void removeLight(DimmableLight dl) { + lights.remove(dl); + } + + /** Clears this set */ + public void clearSet() { + lights.clear(); + } + + /** + * Get the lights + * + * @return duh + */ + public Set getLights() { + return this.lights; + } + + public void setLights(Set newLights) { + this.lights = newLights; + } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java new file mode 100644 index 0000000..f6c86a0 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java @@ -0,0 +1,74 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.models; + +import java.util.Date; +import java.util.UUID; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +@Entity +public class ConfirmationToken { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + + @Column(name = "confirmation_token") + private String confirmationToken; + + @Temporal(TemporalType.TIMESTAMP) + private Date createdDate; + + @OneToOne(targetEntity = User.class, fetch = FetchType.EAGER) + @JoinColumn(nullable = false, name = "user_id") + private User user; + + public ConfirmationToken(User user) { + this.user = user; + createdDate = new Date(); + confirmationToken = UUID.randomUUID().toString(); + } + + /** Constructor for hibernate reflective stuff things whatever */ + public ConfirmationToken() {} + + public Long getId() { + return id; + } + + public String getConfirmationToken() { + return confirmationToken; + } + + public Date getCreatedDate() { + return createdDate; + } + + public User getUser() { + return user; + } + + public void setId(Long id) { + this.id = id; + } + + public void setConfirmationToken(String confirmationToken) { + this.confirmationToken = confirmationToken; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationTokenRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationTokenRepository.java new file mode 100644 index 0000000..4bc18ce --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationTokenRepository.java @@ -0,0 +1,7 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.models; + +import org.springframework.data.repository.CrudRepository; + +public interface ConfirmationTokenRepository extends CrudRepository { + ConfirmationToken findByConfirmationToken(String confirmationToken); +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java index 80d59ab..d14e099 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java @@ -11,4 +11,56 @@ public class KnobDimmer extends Dimmer { public KnobDimmer() { super("knob-dimmer"); } + + /** + * Increases or decreases the current intensity level by 5, moving between absolute multiples of + * 5 between 0 and 100, of all dimmable lights mapped to this knob + * + * @param inc The direction the knob is turned with + */ + public void modifyIntensity(boolean inc) { + + for (DimmableLight dl : lights) { + int remainder = dl.getIntensity() / 5; + + if (inc) { + dl.setIntensity(dl.getIntensity() - remainder); + dl.setIntensity((dl.getIntensity() + 5) % 105); + } else { + dl.setIntensity(dl.getIntensity() + (5 - remainder)); + dl.setIntensity((dl.getIntensity() - 5) % 105); + } + } + } + + /** + * Adds a DimmableLight to this set of DimmableLights + * + * @param dl The DimmableLight to be added + */ + public void addLight(DimmableLight dl) { + lights.add(dl); + } + + /** + * Removes the given DimmableLight + * + * @param dl The DimmableLight to be removed + */ + public void removeLight(DimmableLight dl) { + lights.remove(dl); + } + + /** Clears this set */ + public void clearSet() { + lights.clear(); + } + + public void setLights(Set lights) { + this.lights = lights; + } + + public Set getLights() { + return lights; + } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/MotionSensor.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/MotionSensor.java index d1c47b3..50d2206 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/MotionSensor.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/MotionSensor.java @@ -1,10 +1,23 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; +import javax.persistence.Column; import javax.persistence.Entity; /** Represents a motion sensor device */ @Entity public class MotionSensor extends InputDevice { + + @Column(nullable = false) + private boolean detected; + + public boolean isDetected() { + return detected; + } + + public void setDetected(boolean detected) { + this.detected = detected; + } + public MotionSensor() { super("motion-sensor"); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Sensor.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Sensor.java index e3fbae0..e352a52 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Sensor.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Sensor.java @@ -26,6 +26,10 @@ public class Sensor extends InputDevice { LIGHT } + /** The value of this sensor according to its sensor type */ + @Column(nullable = false) + private int value; + /** The type of this sensor */ @Column(nullable = false) @NotNull @@ -40,6 +44,14 @@ public class Sensor extends InputDevice { this.sensor = sensor; } + public int getValue() { + return this.value; + } + + public void setValue(int newValue) { + this.value = newValue; + } + public Sensor() { super("sensor"); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java index 6f0eb99..2576d38 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Switch.java @@ -3,7 +3,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import javax.persistence.Column; import javax.persistence.Entity; -/** A switch input device TODO: define switch behaviour (push button vs on/off state) */ +/** A switch input device */ @Entity public class Switch extends InputDevice { @@ -20,7 +20,7 @@ public class Switch extends InputDevice { * * @param state The state to be set */ - void setState(boolean state) { + public void setOn(boolean state) { on = state; } @@ -29,7 +29,7 @@ public class Switch extends InputDevice { * * @return This Switch on state */ - boolean getState() { + public boolean isOn() { return on; } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java index f7feaea..67f95d4 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/User.java @@ -2,7 +2,11 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import io.swagger.annotations.ApiModelProperty; import javax.persistence.*; -import javax.validation.constraints.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; /** A user of the Smarthut application */ @Entity(name = "smarthutuser") @@ -33,8 +37,7 @@ public class User { @Size( min = 6, max = 255, - message = - "Your password should be at least 6 characters long and at most 255 chars long") + message = "Your password should be at least 6 characters long and up to 255 chars long") private String password; /** @@ -48,6 +51,10 @@ public class User { @Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address") private String email; + @Column(nullable = false) + @ApiModelProperty(hidden = true) + private Boolean isEnabled = false; + public Long getId() { return id; } @@ -88,6 +95,14 @@ public class User { this.password = password; } + public Boolean getEnabled() { + return isEnabled; + } + + public void setEnabled(Boolean enabled) { + isEnabled = enabled; + } + @Override public String toString() { return "User{" @@ -96,11 +111,17 @@ public class User { + ", name='" + name + '\'' + + ", username='" + + username + + '\'' + ", password='" + password + '\'' + ", email='" + email - + "\'}"; + + '\'' + + ", isEnabled=" + + isEnabled + + '}'; } } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/UserRepository.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/UserRepository.java index 0b8c62a..01fd897 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/UserRepository.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/UserRepository.java @@ -5,4 +5,6 @@ import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository { User findByUsername(String username); + + User findByEmailIgnoreCase(String email); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 30d24cd..9bfe2a7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,4 +10,16 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl spring.jpa.properties.hibernate.format_sql=true -jwt.secret=thiskeymustbeverylongorthethingcomplainssoiamjustgoingtowritehereabunchofgarbageciaomamma \ No newline at end of file +jwt.secret=thiskeymustbeverylongorthethingcomplainssoiamjustgoingtowritehereabunchofgarbageciaomamma + +spring.mail.test-connection=true +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.username=smarthut.sm@gmail.com +spring.mail.password=dcadvbagqfkwbfts +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.connectiontimeout=5000 +spring.mail.properties.mail.smtp.timeout=5000 +spring.mail.properties.mail.smtp.writetimeout=5000 \ No newline at end of file