Add vote statistics feature and improve vote page functionality
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package com.alttd.altitudeweb.controllers.site;
|
||||
|
||||
import com.alttd.altitudeweb.api.SiteApi;
|
||||
import com.alttd.altitudeweb.controllers.data_from_auth.AuthenticatedUuid;
|
||||
import com.alttd.altitudeweb.model.VoteDataDto;
|
||||
import com.alttd.altitudeweb.model.VoteStatsDto;
|
||||
import com.alttd.altitudeweb.services.limits.RateLimit;
|
||||
import com.alttd.altitudeweb.services.site.VoteService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RateLimit(limit = 2, timeValue = 10, timeUnit = TimeUnit.SECONDS)
|
||||
public class SiteController implements SiteApi {
|
||||
|
||||
private final VoteService voteService;
|
||||
|
||||
@Override
|
||||
public ResponseEntity<VoteDataDto> getVoteStats() {
|
||||
UUID uuid = AuthenticatedUuid.getAuthenticatedUserUuid();
|
||||
Optional<VoteDataDto> optionalVoteDataDto = voteService.getVoteStats(uuid);
|
||||
if (optionalVoteDataDto.isEmpty()) {
|
||||
return ResponseEntity.noContent().build();
|
||||
}
|
||||
VoteDataDto voteDataDto = optionalVoteDataDto.get();
|
||||
return ResponseEntity.ok(voteDataDto);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.alttd.altitudeweb.mappers;
|
||||
|
||||
import com.alttd.altitudeweb.database.votingplugin.VotingStatsRow;
|
||||
import com.alttd.altitudeweb.model.VoteDataDto;
|
||||
import com.alttd.altitudeweb.model.VoteInfoDto;
|
||||
import com.alttd.altitudeweb.model.VoteStatsDto;
|
||||
import com.alttd.altitudeweb.model.VoteStreakDto;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class VotingStatsRowToVoteDataDto {
|
||||
|
||||
public VoteDataDto map(VotingStatsRow votingStatsRow) {
|
||||
VoteDataDto voteDataDto = new VoteDataDto();
|
||||
voteDataDto.setVoteStats(getVoteStats(votingStatsRow));
|
||||
voteDataDto.setVoteStreak(getVoteStreak(votingStatsRow));
|
||||
voteDataDto.setBestVoteStreak(getBestVoteStreak(votingStatsRow));
|
||||
voteDataDto.setAllVoteInfo(getVoteInfo(votingStatsRow.lastVotes()));
|
||||
return voteDataDto;
|
||||
}
|
||||
|
||||
private VoteStreakDto getVoteStreak(VotingStatsRow votingStatsRow) {
|
||||
VoteStreakDto voteStreakDto = new VoteStreakDto();
|
||||
voteStreakDto.setDailyStreak(votingStatsRow.dailyStreak());
|
||||
voteStreakDto.setWeeklyStreak(votingStatsRow.weeklyStreak());
|
||||
voteStreakDto.setMonthlyStreak(votingStatsRow.monthlyStreak());
|
||||
return voteStreakDto;
|
||||
}
|
||||
|
||||
private VoteStreakDto getBestVoteStreak(VotingStatsRow votingStatsRow) {
|
||||
VoteStreakDto voteStreakDto = new VoteStreakDto();
|
||||
voteStreakDto.setDailyStreak(votingStatsRow.bestDailyStreak());
|
||||
voteStreakDto.setWeeklyStreak(votingStatsRow.bestWeeklyStreak());
|
||||
voteStreakDto.setMonthlyStreak(votingStatsRow.bestMonthlyStreak());
|
||||
return voteStreakDto;
|
||||
}
|
||||
|
||||
|
||||
private VoteStatsDto getVoteStats(VotingStatsRow votingStatsRow) {
|
||||
VoteStatsDto voteStatsDto = new VoteStatsDto();
|
||||
voteStatsDto.setDaily(votingStatsRow.totalVotesToday());
|
||||
voteStatsDto.setWeekly(votingStatsRow.totalVotesThisWeek());
|
||||
voteStatsDto.setMonthly(votingStatsRow.totalVotesThisMonth());
|
||||
voteStatsDto.setTotal(votingStatsRow.totalVotesAllTime());
|
||||
return voteStatsDto;
|
||||
}
|
||||
|
||||
private List<VoteInfoDto> getVoteInfo(String lastVotes) {
|
||||
return Arrays.stream(lastVotes.split("%line%"))
|
||||
.map(voteInfo -> {
|
||||
String[] siteAndTimestamp = voteInfo.split("//");
|
||||
VoteInfoDto voteInfoDto = new VoteInfoDto();
|
||||
voteInfoDto.setSiteName(siteAndTimestamp[0]);
|
||||
voteInfoDto.setLastVoteTimestamp(Long.parseLong(siteAndTimestamp[1]));
|
||||
return voteInfoDto;
|
||||
})
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.alttd.altitudeweb.services.site;
|
||||
|
||||
import com.alttd.altitudeweb.database.Databases;
|
||||
import com.alttd.altitudeweb.database.votingplugin.VotingPluginUsersMapper;
|
||||
import com.alttd.altitudeweb.database.votingplugin.VotingStatsRow;
|
||||
import com.alttd.altitudeweb.mappers.VotingStatsRowToVoteDataDto;
|
||||
import com.alttd.altitudeweb.model.VoteDataDto;
|
||||
import com.alttd.altitudeweb.setup.Connection;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class VoteService {
|
||||
|
||||
private final VotingStatsRowToVoteDataDto votingStatsRowToVoteDataDto;
|
||||
|
||||
public Optional<VoteDataDto> getVoteStats(UUID uuid) {
|
||||
CompletableFuture<Optional<VoteDataDto>> voteDataDtoFuture = new CompletableFuture<>();
|
||||
Connection.getConnection(Databases.VOTING_PLUGIN).runQuery(sqlSession -> {
|
||||
try {
|
||||
VotingPluginUsersMapper votingPluginUsersMapper = sqlSession.getMapper(VotingPluginUsersMapper.class);
|
||||
Optional<VotingStatsRow> optionalVotingStatsRow = votingPluginUsersMapper.getStatsByUuid(uuid);
|
||||
if (optionalVotingStatsRow.isEmpty()) {
|
||||
log.debug("No voting stats found for {}", uuid);
|
||||
voteDataDtoFuture.complete(Optional.empty());
|
||||
return;
|
||||
}
|
||||
|
||||
VotingStatsRow votingStatsRow = optionalVotingStatsRow.get();
|
||||
|
||||
VoteDataDto voteDataDto = votingStatsRowToVoteDataDto.map(votingStatsRow);
|
||||
voteDataDtoFuture.complete(Optional.of(voteDataDto));
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to get vote data for {}", uuid, e);
|
||||
voteDataDtoFuture.completeExceptionally(e);
|
||||
}
|
||||
});
|
||||
return voteDataDtoFuture.join();//TODO handle exception
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user