From 990f1bd6d4bd3a8e585535388312aca43d04543d Mon Sep 17 00:00:00 2001 From: omenem Date: Thu, 27 Feb 2020 17:31:28 +0100 Subject: [PATCH 1/8] Initial Setup for email verification --- .../smarthut/Service/EmailSenderService.java | 23 ++++++ .../controller/UserAccountController.java | 68 ++++++++++++++++++ .../smarthut/models/ConfirmationToken.java | 71 +++++++++++++++++++ .../models/ConfirmationTokenRepository.java | 7 ++ .../smarthut/models/UserRepository.java | 2 + 5 files changed, 171 insertions(+) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/Service/EmailSenderService.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationTokenRepository.java 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..35bc509 --- /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/controller/UserAccountController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java new file mode 100644 index 0000000..6b16039 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java @@ -0,0 +1,68 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.Service.EmailSenderService; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +@RestController +@EnableAutoConfiguration +@RequestMapping("/register") +public class UserAccountController { + + @Autowired private UserRepository userRepository; + + @Autowired private ConfirmationTokenRepository confirmationTokenRepository; + + @Autowired private EmailSenderService emailSenderService; + + @GetMapping + public ModelAndView displayRegistration(ModelAndView modelAndView, User user) { + modelAndView.addObject("user", user); + modelAndView.setViewName("register"); + return modelAndView; + } + + @PostMapping + public ModelAndView registerUser(ModelAndView modelAndView, User user) { + + User existingUser = userRepository.findByEmailIgnoreCase(user.getEmail()); + // Check if an User with the same email already exists + if (existingUser != null) { + modelAndView.addObject("message", "This email already exists!"); + modelAndView.setViewName("error"); + } else { + userRepository.save(user); + + ConfirmationToken confirmationToken = new ConfirmationToken(user); + + confirmationTokenRepository.save(confirmationToken); + + SimpleMailMessage mailMessage = new SimpleMailMessage(); + mailMessage.setTo(user.getEmail()); + mailMessage.setSubject("Complete Registration!"); + mailMessage.setFrom("smarthut.sm@gmail.com"); + mailMessage.setText( + "To confirm your account, please click here : " + + "http://localhost:8082/confirm-account?token=" + + confirmationToken.getConfirmationToken()); + + emailSenderService.sendEmail(mailMessage); + + modelAndView.addObject("emailId", user.getEmail()); + + modelAndView.setViewName("successfulRegisteration"); + } + + return modelAndView; + } +} 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..7f0b71c --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java @@ -0,0 +1,71 @@ +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(); + } + + 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/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); } From 2271f4a5b92b2143f673908276cbe42ad5ac8034 Mon Sep 17 00:00:00 2001 From: omenem Date: Thu, 27 Feb 2020 21:39:38 +0100 Subject: [PATCH 2/8] Email Verifcation Works --- build.gradle | 1 + .../smarthut/config/WebSecurityConfig.java | 4 ++ .../controller/AuthenticationController.java | 7 --- .../controller/UserAccountController.java | 43 +++++++++++++++---- .../sanmarinoes/smarthut/dto/OkResponse.java | 6 +++ .../DuplicateEmailRegistrationException.java | 11 +++++ .../error/EmailTokenNotFoundException.java | 11 +++++ .../smarthut/models/ConfirmationToken.java | 3 ++ .../sa4/sanmarinoes/smarthut/models/User.java | 26 +++++++++-- src/main/resources/application.properties | 14 +++++- 10 files changed, 106 insertions(+), 20 deletions(-) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/OkResponse.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateEmailRegistrationException.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/EmailTokenNotFoundException.java diff --git a/build.gradle b/build.gradle index ea7614f..7c7384d 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,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/config/WebSecurityConfig.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/WebSecurityConfig.java index a8bcb1d..9bbea89 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,10 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .permitAll() .antMatchers("/auth/register") .permitAll() + .antMatchers("/register") + .permitAll() + .antMatchers("/register/confirm-account") + .permitAll() . // all other requests need to be authenticated anyRequest() 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 ed82692..4646bd1 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 @@ -42,13 +42,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; - } - @PatchMapping("/update") public User update(@Valid @RequestBody final UserUpdateRequest u, final Principal principal) { final User oldUser = userRepository.findByUsername(principal.getName()); 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 index 6b16039..b0210e0 100644 --- 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 @@ -1,16 +1,24 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; import ch.usi.inf.sa4.sanmarinoes.smarthut.Service.EmailSenderService; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.OkResponse; +import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateEmailRegistrationException; +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 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; import org.springframework.web.servlet.ModelAndView; @@ -25,6 +33,8 @@ public class UserAccountController { @Autowired private EmailSenderService emailSenderService; + @Autowired private BCryptPasswordEncoder encoder; + @GetMapping public ModelAndView displayRegistration(ModelAndView modelAndView, User user) { modelAndView.addObject("user", user); @@ -33,14 +43,17 @@ public class UserAccountController { } @PostMapping - public ModelAndView registerUser(ModelAndView modelAndView, User user) { - + public OkResponse registerUser(@Valid @RequestBody User user) + throws DuplicateEmailRegistrationException { + System.out.println(user); User existingUser = userRepository.findByEmailIgnoreCase(user.getEmail()); + // Check if an User with the same email already exists if (existingUser != null) { - modelAndView.addObject("message", "This email already exists!"); - modelAndView.setViewName("error"); + throw new DuplicateEmailRegistrationException(); } else { + // encode user's password + user.setPassword(encoder.encode(user.getPassword())); userRepository.save(user); ConfirmationToken confirmationToken = new ConfirmationToken(user); @@ -53,16 +66,28 @@ public class UserAccountController { mailMessage.setFrom("smarthut.sm@gmail.com"); mailMessage.setText( "To confirm your account, please click here : " - + "http://localhost:8082/confirm-account?token=" + + "http://localhost:8080/register/confirm-account?token=" + confirmationToken.getConfirmationToken()); emailSenderService.sendEmail(mailMessage); - modelAndView.addObject("emailId", user.getEmail()); - - modelAndView.setViewName("successfulRegisteration"); + return new OkResponse(); } + } - return modelAndView; + @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); + return new OkResponse(); + } else { + throw new EmailTokenNotFoundException(); + } } } 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/error/DuplicateEmailRegistrationException.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateEmailRegistrationException.java new file mode 100644 index 0000000..3c37b2b --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateEmailRegistrationException.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 DuplicateEmailRegistrationException extends Exception { + public DuplicateEmailRegistrationException() { + super("Email 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/ConfirmationToken.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java index 7f0b71c..f6c86a0 100644 --- 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 @@ -37,6 +37,9 @@ public class ConfirmationToken { confirmationToken = UUID.randomUUID().toString(); } + /** Constructor for hibernate reflective stuff things whatever */ + public ConfirmationToken() {} + public Long getId() { return id; } 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 e4ce24e..6c1ff6b 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 @@ -3,10 +3,10 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import java.util.Set; import javax.persistence.*; import javax.validation.constraints.Email; -import javax.validation.constraints.Min; 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,7 +33,10 @@ public class User { @NotNull @Column(nullable = false) @NotEmpty(message = "Please provide a password") - @Min(value = 6, message = "Your password should be at least 6 characters long") + @Size( + min = 6, + max = 255, + message = "Your password should be at least 6 characters long and up to 255 chars long") private String password; /** @@ -51,6 +54,9 @@ public class User { @OneToMany(mappedBy = "user") private Set rooms; + @Column(nullable = false) + private Boolean isEnabled = false; + public Long getId() { return id; } @@ -95,6 +101,14 @@ public class User { return rooms; } + public Boolean getEnabled() { + return isEnabled; + } + + public void setEnabled(Boolean enabled) { + isEnabled = enabled; + } + @Override public String toString() { return "User{" @@ -103,11 +117,17 @@ public class User { + ", name='" + name + '\'' + + ", username='" + + username + + '\'' + ", password='" + password + '\'' + ", email='" + email - + "\'}"; + + '\'' + + ", isEnabled=" + + isEnabled + + '}'; } } 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 From 3bbc4bcff0e44c82370ae13076ea30ca8a77a878 Mon Sep 17 00:00:00 2001 From: tommi27 Date: Mon, 2 Mar 2020 11:02:30 +0100 Subject: [PATCH 3/8] updated buttondimmer controller with dto --- .../controller/ButtonDimmerController.java | 16 ++++++++++------ .../smarthut/dto/ButtonDimmerSaveRequest.java | 18 ++++++++++++++++++ .../smarthut/models/ButtonDimmer.java | 8 ++++++++ .../sanmarinoes/smarthut/models/Sensor.java | 12 ++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ButtonDimmerSaveRequest.java 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 7c2d0b7..39b6d39 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 @@ -1,9 +1,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +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.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; @@ -11,7 +11,6 @@ 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; @@ -32,13 +31,18 @@ public class ButtonDimmerController { } @PostMapping - public ButtonDimmer save(@Valid @RequestBody ButtonDimmer bd) { - return buttonDimmerService.save(bd); + public ButtonDimmer create(final ButtonDimmerSaveRequest bd) { + + ButtonDimmer toSave = new ButtonDimmer(); + + toSave.setLights(bd.getLights()); + + return buttonDimmerService.save(toSave); } @PutMapping - public ButtonDimmer update(@Valid @RequestBody ButtonDimmer bd) { - return buttonDimmerService.save(bd); + public ButtonDimmer update(ButtonDimmerSaveRequest bd) { + return this.create(bd); } @DeleteMapping("/{id}") 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..f611090 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/ButtonDimmerSaveRequest.java @@ -0,0 +1,18 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Lob; + +public class ButtonDimmerSaveRequest { + @Lob private Set lights = new HashSet(); + + 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/ButtonDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java index 23a69f8..6f6def8 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 @@ -54,4 +54,12 @@ public class ButtonDimmer extends Dimmer { public void clearSet() { lights.clear(); } + + 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/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"); } From 624c857734c40b73cae0681fc538ec7aa2fabdde Mon Sep 17 00:00:00 2001 From: tommi27 Date: Mon, 2 Mar 2020 12:11:50 +0100 Subject: [PATCH 4/8] updated controllers --- .../controller/ButtonDimmerController.java | 8 +++--- .../controller/DimmableLightController.java | 14 ++++++----- .../controller/KnobDimmerController.java | 14 ++++++----- .../dto/DimmableLightSaveRequest.java | 25 +++++++++++++++++++ .../smarthut/dto/KnobDimmerSaveRequest.java | 18 +++++++++++++ .../smarthut/models/KnobDimmer.java | 8 ++++++ 6 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableLightSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java 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 39b6d39..caeac2a 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 @@ -32,12 +32,10 @@ public class ButtonDimmerController { @PostMapping public ButtonDimmer create(final ButtonDimmerSaveRequest bd) { + ButtonDimmer newBD = new ButtonDimmer(); + newBD.setLights(bd.getLights()); - ButtonDimmer toSave = new ButtonDimmer(); - - toSave.setLights(bd.getLights()); - - return buttonDimmerService.save(toSave); + return buttonDimmerService.save(newBD); } @PutMapping 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 5391e43..597a899 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 @@ -1,9 +1,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +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.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; @@ -11,7 +11,6 @@ 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; @@ -33,13 +32,16 @@ public class DimmableLightController { } @PostMapping - public DimmableLight save(@Valid @RequestBody DimmableLight dl) { - return dimmableLightService.save(dl); + public DimmableLight create(DimmableLightSaveRequest dl) { + DimmableLight newDL = new DimmableLight(); + newDL.setIntensity(dl.getIntensity()); + + return dimmableLightService.save(newDL); } @PutMapping - public DimmableLight update(@Valid @RequestBody DimmableLight dl) { - return dimmableLightService.save(dl); + public DimmableLight update(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 3dd53d7..a42af17 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 @@ -1,9 +1,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +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.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; @@ -11,7 +11,6 @@ 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; @@ -33,13 +32,16 @@ public class KnobDimmerController { } @PostMapping - public KnobDimmer save(@Valid @RequestBody KnobDimmer kd) { - return knobDimmerService.save(kd); + public KnobDimmer create(KnobDimmerSaveRequest kd) { + KnobDimmer newKD = new KnobDimmer(); + newKD.setLights(kd.getLights()); + + return knobDimmerService.save(newKD); } @PutMapping - public KnobDimmer update(@Valid @RequestBody KnobDimmer kd) { - return knobDimmerService.save(kd); + public KnobDimmer update(KnobDimmerSaveRequest kd) { + return this.create(kd); } @DeleteMapping("/{id}") 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..1d3a8e2 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/DimmableLightSaveRequest.java @@ -0,0 +1,25 @@ +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 DimmableLightSaveRequest { + + /** The light intensity value. Goes from 0 (off) to 100 (on) */ + @NotNull + @Min(1) + @Max(100) + private Integer intensity = 0; + + 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..c7d5193 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/KnobDimmerSaveRequest.java @@ -0,0 +1,18 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import ch.usi.inf.sa4.sanmarinoes.smarthut.models.DimmableLight; +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Lob; + +public class KnobDimmerSaveRequest { + @Lob private Set lights = new HashSet(); + + 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/KnobDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/KnobDimmer.java index 5c5c603..cbba6a2 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 @@ -61,4 +61,12 @@ public class KnobDimmer extends Dimmer { public void clearSet() { lights.clear(); } + + public void setLights(Set lights) { + this.lights = lights; + } + + public Set getLights() { + return lights; + } } From eb6e935892672792238bb5a5096216783d8fb9ab Mon Sep 17 00:00:00 2001 From: tommi27 Date: Mon, 2 Mar 2020 14:44:01 +0100 Subject: [PATCH 5/8] all controllers updated with DTOs (needs review) --- .../controller/ButtonDimmerController.java | 4 + .../controller/DimmableLightController.java | 4 + .../controller/KnobDimmerController.java | 4 + .../controller/MotionSensorController.java | 18 ++-- .../controller/RegularLightController.java | 12 ++- .../smarthut/controller/SensorController.java | 18 +++- .../controller/SmartPlugController.java | 12 ++- .../smarthut/controller/SwitchController.java | 12 ++- .../smarthut/dto/ButtonDimmerSaveRequest.java | 51 +++++++++- .../dto/DimmableLightSaveRequest.java | 48 +++++++++ .../smarthut/dto/KnobDimmerSaveRequest.java | 49 ++++++++++ .../smarthut/dto/MotionSensorSaveRequest.java | 63 ++++++++++++ .../smarthut/dto/RegularLightSaveRequest.java | 64 ++++++++++++ .../smarthut/dto/SensorSaveRequest.java | 97 +++++++++++++++++++ .../smarthut/dto/SmartPlugSaveRequest.java | 64 ++++++++++++ .../smarthut/dto/SwitchSaveRequest.java | 64 ++++++++++++ .../smarthut/models/MotionSensor.java | 13 +++ .../sanmarinoes/smarthut/models/Switch.java | 6 +- 18 files changed, 582 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/MotionSensorSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RegularLightSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SensorSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SmartPlugSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/SwitchSaveRequest.java 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 caeac2a..404d5ac 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 @@ -34,6 +34,10 @@ public class ButtonDimmerController { public ButtonDimmer create(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); } 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 597a899..a7f6d1a 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 @@ -35,6 +35,10 @@ public class DimmableLightController { public DimmableLight create(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); } 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 a42af17..a317826 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 @@ -35,6 +35,10 @@ public class KnobDimmerController { public KnobDimmer create(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); } 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 15c964f..2aa37de 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 @@ -1,9 +1,9 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +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.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; @@ -11,7 +11,6 @@ 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; @@ -33,13 +32,20 @@ public class MotionSensorController { } @PostMapping - public MotionSensor save(@Valid @RequestBody MotionSensor ms) { - return motionSensorService.save(ms); + public MotionSensor create(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(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 2ec1453..e2a2f49 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 @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +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.Optional; @@ -33,8 +34,15 @@ public class RegularLightController { } @PostMapping - public RegularLight save(@Valid @RequestBody RegularLight rl) { - return regularLightService.save(rl); + public RegularLight save(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 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 957328e..fab5d85 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 @@ -1,8 +1,8 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SensorSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; -import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.*; import org.springframework.web.bind.annotation.*; @@ -25,13 +25,21 @@ public class SensorController { } @PostMapping - public Sensor save(@Valid @RequestBody Sensor s) { - return sensorRepository.save(s); + public Sensor create(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(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 a0aee71..0761532 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 @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SmartPlugSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; import javax.validation.Valid; @@ -25,8 +26,15 @@ public class SmartPlugController { } @PostMapping - public SmartPlug save(@Valid @RequestBody SmartPlug sp) { - return smartPlugRepository.save(sp); + public SmartPlug create(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 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 7eb83a0..50c2b50 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 @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; import javax.validation.Valid; @@ -25,8 +26,15 @@ public class SwitchController { } @PostMapping - public Switch save(@Valid @RequestBody Switch s) { - return switchRepository.save(s); + public Switch save(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 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 index f611090..ce49970 100644 --- 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 @@ -1,13 +1,30 @@ 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.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; } @@ -15,4 +32,36 @@ public class ButtonDimmerSaveRequest { 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 index 1d3a8e2..43b5a97 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -12,6 +13,53 @@ public class DimmableLightSaveRequest { @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; } 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 index c7d5193..530ab90 100644 --- 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 @@ -1,13 +1,62 @@ 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; } 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/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/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/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; } } From 572134bba230c853845b093120fac16db5dedc42 Mon Sep 17 00:00:00 2001 From: tommi27 Date: Mon, 2 Mar 2020 16:15:52 +0100 Subject: [PATCH 6/8] fixed request annotations --- .../smarthut/controller/ButtonDimmerController.java | 13 ++++--------- .../controller/DimmableLightController.java | 13 ++++--------- .../smarthut/controller/KnobDimmerController.java | 13 ++++--------- .../smarthut/controller/MotionSensorController.java | 13 ++++--------- .../smarthut/controller/RegularLightController.java | 6 +++--- .../smarthut/controller/SensorController.java | 5 +++-- .../smarthut/controller/SmartPlugController.java | 6 +++--- .../smarthut/controller/SwitchController.java | 6 +++--- .../sanmarinoes/smarthut/models/ButtonDimmer.java | 5 +++++ 9 files changed, 33 insertions(+), 47 deletions(-) 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 404d5ac..6ea2556 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 @@ -4,15 +4,10 @@ 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.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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -31,7 +26,7 @@ public class ButtonDimmerController { } @PostMapping - public ButtonDimmer create(final ButtonDimmerSaveRequest bd) { + public ButtonDimmer create(@Valid @RequestBody final ButtonDimmerSaveRequest bd) { ButtonDimmer newBD = new ButtonDimmer(); newBD.setLights(bd.getLights()); newBD.setId(bd.getId()); @@ -43,7 +38,7 @@ public class ButtonDimmerController { } @PutMapping - public ButtonDimmer update(ButtonDimmerSaveRequest bd) { + public ButtonDimmer update(@Valid @RequestBody ButtonDimmerSaveRequest bd) { return this.create(bd); } 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 a7f6d1a..f7e02d2 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 @@ -4,15 +4,10 @@ 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.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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -32,7 +27,7 @@ public class DimmableLightController { } @PostMapping - public DimmableLight create(DimmableLightSaveRequest dl) { + public DimmableLight create(@Valid @RequestBody DimmableLightSaveRequest dl) { DimmableLight newDL = new DimmableLight(); newDL.setIntensity(dl.getIntensity()); newDL.setId(dl.getId()); @@ -44,7 +39,7 @@ public class DimmableLightController { } @PutMapping - public DimmableLight update(DimmableLightSaveRequest dl) { + public DimmableLight update(@Valid @RequestBody DimmableLightSaveRequest dl) { return this.create(dl); } 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 a317826..6c93178 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 @@ -4,15 +4,10 @@ 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.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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -32,7 +27,7 @@ public class KnobDimmerController { } @PostMapping - public KnobDimmer create(KnobDimmerSaveRequest kd) { + public KnobDimmer create(@Valid @RequestBody KnobDimmerSaveRequest kd) { KnobDimmer newKD = new KnobDimmer(); newKD.setLights(kd.getLights()); newKD.setId(kd.getId()); @@ -44,7 +39,7 @@ public class KnobDimmerController { } @PutMapping - public KnobDimmer update(KnobDimmerSaveRequest kd) { + public KnobDimmer update(@Valid @RequestBody KnobDimmerSaveRequest kd) { return this.create(kd); } 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 2aa37de..8decc61 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 @@ -4,15 +4,10 @@ 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.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.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration @@ -32,7 +27,7 @@ public class MotionSensorController { } @PostMapping - public MotionSensor create(MotionSensorSaveRequest ms) { + public MotionSensor create(@Valid @RequestBody MotionSensorSaveRequest ms) { MotionSensor newMS = new MotionSensor(); newMS.setDetected(ms.isDetected()); newMS.setId(ms.getId()); @@ -44,7 +39,7 @@ public class MotionSensorController { } @PutMapping - public MotionSensor update(MotionSensorSaveRequest ms) { + public MotionSensor update(@Valid @RequestBody MotionSensorSaveRequest ms) { return this.create(ms); } 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 e2a2f49..dd53ceb 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 @@ -34,7 +34,7 @@ public class RegularLightController { } @PostMapping - public RegularLight save(RegularLightSaveRequest rl) { + public RegularLight create(@Valid @RequestBody RegularLightSaveRequest rl) { RegularLight newRL = new RegularLight(); newRL.setId(rl.getId()); newRL.setName(rl.getName()); @@ -46,8 +46,8 @@ public class RegularLightController { } @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 fab5d85..788f32f 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 @@ -3,6 +3,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SensorSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; import java.util.*; +import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.*; import org.springframework.web.bind.annotation.*; @@ -25,7 +26,7 @@ public class SensorController { } @PostMapping - public Sensor create(SensorSaveRequest s) { + public Sensor create(@Valid @RequestBody SensorSaveRequest s) { Sensor newSensor = new Sensor(); newSensor.setSensor(s.getSensor()); newSensor.setValue(s.getValue()); @@ -38,7 +39,7 @@ public class SensorController { } @PutMapping - public Sensor update(SensorSaveRequest s) { + public Sensor update(@Valid @RequestBody SensorSaveRequest s) { return this.create(s); } 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 0761532..3cf2cc0 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 @@ -26,7 +26,7 @@ public class SmartPlugController { } @PostMapping - public SmartPlug create(SmartPlugSaveRequest sp) { + public SmartPlug create(@Valid @RequestBody SmartPlugSaveRequest sp) { SmartPlug newSP = new SmartPlug(); newSP.setOn(sp.isOn()); newSP.setId(sp.getId()); @@ -38,8 +38,8 @@ public class SmartPlugController { } @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 50c2b50..51f0858 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 @@ -26,7 +26,7 @@ public class SwitchController { } @PostMapping - public Switch save(SwitchSaveRequest s) { + public Switch create(@Valid @RequestBody SwitchSaveRequest s) { Switch newSwitch = new Switch(); newSwitch.setId(s.getId()); newSwitch.setName(s.getName()); @@ -38,8 +38,8 @@ public class SwitchController { } @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/models/ButtonDimmer.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ButtonDimmer.java index 6f6def8..b2c907f 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 @@ -55,6 +55,11 @@ public class ButtonDimmer extends Dimmer { lights.clear(); } + /** + * Get the lights + * + * @return duh + */ public Set getLights() { return this.lights; } From 51e6bb1f90a69fba603a8c3b9eeabade60b28e00 Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Mon, 2 Mar 2020 16:56:43 +0100 Subject: [PATCH 7/8] Merge --- .../smarthut/config/WebSecurityConfig.java | 20 +++++----- .../controller/AuthenticationController.java | 37 +++++++++++++------ 2 files changed, 36 insertions(+), 21 deletions(-) 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 9bbea89..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 @@ -50,17 +50,19 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .disable() // dont authenticate this particular request .authorizeRequests() - .antMatchers("/auth/login") + .antMatchers( + "/auth/login", + "/auth/register", + "/swagger-ui.html", + "/register", + "/register/confirm-account", + "/v2/api-docs", + "/webjars/**", + "/swagger-resources/**", + "/csrf") .permitAll() - .antMatchers("/auth/register") - .permitAll() - .antMatchers("/register") - .permitAll() - .antMatchers("/register/confirm-account") - .permitAll() - . // all other requests need to be authenticated - anyRequest() + .anyRequest() .authenticated() .and() . 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 4646bd1..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 @@ -5,9 +5,9 @@ import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTResponse; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.UserUpdateRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; +import io.swagger.annotations.Authorization; import java.security.Principal; import javax.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.DisabledException; @@ -21,18 +21,28 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/auth") public class AuthenticationController { - @Autowired private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; - @Autowired private UserRepository userRepository; + private final UserRepository userRepository; - @Autowired private JWTTokenUtil jwtTokenUtil; + private final JWTTokenUtil jwtTokenUtil; - @Autowired private JWTUserDetailsService userDetailsService; - - @Autowired private UserRepository users; + private final JWTUserDetailsService userDetailsService; private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + public AuthenticationController( + AuthenticationManager authenticationManager, + UserRepository userRepository, + JWTTokenUtil jwtTokenUtil, + JWTUserDetailsService userDetailsService, + UserRepository users) { + this.authenticationManager = authenticationManager; + this.userRepository = userRepository; + this.jwtTokenUtil = jwtTokenUtil; + this.userDetailsService = userDetailsService; + } + @PostMapping("/login") public JWTResponse login(@RequestBody JWTRequest authenticationRequest) throws Exception { authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword()); @@ -42,15 +52,18 @@ public class AuthenticationController { return new JWTResponse(token); } + @Authorization(value = "Bearer") @PatchMapping("/update") - public User update(@Valid @RequestBody final UserUpdateRequest u, final Principal principal) { + public User update( + @Valid @RequestBody final UserUpdateRequest userData, final Principal principal) { final User oldUser = userRepository.findByUsername(principal.getName()); - if (u.getName() != null) oldUser.setName(u.getName()); - if (u.getEmail() != null) { - oldUser.setEmail(u.getEmail()); + if (userData.getName() != null) oldUser.setName(userData.getName()); + if (userData.getEmail() != null) { + oldUser.setEmail(userData.getEmail()); // TODO: handle email verification } - if (u.getPassword() != null) oldUser.setPassword(encoder.encode(u.getPassword())); + if (userData.getPassword() != null) + oldUser.setPassword(encoder.encode(userData.getPassword())); return userRepository.save(oldUser); } From fcf7189e44db1ec6d30263bb9bb5afff2ecd5b45 Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Mon, 2 Mar 2020 17:11:29 +0100 Subject: [PATCH 8/8] Updated email verification workflow to current code practices --- build.gradle | 3 + .../smarthut/Service/EmailSenderService.java | 2 +- .../smarthut/config/GsonConfig.java | 36 +++++++++ .../smarthut/config/SpringFoxConfig.java | 77 +++++++++++++++++++ .../smarthut/controller/RoomController.java | 40 ++++++---- .../controller/UserAccountController.java | 47 ++++++----- .../smarthut/dto/RoomSaveRequest.java | 43 +++++++++++ .../smarthut/dto/UserRegistrationRequest.java | 67 ++++++++++++++++ ...va => DuplicateRegistrationException.java} | 6 +- .../sanmarinoes/smarthut/models/Device.java | 13 +++- .../sa4/sanmarinoes/smarthut/models/Room.java | 4 + .../sanmarinoes/smarthut/models/Switch.java | 24 ++++++ .../sa4/sanmarinoes/smarthut/models/User.java | 6 +- 13 files changed, 325 insertions(+), 43 deletions(-) create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/GsonConfig.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RoomSaveRequest.java create mode 100644 src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/UserRegistrationRequest.java rename src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/{DuplicateEmailRegistrationException.java => DuplicateRegistrationException.java} (54%) diff --git a/build.gradle b/build.gradle index 7c7384d..d511c0b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ sourceCompatibility = "11" repositories { mavenCentral() + jcenter() } dependencies { @@ -21,6 +22,8 @@ dependencies { implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'org.springframework.security:spring-security-web' implementation 'org.postgresql:postgresql' + compile "io.springfox:springfox-swagger2:2.9.2" + compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-json' 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 index 35bc509..a51eb5a 100644 --- 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 @@ -1,4 +1,4 @@ -package ch.usi.inf.sa4.sanmarinoes.smarthut.Service; +package ch.usi.inf.sa4.sanmarinoes.smarthut.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/GsonConfig.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/GsonConfig.java new file mode 100644 index 0000000..3a2ab37 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/GsonConfig.java @@ -0,0 +1,36 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.config; + +import com.google.gson.*; +import java.lang.reflect.Type; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.json.GsonHttpMessageConverter; +import springfox.documentation.spring.web.json.Json; + +/** + * Spring configuration in order to register the GSON type adapter needed to avoid serializing twice + * Springfox Swagger JSON output (see: https://stackoverflow.com/a/30220562) + */ +@Configuration +public class GsonConfig { + @Bean + public GsonHttpMessageConverter gsonHttpMessageConverter() { + GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); + converter.setGson(gson()); + return converter; + } + + private Gson gson() { + final GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter()); + return builder.create(); + } +} + +/** GSON type adapter needed to avoid serializing twice Springfox Swagger JSON output */ +class SpringfoxJsonToGsonAdapter implements JsonSerializer { + @Override + public JsonElement serialize(Json json, Type type, JsonSerializationContext context) { + return JsonParser.parseString(json.value()); + } +} 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 new file mode 100644 index 0000000..b5e8d10 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/SpringFoxConfig.java @@ -0,0 +1,77 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.config; + +import static springfox.documentation.builders.PathSelectors.regex; + +import java.util.List; +import java.util.function.Predicate; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * This class configures the automated REST documentation tool Swagger for this project. The + * documentation can be seen by going to http://localhost:8080/swaggeer-ui.html + */ +@Configuration +@EnableSwagger2 +@ComponentScan("ch.usi.inf.sa4.sanmarinoes.smarthut") +public class SpringFoxConfig { + + /** + * Main definition of Springfox / swagger configuration + * + * @return a Docket object containing the swagger configuration + */ + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(paths()::test) + .build() + .apiInfo(apiInfo()) + .securitySchemes(securitySchemes()); + } + + /** + * Configures the documentation about the smarthut authentication system + * + * @return a list of springfox authentication configurations + */ + private static List securitySchemes() { + return List.of(new ApiKey("Bearer", "Authorization", "header")); + } + + /** + * Configures the paths the documentation must be generated for. Add a path here only when the + * spec has been totally defined. + * + * @return A predicate that tests whether a path must be included or not + */ + private Predicate paths() { + return ((Predicate) regex("/auth.*")::apply).or(regex("/register.*")::apply); + } + + /** + * Returns the metadata about the smarthut project + * + * @return metadata about smarthut + */ + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("SmartHut.sm API") + .description("Backend API for the SanMariones version of the SA4 SmartHut project") + .termsOfServiceUrl("https://www.youtube.com/watch?v=9KxTcDsy9Gs") + .license("WTFPL") + .version("dev branch") + .build(); + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RoomController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RoomController.java index 9ff6e2e..a25e4b5 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RoomController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/RoomController.java @@ -1,11 +1,12 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.RoomSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*; +import java.security.Principal; import java.util.*; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.*; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; @@ -28,27 +29,38 @@ public class RoomController { return roomRepository.findById(id); } - @PostMapping - public Room save(@Valid @RequestBody Room r) { - final Object principal = - SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - - if (!(principal instanceof UserDetails)) { - throw new IllegalStateException("User is not logged in"); - } + private Room save(final RoomSaveRequest r, final Principal principal, boolean setWhenNull) { + Room newRoom = new Room(); final String username = ((UserDetails) principal).getUsername(); final Long userId = userRepository.findByUsername(username).getId(); + final String img = r.getImage(); + final String icon = r.getIcon(); - r.setUserId(userId); - r.setUser(null); + newRoom.setUserId(userId); + newRoom.setUser(null); + if (img != null) { + newRoom.setImage(img.getBytes()); + } else if (setWhenNull) { + newRoom.setImage(null); + } + if (icon != null) { + newRoom.setIcon(icon.getBytes()); + } else if (setWhenNull) { + newRoom.setIcon(null); + } - return roomRepository.save(r); + return roomRepository.save(newRoom); + } + + @PostMapping + public Room create(@Valid @RequestBody RoomSaveRequest r, final Principal principal) { + return this.save(r, principal, true); } @PutMapping - public Room update(@Valid @RequestBody Room r) { - return roomRepository.save(r); + public Room update(@Valid @RequestBody RoomSaveRequest r, final Principal principal) { + return this.save(r, principal, false); } @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 index b0210e0..e238f16 100644 --- 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 @@ -1,13 +1,14 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; -import ch.usi.inf.sa4.sanmarinoes.smarthut.Service.EmailSenderService; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.OkResponse; -import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateEmailRegistrationException; +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; @@ -20,7 +21,6 @@ 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; -import org.springframework.web.servlet.ModelAndView; @RestController @EnableAutoConfiguration @@ -35,33 +35,37 @@ public class UserAccountController { @Autowired private BCryptPasswordEncoder encoder; - @GetMapping - public ModelAndView displayRegistration(ModelAndView modelAndView, User user) { - modelAndView.addObject("user", user); - modelAndView.setViewName("register"); - return modelAndView; - } - @PostMapping - public OkResponse registerUser(@Valid @RequestBody User user) - throws DuplicateEmailRegistrationException { - System.out.println(user); - User existingUser = userRepository.findByEmailIgnoreCase(user.getEmail()); + 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 (existingUser != null) { - throw new DuplicateEmailRegistrationException(); + if (existingEmailUser != null || existingUsernameUser != null) { + throw new DuplicateRegistrationException(); } else { - // encode user's password - user.setPassword(encoder.encode(user.getPassword())); - userRepository.save(user); + final User toSave = new User(); + // disable the user (it will be enabled on email confiration) + toSave.setEnabled(false); - ConfirmationToken confirmationToken = new ConfirmationToken(user); + // 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(user.getEmail()); + mailMessage.setTo(registrationData.getEmail()); mailMessage.setSubject("Complete Registration!"); mailMessage.setFrom("smarthut.sm@gmail.com"); mailMessage.setText( @@ -85,6 +89,7 @@ public class UserAccountController { 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/RoomSaveRequest.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RoomSaveRequest.java new file mode 100644 index 0000000..f813b1c --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/dto/RoomSaveRequest.java @@ -0,0 +1,43 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.dto; + +import javax.persistence.Lob; +import javax.validation.constraints.NotNull; + +public class RoomSaveRequest { + /** + * Icon and image are to be given as byte[]. In order to get an encoded string from it, the + * Base64.getEncoder().encodeToString(byte[] content) should be used. For further information: + * https://www.baeldung.com/java-base64-image-string + * https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html + */ + @Lob private String icon; + + @Lob private String image; + + /** The user given name of this room (e.g. 'Master bedroom') */ + @NotNull private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } +} 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/DuplicateEmailRegistrationException.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java similarity index 54% rename from src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateEmailRegistrationException.java rename to src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java index 3c37b2b..302c07e 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateEmailRegistrationException.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/error/DuplicateRegistrationException.java @@ -4,8 +4,8 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class DuplicateEmailRegistrationException extends Exception { - public DuplicateEmailRegistrationException() { - super("Email already belonging to another user"); +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/models/Device.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Device.java index 834104d..871b67c 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Device.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Device.java @@ -1,6 +1,7 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; import com.google.gson.annotations.SerializedName; +import io.swagger.annotations.ApiModelProperty; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -21,12 +22,14 @@ public abstract class Device { /** Device identifier */ @Id @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id", updatable = false, nullable = false) + @Column(name = "id", updatable = false, nullable = false, unique = true) + @ApiModelProperty(hidden = true) private long id; /** The room this device belongs in */ @ManyToOne @JoinColumn(name = "room_id", nullable = false, updatable = false, insertable = false) + @ApiModelProperty(hidden = true) private Room room; /** @@ -46,13 +49,17 @@ public abstract class Device { * The name for the category of this particular device (e.g 'dimmer'). Not stored in the * database but set thanks to constructors */ - @Transient private final String kind; + @ApiModelProperty(hidden = true) + @Transient + private final String kind; /** * The way this device behaves in the automation flow. Not stored in the database but set thanks * to constructors */ - @Transient private final FlowType flowType; + @ApiModelProperty(hidden = true) + @Transient + private final FlowType flowType; public long getId() { return id; diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Room.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Room.java index c0fae3f..4a82ab2 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Room.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/Room.java @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; +import io.swagger.annotations.ApiModelProperty; import java.util.Set; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -11,6 +12,7 @@ public class Room { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", updatable = false, nullable = false) + @ApiModelProperty(hidden = true) private Long id; /** @@ -41,12 +43,14 @@ public class Room { private String name; /** Collection of devices present in this room */ + @ApiModelProperty(hidden = true) @OneToMany(mappedBy = "room") private Set devices; /** User that owns the house this room is in */ @ManyToOne @JoinColumn(name = "user_id", nullable = false, updatable = false, insertable = false) + @ApiModelProperty(hidden = true) private User user; public Long getId() { 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 fbf1eed..6f0eb99 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 @@ -1,11 +1,35 @@ 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) */ @Entity public class Switch extends InputDevice { + + /** The state of this switch */ + @Column(nullable = false, name = "switch_on") + private boolean on; + public Switch() { super("switch"); } + + /** + * Setter method for this Switch + * + * @param state The state to be set + */ + void setState(boolean state) { + on = state; + } + + /** + * Getter method for this Switch + * + * @return This Switch on state + */ + boolean getState() { + 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 6c1ff6b..96b20d8 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 @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.models; +import io.swagger.annotations.ApiModelProperty; import java.util.Set; import javax.persistence.*; import javax.validation.constraints.Email; @@ -15,6 +16,7 @@ public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", updatable = false, nullable = false) + @ApiModelProperty(hidden = true) private Long id; /** The full name of the user */ @@ -43,7 +45,7 @@ public class User { * The user's email (validated according to criteria used in >input type="email"<> * , technically not RFC 5322 compliant */ - @Column(nullable = false) + @Column(nullable = false, unique = true) @NotNull @NotEmpty(message = "Please provide an email") @Email(message = "Please provide a valid email address") @@ -52,9 +54,11 @@ public class User { /** All rooms in the user's house */ @OneToMany(mappedBy = "user") + @ApiModelProperty(hidden = true) private Set rooms; @Column(nullable = false) + @ApiModelProperty(hidden = true) private Boolean isEnabled = false; public Long getId() {