]> git.localhorst.tv Git - alttp.git/blobdiff - resources/js/helpers/Tournament.js
server calculated scoring
[alttp.git] / resources / js / helpers / Tournament.js
index 5716e684948b53c84e54262f00d99b553943d755..ec141d12829b9758405314e052ddeae2aba9d7d7 100644 (file)
@@ -1,12 +1,64 @@
 import Participant from './Participant';
 import Round from './Round';
 
+export const compareScore = (a, b) => {
+       const a_score = a && a.score ? a.score : 0;
+       const b_score = b && b.score ? b.score : 0;
+       if (a_score < b_score) return -1;
+       if (b_score < a_score) return 1;
+       return Participant.compareUsername(a.participant, b.participant) * -1;
+};
+
 export const findParticipant = (tournament, user) => {
        if (!tournament || !tournament.participants || !tournament.participants.length) return null;
        if (!user || !user.id) return null;
        return tournament.participants.find(p => p.user_id == user.id);
 };
 
+export const getRunners = tournament => {
+       if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+       return tournament.participants
+               .filter(Participant.isRunner)
+               .sort(Participant.compareUsername);
+};
+
+export const getTournamentAdmins = tournament => {
+       if (!tournament || !tournament.participants || !tournament.participants.length) return [];
+       return tournament.participants
+               .filter(Participant.isTournamentAdmin)
+               .sort(Participant.compareUsername);
+};
+
+export const hasRunners = tournament => {
+       return getRunners(tournament).length > 0;
+};
+
+export const hasTournamentAdmins = tournament => {
+       return getTournamentAdmins(tournament).length > 0;
+};
+
+export const patchParticipant = (tournament, participant) => {
+       if (!tournament) return tournament;
+       if (!tournament.participants || !tournament.participants.length) {
+               return {
+                       ...tournament,
+                       participants: [participant],
+               };
+       }
+       if (!tournament.participants.find(p => p.id === participant.id)) {
+               return {
+                       ...tournament,
+                       participants: [...tournament.participants, participant],
+               };
+       }
+       return {
+               ...tournament,
+               participants: tournament.participants.map(
+                       p => p.id === participant.id ? participant : p,
+               ),
+       };
+};
+
 export const patchResult = (tournament, result) => {
        if (!tournament || !tournament.rounds) return tournament;
        return {
@@ -19,6 +71,23 @@ export const patchResult = (tournament, result) => {
        };
 };
 
+export const patchRound = (tournament, round) => {
+       if (!tournament) return tournament;
+       return {
+               ...tournament,
+               rounds: tournament.rounds.map(r => r.id === round.id ? { ...r, ...round } : r),
+       };
+};
+
+export const patchUser = (tournament, user) => {
+       if (!tournament || !tournament.participants || !user) return tournament;
+       if (!tournament.participants.find(p => p.user_id == user.id)) return tournament;
+       return {
+               ...tournament,
+               participants: tournament.participants.map(p => Participant.patchUser(p, user)),
+       };
+};
+
 export const sortParticipants = tournament => {
        if (!tournament || !tournament.participants || !tournament.participants.length) {
                return tournament;
@@ -30,7 +99,12 @@ export const sortParticipants = tournament => {
 };
 
 export default {
+       compareScore,
        findParticipant,
+       getRunners,
+       getTournamentAdmins,
        patchResult,
+       patchRound,
+       patchUser,
        sortParticipants,
 };