Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d71d781
multiplayer
SoniDhenuva Nov 18, 2025
a45991c
playerposition
Gurbop Nov 19, 2025
47b5a37
locationendpoint
Gurbop Nov 19, 2025
700c22b
levelsave
Gurbop Nov 19, 2025
78ecee8
multilocation
Gurbop Nov 19, 2025
43df5f3
addingqueries
Gurbop Nov 19, 2025
ee91af7
crud and db base files made
avikaprasad22 Nov 19, 2025
8e0b61c
created crud and db files
avikaprasad22 Nov 19, 2025
10eb293
fixed name conflict + post mapping changed
avikaprasad22 Nov 20, 2025
f4696dd
schema added to leaderboard table!
avikaprasad22 Dec 3, 2025
cc335b6
(Unfinished)PlayerInnit
Gurbop Dec 3, 2025
97fba92
fix java version 2 run itt
NoraTheTurtle Dec 4, 2025
6006e97
tesing for multiplayer
SoniDhenuva Dec 5, 2025
108bb54
player data stored in backend tbales
SoniDhenuva Dec 8, 2025
a063042
creating database table in backend for score counting
NoraTheTurtle Dec 8, 2025
c4db724
Merge branch 'Open-Coding-Society:master' into master
Frogpants Dec 10, 2025
34f19d3
Merge branch 'Open-Coding-Society:master' into master
NoraTheTurtle Dec 15, 2025
c0951cf
make authenticate not required fix connection to backend (saves in sc…
NoraTheTurtle Dec 16, 2025
c8bc78f
add collum for gameName
NoraTheTurtle Dec 16, 2025
bf0141f
new leaderboard table
avikaprasad22 Dec 16, 2025
bc5522b
added CORS stuff to controller
avikaprasad22 Dec 16, 2025
d1f7ac3
getting rid of cors errors
avikaprasad22 Dec 16, 2025
7497054
trying to fix mismatch error
avikaprasad22 Dec 16, 2025
bf9ed8f
create a collom to track the variable that is being counted
NoraTheTurtle Dec 17, 2025
61f1091
made leaderboard api accessible
avikaprasad22 Dec 17, 2025
ef74511
made leaderboard api accessible
avikaprasad22 Dec 17, 2025
68bfb50
put data loader back to normal
avikaprasad22 Dec 19, 2025
45bd9b8
Merge branch 'Open-Coding-Society:master' into master
NoraTheTurtle Dec 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<name>spring</name>
<description>Intro project for Spring Boot</description>
<properties>
<java.version>21</java.version>
<java.version>17</java.version>
<!-- Thymeleaf 3 -->
<org.thymeleaf-version>3.1.3.RELEASE</org.thymeleaf-version>
<org.thymeleaf.extras.springsecurity-version>3.1.3.RELEASE</org.thymeleaf.extras.springsecurity-version>
Expand Down Expand Up @@ -300,7 +300,7 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<release>21</release>
<release>17</release>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.open.spring.mvc.PauseMenu;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

/**
* Lightweight controller to handle gamer score submissions from the frontend.
* Exposed at /api/gamer/score (public, no auth required).
*/
@RestController
@RequestMapping("/api/pausemenu")
public class GamerScoreController {

@Autowired
private ScorePauseMenuRepo scoreRepository;

public static class GamerScoreRequest {
public String user;
public Integer score;
public String gameName;
public String variableName;
}

@PostMapping("/score")
public ResponseEntity<Map<String, Object>> saveGamerScore(@RequestBody GamerScoreRequest payload) {
try {
int score = payload != null && payload.score != null ? payload.score : 0;
String user = payload != null ? payload.user : null;
if (user == null || user.trim().isEmpty()) {
user = "guest";
}
String gameName = payload != null ? payload.gameName : null;
if (gameName == null || gameName.trim().isEmpty()) {
gameName = "unknown";
}
String variableName = payload != null ? payload.variableName : null;
if (variableName == null || variableName.trim().isEmpty()) {
variableName = "unknown";
}

ScoreCounter newScore = new ScoreCounter();
newScore.setUser(user);
newScore.setScore(score);
newScore.setGameName(gameName);
newScore.setVariableName(variableName);

ScoreCounter saved = scoreRepository.save(newScore);

Map<String, Object> response = new HashMap<>();
response.put("success", true);
response.put("id", saved.getId());
response.put("message", "Score saved successfully");
return ResponseEntity.status(HttpStatus.CREATED).body(response);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("success", false);
error.put("message", "Error saving score: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
package com.open.spring.mvc.PauseMenu;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

/**
* API Controller for Pause Menu Score Management
*/
@RestController
@RequestMapping("/api/pausemenu/score")
public class PauseMenuApiController {

@Autowired
private ScorePauseMenuRepo scoreRepository;

/**
* DTO for receiving score data from the frontend
*/
@Data
public static class ScorePauseMenuRequest {
private String user;
private int score;
}

/**
* Save a new score
* POST /api/pausemenu/score/save
*/
@PostMapping("/save")
public ResponseEntity<Map<String, Object>> saveScore(@RequestBody ScorePauseMenuRequest request) {
try {
ScoreCounter newScore = new ScoreCounter();
// default to "guest" when user is missing or blank
String user = request.getUser();
if (user == null || user.trim().isEmpty()) {
user = "guest";
}
newScore.setUser(user);
newScore.setScore(request.getScore());

ScoreCounter saved = scoreRepository.save(newScore);

Map<String, Object> response = new HashMap<>();
response.put("success", true);
response.put("id", saved.getId());
response.put("message", "Score saved successfully");

return ResponseEntity.status(HttpStatus.CREATED).body(response);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("success", false);
error.put("message", "Error saving score: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}

/**
* Get all scores
* GET /api/pausemenu/score/all
*/
@GetMapping("/all")
public ResponseEntity<List<ScoreCounter>> getAllScores() {
List<ScoreCounter> scores = scoreRepository.findAll();
return ResponseEntity.ok(scores);
}

/**
* Get scores for a specific user
* GET /api/pausemenu/score/user/{user}
*/
@GetMapping("/user/{user}")
public ResponseEntity<List<ScoreCounter>> getScoresByUser(@PathVariable String user) {
List<ScoreCounter> scores = scoreRepository.findByUser(user);
return ResponseEntity.ok(scores);
}

/**
* Get a specific score by ID
* GET /api/pausemenu/score/{id}
*/
@GetMapping("/{id}")
public ResponseEntity<?> getScoreById(@PathVariable Long id) {
return scoreRepository.findById(id)
.map(score -> ResponseEntity.ok((Object) score))
.orElse(ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("error", "Score not found")));
}

/**
* Delete a score
* DELETE /api/pausemenu/score/{id}
*/
@DeleteMapping("/{id}")
public ResponseEntity<Map<String, String>> deleteScore(@PathVariable Long id) {
if (scoreRepository.existsById(id)) {
scoreRepository.deleteById(id);
return ResponseEntity.ok(Map.of("message", "Score deleted"));
}
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("error", "Score not found"));
}

/**
* Alternate endpoint used by frontend
* POST /api/gamer/score
* Accepts JSON: { "score": number, "user": string? }
* If user is missing, defaults to "guest"
*/
@PostMapping(path = "/api/gamer/score", consumes = "application/json")
public ResponseEntity<Map<String, Object>> saveGamerScore(@RequestBody Map<String, Object> payload) {
try {
int score = 0;
Object scoreObj = payload.get("score");
if (scoreObj instanceof Number) {
score = ((Number) scoreObj).intValue();
}

String user = (payload.get("user") instanceof String) ? (String) payload.get("user") : null;
if (user == null || user.trim().isEmpty()) {
user = "guest";
}

ScoreCounter newScore = new ScoreCounter();
newScore.setUser(user);
newScore.setScore(score);

ScoreCounter saved = scoreRepository.save(newScore);

Map<String, Object> response = new HashMap<>();
response.put("success", true);
response.put("id", saved.getId());
response.put("message", "Score saved successfully");
return ResponseEntity.status(HttpStatus.CREATED).body(response);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("success", false);
error.put("message", "Error saving score: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.open.spring.mvc.PauseMenu;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

/**
* MVC Controller for displaying pause menu scores
*/
@Controller
@RequestMapping("/pausemenu")
public class PauseMenuController {

@Autowired
private ScorePauseMenuRepo scoreRepository;

/**
* Display all scores
* GET /pausemenu/scores
*/
@GetMapping("/scores")
public String showAllScores(Model model) {
List<ScoreCounter> scores = scoreRepository.findAll();
model.addAttribute("scores", scores);
model.addAttribute("pageTitle", "All Scores");
return "pausemenu/scores-table";
}

/**
* Display scores for a specific user
* GET /pausemenu/scores?user=Username
*/
@GetMapping("/scores/user")
public String showUserScores(String user, Model model) {
List<ScoreCounter> scores = scoreRepository.findByUser(user);
model.addAttribute("scores", scores);
model.addAttribute("pageTitle", "Scores for " + user);
model.addAttribute("userName", user);
return "pausemenu/scores-table";
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/open/spring/mvc/PauseMenu/ScoreCounter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.open.spring.mvc.PauseMenu;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* ScoreCounter Entity - Stores game scores
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "score_counter")
public class ScoreCounter {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = true)
private String user;

@Column(nullable = false)
private int score;

@Column(nullable = true)
private String gameName;

@Column(nullable = true)
private String variableName;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.open.spring.mvc.PauseMenu;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

/**
* Repository for ScoreCounter entity
*/
@Repository
public interface ScorePauseMenuRepo extends JpaRepository<ScoreCounter, Long> {

/**
* Find all scores for a specific user
*/
List<ScoreCounter> findByUser(String user);
}
33 changes: 18 additions & 15 deletions src/main/java/com/open/spring/mvc/grades/DataLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,23 @@ public class DataLoader implements CommandLineRunner {

@Override
public void run(String... args) throws Exception {
// Sample Grades
gradeRepository.save(new Grade("STU001", "Mathematics", 85.5, "A", "submission link"));
gradeRepository.save(new Grade("STU001", "Science", 92.0, "A+", "submission link"));
gradeRepository.save(new Grade("STU002", "Mathematics", 78.0, "B+", "submission link"));
gradeRepository.save(new Grade("STU002", "English", 88.5, "A-", "submission link"));
gradeRepository.save(new Grade("STU003", "Science", 95.0, "A+", "submission link"));
try {
// Sample Grades
gradeRepository.save(new Grade("STU001", "Mathematics", 85.5, "A", "submission link"));
gradeRepository.save(new Grade("STU001", "Science", 92.0, "A+", "submission link"));
gradeRepository.save(new Grade("STU002", "Mathematics", 78.0, "B+", "submission link"));
gradeRepository.save(new Grade("STU002", "English", 88.5, "A-", "submission link"));
gradeRepository.save(new Grade("STU003", "Science", 95.0, "A+", "submission link"));
// Sample Progress
progressRepository.save(new Progress("STU001", "Mathematics", 75.0, "In Progress"));
progressRepository.save(new Progress("STU001", "Science", 100.0, "Completed"));
progressRepository.save(new Progress("STU002", "Mathematics", 60.0, "In Progress"));
progressRepository.save(new Progress("STU002", "English", 90.0, "Completed"));
progressRepository.save(new Progress("STU003", "Science", 45.0, "In Progress"));

// Sample Progress
progressRepository.save(new Progress("STU001", "Mathematics", 75.0, "In Progress"));
progressRepository.save(new Progress("STU001", "Science", 100.0, "Completed"));
progressRepository.save(new Progress("STU002", "Mathematics", 60.0, "In Progress"));
progressRepository.save(new Progress("STU002", "English", 90.0, "Completed"));
progressRepository.save(new Progress("STU003", "Science", 45.0, "In Progress"));

System.out.println("Sample data loaded successfully!");
System.out.println("Sample data loaded successfully!");
} catch (Exception e) {
System.err.println("Grades DataLoader skipped due to database schema mismatch: " + e.getMessage());
}
}
}
}
Loading