import { isNil } from 'lodash' import { CompetitionCompetitor } from '../../../models/ranking/competition/competitor' type CompetitorsLevel = { scored: CompetitionCompetitor[] valued: CompetitionCompetitor[] noHistoryOrUnsubscriber: CompetitionCompetitor[] } export abstract class GenericOrdenator { static sort(competitors: CompetitionCompetitor[]): CompetitionCompetitor[] { const { scored, valued, noHistoryOrUnsubscriber } = this.extractLevels(competitors) return [ ...this.sortScored(scored), ...this.sortValued(valued), ...this.sortNoHistoryOrUnsubscriber(noHistoryOrUnsubscriber), ] } protected static sortScored(competitors: CompetitionCompetitor[]): CompetitionCompetitor[] { return competitors } protected static sortValued(competitors: CompetitionCompetitor[]): CompetitionCompetitor[] { return competitors } protected static sortNoHistoryOrUnsubscriber(competitors: CompetitionCompetitor[]): CompetitionCompetitor[] { return competitors } protected static extractLevels(competitors: CompetitionCompetitor[]): CompetitorsLevel { const scored = competitors.filter(competitor => competitor.score !== 0 && competitor.is_subscriber) const valued = competitors.filter( competitor => competitor.score == 0 && competitor.lastHistory?.value > 0 && competitor.is_subscriber, ) const noHistoryOrUnsubscriber = competitors.filter( competitor => isNil(competitor.lastHistory) || !competitor.is_subscriber, ) return { scored, valued, noHistoryOrUnsubscriber } } }