diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e5fef68 Binary files /dev/null and b/.DS_Store differ diff --git a/README.md b/README.md index 1e099d4..3ee8251 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,7 @@ You can have an overview of our Spring Boot Server with the diagram below: For more detail, please visit: > [Secure Spring Boot App with Spring Security & JWT Authentication](https://bezkoder.com/spring-boot-jwt-authentication/) - > [For MongoDB](https://bezkoder.com/spring-boot-jwt-auth-mongodb/) - ## Refresh Token ![spring-boot-refresh-token-jwt-example-flow](spring-boot-refresh-token-jwt-example-flow.png) @@ -24,55 +22,32 @@ For instruction: [Spring Boot Refresh Token with JWT example](https://bezkoder.c ## Fullstack Authentication > [Spring Boot + Vue.js JWT Authentication](https://bezkoder.com/spring-boot-vue-js-authentication-jwt-spring-security/) - > [Spring Boot + Angular 8 JWT Authentication](https://bezkoder.com/angular-spring-boot-jwt-auth/) - > [Spring Boot + Angular 10 JWT Authentication](https://bezkoder.com/angular-10-spring-boot-jwt-auth/) - > [Spring Boot + Angular 11 JWT Authentication](https://bezkoder.com/angular-11-spring-boot-jwt-auth/) - > [Spring Boot + React JWT Authentication](https://bezkoder.com/spring-boot-react-jwt-auth/) - ## Fullstack CRUD App > [Vue.js + Spring Boot + MySQL/PostgreSQL example](https://bezkoder.com/spring-boot-vue-js-crud-example/) - > [Angular 8 + Spring Boot + MySQL example](https://bezkoder.com/angular-spring-boot-crud/) - > [Angular 8 + Spring Boot + PostgreSQL example](https://bezkoder.com/angular-spring-boot-postgresql/) - > [Angular 10 + Spring Boot + MySQL example](https://bezkoder.com/angular-10-spring-boot-crud/) - > [Angular 10 + Spring Boot + PostgreSQL example](https://bezkoder.com/angular-10-spring-boot-postgresql/) - > [Angular 11 + Spring Boot + MySQL example](https://bezkoder.com/angular-11-spring-boot-crud/) - > [Angular 11 + Spring Boot + PostgreSQL example](https://bezkoder.com/angular-11-spring-boot-postgresql/) - > [React + Spring Boot + MySQL example](https://bezkoder.com/react-spring-boot-crud/) - > [React + Spring Boot + PostgreSQL example](https://bezkoder.com/spring-boot-react-postgresql/) - > [React + Spring Boot + MongoDB example](https://bezkoder.com/react-spring-boot-mongodb/) - Run both Back-end & Front-end in one place: > [Integrate Angular with Spring Boot Rest API](https://bezkoder.com/integrate-angular-spring-boot/) - > [Integrate React.js with Spring Boot Rest API](https://bezkoder.com/integrate-reactjs-spring-boot/) - > [Integrate Vue.js with Spring Boot Rest API](https://bezkoder.com/integrate-vue-spring-boot/) - More Practice: > [Spring Boot File upload example with Multipart File](https://bezkoder.com/spring-boot-file-upload/) - > [Exception handling: @RestControllerAdvice example in Spring Boot](https://bezkoder.com/spring-boot-restcontrolleradvice/) - > [Spring Boot Repository Unit Test with @DataJpaTest](https://bezkoder.com/spring-boot-unit-test-jpa-repo-datajpatest/) - > [Deploy Spring Boot App on AWS – Elastic Beanstalk](https://bezkoder.com/deploy-spring-boot-aws-eb/) - > [Secure Spring Boot App with Spring Security & JWT Authentication](https://bezkoder.com/spring-boot-jwt-authentication/) - ## Dependency – If you want to use PostgreSQL: ```xml @@ -97,13 +72,10 @@ Open `src/main/resources/application.properties` spring.datasource.url= jdbc:postgresql://localhost:5432/testdb spring.datasource.username= postgres spring.datasource.password= 123 - spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect - # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto= update - # App Properties bezkoder.app.jwtSecret= bezKoderSecretKey bezkoder.app.jwtExpirationMs= 86400000 @@ -113,10 +85,8 @@ bezkoder.app.jwtExpirationMs= 86400000 spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=false spring.datasource.username= root spring.datasource.password= 123456 - spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.hibernate.ddl-auto= update - # App Properties bezkoder.app.jwtSecret= bezKoderSecretKey bezkoder.app.jwtExpirationMs= 86400000 @@ -132,3 +102,4 @@ INSERT INTO roles(name) VALUES('ROLE_USER'); INSERT INTO roles(name) VALUES('ROLE_MODERATOR'); INSERT INTO roles(name) VALUES('ROLE_ADMIN'); ``` +# backend-matcher diff --git a/pom.xml b/pom.xml index 907ac6a..ca35be3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,40 +24,80 @@ org.springframework.boot spring-boot-starter-data-jpa - + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + org.springframework.boot spring-boot-starter-security - + + org.projectlombok + lombok + true + org.springframework.boot spring-boot-starter-web - + + org.springframework.boot + spring-boot-starter-websocket + mysql mysql-connector-java runtime - + + org.springframework.boot + spring-boot-starter-jetty + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-tomcat + + + io.jsonwebtoken jjwt 0.9.1 - + + org.springframework.boot + spring-boot-starter-websocket + org.springframework.boot spring-boot-starter-test test - org.springframework.security spring-security-test test + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..34c2b1a Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store new file mode 100644 index 0000000..8ea1cf3 Binary files /dev/null and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store new file mode 100644 index 0000000..10c64d9 Binary files /dev/null and b/src/main/java/.DS_Store differ diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store new file mode 100644 index 0000000..20071a0 Binary files /dev/null and b/src/main/java/com/.DS_Store differ diff --git a/src/main/java/com/bezkoder/springjwt/models/User.java b/src/main/java/com/bezkoder/springjwt/models/User.java deleted file mode 100644 index 6e3eaa2..0000000 --- a/src/main/java/com/bezkoder/springjwt/models/User.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.bezkoder.springjwt.models; - -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.*; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; - -@Entity -@Table( name = "users", - uniqueConstraints = { - @UniqueConstraint(columnNames = "username"), - @UniqueConstraint(columnNames = "email") - }) -public class User { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotBlank - @Size(max = 20) - private String username; - - @NotBlank - @Size(max = 50) - @Email - private String email; - - @NotBlank - @Size(max = 120) - private String password; - - @ManyToMany(fetch = FetchType.LAZY) - @JoinTable( name = "user_roles", - joinColumns = @JoinColumn(name = "user_id"), - inverseJoinColumns = @JoinColumn(name = "role_id")) - private Set roles = new HashSet<>(); - - public User() { - } - - public User(String username, String email, String password) { - this.username = username; - this.email = email; - this.password = password; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Set getRoles() { - return roles; - } - - public void setRoles(Set roles) { - this.roles = roles; - } -} diff --git a/src/main/java/com/spring/.DS_Store b/src/main/java/com/spring/.DS_Store new file mode 100644 index 0000000..084ac8e Binary files /dev/null and b/src/main/java/com/spring/.DS_Store differ diff --git a/src/main/java/com/spring/data/.DS_Store b/src/main/java/com/spring/data/.DS_Store new file mode 100644 index 0000000..fd1b151 Binary files /dev/null and b/src/main/java/com/spring/data/.DS_Store differ diff --git a/src/main/java/com/bezkoder/springjwt/SpringBootSecurityJwtApplication.java b/src/main/java/com/spring/data/SpringBootSecurityJwtApplication.java similarity index 90% rename from src/main/java/com/bezkoder/springjwt/SpringBootSecurityJwtApplication.java rename to src/main/java/com/spring/data/SpringBootSecurityJwtApplication.java index d13abd7..0635aa4 100644 --- a/src/main/java/com/bezkoder/springjwt/SpringBootSecurityJwtApplication.java +++ b/src/main/java/com/spring/data/SpringBootSecurityJwtApplication.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt; +package com.spring.data; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/bezkoder/springjwt/controllers/AuthController.java b/src/main/java/com/spring/data/controllers/AuthController.java similarity index 81% rename from src/main/java/com/bezkoder/springjwt/controllers/AuthController.java rename to src/main/java/com/spring/data/controllers/AuthController.java index e598702..07dd640 100644 --- a/src/main/java/com/bezkoder/springjwt/controllers/AuthController.java +++ b/src/main/java/com/spring/data/controllers/AuthController.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.controllers; +package com.spring.data.controllers; import java.util.HashSet; import java.util.List; @@ -7,6 +7,18 @@ import javax.validation.Valid; +import com.spring.data.models.ERole; +import com.spring.data.models.Role; +import com.spring.data.models.User; +import com.spring.data.payload.request.LoginRequest; +import com.spring.data.payload.request.SignupRequest; +import com.spring.data.payload.response.JwtResponse; +import com.spring.data.payload.response.MessageResponse; +import com.spring.data.repository.RoleRepository; +import com.spring.data.repository.UserRepository; +import com.spring.data.security.jwt.JwtUtils; +import com.spring.data.security.services.UserDetailsImpl; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; @@ -20,19 +32,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.bezkoder.springjwt.models.ERole; -import com.bezkoder.springjwt.models.Role; -import com.bezkoder.springjwt.models.User; -import com.bezkoder.springjwt.payload.request.LoginRequest; -import com.bezkoder.springjwt.payload.request.SignupRequest; -import com.bezkoder.springjwt.payload.response.JwtResponse; -import com.bezkoder.springjwt.payload.response.MessageResponse; -import com.bezkoder.springjwt.repository.RoleRepository; -import com.bezkoder.springjwt.repository.UserRepository; -import com.bezkoder.springjwt.security.jwt.JwtUtils; -import com.bezkoder.springjwt.security.services.UserDetailsImpl; - -@CrossOrigin(origins = "*", maxAge = 3600) +@CrossOrigin(origins = "*") @RestController @RequestMapping("/api/auth") public class AuthController { @@ -74,21 +74,21 @@ public ResponseEntity authenticateUser(@Valid @RequestBody LoginRequest login @PostMapping("/signup") public ResponseEntity registerUser(@Valid @RequestBody SignupRequest signUpRequest) { - if (userRepository.existsByUsername(signUpRequest.getUsername())) { + if (userRepository.existsByNom(signUpRequest.getNom())) { return ResponseEntity .badRequest() .body(new MessageResponse("Error: Username is already taken!")); } - if (userRepository.existsByEmail(signUpRequest.getEmail())) { + if (userRepository.existsByUsername(signUpRequest.getUsername())) { return ResponseEntity .badRequest() .body(new MessageResponse("Error: Email is already in use!")); } // Create new user's account - User user = new User(signUpRequest.getUsername(), - signUpRequest.getEmail(), + User user = new User(signUpRequest.getNom(), + signUpRequest.getUsername(), encoder.encode(signUpRequest.getPassword())); Set strRoles = signUpRequest.getRole(); diff --git a/src/main/java/com/spring/data/controllers/ChatController.java b/src/main/java/com/spring/data/controllers/ChatController.java new file mode 100644 index 0000000..a3c8e10 --- /dev/null +++ b/src/main/java/com/spring/data/controllers/ChatController.java @@ -0,0 +1,31 @@ +package com.spring.data.controllers; + +import com.spring.data.models.ChatMessage; + +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; +import org.springframework.stereotype.Controller; + +@Controller +public class ChatController { + + @MessageMapping("/chat.send") + @SendTo("/topic/public") + public ChatMessage sendMessage(@Payload final ChatMessage chatMessage) { + return chatMessage; + } + + @MessageMapping("/chat.newUser") + @SendTo("/topic/public") + public ChatMessage newUser(@Payload final ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) { + headerAccessor.getSessionAttributes().put("username", chatMessage.getSender()); + return chatMessage; + } + + + + + +} diff --git a/src/main/java/com/spring/data/controllers/ConversaController.java b/src/main/java/com/spring/data/controllers/ConversaController.java new file mode 100644 index 0000000..b32257e --- /dev/null +++ b/src/main/java/com/spring/data/controllers/ConversaController.java @@ -0,0 +1,91 @@ +package com.spring.data.controllers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.spring.data.models.Conversa; +import com.spring.data.repository.ConversaRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("/conversa") +public class ConversaController { + @Autowired + ConversaRepository conversaRepository; + + @GetMapping("/all/{id}") + public ResponseEntity> getAllUsers(@PathVariable("id") long id/*@RequestParam(required = false) String username*/) { + try { + List reportes = new ArrayList(); + + //if (username == null) + conversaRepository.findUserConverses(id).forEach(reportes::add); + //else + // userRepository.findByStringContaining(username).forEach(users::add); + + if (reportes.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(reportes, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable("id") long id) { + Optional userData = conversaRepository.findById(id); + + if (userData.isPresent()) { + return new ResponseEntity<>(userData.get(), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + /*@PostMapping("/newconversa/{user_id_1}/{user_id_2}") + public ResponseEntity novaConversa(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2, @PathVariable("time_started") String time_started@RequestBody Conversa conversa) { + try { + Conversa _conversa = conversaRepository.save(new Conversa(conversa.getUser_Id_creador(), conversa.getUser_Id_segon(), conversa.getTimeStarted())); + return new ResponseEntity<>(_conversa, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } +}*/ + +@PostMapping("/newconversa/{user_id_1}/{user_id_2}") +public ResponseEntity novaConversa(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2 /* @PathVariable("time_started") String time_started@RequestBody Conversa conversa*/) { +try { + Conversa _conversa = conversaRepository.save(new Conversa(user_id_1, user_id_2/*, conversa.getTimeStarted())*/)); + return new ResponseEntity<>(_conversa, HttpStatus.CREATED); +} catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); +} +} + +@DeleteMapping("/delete/{id}/{id2}") + public ResponseEntity delete(@PathVariable("id") long id, @PathVariable("id2") long id2) { + try { + conversaRepository.deleteById(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + +} diff --git a/src/main/java/com/spring/data/controllers/MatchesController.java b/src/main/java/com/spring/data/controllers/MatchesController.java new file mode 100644 index 0000000..b15c3d2 --- /dev/null +++ b/src/main/java/com/spring/data/controllers/MatchesController.java @@ -0,0 +1,359 @@ +package com.spring.data.controllers; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.fasterxml.jackson.databind.deser.DataFormatReaders.Match; +import com.spring.data.models.Matches; +import com.spring.data.models.Message; +import com.spring.data.repository.*; +import com.spring.data.controllers.ConversaController; + +import com.spring.data.models.Conversa; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +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.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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("/matches") +public class MatchesController { + + @Autowired + MatchesRepository matchesRepository; + + @Autowired + ConversaRepository conversaRepository; + + @Autowired + MessageRepository messageRepository; + + + + @GetMapping("/all") + public ResponseEntity> getAllUsers() { + try { + List matches = new ArrayList(); + + matchesRepository.findAllMatches().forEach(matches::add); + + if (matches.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(matches, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + /*else + matchesRepository.findByStringContaining(nom).forEach(users::add); + + if (matches.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(matches, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + }*/ + + + //Falta fer una query per crear una nova entrada a la taula amb el like + + //Mirar si fa match ---> Implementat de moment amb un request body // Error: No converter found capable of converting from type [java.lang.Integer] to type [java.lang.Boolean] + + + + //@PutMapping("/{user_id_1}/{user_id_2}/{liked_2}") + public Boolean isMatch(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2, @PathVariable("liked_2") boolean liked_2) { + Optional matchData = matchesRepository.findTableByUsers(user_id_1, user_id_2); + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + boolean isliked = matchesRepository.alreadyLiked(user_id_1, user_id_2) > 0; + if (isliked && liked_2 == true) { + //Matches _matches = matchData.get(); + _matches.setLiked_2(liked_2); + _matches.setIs_Match(true); + // matchesRepository.save(matchData); + return true; + } + else { + //_matches.setLiked_2(false); + return false; + } + + } + else return false; +} + + + + + +/* +@PutMapping("/{user_id_1}/{user_id_2}/{liked_2}") + public ResponseEntity isMatch2(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2, @PathVariable("liked_2") boolean liked_2) { + Optional matchData = matchesRepository.findTableByUsers(user_id_1, user_id_2); + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + boolean isliked = matchesRepository.alreadyLiked(user_id_1, user_id_2) > 0; + if (isliked && liked_2 == true) { + + //Matches _matches = matchData.get(); + _matches.setLiked_2(liked_2); + _matches.setIs_Match(true); + //matchesRepository.save(matchData); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } + else if (liked_2 == true) { + @PostMapping("/addShoe") + public Shoe addShoe(@RequestBody Shoe shoe) { + return shoeRepository.save(shoe); + } + } + else { + + //_matches.setLiked_2(false); + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); +}*/ + +/*@PostMapping("/newlike/{user_id_1}/{user_id_2}") +public ResponseEntity liked(@PathVariable("user_id_1") Long user_id_1, @PathVariable("user_id_2") Long user_id_2) { + try { + Matches _matches = matchesRepository.save(new Matches((long)1, (long)5, true, false, false)); + return new ResponseEntity<>(_matches, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } +}*/ + +@PostMapping("/newlike") +public ResponseEntity liked(@RequestBody Matches matches) { + try { + Matches _matches = matchesRepository.save(new Matches(matches.getUser_Id_1(), matches.getUser_Id_2(), true, false, false)); + return new ResponseEntity<>(_matches, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } +} + +@PostMapping("/newconversa/{user_id_1}/{user_id_2}") +public ResponseEntity novaConversa(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2 /* @PathVariable("time_started") String time_started@RequestBody Conversa conversa*/) { +try { + Conversa _conversa = conversaRepository.save(new Conversa(user_id_1, user_id_2));/*, conversa.getTimeStarted())*/ + return new ResponseEntity<>(_conversa, HttpStatus.CREATED); +} catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); +} +} + +@PostMapping("/{user_id_1}/{user_id_2}/{user_liked}") + public ResponseEntity isMatch2(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2, @PathVariable("user_liked") Boolean user_liked, @RequestBody (required=false) Matches matches /*@RequestBody (required=false) Conversa conversa*/) { + Optional matchData = matchesRepository.findTableByUsers(user_id_1, user_id_2); + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + boolean isliked = matchesRepository.alreadyLiked(user_id_1, user_id_2) > 0; + if (isliked && user_liked == true) { + + //Matches _matches = matchData.get(); + _matches.setLiked_2(user_liked); + _matches.setIs_Match(true); + //matchesRepository.save(matchData); + novaConversa(user_id_1, user_id_2); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } + } + else if (user_liked == true) { + liked(matches); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + +/*7@PostMapping("/{user_id_1}/{user_id_2}/{user_liked}") + public ResponseEntity isMatch2(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2, @PathVariable("user_liked") Boolean user_liked, @RequestBody (required=false) Matches matches) { + Optional matchData = matchesRepository.findTableByUsers(user_id_1, user_id_2); + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + boolean isliked = matchesRepository.alreadyLiked(user_id_1, user_id_2) > 0; + if (isliked && user_liked == true) { + + //Matches _matches = matchData.get(); + _matches.setLiked_2(user_liked); + _matches.setIs_Match(true); + //matchesRepository.save(matchData); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } + } + else if (user_liked == true) { + Matches _matches = matchesRepository.save(new Matches(matches.getUser_Id_1(), matches.getUser_Id_2(), matches.getLiked_1(), false, false)); + return new ResponseEntity<>(_matches, HttpStatus.CREATED); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + }*/ + + + +/* + +@PutMapping("/update/preferences/{id}") + public ResponseEntity updateModo(@PathVariable("id") long id, @RequestBody User user) { + Optional userData = userRepository.findById(id); + + if (userData.isPresent()) { + User _user = userData.get(); + _user.setFlex(user.getFlex()); + _user.setDuo(user.getDuo()); + _user.setClash(user.getClash()); + _user.setOtro(user.getOtro()); + _user.setforfun(user.getForFun()); + _user.setChamps(user.getChamps()); + _user.setOtps(user.getOtps()); + _user.setTryHard(user.getTryHard()); + _user.setBot(user.getBot()); + _user.setFill(user.getFill()); + _user.setJungle(user.getJungle()); + _user.setMid(user.getMid()); + _user.setSupp(user.getSupp()); + _user.setTop(user.getTop()); + return new ResponseEntity<>(userRepository.save(_user), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } +*/ + + + //Retorna Id de la taula (en teoria no s'ha d'utilitzar) + @GetMapping("/getTableId/{user_id_1}/{user_id_2}") + public Long getTableId(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2) { + return matchesRepository.findIdByUsers(user_id_1, user_id_2); + } + + @GetMapping("/getTable/{user_id_1}/{user_id_2}") //Funcio auxiliar per fer proves amb postman + public ResponseEntity getTable(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2) { + Optional matchData = matchesRepository.findTableByUsers(user_id_1, user_id_2); + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + + //Retorna taula matches del user id_1, id_2 --> No cal utilitzar-la + //@GetMapping("/getTable/{user_id_1}/{user_id_2}") + public ResponseEntity getMatch(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") long user_id_2) { + Optional matchData = matchesRepository.findByMatches(user_id_1, user_id_2); + + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + @PutMapping("/like/{user_id_1}/{user_id_}") + public ResponseEntity updateMatch(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_1") long user_id_2, @RequestBody Matches matches) { + Optional matchData = matchesRepository.findByMatches(user_id_1, user_id_2); + + if (matchData.isPresent()) { + Matches _matches = matchData.get(); + _matches.setLiked_2(matches.getLiked_2()); + return new ResponseEntity<>(matchesRepository.save(_matches), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + + + @GetMapping("/{id}") + public ResponseEntity getMatchById(@PathVariable("id") long id) { + Optional matchData = matchesRepository.findById(id); + + if (matchData.isPresent()) { + return new ResponseEntity<>(matchData.get(), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + //No cal utilitzar-la + @GetMapping("/{user_id_1}/{user_id_2}") + public Boolean isMatch(@PathVariable("user_id_1") long user_id_1, @PathVariable("user_id_2") Long user_id_2) { + return matchesRepository.findIsMatch(user_id_1, user_id_2); + } + + //Matches del usuari user_id_1 + @GetMapping("/user/{user_id_1}") + public List getUserMatches(@PathVariable("user_id_1") long user_id_1) { + + return matchesRepository.findUserMatches(user_id_1); + } + + + //S'esborren els missatges amb conversa_id id + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteAllMessages(@PathVariable("id") long id) { + try { + List messages = messageRepository.findMessages(id); + messageRepository.deleteAll(messages); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + + //@DeleteMapping("/delete/{id}/{id2}") + //S'esborra la conversa dels usuaris id i id2 + public ResponseEntity deleteConversa(@PathVariable("id") long id, @PathVariable("id2") long id2) { + try { + long idtaula = conversaRepository.findId(id, id2); + deleteAllMessages(idtaula); + conversaRepository.deleteById(idtaula); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + //S'esborra el match, la conversa i els missatges de la conversa + @DeleteMapping("/delete/{id}/{id2}") + public ResponseEntity deleteMatch(@PathVariable("id") long id, @PathVariable("id2") long id2) { + try { + long idtaula = matchesRepository.findId(id, id2); + matchesRepository.deleteById(idtaula); + deleteConversa(id, id2); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + + +} + diff --git a/src/main/java/com/spring/data/controllers/MessageController.java b/src/main/java/com/spring/data/controllers/MessageController.java new file mode 100644 index 0000000..c5af46f --- /dev/null +++ b/src/main/java/com/spring/data/controllers/MessageController.java @@ -0,0 +1,57 @@ +package com.spring.data.controllers; + +import java.util.ArrayList; +import java.util.List; + +import com.spring.data.repository.MessageRepository; + +import com.spring.data.models.Message; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +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; + + +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("/message") +public class MessageController { + + @Autowired + MessageRepository messageRepository; + + + @GetMapping("/all/{id}") + public ResponseEntity> getAllUsers(@PathVariable("id") long id) { + try { + List matches = new ArrayList(); + + messageRepository.findMessages(id).forEach(matches::add); + + if (matches.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(matches, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PostMapping("/create") + public ResponseEntity createReport(@RequestBody Message message) { + try { + Message _message = messageRepository.save(new Message(message.getconversaId(), message.getUseridemisor(), message.getUseridreceptor(), message.getmessage(), message.getTimestamp())); + return new ResponseEntity<>(_message, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + +} diff --git a/src/main/java/com/spring/data/controllers/NotificationDispatcher.java b/src/main/java/com/spring/data/controllers/NotificationDispatcher.java new file mode 100644 index 0000000..a91c38a --- /dev/null +++ b/src/main/java/com/spring/data/controllers/NotificationDispatcher.java @@ -0,0 +1,63 @@ +package com.spring.data.controllers; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessageHeaderAccessor; +import org.springframework.messaging.simp.SimpMessageType; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; + +import java.util.HashSet; +import java.util.Set; + +import com.spring.data.models.Notification; + +@Service +public class NotificationDispatcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(NotificationDispatcher.class); + + private final SimpMessagingTemplate template; + + private Set listeners = new HashSet<>(); + + public NotificationDispatcher(SimpMessagingTemplate template) { + this.template = template; + } + + public void add(String sessionId) { + listeners.add(sessionId); + } + + public void remove(String sessionId) { + listeners.remove(sessionId); + } + + @Scheduled(fixedDelay = 2000) + public void dispatch() { + for (String listener : listeners) { + LOGGER.info("Sending notification to " + listener); + + SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE); + headerAccessor.setSessionId(listener); + headerAccessor.setLeaveMutable(true); + + int value = (int) Math.round(Math.random() * 100d); + template.convertAndSendToUser( + listener, + "/notification/item", + new Notification(Integer.toString(value)), + headerAccessor.getMessageHeaders()); + } + } + + @EventListener + public void sessionDisconnectionHandler(SessionDisconnectEvent event) { + String sessionId = event.getSessionId(); + LOGGER.info("Disconnecting " + sessionId + "!"); + remove(sessionId); + } +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/controllers/NotificationsController.java b/src/main/java/com/spring/data/controllers/NotificationsController.java new file mode 100644 index 0000000..fca3072 --- /dev/null +++ b/src/main/java/com/spring/data/controllers/NotificationsController.java @@ -0,0 +1,23 @@ +package com.spring.data.controllers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.stereotype.Controller; + +@Controller +public class NotificationsController { + private final NotificationDispatcher dispatcher; + @Autowired + public NotificationsController(NotificationDispatcher dispatcher) { + this.dispatcher = dispatcher; + } + @MessageMapping("/start") + public void start(StompHeaderAccessor stompHeaderAccessor) { + dispatcher.add(stompHeaderAccessor.getSessionId()); + } + @MessageMapping("/stop") + public void stop(StompHeaderAccessor stompHeaderAccessor) { + dispatcher.remove(stompHeaderAccessor.getSessionId()); + } +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/controllers/ReportesController.java b/src/main/java/com/spring/data/controllers/ReportesController.java new file mode 100644 index 0000000..0bf680e --- /dev/null +++ b/src/main/java/com/spring/data/controllers/ReportesController.java @@ -0,0 +1,88 @@ +package com.spring.data.controllers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.spring.data.models.Reportes; +import com.spring.data.repository.ReportesRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + + +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("/reportes") +public class ReportesController { + @Autowired + ReportesRepository reportesRepository; + + @GetMapping("/all") + public ResponseEntity> getAllUsers(/*@RequestParam(required = false) String username*/) { + try { + List reportes = new ArrayList(); + + //if (username == null) + reportesRepository.findAll().forEach(reportes::add); + //else + // userRepository.findByStringContaining(username).forEach(users::add); + + if (reportes.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(reportes, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable("id") long id) { + Optional reportesData = reportesRepository.findById(id); + + if (reportesData.isPresent()) { + return new ResponseEntity<>(reportesData.get(), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + @PostMapping("/create/{user_id}/{user_id_reported}") + public ResponseEntity createReport(@RequestBody Reportes reportes) { + try { + Reportes _reportes = reportesRepository.save(new Reportes(reportes.getUserId(), reportes.getUserId_reported(), reportes.getMotiu(), reportes.getComentari(), reportes.getProva(), reportes.getSolucionado())); + return new ResponseEntity<>(_reportes, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @PutMapping("/update/{id}") + public ResponseEntity updateModo(@PathVariable("id") long id, @RequestBody Reportes reportes) { + Optional reportesData = reportesRepository.findById(id); + + if (reportesData.isPresent()) { + Reportes _reportes = reportesData.get(); + _reportes.setSolucionado(reportes.getSolucionado()); + return new ResponseEntity<>(reportesRepository.save(_reportes), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + + +} diff --git a/src/main/java/com/bezkoder/springjwt/controllers/TestController.java b/src/main/java/com/spring/data/controllers/TestController.java similarity index 95% rename from src/main/java/com/bezkoder/springjwt/controllers/TestController.java rename to src/main/java/com/spring/data/controllers/TestController.java index 298a7ea..014363e 100644 --- a/src/main/java/com/bezkoder/springjwt/controllers/TestController.java +++ b/src/main/java/com/spring/data/controllers/TestController.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.controllers; +package com.spring.data.controllers; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.CrossOrigin; diff --git a/src/main/java/com/spring/data/controllers/UserController.java b/src/main/java/com/spring/data/controllers/UserController.java new file mode 100644 index 0000000..db3c09e --- /dev/null +++ b/src/main/java/com/spring/data/controllers/UserController.java @@ -0,0 +1,195 @@ +package com.spring.data.controllers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.spring.data.models.User; +import com.spring.data.repository.UserRepository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + UserRepository userRepository; + + @GetMapping("/all") + public ResponseEntity> getAllUsers(@RequestParam(required = false) String username) { + try { + List users = new ArrayList(); + + //if (username == null) + userRepository.findAll().forEach(users::add); + //else + // userRepository.findByStringContaining(username).forEach(users::add); + + if (users.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(users, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + +// Metode per filtrar usuaris + matches --> No acabat + /* +@GetMapping("/all/{id}") + public ResponseEntity> getAllUsers(@PathVariable("id") long id, @RequestParam(required = false) String username) { + try { + List users = new ArrayList(); + userRepository.findAll().forEach(users::add); + int n = users.size(); + for (long i = 1; i <= n; ++i) { + boolean isliked = matchesRepository.alreadyLiked(id, i) > 0; + if (isliked) { + users.remove(matchesRepository.) + } + } + + + + //else + // userRepository.findByStringContaining(username).forEach(users::add); + + if (users.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + return new ResponseEntity<>(users, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + +*/ + + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable("id") long id) { + Optional userData = userRepository.findById(id); + + if (userData.isPresent()) { + return new ResponseEntity<>(userData.get(), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + @GetMapping("/modo/{id}/{modo}") //Query noems feta ambb modo_duo + public User getUserByIdandModo(@PathVariable("id") long id, @PathVariable("modo") Boolean modo) { + return userRepository.findUserByIdAndModo(id, modo); + } + + /*@PostMapping("/users") + public ResponseEntity createUser(@RequestBody User user) { + try { + User _user = userRepository + .save(new User(user.getTitle(), user.getDescription(), false)); + return new ResponseEntity<>(_user, HttpStatus.CREATED); + } catch (Exception e) { + return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); + } + }*/ + + //Seria millor implementar un DTO + @PutMapping("/update/preferences/{id}") + public ResponseEntity updateModo(@PathVariable("id") long id, @RequestBody User user) { + Optional userData = userRepository.findById(id); + + if (userData.isPresent()) { + User _user = userData.get(); + _user.setFlex(user.getFlex()); + _user.setDuo(user.getDuo()); + _user.setClash(user.getClash()); + _user.setOtro(user.getOtro()); + _user.setforfun(user.getForFun()); + _user.setChamps(user.getChamps()); + _user.setOtps(user.getOtps()); + _user.setTryHard(user.getTryHard()); + _user.setBot(user.getBot()); + _user.setFill(user.getFill()); + _user.setJungle(user.getJungle()); + _user.setMid(user.getMid()); + _user.setSupp(user.getSupp()); + _user.setTop(user.getTop()); + return new ResponseEntity<>(userRepository.save(_user), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + + @PutMapping("/update/{id}") + public ResponseEntity updateUser(@PathVariable("id") long id, @RequestBody User user) { + Optional userData = userRepository.findById(id); + + if (userData.isPresent()) { + User _user = userData.get(); + _user.setNom(user.getNom()); + _user.setUsername(user.getUsername()); + _user.setServer(user.getServer()); + _user.setRolPred(user.getRolPred()); + _user.setDetails(user.getDetails()); + _user.setImg(user.getImg()); + _user.setPassword(user.getPassword()); + return new ResponseEntity<>(userRepository.save(_user), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteUser(@PathVariable("id") long id) { + try { + userRepository.deleteById(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @DeleteMapping("/deleteAll") + public ResponseEntity deleteAllUsers() { + try { + userRepository.deleteAll(); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + + } + + /*@GetMapping("/tutorials/published") + public ResponseEntity> findByPublished() { + try { + List tutorials = userRepository.findByPublished(true); + + if (tutorials.isEmpty()) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(tutorials, HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + }*/ + +} diff --git a/src/main/java/com/spring/data/controllers/WebSocketConfig.java b/src/main/java/com/spring/data/controllers/WebSocketConfig.java new file mode 100644 index 0000000..8a62ee6 --- /dev/null +++ b/src/main/java/com/spring/data/controllers/WebSocketConfig.java @@ -0,0 +1,30 @@ +package com.spring.data.controllers; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); + config.setApplicationDestinationPrefixes("/app"); + config.enableSimpleBroker("/notification"); + config.setApplicationDestinationPrefixes("/swns"); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + // with sockjs + registry.addEndpoint("/ws-message").setAllowedOrigins("*").withSockJS(); + registry.addEndpoint("/notifications").setAllowedOrigins("*").withSockJS(); + // without sockjs + //registry.addEndpoint("/ws-message").setAllowedOriginPatterns("*"); + } + +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/controllers/WebSocketEventListener.java b/src/main/java/com/spring/data/controllers/WebSocketEventListener.java new file mode 100644 index 0000000..e67d2ea --- /dev/null +++ b/src/main/java/com/spring/data/controllers/WebSocketEventListener.java @@ -0,0 +1,44 @@ +package com.spring.data.controllers; + +import org.slf4j.LoggerFactory; + +import com.spring.data.models.ChatMessage; +import com.spring.data.models.MessageType; + +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.messaging.SessionConnectedEvent; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; + + +@Component +public class WebSocketEventListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketEventListener.class); + + @Autowired + private SimpMessageSendingOperations sendingOperations; + + @EventListener + public void handleWebSocketConnectListener(final SessionConnectedEvent event) { + LOGGER.info("New connection bro!"); + } + + @EventListener + public void handleWebSocketDisconnectListener(final SessionDisconnectEvent event) { + + final StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage()); + + final String username = (String) headerAccessor.getSessionAttributes().get("username"); + + final ChatMessage chatMessage = ChatMessage.builder().type(MessageType.DISCONNECTED).sender(username).build(); + + sendingOperations.convertAndSend("/topic/public", chatMessage); + + } + +} diff --git a/src/main/java/com/spring/data/controllers/WebSocketTextController.java b/src/main/java/com/spring/data/controllers/WebSocketTextController.java new file mode 100644 index 0000000..775d72f --- /dev/null +++ b/src/main/java/com/spring/data/controllers/WebSocketTextController.java @@ -0,0 +1,38 @@ +package com.spring.data.controllers; + +import com.spring.data.models.TextMessageDTO; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WebSocketTextController { + + @Autowired + SimpMessagingTemplate template; + + @PostMapping("/send") + public ResponseEntity sendMessage(@RequestBody TextMessageDTO textMessageDTO) { + template.convertAndSend("/topic/message", textMessageDTO); + return new ResponseEntity<>(HttpStatus.OK); + } + + @MessageMapping("/sendMessage") + public void receiveMessage(@Payload TextMessageDTO textMessageDTO) { + // receive message from client + } + + + @SendTo("/topic/message") + public TextMessageDTO broadcastMessage(@Payload TextMessageDTO textMessageDTO) { + return textMessageDTO; + } +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/models/ChatMessage.java b/src/main/java/com/spring/data/models/ChatMessage.java new file mode 100644 index 0000000..79c85b3 --- /dev/null +++ b/src/main/java/com/spring/data/models/ChatMessage.java @@ -0,0 +1,46 @@ +package com.spring.data.models; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +import lombok.Builder; +import lombok.Getter; + +//@Entity +@Builder +//@Table(name ="conversa") +public class ChatMessage { + + @Getter + private MessageType type; + + @Getter + private String content; + + + @Column(name = "user_id_emisor") + //@Getter No funciona + private String sender; + + @Column(name = "ts") + @Getter + private String time; + + @Column(name = "conversa_id") + private Long conversa_id; + + public String getSender() { + return sender; + } + + public Long getConversaId() { + return conversa_id; + } + + public void setConversaId(Long conversa_id) { + this.conversa_id = conversa_id; + } + + +} diff --git a/src/main/java/com/spring/data/models/Conversa.java b/src/main/java/com/spring/data/models/Conversa.java new file mode 100644 index 0000000..82cfb1c --- /dev/null +++ b/src/main/java/com/spring/data/models/Conversa.java @@ -0,0 +1,68 @@ +package com.spring.data.models; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import lombok.Builder; +import lombok.Getter; + +//@Builder +@Entity +@Table(name = "conversa") +public class Conversa { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + + private Long user_id_creador; + + private Long user_id_segon; + + private String time_started; + + public Conversa() {} + + public Conversa(Long user_id_creador, Long user_id_segon/*, String time_started)*/) { + this.user_id_creador = user_id_creador; + this.user_id_segon = user_id_segon; + //this.time_started = time_started; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUser_Id_creador() { + return user_id_creador; + } + + public void setUser_Id_creador(Long id_creador) { + this.user_id_creador = id_creador; + } + + public Long getUser_Id_segon() { + return user_id_segon; + } + + public void setUser_Id_segon(Long id_segon) { + this.user_id_segon = id_segon; + } + + public String getTimeStarted() { + return time_started; + } + + public void setTimeStarted(String time_started) { + this.time_started = time_started; + } + +} diff --git a/src/main/java/com/bezkoder/springjwt/models/ERole.java b/src/main/java/com/spring/data/models/ERole.java similarity index 64% rename from src/main/java/com/bezkoder/springjwt/models/ERole.java rename to src/main/java/com/spring/data/models/ERole.java index 9acf4a4..a3dc37e 100644 --- a/src/main/java/com/bezkoder/springjwt/models/ERole.java +++ b/src/main/java/com/spring/data/models/ERole.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.models; +package com.spring.data.models; public enum ERole { ROLE_USER, diff --git a/src/main/java/com/spring/data/models/Matches.java b/src/main/java/com/spring/data/models/Matches.java new file mode 100644 index 0000000..51ff472 --- /dev/null +++ b/src/main/java/com/spring/data/models/Matches.java @@ -0,0 +1,103 @@ +package com.spring.data.models; + +import javax.persistence.*; +//import com.codesplai.spring.demo.repositories.MatchesRepository; + + +@Entity +@Table(name ="matches") +public class Matches { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + //@Column(name = "user_id_1") + //@OneToOne(cascade = CascadeType.ALL) + //@JoinColumn(name = "user_id_1", referencedColumnName = "id") + @Column(name = "user_id_1") + private int user_id_1; + + //@OneToOne(cascade = CascadeType.ALL) + //@JoinColumn(name = "user_id_2", referencedColumnName = "id") + @Column(name = "user_id_2") + private int user_id_2; + + @Column(name = "is_match", columnDefinition = "boolean default false") + private Boolean is_match = false; + + //@Column(name = "liked_1", columnDefinition = "boolean default true") + private Boolean liked_1; + + @Column(name = "liked_2", columnDefinition = "boolean default false") + private Boolean liked_2 = false; + + public Matches() {} + + /*public Matches(Long user_id_1, Long user_id_2) { + this.user_id_1 = user_id_1; + this.user_id_2 = user_id_2; + }*/ + + public Matches(int user_id_1, int user_id_2, Boolean liked_1, boolean liked_2, boolean is_match) { + this.user_id_1 = user_id_1; + this.user_id_2 = user_id_2; + this.liked_1 = liked_1; + this.liked_2 = liked_2; + this.is_match = is_match; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public int getUser_Id_1() { + return user_id_1; + } + + public void setUser_Id_1(int id_user) { + this.user_id_1 = id_user; + } + + public int getUser_Id_2() { + return user_id_2; + } + + public void setUser_Id_2(int id_user) { + this.user_id_2 = id_user; + } + + public Boolean getIs_Match() { + return is_match; + } + + public Boolean setIs_Match(Boolean is_match) { + return this.is_match = is_match; + } + + public Boolean getLiked_1() { + return liked_1; + } + + public Boolean setIs_Liked_1(Boolean liked_1) { + return this.liked_1 = liked_1; + } + + public Boolean getLiked_2() { + return liked_2; + } + + public Boolean setLiked_2(Boolean liked_2) { + return this.liked_2 = liked_2; + } + + @Override + public String toString() { + return "Match{" + "id=" + id + ", name2=" + user_id_1 + ", name=" + user_id_2 + /*",is match=" + is_match +*/'}'; + } + + +} diff --git a/src/main/java/com/spring/data/models/Message.java b/src/main/java/com/spring/data/models/Message.java new file mode 100644 index 0000000..dd1e23c --- /dev/null +++ b/src/main/java/com/spring/data/models/Message.java @@ -0,0 +1,79 @@ +package com.spring.data.models; + +import javax.persistence.*; + +@Entity +@Table(name ="message") +public class Message { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long conversa_id; + + private Long user_id_emisor; + + private Long user_id_receptor; + + private String message_txt; + + private String ts; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getconversaId() { + return conversa_id; + } + + public void setconversaId(Long id) { + this.conversa_id = id; + } + + public Long getUseridemisor() { + return user_id_emisor; + } + + public void setUseridemisor(Long user_id_emisor) { + this.user_id_emisor = user_id_emisor; + } + + public Long getUseridreceptor() { + return user_id_receptor; + } + + public void setUseridreceptor(Long user_id_receptor) { + this.user_id_receptor = user_id_receptor; + } + + public String getmessage() { + return message_txt; + } + + public void setmessage(String message_txt) { + this.message_txt = message_txt; + } + + public String getTimestamp() { + return ts; + } + + public void setTimestamp(String ts) { + this.ts = ts; + } + + public Message() {} + + public Message(Long conversa_id, Long user_id_emisor, Long user_id_receptor, String message_txt, String ts) { + this.conversa_id = conversa_id; + this.user_id_emisor = user_id_emisor; + this.user_id_receptor = user_id_receptor; + this.message_txt = message_txt; + this.ts = ts; + } +} diff --git a/src/main/java/com/spring/data/models/MessageType.java b/src/main/java/com/spring/data/models/MessageType.java new file mode 100644 index 0000000..62a9042 --- /dev/null +++ b/src/main/java/com/spring/data/models/MessageType.java @@ -0,0 +1,7 @@ +package com.spring.data.models; + +public enum MessageType { + CHAT, + CONNECT, + DISCONNECTED +} diff --git a/src/main/java/com/spring/data/models/Notification.java b/src/main/java/com/spring/data/models/Notification.java new file mode 100644 index 0000000..f0da6be --- /dev/null +++ b/src/main/java/com/spring/data/models/Notification.java @@ -0,0 +1,13 @@ +package com.spring.data.models; + +public class Notification { + + public String text; + + public Notification() { + } + + public Notification(String text) { + this.text = text; + } +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/models/Reportes.java b/src/main/java/com/spring/data/models/Reportes.java new file mode 100644 index 0000000..7857052 --- /dev/null +++ b/src/main/java/com/spring/data/models/Reportes.java @@ -0,0 +1,102 @@ +package com.spring.data.models; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "reportes") +public class Reportes { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private Long user_id; + + private Long user_id_reported; + + private String motiu; + + private String comentari; + + private String prova; + + private Boolean solucionado = false; + + public Reportes() {} + + public Reportes(Long user_id, Long user_id_reported, String motiu, String comentari, String prova, Boolean solucionado) { + this.user_id = user_id; + this.user_id_reported = user_id_reported; + this.motiu = motiu; + this.comentari = comentari; + this.prova = prova; + this.solucionado = solucionado; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getUserId() { + return user_id; + } + + public void setUserId(Long user_id) { + this.user_id = user_id; + } + + public Long getUserId_reported() { + return user_id_reported; + } + + public void setUserId_reported(Long user_id_reported) { + this.user_id_reported = user_id_reported; + } + + public String getMotiu() { + return motiu; + } + + public void setMotiu(String motiu) { + this.motiu = motiu; + } + + public String getComentari() { + return comentari; + } + + public void setComentari(String comentari) { + this.comentari = comentari; + } + + public String getProva() { + return prova; + } + + public void setProva(String prova) { + this.prova = prova; + } + + public Boolean getSolucionado() { + return solucionado; + } + + public void setSolucionado(Boolean solucionado) { + this.solucionado = solucionado; + } + + @Override + public String toString() { + return "Reporte{" + "id=" + id + ", usuari=" + user_id + ", usuari_reportat=" + user_id_reported + ", motiu=" + motiu + ", comentari=" + comentari + '}'; + } +} + + + diff --git a/src/main/java/com/bezkoder/springjwt/models/Role.java b/src/main/java/com/spring/data/models/Role.java similarity index 92% rename from src/main/java/com/bezkoder/springjwt/models/Role.java rename to src/main/java/com/spring/data/models/Role.java index 44b82ad..662f9b8 100644 --- a/src/main/java/com/bezkoder/springjwt/models/Role.java +++ b/src/main/java/com/spring/data/models/Role.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.models; +package com.spring.data.models; import javax.persistence.*; diff --git a/src/main/java/com/spring/data/models/TextMessageDTO.java b/src/main/java/com/spring/data/models/TextMessageDTO.java new file mode 100644 index 0000000..bc25d68 --- /dev/null +++ b/src/main/java/com/spring/data/models/TextMessageDTO.java @@ -0,0 +1,15 @@ +package com.spring.data.models; + +public class TextMessageDTO { + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} \ No newline at end of file diff --git a/src/main/java/com/spring/data/models/User.java b/src/main/java/com/spring/data/models/User.java new file mode 100644 index 0000000..05fa944 --- /dev/null +++ b/src/main/java/com/spring/data/models/User.java @@ -0,0 +1,304 @@ +package com.spring.data.models; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.*; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@Entity +@Table(name = "user") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "username") + private String username; + + @Column(name = "nom") + private String nom; + + private String nickname; + + private String server; + + private String rol_pred; + + private String img; + + private String details; + + //Modos ---> Fer una taula que tingui id i el modo (1-4) que vol jugar + private Boolean modo_flex; + + private Boolean modo_duo; + + private Boolean modo_clash; + + private Boolean modo_otro; + + //Tipos ---> Fer una taula que tingui id i el modo (1-5) que vol jugar + private Boolean tipo_ForFun; + + private Boolean tipo_tryhard; + + private Boolean tipo_champs; + + private Boolean tipo_otps; + + private Boolean rol_jungle; + + //Rols ---> Fer una taula que tingui id i el modo (1-5) que vol jugar + private Boolean rol_top; + + private Boolean rol_mid; + + private Boolean rol_bot; + + private Boolean rol_supp; + + private Boolean rol_fill; + + // Suposo que faltaria una pels personatges + + @Column(name = "password") + private String password; + + + + @Transient + private String passwordConfirm; + + + public User() {} + + + public User(String nom, String username, String password) { + this.nom = nom; + this.username = username; + this.password = password; + } + + public User(Boolean modo_flex, Boolean modo_duo, Boolean modo_clash, Boolean modo_otro) { + this.modo_flex = modo_flex; + this.modo_duo = modo_duo; + this.modo_clash = modo_clash; + this.modo_otro = modo_otro; + } + + @ManyToMany + private Set roles; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPasswordConfirm() { + return passwordConfirm; + } + + public void setPasswordConfirm(String passwordConfirm) { + this.passwordConfirm = passwordConfirm; + } + + public String getRolPred() { + return rol_pred; + } + + public void setRolPred(String rol_pred) { + this.rol_pred = rol_pred; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getDetails() { + return details; + } + + public void setDetails(String details) { + this.details = details; + } + + + + // ---> MODOS + public Boolean getFlex() { + return modo_flex; + } + + public void setFlex(Boolean modo_flex) { + this.modo_flex = modo_flex; + } + + public Boolean getClash() { + return modo_clash; + } + + public void setClash(Boolean modo_clash) { + this.modo_clash = modo_clash; + } + + public Boolean getDuo() { + return modo_duo; + } + + public void setDuo(Boolean modo_duo) { + this.modo_duo = modo_duo; + } + + public Boolean getOtro() { + return modo_otro; + } + + public void setOtro(Boolean modo_otro) { + this.modo_otro = modo_otro; + } + + // ---> TIPOS + public Boolean getForFun() { + return tipo_ForFun; + } + + public void setforfun(Boolean tipo_ForFun) { + this.tipo_ForFun = tipo_ForFun; + } + + public Boolean getChamps() { + return tipo_champs; + } + + public void setChamps(Boolean tipo_champs) { + this.tipo_champs = tipo_champs; + } + + public Boolean getOtps() { + return tipo_otps; + } + + public void setOtps(Boolean tipo_otps) { + this.tipo_otps = tipo_otps; + } + + public Boolean getTryHard() { + return tipo_tryhard; + } + + public void setTryHard(Boolean tipo_tryhard) { + this.tipo_tryhard = tipo_tryhard; + } + + // ---> ROLS + + public Boolean getBot() { + return rol_bot; + } + + public void setBot(Boolean rol_bot) { + this.rol_bot = rol_bot; + } + + public Boolean getFill() { + return rol_fill; + } + + public void setFill(Boolean rol_fill) { + this.rol_fill = rol_fill; + } + + public Boolean getJungle() { + return rol_jungle; + } + + public void setJungle(Boolean rol_jungle) { + this.rol_jungle = rol_jungle; + } + + public Boolean getMid() { + return rol_mid; + } + + public void setMid(Boolean rol_mid) { + this.rol_mid = rol_mid; + } + + public Boolean getSupp() { + return rol_supp; + } + + public void setSupp(Boolean rol_supp) { + this.rol_supp = rol_supp; + } + + public Boolean getTop() { + return rol_top; + } + + public void setTop(Boolean rol_top) { + this.rol_top = rol_top; + } + + + public Set getRoles() { + return roles; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + @Override + public String toString() { + return "User{" + "id=" + id + ", name=" + nom + ", email=" + username + ", server=" + server + ", nickname=" + nickname + '}'; + } +} diff --git a/src/main/java/com/spring/data/payload/.DS_Store b/src/main/java/com/spring/data/payload/.DS_Store new file mode 100644 index 0000000..6f3ebb9 Binary files /dev/null and b/src/main/java/com/spring/data/payload/.DS_Store differ diff --git a/src/main/java/com/bezkoder/springjwt/payload/request/LoginRequest.java b/src/main/java/com/spring/data/payload/request/LoginRequest.java similarity index 89% rename from src/main/java/com/bezkoder/springjwt/payload/request/LoginRequest.java rename to src/main/java/com/spring/data/payload/request/LoginRequest.java index e0e7f9f..30530d3 100644 --- a/src/main/java/com/bezkoder/springjwt/payload/request/LoginRequest.java +++ b/src/main/java/com/spring/data/payload/request/LoginRequest.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.payload.request; +package com.spring.data.payload.request; import javax.validation.constraints.NotBlank; diff --git a/src/main/java/com/bezkoder/springjwt/payload/request/SignupRequest.java b/src/main/java/com/spring/data/payload/request/SignupRequest.java similarity index 80% rename from src/main/java/com/bezkoder/springjwt/payload/request/SignupRequest.java rename to src/main/java/com/spring/data/payload/request/SignupRequest.java index 515e0a5..15ea975 100644 --- a/src/main/java/com/bezkoder/springjwt/payload/request/SignupRequest.java +++ b/src/main/java/com/spring/data/payload/request/SignupRequest.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.payload.request; +package com.spring.data.payload.request; import java.util.Set; @@ -7,12 +7,12 @@ public class SignupRequest { @NotBlank @Size(min = 3, max = 20) - private String username; + private String nom; @NotBlank @Size(max = 50) @Email - private String email; + private String username; private Set role; @@ -20,20 +20,20 @@ public class SignupRequest { @Size(min = 6, max = 40) private String password; - public String getUsername() { - return username; + public String getNom() { + return nom; } - public void setUsername(String username) { - this.username = username; + public void setNom(String nom) { + this.nom = nom; } - public String getEmail() { - return email; + public String getUsername() { + return username; } - public void setEmail(String email) { - this.email = email; + public void setUsername(String username) { + this.username = username; } public String getPassword() { diff --git a/src/main/java/com/bezkoder/springjwt/payload/response/JwtResponse.java b/src/main/java/com/spring/data/payload/response/JwtResponse.java similarity index 73% rename from src/main/java/com/bezkoder/springjwt/payload/response/JwtResponse.java rename to src/main/java/com/spring/data/payload/response/JwtResponse.java index 35ae5a4..6c7d957 100644 --- a/src/main/java/com/bezkoder/springjwt/payload/response/JwtResponse.java +++ b/src/main/java/com/spring/data/payload/response/JwtResponse.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.payload.response; +package com.spring.data.payload.response; import java.util.List; @@ -7,14 +7,14 @@ public class JwtResponse { private String type = "Bearer"; private Long id; private String username; - private String email; + private String nom; private List roles; - public JwtResponse(String accessToken, Long id, String username, String email, List roles) { + public JwtResponse(String accessToken, Long id, String nom, String username, List roles) { this.token = accessToken; this.id = id; this.username = username; - this.email = email; + this.nom = nom; this.roles = roles; } @@ -42,12 +42,12 @@ public void setId(Long id) { this.id = id; } - public String getEmail() { - return email; + public String getNom() { + return nom; } - public void setEmail(String email) { - this.email = email; + public void setNom(String nom) { + this.nom = nom; } public String getUsername() { diff --git a/src/main/java/com/bezkoder/springjwt/payload/response/MessageResponse.java b/src/main/java/com/spring/data/payload/response/MessageResponse.java similarity index 84% rename from src/main/java/com/bezkoder/springjwt/payload/response/MessageResponse.java rename to src/main/java/com/spring/data/payload/response/MessageResponse.java index 4a3a59f..1ecfea7 100644 --- a/src/main/java/com/bezkoder/springjwt/payload/response/MessageResponse.java +++ b/src/main/java/com/spring/data/payload/response/MessageResponse.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.payload.response; +package com.spring.data.payload.response; public class MessageResponse { private String message; diff --git a/src/main/java/com/spring/data/repository/ConversaRepository.java b/src/main/java/com/spring/data/repository/ConversaRepository.java new file mode 100644 index 0000000..82023d1 --- /dev/null +++ b/src/main/java/com/spring/data/repository/ConversaRepository.java @@ -0,0 +1,16 @@ +package com.spring.data.repository; + +import java.util.List; + +import com.spring.data.models.Conversa; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface ConversaRepository extends JpaRepository{ + @Query(value = "SELECT * FROM Conversa m WHERE m.user_Id_creador= ?1 OR m.user_Id_segon = ?1", nativeQuery = true) + List findUserConverses(Long user_id_1); + + @Query(value = "SELECT id FROM Conversa m WHERE m.user_id_creador = ?1 AND m.user_id_segon = ?2 OR m.user_id_creador = ?2 AND m.user_id_segon = ?1", nativeQuery = true) + Long findId(Long user_id_1, Long user_id_2); +} diff --git a/src/main/java/com/spring/data/repository/MatchesRepository.java b/src/main/java/com/spring/data/repository/MatchesRepository.java new file mode 100644 index 0000000..e159b30 --- /dev/null +++ b/src/main/java/com/spring/data/repository/MatchesRepository.java @@ -0,0 +1,66 @@ +package com.spring.data.repository; + + +import java.util.List; +import java.util.Optional; + +import com.spring.data.models.Matches; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface MatchesRepository extends JpaRepository { + + @Query(value = "SELECT * FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2", nativeQuery = true) + Boolean findIsMatch(Long user_id_1, Long user_id_2); + + //S'ha de posar que nomes surtin el id_user + // SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2" + @Query(value = "SELECT * FROM Matches m WHERE m.is_match = 1 AND m.user_id_1 = ?1 OR m.user_id_2 = ?1", nativeQuery = true) + List findUserMatches(Long user_id_1); + + @Query(value = "SELECT * FROM Matches m WHERE m.user_id_1 = ?1 OR m.user_id_2 = ?1 AND m.is_match = 0", nativeQuery = true) + List findUserNotMatches(Long user_id_1); + + @Query(value = "SELECT count(*) FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2 OR m.user_id_1 = ?2 AND m.user_id_2 = ?1 AND m.liked_1 = 1", nativeQuery = true) + int alreadyLiked(Long user_id_1, Long user_id_2); + + @Query(value = "SELECT * FROM Matches m WHERE m.liked_1 = 1 AND m.user_id_1 = ?1 AND m.user_id_2 = ?2", nativeQuery = true) + Boolean user1_liked(Long user_id_1, Long user_id_2); + + //Potser sense optional + @Query(value = "SELECT * FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2", nativeQuery = true) + Optional findByMatches(Long user_id_1, Long user_id_2); + + @Query(value = "SELECT * FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2 OR m.user_id_1 = ?2 AND m.user_id_2 = ?1", nativeQuery = true) + Long findIdByUsers(Long user_id_1, Long user_id_2); + + @Query(value = "SELECT * FROM Matches m WHERE m.is_match = 0", nativeQuery = true) + List findAllMatches(); + + @Query(value = "SELECT * FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2 OR m.user_id_1 = ?2 AND m.user_id_2 = ?1", nativeQuery = true) + Optional findTableByUsers(Long user_id_1, Long user_id_2); + + @Query(value = "SELECT id FROM Matches m WHERE m.user_id_1 = ?1 AND m.user_id_2 = ?2 OR m.user_id_1 = ?2 AND m.user_id_2 = ?1", nativeQuery = true) + Long findId(Long user_id_1, Long user_id_2); + + + + //void save(Optional matchData); + + /*@Modifying + @Query(value = "INSERT INTO MATCHES (user_id_1, user_id_2, is_match, liked_1, liked_2) values (:user_id_1, :user_id_2, :is_match, :status)", nativeQuery = true) + void insertUser(@Param("user_id_1") Long user_id_1, @Param("user_id_2") Long user_id_2, @Param("is_match") Integer status, @Param("email") String email);*/ + +} + + + + +/* +getReportes +*/ \ No newline at end of file diff --git a/src/main/java/com/spring/data/repository/MessageRepository.java b/src/main/java/com/spring/data/repository/MessageRepository.java new file mode 100644 index 0000000..988b705 --- /dev/null +++ b/src/main/java/com/spring/data/repository/MessageRepository.java @@ -0,0 +1,14 @@ +package com.spring.data.repository; + +import java.util.List; + +import com.spring.data.models.Message; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface MessageRepository extends JpaRepository{ + + @Query(value = "SELECT * FROM Message m WHERE m.conversa_id= ?1", nativeQuery = true) + List findMessages(Long id); +} diff --git a/src/main/java/com/spring/data/repository/ReportesRepository.java b/src/main/java/com/spring/data/repository/ReportesRepository.java new file mode 100644 index 0000000..8a006b6 --- /dev/null +++ b/src/main/java/com/spring/data/repository/ReportesRepository.java @@ -0,0 +1,11 @@ +package com.spring.data.repository; + +import com.spring.data.models.Reportes; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReportesRepository extends JpaRepository { + +} diff --git a/src/main/java/com/bezkoder/springjwt/repository/RoleRepository.java b/src/main/java/com/spring/data/repository/RoleRepository.java similarity index 67% rename from src/main/java/com/bezkoder/springjwt/repository/RoleRepository.java rename to src/main/java/com/spring/data/repository/RoleRepository.java index 06aa459..c7e3086 100644 --- a/src/main/java/com/bezkoder/springjwt/repository/RoleRepository.java +++ b/src/main/java/com/spring/data/repository/RoleRepository.java @@ -1,13 +1,13 @@ -package com.bezkoder.springjwt.repository; +package com.spring.data.repository; import java.util.Optional; +import com.spring.data.models.ERole; +import com.spring.data.models.Role; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import com.bezkoder.springjwt.models.ERole; -import com.bezkoder.springjwt.models.Role; - @Repository public interface RoleRepository extends JpaRepository { Optional findByName(ERole name); diff --git a/src/main/java/com/bezkoder/springjwt/repository/UserRepository.java b/src/main/java/com/spring/data/repository/UserRepository.java similarity index 50% rename from src/main/java/com/bezkoder/springjwt/repository/UserRepository.java rename to src/main/java/com/spring/data/repository/UserRepository.java index 74f2df9..7b926f3 100644 --- a/src/main/java/com/bezkoder/springjwt/repository/UserRepository.java +++ b/src/main/java/com/spring/data/repository/UserRepository.java @@ -1,17 +1,21 @@ -package com.bezkoder.springjwt.repository; +package com.spring.data.repository; import java.util.Optional; +import com.spring.data.models.User; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import com.bezkoder.springjwt.models.User; - @Repository public interface UserRepository extends JpaRepository { Optional findByUsername(String username); + Boolean existsByNom(String username); + Boolean existsByUsername(String username); - Boolean existsByEmail(String email); + @Query(value = "SELECT * FROM User u WHERE u.id = ?1 AND u.modo_duo = ?2", nativeQuery = true) + User findUserByIdAndModo(Long id, Boolean modo_duo); } diff --git a/src/main/java/com/spring/data/security/.DS_Store b/src/main/java/com/spring/data/security/.DS_Store new file mode 100644 index 0000000..22b7434 Binary files /dev/null and b/src/main/java/com/spring/data/security/.DS_Store differ diff --git a/src/main/java/com/bezkoder/springjwt/security/WebSecurityConfig.java b/src/main/java/com/spring/data/security/WebSecurityConfig.java similarity index 83% rename from src/main/java/com/bezkoder/springjwt/security/WebSecurityConfig.java rename to src/main/java/com/spring/data/security/WebSecurityConfig.java index 405cf6b..0e90431 100644 --- a/src/main/java/com/bezkoder/springjwt/security/WebSecurityConfig.java +++ b/src/main/java/com/spring/data/security/WebSecurityConfig.java @@ -1,8 +1,13 @@ -package com.bezkoder.springjwt.security; +package com.spring.data.security; + +import com.spring.data.security.jwt.AuthEntryPointJwt; +import com.spring.data.security.jwt.AuthTokenFilter; +import com.spring.data.security.services.UserDetailsServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -14,10 +19,6 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import com.bezkoder.springjwt.security.jwt.AuthEntryPointJwt; -import com.bezkoder.springjwt.security.jwt.AuthTokenFilter; -import com.bezkoder.springjwt.security.services.UserDetailsServiceImpl; - @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( @@ -51,16 +52,23 @@ public AuthenticationManager authenticationManagerBean() throws Exception { public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - + @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable() .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests().antMatchers("/api/auth/**").permitAll() + .antMatchers("/**").permitAll() + /*.antMatchers("/user/delete/**").hasAnyAuthority("ADMIN") + //.antMatchers("/reportes/**").hasAnyAuthority("ADMIN") + .antMatchers("/user/deleteAll/**").hasAuthority("ADMIN")*/ .antMatchers("/api/test/**").permitAll() .anyRequest().authenticated(); http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); + + + } } diff --git a/src/main/java/com/bezkoder/springjwt/security/jwt/AuthEntryPointJwt.java b/src/main/java/com/spring/data/security/jwt/AuthEntryPointJwt.java similarity index 95% rename from src/main/java/com/bezkoder/springjwt/security/jwt/AuthEntryPointJwt.java rename to src/main/java/com/spring/data/security/jwt/AuthEntryPointJwt.java index b7e2647..11f1db7 100644 --- a/src/main/java/com/bezkoder/springjwt/security/jwt/AuthEntryPointJwt.java +++ b/src/main/java/com/spring/data/security/jwt/AuthEntryPointJwt.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.security.jwt; +package com.spring.data.security.jwt; import java.io.IOException; diff --git a/src/main/java/com/bezkoder/springjwt/security/jwt/AuthTokenFilter.java b/src/main/java/com/spring/data/security/jwt/AuthTokenFilter.java similarity index 94% rename from src/main/java/com/bezkoder/springjwt/security/jwt/AuthTokenFilter.java rename to src/main/java/com/spring/data/security/jwt/AuthTokenFilter.java index 4a906a8..0f07a3a 100644 --- a/src/main/java/com/bezkoder/springjwt/security/jwt/AuthTokenFilter.java +++ b/src/main/java/com/spring/data/security/jwt/AuthTokenFilter.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.security.jwt; +package com.spring.data.security.jwt; import java.io.IOException; @@ -7,6 +7,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.spring.data.security.services.UserDetailsServiceImpl; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,8 +19,6 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; -import com.bezkoder.springjwt.security.services.UserDetailsServiceImpl; - public class AuthTokenFilter extends OncePerRequestFilter { @Autowired private JwtUtils jwtUtils; diff --git a/src/main/java/com/bezkoder/springjwt/security/jwt/JwtUtils.java b/src/main/java/com/spring/data/security/jwt/JwtUtils.java similarity index 94% rename from src/main/java/com/bezkoder/springjwt/security/jwt/JwtUtils.java rename to src/main/java/com/spring/data/security/jwt/JwtUtils.java index 400b563..2c67e94 100644 --- a/src/main/java/com/bezkoder/springjwt/security/jwt/JwtUtils.java +++ b/src/main/java/com/spring/data/security/jwt/JwtUtils.java @@ -1,14 +1,15 @@ -package com.bezkoder.springjwt.security.jwt; +package com.spring.data.security.jwt; import java.util.Date; +import com.spring.data.security.services.UserDetailsImpl; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import com.bezkoder.springjwt.security.services.UserDetailsImpl; import io.jsonwebtoken.*; @Component diff --git a/src/main/java/com/bezkoder/springjwt/security/services/UserDetailsImpl.java b/src/main/java/com/spring/data/security/services/UserDetailsImpl.java similarity index 90% rename from src/main/java/com/bezkoder/springjwt/security/services/UserDetailsImpl.java rename to src/main/java/com/spring/data/security/services/UserDetailsImpl.java index fafc5a9..4e4d157 100644 --- a/src/main/java/com/bezkoder/springjwt/security/services/UserDetailsImpl.java +++ b/src/main/java/com/spring/data/security/services/UserDetailsImpl.java @@ -1,4 +1,4 @@ -package com.bezkoder.springjwt.security.services; +package com.spring.data.security.services; import java.util.Collection; import java.util.List; @@ -9,8 +9,8 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; -import com.bezkoder.springjwt.models.User; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.spring.data.models.User; public class UserDetailsImpl implements UserDetails { private static final long serialVersionUID = 1L; @@ -26,11 +26,10 @@ public class UserDetailsImpl implements UserDetails { private Collection authorities; - public UserDetailsImpl(Long id, String username, String email, String password, + public UserDetailsImpl(Long id, String username, String password, Collection authorities) { this.id = id; this.username = username; - this.email = email; this.password = password; this.authorities = authorities; } @@ -43,7 +42,6 @@ public static UserDetailsImpl build(User user) { return new UserDetailsImpl( user.getId(), user.getUsername(), - user.getEmail(), user.getPassword(), authorities); } diff --git a/src/main/java/com/bezkoder/springjwt/security/services/UserDetailsServiceImpl.java b/src/main/java/com/spring/data/security/services/UserDetailsServiceImpl.java similarity index 66% rename from src/main/java/com/bezkoder/springjwt/security/services/UserDetailsServiceImpl.java rename to src/main/java/com/spring/data/security/services/UserDetailsServiceImpl.java index 9a3ed41..61ca816 100644 --- a/src/main/java/com/bezkoder/springjwt/security/services/UserDetailsServiceImpl.java +++ b/src/main/java/com/spring/data/security/services/UserDetailsServiceImpl.java @@ -1,4 +1,7 @@ -package com.bezkoder.springjwt.security.services; +package com.spring.data.security.services; + +import com.spring.data.models.User; +import com.spring.data.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; @@ -7,9 +10,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.bezkoder.springjwt.models.User; -import com.bezkoder.springjwt.repository.UserRepository; - @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired @@ -17,9 +17,9 @@ public class UserDetailsServiceImpl implements UserDetailsService { @Override @Transactional - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + username)); + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + User user = userRepository.findByUsername(email) + .orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + email)); return UserDetailsImpl.build(user); } diff --git a/src/main/java/com/spring/data/web/WebSocketMessageConfig.java b/src/main/java/com/spring/data/web/WebSocketMessageConfig.java new file mode 100644 index 0000000..afdac28 --- /dev/null +++ b/src/main/java/com/spring/data/web/WebSocketMessageConfig.java @@ -0,0 +1,23 @@ +package com.spring.data.web; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketMessageConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(final StompEndpointRegistry registry) { + registry.addEndpoint("/chat-example").withSockJS(); + } + + @Override + public void configureMessageBroker(final MessageBrokerRegistry registry) { + registry.setApplicationDestinationPrefixes("/app"); + registry.enableSimpleBroker("/topic"); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d02fe7a..7f3daeb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ -spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=false +spring.datasource.url= jdbc:mysql://localhost:3306/Matcher?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC spring.datasource.username= root -spring.datasource.password= 123456 +spring.datasource.password= dj1932001 spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.hibernate.ddl-auto= update diff --git a/src/main/resources/static/css/styles.css b/src/main/resources/static/css/styles.css new file mode 100644 index 0000000..d67a9ea --- /dev/null +++ b/src/main/resources/static/css/styles.css @@ -0,0 +1,116 @@ +body,html { + margin: 0; + background-color: rgba(40, 42, 54, 1) !important; +} + +.card { + height: 500px; + border-radius: 15px !important; + background-color: rgba(0,0,0,0.4) !important; +} + +.card-body { + overflow-y: auto; +} + +.card-header { + border-radius: 15px 15px 0 0 !important; + border-bottom: 0 !important; +} + +.card-footer { + border-radius: 0 0 15px 15px !important; + border-top: 0 !important; +} + +.user_img { + height: 70px; + width: 70px; + border:1.5px solid #f5f6fa; +} + + +.img_cont_msg { + height: 40px; + width: 40px; +} + +.chat-summary { + margin-top: auto; + margin-bottom: auto; + margin-left: 15px; +} + +.chat-summary span { + font-size: 20px; + color: white; +} + +.chat-summary p { + font-size: 10px; + color: rgba(255,255,255,0.6); +} + +.msg_container_send { + margin-top: auto; + margin-bottom: auto; + margin-right: 10px; + border-radius: 25px; + padding: 10px; + position: relative; + color:white; +} + +.msg_time_send { + position: absolute; + right:0; + bottom: -20px; + color: rgba(255,255,255,0.5); + font-size: 10px; + width: max-content; +} + +.all-input { + background-color: rgba(0,0,0,0.3) !important; + border:0 !important; + color:white !important; + height: 60px !important; + overflow-y: auto; +} + + +.all-input:focus { + box-shadow:none !important; + outline:0px !important; +} + +button { + background-color: rgba(0,0,0,0.3) !important; + border:0 !important; + color:white !important; + border-radius: 0 5px 5px 0 !important; +} + +.hide { + display:none; +} + +.login { + padding: 10px; +} + +.main { + margin: 30px auto; +} + +.circle { + width: 40px; + height: 40px; + border-radius: 50%; + color: white; + text-align: center; + font-size: 1.5em; + vertical-align: middle; + margin:3px; + border:1.5px solid #f5f6fa; +} diff --git a/src/main/resources/static/img/favicon-16x16.png b/src/main/resources/static/img/favicon-16x16.png new file mode 100644 index 0000000..be9357c Binary files /dev/null and b/src/main/resources/static/img/favicon-16x16.png differ diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..6393225 --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,78 @@ + + + + + Websockets Chat App + + + + + + + + + + + + + +
+ + + +
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ Web Sockets with Spring Boot Chat +
+
+
+ +
+ +
+ +
+ +
+ + +
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js new file mode 100644 index 0000000..9414fbd --- /dev/null +++ b/src/main/resources/static/js/script.js @@ -0,0 +1,126 @@ +'use strict' + +let stompClient +let username + +const connect = (event) => { + username = document.querySelector('#username').value.trim() + + if (username) { + const login = document.querySelector('#login') + login.classList.add('hide') + + const chatPage = document.querySelector('#chat-page') + chatPage.classList.remove('hide') + + const socket = new SockJS('/chat-example') + stompClient = Stomp.over(socket) + stompClient.connect({}, onConnected, onError) + } + event.preventDefault() +} + +const onConnected = () => { + stompClient.subscribe('/topic/public', onMessageReceived) + stompClient.send("/app/chat.newUser", + {}, + JSON.stringify({sender: username, type: 'CONNECT'}) + ) + const status = document.querySelector('#status') + status.className = 'hide' +} + +const onError = (error) => { + const status = document.querySelector('#status') + status.innerHTML = 'Could not find the connection you were looking for. Move along. Or, Refresh the page!' + status.style.color = 'red' +} + +const sendMessage = (event) => { + const messageInput = document.querySelector('#message') + const messageContent = messageInput.value.trim() + + if (messageContent && stompClient) { + const chatMessage = { + sender: username, + content: messageInput.value, + type: 'CHAT', + time: moment().calendar() + } + stompClient.send("/app/chat.send", {}, JSON.stringify(chatMessage)) + messageInput.value = '' + } + event.preventDefault(); +} + + +const onMessageReceived = (payload) => { + const message = JSON.parse(payload.body); + + const chatCard = document.createElement('div') + chatCard.className = 'card-body' + + const flexBox = document.createElement('div') + flexBox.className = 'd-flex justify-content-end mb-4' + chatCard.appendChild(flexBox) + + const messageElement = document.createElement('div') + messageElement.className = 'msg_container_send' + + flexBox.appendChild(messageElement) + + if (message.type === 'CONNECT') { + messageElement.classList.add('event-message') + message.content = message.sender + ' connected!' + } else if (message.type === 'DISCONNECT') { + messageElement.classList.add('event-message') + message.content = message.sender + ' left!' + } else { + messageElement.classList.add('chat-message') + + const avatarContainer = document.createElement('div') + avatarContainer.className = 'img_cont_msg' + const avatarElement = document.createElement('div') + avatarElement.className = 'circle user_img_msg' + const avatarText = document.createTextNode(message.sender[0]) + avatarElement.appendChild(avatarText); + avatarElement.style['background-color'] = getAvatarColor(message.sender) + avatarContainer.appendChild(avatarElement) + + messageElement.style['background-color'] = getAvatarColor(message.sender) + + flexBox.appendChild(avatarContainer) + + const time = document.createElement('span') + time.className = 'msg_time_send' + time.innerHTML = message.time + messageElement.appendChild(time) + + } + + messageElement.innerHTML = message.content + + const chat = document.querySelector('#chat') + chat.appendChild(flexBox) + chat.scrollTop = chat.scrollHeight +} + +const hashCode = (str) => { + let hash = 0 + for (let i = 0; i < str.length; i++) { + hash = str.charCodeAt(i) + ((hash << 5) - hash) + } + return hash +} + + +const getAvatarColor = (messageSender) => { + const colours = ['#2196F3', '#32c787', '#1BC6B4', '#A1B4C4'] + const index = Math.abs(hashCode(messageSender) % colours.length) + return colours[index] +} + +const loginForm = document.querySelector('#login-form') +loginForm.addEventListener('submit', connect, true) +const messageControls = document.querySelector('#message-controls') +messageControls.addEventListener('submit', sendMessage, true) \ No newline at end of file