package es.uv.garcosda.controllers; import java.util.List; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import es.uv.garcosda.domain.Mail; import es.uv.garcosda.domain.Mailbox; import es.uv.garcosda.domain.User; import es.uv.garcosda.objects.MailDTO; import es.uv.garcosda.services.UserService; @RestController @RequestMapping("/api/v1") public class MailerController { @Autowired UserService us; @Autowired RabbitTemplate rabitt; @Value("${rabbitmq.exchange.name}") private String exchange; @Value("${rabbitmq.routing.key.user}") private String routingKeyUser; @Value("${rabbitmq.routing.key.recover}") private String routingKeyRecover; @GetMapping("users") public ResponseEntity getUsers() { List u = this.us.findAll(); return new ResponseEntity>(u, HttpStatus.OK); } @GetMapping("users/{email}") public ResponseEntity getUser(@PathVariable("email") String email) { User u = this.us.findByEmail(email); if(u.getEmail() == null) { return new ResponseEntity("No user found with email "+email, HttpStatus.NOT_FOUND); } else { return new ResponseEntity(u, HttpStatus.OK); } } @GetMapping("mailbox/{email}") public ResponseEntity getMailbox(@PathVariable("email") String email) { User u = this.us.findByEmail(email); if(u.getEmail() == null) { return new ResponseEntity("No mailbox found for email "+email, HttpStatus.NOT_FOUND); } else { Mailbox m = this.us.findMailboxByEmail(u.getEmail()); if(m.getUser() == null) { return new ResponseEntity("No mailbox found for email "+email, HttpStatus.NOT_FOUND); } return new ResponseEntity(m, HttpStatus.OK); } } @PostMapping("mailbox") public ResponseEntity sendMail(@RequestBody MailDTO mail){ User from = this.us.findByEmail(mail.getFrom()); User to = this.us.findByEmail(mail.getTo()); if(from.getEmail() == null) { return new ResponseEntity("No origin user found with email "+mail.getFrom(), HttpStatus.NOT_FOUND); } else if(to.getEmail() == null) { return new ResponseEntity("No destination user found with email "+mail.getTo(), HttpStatus.NOT_FOUND); } else { Mail m = new Mail(from, to, mail.getSubject(), mail.getBody()); us.addMail(m); return new ResponseEntity(m, HttpStatus.OK); } } @PostMapping("users") public ResponseEntity addUser(@RequestBody User user){ if(this.us.addUser(user)) { this.rabitt.convertAndSend(this.exchange, this.routingKeyUser, user); return new ResponseEntity("User created", HttpStatus.CREATED); } else{ return new ResponseEntity("Cannot create user", HttpStatus.CONFLICT); } } @PostMapping("users/{email}/passwd") public ResponseEntity recoverUserPasswd(@PathVariable("email") String email){ User user = this.us.findByEmail(email); if(user.getEmail() == null) { return new ResponseEntity("No user found with email "+email, HttpStatus.NOT_FOUND); } this.rabitt.convertAndSend(this.exchange, this.routingKeyRecover, user); return new ResponseEntity("New password sent", HttpStatus.CREATED); } }