From b0365df2e65992e5344239f88f6aaee6b5c2d329 Mon Sep 17 00:00:00 2001 From: zjayee Date: Mon, 6 Nov 2023 02:41:07 -0500 Subject: [PATCH 1/2] Added session code generation logic --- pom.xml | 7 ++- .../java/callhub/connect/MainController.java | 2 +- .../MessageRepository.java | 2 +- .../data_access/SessionRepository.java | 9 +++ .../callhub/connect/entities/Session.java | 36 +++++++++++ .../connect/use_case/SessionController.java | 61 +++++++++++++++++++ 6 files changed, 113 insertions(+), 4 deletions(-) rename src/main/java/callhub/connect/{use_case => data_access}/MessageRepository.java (90%) create mode 100644 src/main/java/callhub/connect/data_access/SessionRepository.java create mode 100644 src/main/java/callhub/connect/entities/Session.java create mode 100644 src/main/java/callhub/connect/use_case/SessionController.java diff --git a/pom.xml b/pom.xml index 6fb4170..62f36a0 100644 --- a/pom.xml +++ b/pom.xml @@ -38,11 +38,14 @@ org.springframework.boot spring-boot-starter-websocket - + + com.google.code.gson + gson + 2.10.1 + org.springframework.boot spring-boot-starter-test - test org.springframework.data diff --git a/src/main/java/callhub/connect/MainController.java b/src/main/java/callhub/connect/MainController.java index b70b3d0..e2ae02f 100644 --- a/src/main/java/callhub/connect/MainController.java +++ b/src/main/java/callhub/connect/MainController.java @@ -1,7 +1,7 @@ package callhub.connect; import callhub.connect.entities.Message; -import callhub.connect.use_case.MessageRepository; +import callhub.connect.data_access.MessageRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/callhub/connect/use_case/MessageRepository.java b/src/main/java/callhub/connect/data_access/MessageRepository.java similarity index 90% rename from src/main/java/callhub/connect/use_case/MessageRepository.java rename to src/main/java/callhub/connect/data_access/MessageRepository.java index 2584333..e1296c1 100644 --- a/src/main/java/callhub/connect/use_case/MessageRepository.java +++ b/src/main/java/callhub/connect/data_access/MessageRepository.java @@ -1,4 +1,4 @@ -package callhub.connect.use_case; +package callhub.connect.data_access; import callhub.connect.entities.Message; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; diff --git a/src/main/java/callhub/connect/data_access/SessionRepository.java b/src/main/java/callhub/connect/data_access/SessionRepository.java new file mode 100644 index 0000000..9b4ae9f --- /dev/null +++ b/src/main/java/callhub/connect/data_access/SessionRepository.java @@ -0,0 +1,9 @@ +package callhub.connect.data_access; + +import callhub.connect.entities.Session; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface SessionRepository extends MongoRepository { + + boolean existsByCodeAndActive(String code, boolean active); +} diff --git a/src/main/java/callhub/connect/entities/Session.java b/src/main/java/callhub/connect/entities/Session.java new file mode 100644 index 0000000..2c40ab4 --- /dev/null +++ b/src/main/java/callhub/connect/entities/Session.java @@ -0,0 +1,36 @@ +package callhub.connect.entities; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.sql.Timestamp; +import java.util.ArrayList; + +@Document("sessions") +public class Session { + @Id + private String id; + + private String code; + private Timestamp startTime; + + private boolean active; + private ArrayList messages; + // private ArrayList<> documents; + + public Session(boolean active, String code){ + this.active = active; + this.messages = new ArrayList(); + this.startTime = new Timestamp(System.currentTimeMillis()); + this.code = code; + } + + public String getId() { + return id; + } + + public String getCode() { + return code; + } + +} diff --git a/src/main/java/callhub/connect/use_case/SessionController.java b/src/main/java/callhub/connect/use_case/SessionController.java new file mode 100644 index 0000000..587c324 --- /dev/null +++ b/src/main/java/callhub/connect/use_case/SessionController.java @@ -0,0 +1,61 @@ +package callhub.connect.use_case; + +import callhub.connect.data_access.MessageRepository; +import callhub.connect.data_access.SessionRepository; +import callhub.connect.entities.Message; +import callhub.connect.entities.Session; +import com.google.gson.Gson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.security.SecureRandom; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; + +@RestController +@RequestMapping("/session") +public class SessionController { + + public SessionRepository sessionRepository; + + private final static int CODE_LENGTH = 6; + + public SessionController(SessionRepository sessionRepository){ + this.sessionRepository = sessionRepository; + } + + @GetMapping("/new-session") + public ResponseEntity newSession() { + HttpHeaders headers = new HttpHeaders(); + Session result = sessionRepository.save(new Session(true, generateSessionCode())); + + // Create response + Gson gson = new Gson(); + HashMap responseBody = new HashMap<>(); + responseBody.put("sessionCode", result.getCode()); + responseBody.put("sessionId", result.getId()); + return new ResponseEntity<>(gson.toJson(responseBody), headers, HttpStatus.OK); + } + + private String generateSessionCode(){ + final String ALLOWED_CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + SecureRandom random = new SecureRandom(); + StringBuilder code = new StringBuilder(CODE_LENGTH); + do { + for (int i = 0; i < CODE_LENGTH; i++) { + code.append(ALLOWED_CHAR.charAt(random.nextInt(ALLOWED_CHAR.length()))); + } + + } while (sessionRepository.existsByCodeAndActive(code.toString(), true)); //ensures code is unique + + return code.toString(); + } + + +} From 7c47308d8012179ee97f3629fb99191ef4f54aa5 Mon Sep 17 00:00:00 2001 From: zjayee Date: Mon, 6 Nov 2023 04:12:11 -0500 Subject: [PATCH 2/2] Added join session functionality Checks if valid session code and returns corresponding session id and code --- .../connect/CallhubconnectApplication.java | 15 +++++++++------ .../data_access/SessionRepository.java | 2 ++ .../callhub/connect/entities/Session.java | 4 ++-- .../connect/use_case/SessionController.java | 19 +++++++++++++++---- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/callhub/connect/CallhubconnectApplication.java b/src/main/java/callhub/connect/CallhubconnectApplication.java index b22789a..70956a4 100644 --- a/src/main/java/callhub/connect/CallhubconnectApplication.java +++ b/src/main/java/callhub/connect/CallhubconnectApplication.java @@ -12,8 +12,6 @@ @SpringBootApplication @Configuration -@EnableAutoConfiguration -@ComponentScan public class CallhubconnectApplication { @Value("${azure}") @@ -28,10 +26,15 @@ public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**").allowedOrigins("azureEndpoint"); - registry.addMapping("/**").allowedOrigins("http://localhost:8080/"); - registry.addMapping("/**").allowedOrigins("http://localhost:3000/"); - registry.addMapping("/**").allowedOrigins("https://callhub.netlify.app/"); + registry.addMapping("/**"). + allowedOrigins( + "http://localhost:8080", + "http://localhost:3000", + "https://callhub.netlify.app", + azureEndpoint // Use the actual value of azureEndpoint + ).allowedMethods("GET", "POST", "PUT", "DELETE") + .allowedHeaders("*") + .allowCredentials(true); } }; } diff --git a/src/main/java/callhub/connect/data_access/SessionRepository.java b/src/main/java/callhub/connect/data_access/SessionRepository.java index 9b4ae9f..96adcba 100644 --- a/src/main/java/callhub/connect/data_access/SessionRepository.java +++ b/src/main/java/callhub/connect/data_access/SessionRepository.java @@ -6,4 +6,6 @@ public interface SessionRepository extends MongoRepository { boolean existsByCodeAndActive(String code, boolean active); + + Session getSessionsByActiveAndCode(boolean active, String code); } diff --git a/src/main/java/callhub/connect/entities/Session.java b/src/main/java/callhub/connect/entities/Session.java index 2c40ab4..7acdf03 100644 --- a/src/main/java/callhub/connect/entities/Session.java +++ b/src/main/java/callhub/connect/entities/Session.java @@ -12,7 +12,7 @@ public class Session { private String id; private String code; - private Timestamp startTime; + private java.util.Date startTime; private boolean active; private ArrayList messages; @@ -21,7 +21,7 @@ public class Session { public Session(boolean active, String code){ this.active = active; this.messages = new ArrayList(); - this.startTime = new Timestamp(System.currentTimeMillis()); + this.startTime = new java.util.Date(System.currentTimeMillis()); this.code = code; } diff --git a/src/main/java/callhub/connect/use_case/SessionController.java b/src/main/java/callhub/connect/use_case/SessionController.java index 587c324..772dda2 100644 --- a/src/main/java/callhub/connect/use_case/SessionController.java +++ b/src/main/java/callhub/connect/use_case/SessionController.java @@ -10,6 +10,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,6 +24,7 @@ public class SessionController { public SessionRepository sessionRepository; + private static final Gson gson = new Gson(); private final static int CODE_LENGTH = 6; @@ -33,13 +35,22 @@ public SessionController(SessionRepository sessionRepository){ @GetMapping("/new-session") public ResponseEntity newSession() { HttpHeaders headers = new HttpHeaders(); - Session result = sessionRepository.save(new Session(true, generateSessionCode())); + Session session = sessionRepository.save(new Session(true, generateSessionCode())); + // Create response + HashMap responseBody = new HashMap<>(); + responseBody.put("sessionCode", session.getCode()); + responseBody.put("sessionId", session.getId()); + return new ResponseEntity<>(gson.toJson(responseBody), headers, HttpStatus.OK); + } + @GetMapping("/join/{code}") + public ResponseEntity joinSession(@PathVariable String code) { + HttpHeaders headers = new HttpHeaders(); + Session session = sessionRepository.getSessionsByActiveAndCode(true, code); // Create response - Gson gson = new Gson(); HashMap responseBody = new HashMap<>(); - responseBody.put("sessionCode", result.getCode()); - responseBody.put("sessionId", result.getId()); + responseBody.put("sessionCode", session.getCode()); + responseBody.put("sessionId", session.getId()); return new ResponseEntity<>(gson.toJson(responseBody), headers, HttpStatus.OK); }