78 lines
1.8 KiB
TypeScript
78 lines
1.8 KiB
TypeScript
/**
|
|
* A pariticpant of a competition
|
|
*/
|
|
export interface ParticipantFromApi {
|
|
PerId: string;
|
|
firstname: string;
|
|
lastname: string;
|
|
result_rank?: number;
|
|
['result_rank0']?: string;
|
|
['result_rank1']?: string;
|
|
['result_rank2']?: string;
|
|
['result_rank3']?: string;
|
|
['result_rank4']?: string;
|
|
['result_rank5']?: string;
|
|
['result_rank6']?: string;
|
|
[key: string]: string | number | boolean | undefined;
|
|
}
|
|
export interface Participant {
|
|
id: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
results: Result[];
|
|
overallRank?: number;
|
|
}
|
|
|
|
export interface Result {
|
|
rank: number;
|
|
result: string;
|
|
}
|
|
|
|
/**
|
|
* Function to extract results from PartiipantFromApi
|
|
* @param {ParticipantFromApi} fromApi
|
|
* @return {Result[]}
|
|
*/
|
|
function _extractResults(fromApi: ParticipantFromApi): Result[] {
|
|
const results: Result[] = Array(7);
|
|
|
|
const existingResults = Object.keys(fromApi).filter(key =>
|
|
key.match(/result[0-9]/),
|
|
);
|
|
|
|
for (const result of existingResults) {
|
|
let roundNumber = 0;
|
|
const match = result.match(/result([0-9])/);
|
|
if (match !== undefined && match !== null) {
|
|
roundNumber = parseInt(match[1]);
|
|
}
|
|
if (roundNumber < 0) {
|
|
continue;
|
|
}
|
|
results[roundNumber] = {
|
|
rank: parseInt(fromApi[`result_rank${roundNumber}`] as string),
|
|
result: fromApi[`result${roundNumber}`] as string,
|
|
};
|
|
}
|
|
return results;
|
|
}
|
|
|
|
/**
|
|
* Function to clean up participants from the api
|
|
* @param {ParticipantFromApi} fromApi
|
|
* @return {Participant}
|
|
*/
|
|
export function participantFromApiParticipant(
|
|
fromApi: ParticipantFromApi,
|
|
): Participant {
|
|
const results = _extractResults(fromApi);
|
|
|
|
return {
|
|
id: fromApi.PerId,
|
|
firstName: fromApi.firstname,
|
|
lastName: fromApi.lastname,
|
|
results: results,
|
|
overallRank: fromApi.result_rank,
|
|
};
|
|
}
|