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