source: src/main/java/com/example/kvizko/web/Controller.java@ c3268ca

main
Last change on this file since c3268ca was c3268ca, checked in by Stefan Risteski <stefanristeski2001@…>, 9 months ago

Project

The whole Project

  • Property mode set to 100644
File size: 19.6 KB
Line 
1package com.example.kvizko.web;
2
3import com.example.kvizko.exceptions.InvalidCredentialsException;
4import com.example.kvizko.exceptions.UsernameAlreadyTakenException;
5import com.example.kvizko.models.*;
6
7import com.example.kvizko.models.views.*;
8import com.example.kvizko.repository.*;
9import com.example.kvizko.service.*;
10import jakarta.servlet.http.HttpSession;
11import org.springframework.ui.Model;
12import org.springframework.web.bind.annotation.*;
13
14
15import java.math.BigDecimal;
16import java.time.LocalDate;
17import java.util.*;
18import java.util.stream.Collectors;
19import java.util.stream.Stream;
20
21@org.springframework.stereotype.Controller
22public class Controller {
23
24 private final QuizService quizService;
25 private final CategoryService categoryService;
26 private final SubjectService subjectService;
27 private final QuestionService questionService;
28 private final ChoiceService choiceService;
29 private final UserService userService;
30 private final AttemptService attemptService;
31 private final ResultService resultService;
32 private final QuizTakerService quizTakerService;
33 private final SelectedchoiceService selectedchoiceService;
34
35 private final AdministratorRepository administratorRepository;
36
37 private final AvgpoenizakvizRepository avgpoenizakvizRepository;
38 private final BrturniribrigrachibrkvizovibrmedaliRepository brturniribrigrachibrkvizovibrmedaliRepository;
39 private final IzveshtajzaturnirRepository izveshtajzaturnirRepository;
40 private final KorisnicirangiranisporedmedaliRepository korisnicirangiranisporedmedaliRepository;
41 private final KvizovirangiranisporedtochniprashanjaRepository kvizovirangiranisporedtochniprashanjaRepository;
42 private final NajangazhiranikorisniciRepository najangazhiranikorisniciRepository;
43 private final NajigranikvizoviRepository najigranikvizoviRepository;
44 private final PrashanjarangiranisporedtochniodgovoriRepository prashanjarangiranisporedtochniodgovoriRepository;
45 private final Top5ReshavachiRepository top5ReshavachiRepository;
46 private final Vkbrojreshenikvizovivo3MeseciRepository vkbrojreshenikvizovivo3MeseciRepositoryRepository;
47 private final LeaderboardRepository leaderboardRepository;
48
49
50 public Controller(QuizService quizService, CategoryService categoryService, SubjectService subjectService,
51 QuestionService questionService, ChoiceService choiceService, UserService userService,
52 AttemptService attemptService, ResultService resultService, QuizTakerService quizTakerService,
53 SelectedchoiceService selectedchoiceService, AdministratorRepository administratorRepository, AvgpoenizakvizRepository avgpoenizakvizRepository,
54 BrturniribrigrachibrkvizovibrmedaliRepository brturniribrigrachibrkvizovibrmedaliRepository,
55 IzveshtajzaturnirRepository izveshtajzaturnirRepository,
56 KorisnicirangiranisporedmedaliRepository korisnicirangiranisporedmedaliRepository,
57 KvizovirangiranisporedtochniprashanjaRepository kvizovirangiranisporedtochniprashanjaRepository,
58 NajangazhiranikorisniciRepository najangazhiranikorisniciRepository,
59 NajigranikvizoviRepository najigranikvizoviRepository,
60 PrashanjarangiranisporedtochniodgovoriRepository prashanjarangiranisporedtochniodgovoriRepository,
61 Top5ReshavachiRepository top5ReshavachiRepository,
62 Vkbrojreshenikvizovivo3MeseciRepository vkbrojreshenikvizovivo3MeseciRepositoryRepository, LeaderboardRepository leaderboardRepository) {
63 this.quizService = quizService;
64 this.categoryService = categoryService;
65 this.subjectService = subjectService;
66 this.questionService = questionService;
67 this.choiceService = choiceService;
68 this.userService = userService;
69 this.attemptService = attemptService;
70 this.resultService = resultService;
71 this.quizTakerService = quizTakerService;
72 this.selectedchoiceService = selectedchoiceService;
73 this.administratorRepository = administratorRepository;
74 this.avgpoenizakvizRepository = avgpoenizakvizRepository;
75 this.brturniribrigrachibrkvizovibrmedaliRepository = brturniribrigrachibrkvizovibrmedaliRepository;
76 this.izveshtajzaturnirRepository = izveshtajzaturnirRepository;
77 this.korisnicirangiranisporedmedaliRepository = korisnicirangiranisporedmedaliRepository;
78 this.kvizovirangiranisporedtochniprashanjaRepository = kvizovirangiranisporedtochniprashanjaRepository;
79 this.najangazhiranikorisniciRepository = najangazhiranikorisniciRepository;
80 this.najigranikvizoviRepository = najigranikvizoviRepository;
81 this.prashanjarangiranisporedtochniodgovoriRepository = prashanjarangiranisporedtochniodgovoriRepository;
82 this.top5ReshavachiRepository = top5ReshavachiRepository;
83 this.vkbrojreshenikvizovivo3MeseciRepositoryRepository = vkbrojreshenikvizovivo3MeseciRepositoryRepository;
84 this.leaderboardRepository = leaderboardRepository;
85 }
86
87
88 public boolean privilegeCheck(Long userid) {
89 return administratorRepository.findById(userid).isPresent();
90 }
91
92 private void setPrivilege(Model model, HttpSession session) {
93 User user = (User) session.getAttribute("user");
94 if (user != null && privilegeCheck(user.getUserid())) {
95 model.addAttribute("isAdmin", true);
96 } else {
97 model.addAttribute("isAdmin", false);
98 }
99 }
100
101 private boolean redirectNonAdmin(HttpSession session) {
102 User user = (User) session.getAttribute("user");
103 return user == null || !privilegeCheck(user.getUserid());
104 }
105
106
107 @GetMapping("/")
108 public String index(Model model, HttpSession session) {
109 model.addAttribute("subjects", subjectService.listAll());
110 model.addAttribute("user", session.getAttribute("user"));
111 setPrivilege(model, session);
112 return "index";
113 }
114
115 @GetMapping("/{subjectid}/categories")
116 public String selectCategory(@PathVariable Long subjectid, Model model, HttpSession session) {
117 model.addAttribute("categories", categoryService.findBySubject(subjectid));
118 model.addAttribute("user", session.getAttribute("user"));
119 setPrivilege(model, session);
120
121 return "Quizzes-and-categories";
122 }
123
124 @GetMapping("/{categoryid}/quizzes")
125 public String selectQuiz(@PathVariable Long categoryid, Model model, HttpSession session) {
126 model.addAttribute("quizzes", quizService.quizzesByCategoryID(categoryid));
127 model.addAttribute("user", session.getAttribute("user"));
128 setPrivilege(model, session);
129
130 return "Quizzes-and-categories";
131 }
132
133 @GetMapping("/{quizid}/quizStart")
134 public String quizStart(@PathVariable Long quizid, Model model, HttpSession session) {
135
136 Attempt attempt = null;
137 if (session.getAttribute("user") != null) {
138 User user = (User) session.getAttribute("user");
139 Quiztaker quiztaker = quizTakerService.findById(user.getUserid());
140 if (quiztaker != null) {
141 attempt = attemptService.save(quiztaker, java.sql.Date.valueOf(LocalDate.now()), quizService.quizById(quizid));
142 }
143
144
145 }
146
147 session.setAttribute("attempt", attempt);
148 model.addAttribute("user", session.getAttribute("user"));
149 setPrivilege(model, session);
150
151 List<Question> questionsByQuiz = questionService.questionsByQuiz(quizid);
152 Collections.shuffle(questionsByQuiz);
153
154 questionsByQuiz=questionsByQuiz.stream().limit(5).collect(Collectors.toList());
155
156 List<Choice> correctChoices = new ArrayList<>();
157 List<Question> allQuestions = new ArrayList<>(questionsByQuiz);
158 for(Question question : allQuestions)
159 {
160 correctChoices.addAll( this.choiceService.choicesByQuestion(question).stream().filter(Choice::isIscorrect).toList());
161 }
162 session.setAttribute("correctChoices", correctChoices);
163 session.setAttribute("allQuestions",allQuestions);
164
165 Question firstQuestion = questionsByQuiz.remove(0);
166 model.addAttribute("question", firstQuestion);
167
168 session.setAttribute("questionsByQuiz", questionsByQuiz);
169
170 session.setAttribute("quizName", quizService.quizById(quizid).getQuizname());
171 session.setAttribute("questionCount", 5);
172 session.setAttribute("correctQuestionCounter", 0);
173
174
175 List<Choice> choicesByQuestion = choiceService.choicesByQuestion(firstQuestion);
176 Collections.shuffle(choicesByQuestion);
177 model.addAttribute("choices", choicesByQuestion);
178 model.addAttribute("lastQuestion", false);
179
180 session.setAttribute("selectedChoices", new ArrayList<Choice>());
181
182 return "Question-and-choices";
183 }
184
185
186 @PostMapping("/quizSolving")
187 public String quizSolving(Model model,
188 @RequestParam(required = false) Long selectedChoice,
189 @SessionAttribute Integer questionCount,
190 @SessionAttribute List<Question> questionsByQuiz,
191 @SessionAttribute String quizName,
192 @SessionAttribute Integer correctQuestionCounter,
193 HttpSession session) {
194
195 model.addAttribute("user", session.getAttribute("user"));
196 setPrivilege(model, session);
197
198 List<Choice> selectedChoices=(List<Choice>) session.getAttribute("selectedChoices");
199 Choice selectedChoiceObj=choiceService.getById(selectedChoice);
200 selectedChoiceObj.setSelectionquestion(null);
201 selectedChoices.add(selectedChoiceObj);
202 session.setAttribute("selectedChoices", selectedChoices);
203
204 if (questionsByQuiz.isEmpty()) {
205
206
207 if (selectedChoice != null && choiceService.getById(selectedChoice).isIscorrect()) {
208 correctQuestionCounter++;
209 }
210
211 Attempt attempt = (Attempt) session.getAttribute("attempt");
212 if (attempt != null) {
213 if (selectedChoice != null) {
214 selectedchoiceService.save(selectedChoice, attempt);
215
216 }
217 resultService.save(attempt, correctQuestionCounter * 100 / questionCount);
218 }
219
220 model.addAttribute("result", correctQuestionCounter * 100 / questionCount);
221 model.addAttribute("allQuestions", session.getAttribute("allQuestions"));
222 model.addAttribute("correctChoices", session.getAttribute("correctChoices"));
223 model.addAttribute("selectedChoices", selectedChoices);
224 return "Result";
225 } else {
226 if (questionsByQuiz.size() == 1) {
227 model.addAttribute("lastQuestion", true);
228 } else {
229 model.addAttribute("lastQuestion", false);
230 }
231 session.setAttribute("questionCount", questionCount);
232 session.setAttribute("quizName", quizName);
233
234
235 Question currentQuestion = questionsByQuiz.remove(0);
236 session.setAttribute("questionsByQuiz", questionsByQuiz);
237
238 if (session.getAttribute("attempt") != null && selectedChoice != null) {
239 selectedchoiceService.save(selectedChoice, (Attempt) session.getAttribute("attempt"));
240 }
241
242 if (selectedChoice != null && choiceService.getById(selectedChoice).isIscorrect()) {
243 correctQuestionCounter++;
244 }
245 session.setAttribute("correctQuestionCounter", correctQuestionCounter);
246
247
248 model.addAttribute("question", currentQuestion);
249 model.addAttribute("choices", choiceService.choicesByQuestion(currentQuestion));
250
251 }
252 return "Question-and-choices";
253
254 }
255
256 @GetMapping("/getLogin")
257 public String getLogin(HttpSession session, Model model) {
258 if(session.getAttribute("user")!=null)
259 {
260 return "redirect:/";
261 }
262 model.addAttribute("user", session.getAttribute("user"));
263 model.addAttribute("invalidSignin", session.getAttribute("invalidSignin"));
264 session.removeAttribute("invalidSignin");
265 setPrivilege(model, session);
266 return "Login";
267 }
268
269 @GetMapping("/getRegister")
270 public String getRegister(HttpSession session, Model model) {
271 if(session.getAttribute("user")!=null)
272 {
273 return "redirect:/";
274 }
275 model.addAttribute("user", session.getAttribute("user"));
276 model.addAttribute("invalidRegister", session.getAttribute("invalidRegister"));
277 model.addAttribute("passwordDoNotMatch", session.getAttribute("passwordDoNotMatch"));
278 session.removeAttribute("invalidRegister");
279 session.removeAttribute("passwordDoNotMatch");
280 setPrivilege(model, session);
281 return "Sign-up";
282 }
283
284 @PostMapping("/processLogin")
285 public String processLogin(@RequestParam String username,
286 @RequestParam String password,
287 HttpSession session) {
288 User user = null;
289 try {
290 user = this.userService.findByUsernameAndPassword(username, password);
291 } catch (InvalidCredentialsException e) {
292 session.setAttribute("invalidSignin", true);
293 return "redirect:/getLogin";
294 }
295 session.setAttribute("user", user);
296 session.removeAttribute("invalidSignin");
297 session.removeAttribute("passwordDoNotMatch");
298 return "redirect:/";
299 }
300
301 @PostMapping("/processSignup")
302 public String processSignup(@RequestParam String username,
303 @RequestParam(required = false) String full_name,
304 @RequestParam String password,
305 @RequestParam String password2,
306 HttpSession session) {
307
308
309 try {
310 if(password.equals(password2)){
311 this.userService.registerUser(username, full_name, password);
312 }
313 else {
314 session.setAttribute("passwordDoNotMatch", true);
315 return "redirect:/getRegister";
316 }
317 } catch (UsernameAlreadyTakenException e) {
318 session.setAttribute("invalidRegister", true);
319 return "redirect:/getRegister";
320 }
321 return "redirect:/";
322 }
323
324 @GetMapping("/logOut")
325 public String logOut(HttpSession session) {
326
327 session.invalidate();
328 return "redirect:/";
329 }
330
331 @GetMapping("/reports")
332 public String reportList(Model model, HttpSession session)
333 {
334 if(redirectNonAdmin(session))
335 {
336 return "redirect:/";
337 }
338 model.addAttribute("user", session.getAttribute("user"));
339 setPrivilege(model, session);
340
341
342 return "reportList";
343 }
344
345 @GetMapping("/avgPoints")
346 public String avgPoints(Model model, HttpSession session)
347 {
348 if(redirectNonAdmin(session))
349 {
350 return "redirect:/";
351 }
352 model.addAttribute("user", session.getAttribute("user"));
353 setPrivilege(model, session);
354
355
356 List<Avgpoenizakviz> list=avgpoenizakvizRepository.findAll();
357 list.forEach(
358 x -> {
359 /*DecimalFormat df = new DecimalFormat("###,##");
360 BigDecimal bigDecimal=x.getAvg();
361 x.setAvg(new BigDecimal(df.format(bigDecimal)));*/
362 x.setAvg(BigDecimal.valueOf(x.getAvg().intValue()));
363 }
364
365 );
366 model.addAttribute("items", list);
367 return "AvgPoeniZaKviz";
368
369 }
370
371 @GetMapping("/numbersReport")
372 public String numbersReport(Model model, HttpSession session)
373 {
374 if(redirectNonAdmin(session))
375 {
376 return "redirect:/";
377 }
378 model.addAttribute("user", session.getAttribute("user"));
379 setPrivilege(model, session);
380 model.addAttribute("items", brturniribrigrachibrkvizovibrmedaliRepository.findAll());
381 return "Brturniribrigrachibrkvizovibrmedali";
382 }
383
384 @GetMapping("/tournamentsReport")
385 public String tournamentsReport(Model model, HttpSession session)
386 {
387 if(redirectNonAdmin(session))
388 {
389 return "redirect:/";
390 }
391 model.addAttribute("user", session.getAttribute("user"));
392 setPrivilege(model, session);
393 model.addAttribute("items", izveshtajzaturnirRepository.findAll());
394 return "Izveshtajzaturniri";
395 }
396
397 @GetMapping("/medalRankings")
398 public String medalRankings(Model model, HttpSession session)
399 {
400 if(redirectNonAdmin(session))
401 {
402 return "redirect:/";
403 }
404 model.addAttribute("user", session.getAttribute("user"));
405 setPrivilege(model, session);
406 model.addAttribute("items", korisnicirangiranisporedmedaliRepository.findAll());
407 return "medalRankings";
408 }
409
410 @GetMapping("/correctQuestionQuizRankings")
411 public String correctQuestionQuizRankings(Model model, HttpSession session)
412 {
413 if(redirectNonAdmin(session))
414 {
415 return "redirect:/";
416 }
417 model.addAttribute("user", session.getAttribute("user"));
418 setPrivilege(model, session);
419 model.addAttribute("items", kvizovirangiranisporedtochniprashanjaRepository.findAll());
420 return "correctQuestionQuizRankings";
421 }
422
423 @GetMapping("/hardestWorkers")
424 public String hardestWorkers(Model model, HttpSession session)
425 {
426 if(redirectNonAdmin(session))
427 {
428 return "redirect:/";
429 }
430 model.addAttribute("user", session.getAttribute("user"));
431 setPrivilege(model, session);
432 model.addAttribute("items", najangazhiranikorisniciRepository.findAll());
433 return "hardestWorkers";
434 }
435
436 @GetMapping("/topQuizzes")
437 public String topQuizzes(Model model, HttpSession session)
438 {
439 if(redirectNonAdmin(session))
440 {
441 return "redirect:/";
442 }
443 model.addAttribute("user", session.getAttribute("user"));
444 setPrivilege(model, session);
445 model.addAttribute("items", najigranikvizoviRepository.findAll());
446 return "topQuizzes";
447 }
448
449 @GetMapping("/questionsRankedByCorrectAnswer")
450 public String questionsRankedByQuiz(Model model, HttpSession session)
451 {
452 if(redirectNonAdmin(session))
453 {
454 return "redirect:/";
455 }
456 model.addAttribute("user", session.getAttribute("user"));
457 setPrivilege(model, session);
458 model.addAttribute("items", prashanjarangiranisporedtochniodgovoriRepository.findAll());
459 return "questionsRankedByCorrectAnswer";
460 }
461
462 @GetMapping("/top5Solvers")
463 public String top5Solvers(Model model, HttpSession session)
464 {
465 if(redirectNonAdmin(session))
466 {
467 return "redirect:/";
468 }
469 model.addAttribute("user", session.getAttribute("user"));
470 setPrivilege(model, session);
471 model.addAttribute("items", top5ReshavachiRepository.findAll());
472 return "top5Solvers";
473 }
474 @GetMapping("/leaderboard")
475 public String leaderboard(Model model, HttpSession session)
476 {
477
478 model.addAttribute("user", session.getAttribute("user"));
479 setPrivilege(model, session);
480 model.addAttribute("items", leaderboardRepository.findAll());
481 return "leaderboard";
482 }
483
484 @GetMapping("/totalQuizzes3Months")
485 public String totalQuizzes3Months(Model model, HttpSession session)
486 {
487 if(redirectNonAdmin(session))
488 {
489 return "redirect:/";
490 }
491 model.addAttribute("user", session.getAttribute("user"));
492 setPrivilege(model, session);
493 model.addAttribute("items", vkbrojreshenikvizovivo3MeseciRepositoryRepository.findAll());
494 return "totalQuizzes3Months";
495 }
496}
Note: See TracBrowser for help on using the repository browser.