Skip to content

Commit

Permalink
fetch competition organiser details
Browse files Browse the repository at this point in the history
  • Loading branch information
nimarion committed Jun 19, 2024
1 parent f744cea commit 8fdeb46
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 48 deletions.
17 changes: 17 additions & 0 deletions src/athletes/athlete.zod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,20 @@ export const Athlete = z.object({
),
athleteRepresentative: z.nullable(z.object({ _id: z.number() })),
});

export const AthleteSearchSchema = z.object({
aaAthleteId: z.string(),
familyName: z.string(),
givenName: z.string(),
birthDate: z
.string()
.nullable()
.transform((val) => {
if (!val) return null;
const date = new Date(val);
date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return date;
}),
gender: z.string(),
country: z.string(),
});
26 changes: 2 additions & 24 deletions src/athletes/athletes.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { z } from 'zod';
import * as Sentry from '@sentry/node';
import { Athlete, AthleteSearchResult } from './athlete.dto';
import ATHLETE_QUERY, { ATHLETE_SEARCH_QUERY } from './athlete.query';
import { Athlete as AthleteSchema } from './athlete.zod';
import { Athlete as AthleteSchema, AthleteSearchSchema } from './athlete.zod';
import parseVenue from './venue.utils';
import mapDisciplineToCode from 'src/discipline.utils';
import { formatLastname } from 'src/name.utils';
Expand All @@ -22,34 +22,12 @@ export class AthletesService {
const data = await this.graphQLClient.request(ATHLETE_SEARCH_QUERY, {
name,
});
console.log(data);
const response = z
.object({
searchCompetitors: z.array(
z.object({
aaAthleteId: z.string(),
familyName: z.string(),
givenName: z.string(),
birthDate: z
.string()
.nullable()
.transform((val) => {
if (!val) return null;
const date = new Date(val);
date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
return date;
}),
gender: z.string(),
country: z.string(),
}),
),
searchCompetitors: z.array(AthleteSearchSchema),
})
.parse(data);
if (response.searchCompetitors.length === 0) {
return null;
}
return response.searchCompetitors.map((item) => {
console.log(item.gender, item.gender in ['Men', 'Women']);
const sex =
item.gender === 'Men'
? 'MALE'
Expand Down
28 changes: 15 additions & 13 deletions src/competitions/competition.dto.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';

export class CompetitionOrganiserInfo {
@ApiProperty()
websiteUrl: string;
@ApiProperty()
liveStreamUrl: string;
@ApiProperty()
resultsUrl: string;
@ApiProperty()
events: any[];
@ApiProperty()
contactPersons: ContactPerson[];
}

export class ContactPerson {
@ApiProperty()
email: string;
Expand All @@ -23,3 +10,18 @@ export class ContactPerson {
@ApiProperty()
role: string;
}

export class CompetitionOrganiserInfo {
@ApiProperty()
websiteUrl: string;
@ApiProperty()
liveStreamUrl: string;
@ApiProperty()
resultsUrl: string;
@ApiProperty({ type: [ContactPerson] })
contactPersons: ContactPerson[];
@ApiProperty({
type: [Map<string, string[]>],
})
events: any;
}
26 changes: 26 additions & 0 deletions src/competitions/competition.query.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { gql } from 'graphql-request';

export const COMPETITION_ORGANISER = gql`
query GetCompetitionOrganiserInfo($competitionId: Int!) {
getCompetitionOrganiserInfo(competitionId: $competitionId) {
liveStreamingUrl
resultsPageUrl
websiteUrl
additionalInfo
units {
events
gender
}
prizeMoney {
gender
prizes
}
contactPersons {
email
name
phoneNumber
title
}
}
}
`;
21 changes: 21 additions & 0 deletions src/competitions/competition.zod.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { z } from 'zod';

export const CompetitionOrganiserInfoSchema = z.object({
liveStreamingUrl: z.string(),
resultsPageUrl: z.string(),
websiteUrl: z.string(),
units: z.array(
z.object({
events: z.array(z.string()),
gender: z.string(),
}),
),
contactPersons: z.array(
z.object({
email: z.string(),
phoneNumber: z.string(),
title: z.string(),
name: z.string(),
}),
),
});
19 changes: 15 additions & 4 deletions src/competitions/competitions.controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Controller, Get, Param } from '@nestjs/common';
import { Controller, Get, NotFoundException, Param } from '@nestjs/common';
import { CompetitionsService } from './competitions.service';
import { CompetitionOrganiserInfo } from './competition.dto';
import { ApiOkResponse } from '@nestjs/swagger';

@Controller('competitions')
export class CompetitionsController {
Expand All @@ -17,8 +19,17 @@ export class CompetitionsController {
}

@Get(':id/organiser')
findOrganiser(@Param('id') id: string) {
console.log(id);
return null;
@ApiOkResponse({
type: CompetitionOrganiserInfo,
})
async findOrganiser(
@Param('id') id: number,
): Promise<CompetitionOrganiserInfo> {
const data =
await this.competitionsService.findCompetitionOrganiserInfo(id);
if (!data) {
throw new NotFoundException();
}
return data;
}
}
62 changes: 55 additions & 7 deletions src/competitions/competitions.service.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,64 @@
import { Injectable } from '@nestjs/common';
import { GraphQLClient } from 'graphql-request';
import { GraphqlService } from 'src/graphql/graphql.service';
import * as Sentry from '@sentry/node';
import { COMPETITION_ORGANISER } from './competition.query';
import { z } from 'zod';
import { CompetitionOrganiserInfo } from './competition.dto';
import parsePhoneNumber from 'libphonenumber-js';
import { CompetitionOrganiserInfoSchema } from './competition.zod';

@Injectable()
export class CompetitionsService {
findAll() {
return `This action returns all competitions`;
private graphQLClient: GraphQLClient;
constructor(private readonly graphqlService: GraphqlService) {
this.graphQLClient = this.graphqlService.getClient();
}

findOne(id: number) {
return `This action returns a #${id} competition`;
}
async findCompetitionOrganiserInfo(
competitionId: number,
): Promise<CompetitionOrganiserInfo | null> {
try {
const data = await this.graphQLClient.request(COMPETITION_ORGANISER, {
competitionId,
});
const response = z
.object({
getCompetitionOrganiserInfo: CompetitionOrganiserInfoSchema,
})
.parse(data);

const events = new Map<string, string[]>();
response.getCompetitionOrganiserInfo.units.forEach((unit) => {
const disciplines: string[] = [];
unit.events.forEach((event) => {
disciplines.push(event);
});
events.set(unit.gender, disciplines);
});

remove(id: number) {
return `This action removes a #${id} competition`;
return {
liveStreamUrl: response.getCompetitionOrganiserInfo.liveStreamingUrl,
resultsUrl: response.getCompetitionOrganiserInfo.resultsPageUrl,
websiteUrl: response.getCompetitionOrganiserInfo.websiteUrl,
events: JSON.parse(JSON.stringify(Object.fromEntries(events))),
contactPersons: response.getCompetitionOrganiserInfo.contactPersons.map(
(contact) => {
return {
email: contact.email,
name: contact.name,
phone: parsePhoneNumber(
contact.phoneNumber,
).formatInternational(),
role: contact.title,
};
},
),
};
} catch (error) {
console.error(error);
Sentry.captureException(error);
}
return null;
}
}

0 comments on commit 8fdeb46

Please sign in to comment.