Skip to content

Commit

Permalink
Merge pull request #120 from Arquisoft/ranking_global-develop
Browse files Browse the repository at this point in the history
Ranking global develop
  • Loading branch information
Pelayori authored Mar 7, 2024
2 parents 745cfb7 + 9b0dfbd commit 42b773a
Show file tree
Hide file tree
Showing 15 changed files with 317 additions and 14 deletions.
13 changes: 13 additions & 0 deletions src/main/java/com/uniovi/configuration/CustomConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.List;
import java.util.Locale;

@Configuration
Expand All @@ -31,4 +35,13 @@ public LocaleChangeInterceptor localeChangeInterceptor() {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
int page = 0;
int size = 5;
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
resolver.setFallbackPageable(PageRequest.of(page, size));
argumentResolvers.add(resolver);
}
}
39 changes: 31 additions & 8 deletions src/main/java/com/uniovi/controllers/PlayersController.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
package com.uniovi.controllers;

import com.uniovi.configuration.SecurityConfig;
import com.uniovi.entities.GameSession;
import com.uniovi.entities.Player;
import com.uniovi.services.GameSessionService;
import com.uniovi.services.PlayerService;
import com.uniovi.validators.SignUpValidator;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
Expand All @@ -25,17 +23,19 @@
import org.springframework.web.bind.annotation.RequestParam;

import java.security.Principal;
import java.util.Optional;

@Controller
public class PlayersController {
private final PlayerService playerService;
private final SignUpValidator signUpValidator;

private final GameSessionService gameSessionService;

@Autowired
public PlayersController(PlayerService playerService, SignUpValidator signUpValidator) {
public PlayersController(PlayerService playerService, SignUpValidator signUpValidator, GameSessionService gameSessionService) {
this.playerService = playerService;
this.signUpValidator = signUpValidator;
this.gameSessionService = gameSessionService;
}

@GetMapping("/signup")
Expand Down Expand Up @@ -92,4 +92,27 @@ public String showLoginForm(Model model, @RequestParam(value = "error", required
public String home(Model model, Principal principal) {
return "player/home";
}


@GetMapping("/ranking/globalRanking")
public String showGlobalRanking(Pageable pageable, Model model) {
Page<Object[]> ranking = gameSessionService.getGlobalRanking(pageable);

model.addAttribute("ranking", ranking.getContent());
model.addAttribute("page", ranking);

return "/ranking/globalRanking";
}

@GetMapping("/ranking/playerRanking")
public String showPlayerRanking(Pageable pageable, Model model, Principal principal) {
Player player = playerService.getUserByUsername(principal.getName()).get();
Page<GameSession> ranking = gameSessionService.getPlayerRanking(pageable, player);

model.addAttribute("ranking", ranking.getContent());
model.addAttribute("page", ranking);

return "/ranking/playerRanking";
}

}
2 changes: 2 additions & 0 deletions src/main/java/com/uniovi/entities/GameSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public class GameSession implements JsonEntity {

private int score;

private int score;

public void addQuestion(boolean correct) {
if(correct)
correctQuestions++;
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/uniovi/repositories/GameSessionRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
package com.uniovi.repositories;

import com.uniovi.entities.Answer;
import com.uniovi.entities.GameSession;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import com.uniovi.entities.Player;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;


import java.util.List;

public interface GameSessionRepository extends CrudRepository<GameSession, Long> {

List<GameSession> findAll();

List<GameSession> findAllByPlayer(Player player);


@Query("SELECT gs.player, SUM(gs.score) FROM GameSession gs GROUP BY gs.player ORDER BY SUM(gs.score) DESC")
Page<Object[]> findTotalScoresByPlayer(Pageable pageable);
Page<GameSession> findAllByPlayerOrderByScoreDesc(Pageable pageable, Player player);
}
34 changes: 34 additions & 0 deletions src/main/java/com/uniovi/services/GameSessionService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.uniovi.services;

import com.uniovi.entities.GameSession;
import com.uniovi.entities.Player;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
@Service
public interface GameSessionService {

/**
* Return the list of GameSessions
*
* @return the list of GameSessions
*/
List<GameSession> getGameSessions();

// /**
// * Return the list of GameSessions by player
// *
// * @return the list of GameSessions by player
// */
// List<GameSession> getGameSessionsByPlayer(Player player);
//
// HashMap<Player,Integer> getSortedPlayersScores();


public Page<Object[]> getGlobalRanking(Pageable pageable);
public Page<GameSession> getPlayerRanking(Pageable pageable, Player player);

}
81 changes: 81 additions & 0 deletions src/main/java/com/uniovi/services/impl/GameSessionImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.uniovi.services.impl;

import com.uniovi.entities.Player;
import com.uniovi.repositories.GameSessionRepository;
import com.uniovi.entities.GameSession;
import com.uniovi.services.GameSessionService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class GameSessionImpl implements GameSessionService {

private final GameSessionRepository gameSessionRepository;

public GameSessionImpl(GameSessionRepository gameSessionRepository) {
this.gameSessionRepository = gameSessionRepository;
}

@Override
public List<GameSession> getGameSessions() {
return gameSessionRepository.findAll();
}

// @Override
// public List<GameSession> getGameSessionsByPlayer(Player player) {
// return gameSessionRepository.findAllByPlayer(player);
// }
//
// @Override
// public HashMap<Player, Integer> getSortedPlayersScores() {
// List<GameSession> gameSessions = gameSessionRepository.findAll();
// HashMap<Player, Integer> ranking = getRanking(gameSessions);
// // Ordenar las entradas del ranking por puntuación
// List<Map.Entry<Player, Integer>> sortedEntries = new ArrayList<>(ranking.entrySet());
// sortedEntries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
//
// // Crear un LinkedHashMap para mantener el orden de inserción
// LinkedHashMap<Player, Integer> sortedRanking = new LinkedHashMap<>();
// for (Map.Entry<Player, Integer> entry : sortedEntries) {
// sortedRanking.put(entry.getKey(), entry.getValue());
// }
//
// return sortedRanking;
// }
//
// private static HashMap<Player, Integer> getRanking(List<GameSession> gameSessions) {
// HashMap<Player, Integer> ranking = new HashMap<>();
//
// // Iterar a través de las sesiones de juego
// for (GameSession gameSession : gameSessions) {
// Player player = gameSession.getPlayer();
// int score = gameSession.getScore();
//
// // Si el jugador ya está en el ranking, sumar la puntuación, de lo contrario, agregarlo al ranking
// if (ranking.containsKey(player)) {
// int currentScore = ranking.get(player) + score;
// ranking.put(player, currentScore);
// } else {
// ranking.put(player, score);
// }
// }
// return ranking;
// }


@Override
public Page<Object[]> getGlobalRanking(Pageable pageable) {
return gameSessionRepository.findTotalScoresByPlayer(pageable);
}

@Override
public Page<GameSession> getPlayerRanking(Pageable pageable, Player player) {
return gameSessionRepository.findAllByPlayerOrderByScoreDesc(pageable, player);
}


}
10 changes: 10 additions & 0 deletions src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ navbar.play=Jugar
navbar.game1=Juego 1
navbar.game2=Juego 2
navbar.history=Historial
navbar.ranking=Ranking
navbar.ranking.global=Ranking global
navbar.ranking.player=Tu ranking personal
navbar.changeLanguage=Idioma
navbar.toEnglish=Inglés
navbar.toSpanish=Español
Expand Down Expand Up @@ -59,6 +62,13 @@ signup.passwordConfirm.placeholder=Repita la contraseña
signup.submit=Registrarse
signup.title=Regístrate

# -------------------Statements for the playerRanking.html and GlobalRanking.html file---------------------
ranking.title=Ranking
ranking.position=Posición
ranking.score=Puntuación
ranking.date=Fecha
ranking.player=Player

# -------------------Statements for the apiHome.html file---------------------
api.doc.title=Documentación de la API
api.doc.description=Esta es la documentación de la API de WIQ. Aquí puedes encontrar información sobre los recursos disponibles, los parámetros que aceptan y los ejemplos de uso.
Expand Down
18 changes: 12 additions & 6 deletions src/main/resources/messages_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ navbar.play=Play
navbar.game1=Game 1
navbar.game2=Game 2
navbar.history=History
navbar.ranking=Ranking
navbar.ranking.global=Global ranking
navbar.ranking.player=Your personal ranking
navbar.changeLanguage=Idiom
navbar.changeLanguage=Language
navbar.toEnglish=English
navbar.toSpanish=Spanish
Expand Down Expand Up @@ -58,6 +62,13 @@ signup.passwordConfirm.placeholder=Confirm your password
signup.submit=Sign up
signup.title=Sign up

# -------------------Statements for the playerRanking.html and GlobalRanking.html file---------------------
ranking.title=Ranking
ranking.position=Position
ranking.score=Score
ranking.date=Date
ranking.player=Player

# -------------------Statements for the apiHome.html file---------------------
api.doc.title=API Documentation
api.doc.description=This document describes the REST API endpoints.
Expand All @@ -80,9 +91,4 @@ api.doc.player.emails=Emails, comma separated (optional)

api.doc.question.category=Category (optional). Category ID or name.
api.doc.question.id=Question ID in the system (optional)
api.doc.question.statement=Statement (optional). Text to search in the question statement.





api.doc.question.statement=Statement (optional). Text to search in the question statement.
10 changes: 10 additions & 0 deletions src/main/resources/messages_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ navbar.play=Jugar
navbar.game1=Juego 1
navbar.game2=Juego 2
navbar.history=Historial
navbar.ranking=Ranking
navbar.ranking.global=Ranking global
navbar.ranking.player=Tu ranking personal
navbar.changeLanguage=Idioma
navbar.toEnglish=Inglés
navbar.toSpanish=Español
Expand Down Expand Up @@ -59,6 +62,13 @@ signup.passwordConfirm.placeholder=Repita la contraseña
signup.submit=Registrarse
signup.title=Regístrate

# -------------------Statements for the playerRanking.html and GlobalRanking.html file---------------------
ranking.title=Ranking
ranking.position=Posición
ranking.score=Puntuación
ranking.date=Fecha
ranking.player=Jugador

# -------------------Statements for the apiHome.html file---------------------
api.doc.title=Documentación de la API
api.doc.description=Esta es la documentación de la API de WIQ. Aquí puedes encontrar información sobre los recursos disponibles, los parámetros que aceptan y los ejemplos de uso.
Expand Down
10 changes: 10 additions & 0 deletions src/main/resources/templates/fragments/nav.html
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@
<a class="dropdown-item" href="/" th:text="#{navbar.history}"></a>
</div>
</li>
<li class="nav-item dropdown active">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown2" role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span th:text="#{navbar.ranking}"></span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown2">
<a class="dropdown-item" href="/ranking/globalRanking" th:text="#{navbar.ranking.global}"></a>
<a sec:authorize="isAuthenticated()" class="dropdown-item" href="/ranking/playerRanking" th:text="#{navbar.ranking.player}"></a>
</div>
</li>
</ul>
<ul class="navbar-nav justify-content-end">
<!-- Botones para cambiar de idioma -->
Expand Down
28 changes: 28 additions & 0 deletions src/main/resources/templates/fragments/pagination.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<div class="text-center">
<ul class="pagination justify-content-center">
<!-- Primera -->
<li class="page-item" >
<a class="page-link" th:href="@{'?page=0'}">Primera</a>
</li>
<!-- Anterior (si la hay ) -->
<li class="page-item" th:if='${page.getNumber()-1 >= 0}'>
<a class="page-link" th:href="@{'?page='+${page.getNumber()-1} }"
th:text="${page.getNumber()}"></a>
</li>
<!-- Actual -->
<li class="page-item active" >
<a class="page-link" th:href="@{'?page='+${page.getNumber()} }"
th:text="${page.getNumber()+1}"></a>
</li>
<!-- Siguiente (si la hay) -->
<li class="page-item" th:if='${page.getNumber()+1 <= page.getTotalPages()-1}'>
<a class="page-link" th:href="@{'?page='+${page.getNumber()+1} }"
th:text="${page.getNumber()+2}"></a>
</li>
<!-- Última -->
<li class="page-item" >
<a class="page-link"
th:href="@{'?page='+${page.getTotalPages()-1}}"> Última</a>
</li>
</ul>
</div>
Loading

0 comments on commit 42b773a

Please sign in to comment.