Skip to content

Commit 419fb0f

Browse files
committed
Add servlet for ProblemsService
1 parent c50de98 commit 419fb0f

1 file changed

Lines changed: 297 additions & 0 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,297 @@
1+
package com.playshogi.website.gwt.server.servlets;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonParser;
6+
import com.playshogi.website.gwt.server.services.ProblemsServiceImpl;
7+
import com.playshogi.website.gwt.shared.models.ProblemCollectionDetails;
8+
import com.playshogi.website.gwt.shared.models.ProblemOptions;
9+
import com.playshogi.website.gwt.shared.models.RaceDetails;
10+
import com.playshogi.website.gwt.shared.services.ProblemsService;
11+
12+
import javax.servlet.http.HttpServlet;
13+
import javax.servlet.http.HttpServletRequest;
14+
import javax.servlet.http.HttpServletResponse;
15+
import java.io.IOException;
16+
import java.io.Reader;
17+
18+
public class ProblemsServiceServlet extends HttpServlet {
19+
20+
private final ProblemsService problemsService = new ProblemsServiceImpl();
21+
private final Gson gson = new Gson();
22+
23+
@Override
24+
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
25+
resp.setContentType("application/json; charset=UTF-8");
26+
27+
try (Reader reader = req.getReader()) {
28+
JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
29+
String action = json.get("action").getAsString();
30+
Object result;
31+
32+
switch (action) {
33+
// --- Problem Fetching ---
34+
case "getProblem":
35+
if (json.has("options")) {
36+
result = problemsService.getProblem(gson.fromJson(json.get("options"), ProblemOptions.class));
37+
} else {
38+
result = problemsService.getProblem(json.get("problemId").getAsString());
39+
}
40+
break;
41+
42+
case "getRandomProblem":
43+
if (json.has("numMoves")) {
44+
result = problemsService.getRandomProblem(json.get("numMoves").getAsInt());
45+
} else {
46+
result = problemsService.getRandomProblem();
47+
}
48+
break;
49+
50+
// --- Stats & High Scores ---
51+
case "saveUserProblemAttempt":
52+
problemsService.saveUserProblemAttempt(
53+
json.get("sessionId").getAsString(),
54+
json.get("problemId").getAsString(),
55+
json.get("success").getAsBoolean(),
56+
json.get("timeMs").getAsInt()
57+
);
58+
result = "OK";
59+
break;
60+
61+
case "saveHighScore":
62+
problemsService.saveHighScore(
63+
json.get("userName").getAsString(),
64+
json.get("score").getAsInt()
65+
);
66+
result = "OK";
67+
break;
68+
69+
case "getHighScores":
70+
result = problemsService.getHighScores();
71+
break;
72+
73+
case "saveCollectionTime":
74+
problemsService.saveCollectionTime(
75+
json.get("sessionId").getAsString(),
76+
json.get("collectionId").getAsString(),
77+
json.get("timeMs").getAsInt(),
78+
json.get("complete").getAsBoolean(),
79+
json.get("solved").getAsInt()
80+
);
81+
result = "OK";
82+
break;
83+
84+
case "getProblemStatisticsDetails":
85+
result = problemsService.getProblemStatisticsDetails(json.get("sessionId").getAsString());
86+
break;
87+
88+
// --- Collection Management ---
89+
case "saveProblemsCollection":
90+
result = problemsService.saveProblemsCollection(
91+
json.get("sessionId").getAsString(),
92+
json.get("draftId").getAsString(),
93+
gson.fromJson(json.get("details"), ProblemCollectionDetails.class)
94+
);
95+
break;
96+
97+
case "addDraftToProblemCollection":
98+
problemsService.addDraftToProblemCollection(
99+
json.get("sessionId").getAsString(),
100+
json.get("draftId").getAsString(),
101+
json.get("collectionId").getAsString()
102+
);
103+
result = "OK";
104+
break;
105+
106+
case "getAllProblemCollections":
107+
result = problemsService.getAllProblemCollections(json.get("sessionId").getAsString());
108+
break;
109+
110+
case "getPublicProblemCollections":
111+
result = problemsService.getPublicProblemCollections(json.get("sessionId").getAsString());
112+
break;
113+
114+
case "getUserProblemCollections":
115+
result = problemsService.getUserProblemCollections(
116+
json.get("sessionId").getAsString(),
117+
json.get("userName").getAsString()
118+
);
119+
break;
120+
121+
case "getProblemCollection":
122+
result = problemsService.getProblemCollection(
123+
json.get("sessionId").getAsString(),
124+
json.get("collectionId").getAsString(),
125+
json.get("includeHiddenProblems").getAsBoolean()
126+
);
127+
break;
128+
129+
case "getLearnFromMistakeProblemCollection":
130+
result = problemsService.getLearnFromMistakeProblemCollection(
131+
json.get("sessionId").getAsString(),
132+
json.get("gameCollectionId").getAsString()
133+
);
134+
break;
135+
136+
case "deleteProblemCollection":
137+
problemsService.deleteProblemCollection(
138+
json.get("sessionId").getAsString(),
139+
json.get("problemSetId").getAsString(),
140+
json.get("alsoDeleteKifus").getAsBoolean()
141+
);
142+
result = "OK";
143+
break;
144+
145+
case "updateProblemCollectionDetails":
146+
problemsService.updateProblemCollectionDetails(
147+
json.get("sessionId").getAsString(),
148+
gson.fromJson(json.get("problemCollectionDetails"), ProblemCollectionDetails.class)
149+
);
150+
result = "OK";
151+
break;
152+
153+
case "updateProblemCollectionDetailsAdmin":
154+
problemsService.updateProblemCollectionDetailsAdmin(
155+
json.get("sessionId").getAsString(),
156+
gson.fromJson(json.get("problemCollectionDetails"), ProblemCollectionDetails.class)
157+
);
158+
result = "OK";
159+
break;
160+
161+
case "createProblemCollection":
162+
problemsService.createProblemCollection(
163+
json.get("sessionId").getAsString(),
164+
gson.fromJson(json.get("details"), ProblemCollectionDetails.class)
165+
);
166+
result = "OK";
167+
break;
168+
169+
case "saveProblemAndAddToCollection":
170+
problemsService.saveProblemAndAddToCollection(
171+
json.get("sessionId").getAsString(),
172+
json.get("usf").getAsString(),
173+
json.get("collectionId").getAsString()
174+
);
175+
result = "OK";
176+
break;
177+
178+
case "removeProblemFromCollection":
179+
problemsService.removeProblemFromCollection(
180+
json.get("sessionId").getAsString(),
181+
json.get("problemId").getAsString(),
182+
json.get("collectionId").getAsString()
183+
);
184+
result = "OK";
185+
break;
186+
187+
case "addExistingKifuToProblemCollection":
188+
problemsService.addExistingKifuToProblemCollection(
189+
json.get("sessionId").getAsString(),
190+
json.get("kifuId").getAsString(),
191+
json.get("collectionId").getAsString()
192+
);
193+
result = "OK";
194+
break;
195+
196+
case "swapProblemsInCollection":
197+
problemsService.swapProblemsInCollection(
198+
json.get("sessionId").getAsString(),
199+
json.get("collectionId").getAsString(),
200+
json.get("firstProblemId").getAsString(),
201+
json.get("secondProblemId").getAsString()
202+
);
203+
result = "OK";
204+
break;
205+
206+
// --- Logic / Admin Tasks ---
207+
case "convertGameCollection":
208+
problemsService.convertGameCollection(
209+
json.get("sessionId").getAsString(),
210+
json.get("gameCollectionId").getAsString()
211+
);
212+
result = "OK";
213+
break;
214+
215+
case "createCollectionsByDifficulty":
216+
problemsService.createCollectionsByDifficulty(json.get("sessionId").getAsString());
217+
result = "OK";
218+
break;
219+
220+
// --- Race System ---
221+
case "createRace":
222+
result = problemsService.createRace(
223+
json.get("sessionId").getAsString(),
224+
json.get("collectionId").getAsString(),
225+
RaceDetails.RaceType.valueOf(json.get("raceType").getAsString())
226+
);
227+
break;
228+
229+
case "getRaceDetails":
230+
result = problemsService.getRaceDetails(
231+
json.get("sessionId").getAsString(),
232+
json.get("raceId").getAsString()
233+
);
234+
break;
235+
236+
case "waitForRaceUpdate":
237+
result = problemsService.waitForRaceUpdate(
238+
json.get("sessionId").getAsString(),
239+
json.get("raceId").getAsString()
240+
);
241+
break;
242+
243+
case "joinRace":
244+
problemsService.joinRace(json.get("sessionId").getAsString(), json.get("raceId").getAsString());
245+
result = "OK";
246+
break;
247+
248+
case "withdrawFromRace":
249+
problemsService.withdrawFromRace(json.get("sessionId").getAsString(),
250+
json.get("raceId").getAsString());
251+
result = "OK";
252+
break;
253+
254+
case "startRace":
255+
problemsService.startRace(json.get("sessionId").getAsString(), json.get("raceId").getAsString());
256+
result = "OK";
257+
break;
258+
259+
case "reportUserProgressInRace":
260+
problemsService.reportUserProgressInRace(
261+
json.get("sessionId").getAsString(),
262+
json.get("raceId").getAsString(),
263+
json.get("problemId").getAsString(),
264+
RaceDetails.ProblemStatus.valueOf(json.get("status").getAsString())
265+
);
266+
result = "OK";
267+
break;
268+
269+
case "reportBadProblem":
270+
problemsService.reportBadProblem(
271+
json.get("sessionId").getAsString(),
272+
json.get("kifuId").getAsString(),
273+
json.get("problemId").getAsString(),
274+
json.get("collectionId").getAsString(),
275+
json.get("reason").getAsString(),
276+
json.get("comment").getAsString()
277+
);
278+
result = "OK";
279+
break;
280+
281+
default:
282+
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
283+
gson.toJson("Unknown action: " + action, resp.getWriter());
284+
return;
285+
}
286+
287+
// Write successful result (or empty if void)
288+
gson.toJson(result, resp.getWriter());
289+
290+
} catch (Exception e) {
291+
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
292+
JsonObject error = new JsonObject();
293+
error.addProperty("error", e.getMessage());
294+
gson.toJson(error, resp.getWriter());
295+
}
296+
}
297+
}

0 commit comments

Comments
 (0)