diff --git a/src/activities/dtos/create-activity-route-pitch.input.ts b/src/activities/dtos/create-activity-route-pitch.input.ts new file mode 100644 index 00000000..5501ed48 --- /dev/null +++ b/src/activities/dtos/create-activity-route-pitch.input.ts @@ -0,0 +1,17 @@ +import { InputType, Field, Int } from '@nestjs/graphql'; +import { AscentType, PublishType } from '../entities/activity-route.entity'; + +@InputType() +export class CreateActivityRoutePitchInput { + @Field() + pitchId: string; + + @Field(() => Int) + position: number; + + @Field() + ascentType: AscentType; + + @Field() + publish: PublishType; +} diff --git a/src/activities/dtos/create-activity-route.input.ts b/src/activities/dtos/create-activity-route.input.ts index bce66693..b9e249fa 100644 --- a/src/activities/dtos/create-activity-route.input.ts +++ b/src/activities/dtos/create-activity-route.input.ts @@ -1,6 +1,7 @@ import { InputType, Field, Int, Float } from '@nestjs/graphql'; import { IsOptional } from 'class-validator'; import { AscentType, PublishType } from '../entities/activity-route.entity'; +import { CreateActivityRoutePitchInput } from './create-activity-route-pitch.input'; @InputType() export class CreateActivityRouteInput { @@ -28,11 +29,15 @@ export class CreateActivityRouteInput { @IsOptional() position: number; - @Field(type => Float, { nullable: true }) + @Field((type) => Float, { nullable: true }) @IsOptional() votedDifficulty: number; - @Field(type => Int, { nullable: true }) + @Field((type) => Int, { nullable: true }) @IsOptional() votedStarRating: number; + + @Field(() => [CreateActivityRoutePitchInput], { nullable: true }) + @IsOptional() + pitches: CreateActivityRoutePitchInput[]; } diff --git a/src/activities/entities/activity-route.entity.ts b/src/activities/entities/activity-route.entity.ts index 335e0f27..303c7c94 100644 --- a/src/activities/entities/activity-route.entity.ts +++ b/src/activities/entities/activity-route.entity.ts @@ -89,11 +89,7 @@ export class ActivityRoute extends BaseEntity { legacy: string; // TODO: if we decided that every activity route belongs to an activity, this can become non nullable - @ManyToOne( - () => Activity, - activity => activity.routes, - { nullable: true }, - ) + @ManyToOne(() => Activity, (activity) => activity.routes, { nullable: true }) @Field(() => Activity, { nullable: true }) activity: Promise; @Column({ nullable: true }) @@ -107,8 +103,11 @@ export class ActivityRoute extends BaseEntity { routeId: string; @ManyToOne(() => Pitch, { nullable: true }) - @Field(type => Pitch, { nullable: true }) + @Field((type) => Pitch, { nullable: true }) pitch: Promise; + @Column({ nullable: true }) + @Field({ nullable: true }) + pitchId: string; @Column({ type: 'enum', diff --git a/src/activities/services/activity-routes.service.ts b/src/activities/services/activity-routes.service.ts index 5f155300..0feda0d7 100644 --- a/src/activities/services/activity-routes.service.ts +++ b/src/activities/services/activity-routes.service.ts @@ -33,6 +33,7 @@ import { RoutesTouches } from '../utils/routes-touches.class'; import { FindRoutesTouchesInput } from '../dtos/find-routes-touches.input'; import { SideEffect } from '../utils/side-effect.class'; import { setBuilderCache } from '../../core/utils/entity-cache/entity-cache-helpers'; +import { CreateActivityRoutePitchInput } from '../dtos/create-activity-route-pitch.input'; @Injectable() export class ActivityRoutesService { @@ -197,9 +198,28 @@ export class ActivityRoutesService { activityRoute.activity = Promise.resolve(activity); } + for (const pitch of routeIn.pitches ?? []) { + await this.savePitch(queryRunner, activityRoute, pitch); + } + return queryRunner.manager.save(activityRoute); } + private async savePitch( + queryRunner: QueryRunner, + activityRoute: ActivityRoute, + pitch: CreateActivityRoutePitchInput, + ) { + const activityRoutePitch = new ActivityRoute(); + queryRunner.manager.merge(ActivityRoute, activityRoutePitch, activityRoute); + + activityRoutePitch.pitchId = pitch.pitchId; + activityRoutePitch.ascentType = pitch.ascentType; + activityRoutePitch.publish = pitch.publish; + + return queryRunner.manager.save(activityRoutePitch); + } + private isTick(ascentType: AscentType) { return tickAscentTypes.has(ascentType); }