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/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/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..96adcba --- /dev/null +++ b/src/main/java/callhub/connect/data_access/SessionRepository.java @@ -0,0 +1,11 @@ +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); + + 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 new file mode 100644 index 0000000..7acdf03 --- /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 java.util.Date 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 java.util.Date(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..772dda2 --- /dev/null +++ b/src/main/java/callhub/connect/use_case/SessionController.java @@ -0,0 +1,72 @@ +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.PathVariable; +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 static final Gson gson = new Gson(); + + 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 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 + HashMap responseBody = new HashMap<>(); + responseBody.put("sessionCode", session.getCode()); + responseBody.put("sessionId", session.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(); + } + + +}