From 08c358eb08341f5b83e3e2691d479588d93e5458 Mon Sep 17 00:00:00 2001 From: Anze Demsar Date: Tue, 11 Oct 2022 21:05:01 +0200 Subject: [PATCH 1/2] accept and save list of pitches along with activity input --- .../dtos/create-activity-route-pitch.input.ts | 17 ++++++++++++++++ .../dtos/create-activity-route.input.ts | 8 ++++++-- .../entities/activity-route.entity.ts | 11 +++++----- .../services/activity-routes.service.ts | 20 +++++++++++++++++++ 4 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 src/activities/dtos/create-activity-route-pitch.input.ts 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..5ebabd2a 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,14 @@ 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]) + pitches: CreateActivityRoutePitchInput[]; } diff --git a/src/activities/entities/activity-route.entity.ts b/src/activities/entities/activity-route.entity.ts index 335e0f27..99c2dfda 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() + @Field() + 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..ac6b0153 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); } From e35726e844fa3c7cef2ca96230c1c5219a212c0e Mon Sep 17 00:00:00 2001 From: Anze Demsar Date: Tue, 11 Oct 2022 21:18:22 +0200 Subject: [PATCH 2/2] make activity route pitchId nullable --- src/activities/dtos/create-activity-route.input.ts | 3 ++- src/activities/entities/activity-route.entity.ts | 4 ++-- src/activities/services/activity-routes.service.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/activities/dtos/create-activity-route.input.ts b/src/activities/dtos/create-activity-route.input.ts index 5ebabd2a..b9e249fa 100644 --- a/src/activities/dtos/create-activity-route.input.ts +++ b/src/activities/dtos/create-activity-route.input.ts @@ -37,6 +37,7 @@ export class CreateActivityRouteInput { @IsOptional() votedStarRating: number; - @Field(() => [CreateActivityRoutePitchInput]) + @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 99c2dfda..303c7c94 100644 --- a/src/activities/entities/activity-route.entity.ts +++ b/src/activities/entities/activity-route.entity.ts @@ -105,8 +105,8 @@ export class ActivityRoute extends BaseEntity { @ManyToOne(() => Pitch, { nullable: true }) @Field((type) => Pitch, { nullable: true }) pitch: Promise; - @Column() - @Field() + @Column({ nullable: true }) + @Field({ nullable: true }) pitchId: string; @Column({ diff --git a/src/activities/services/activity-routes.service.ts b/src/activities/services/activity-routes.service.ts index ac6b0153..0feda0d7 100644 --- a/src/activities/services/activity-routes.service.ts +++ b/src/activities/services/activity-routes.service.ts @@ -198,7 +198,7 @@ export class ActivityRoutesService { activityRoute.activity = Promise.resolve(activity); } - for (const pitch of routeIn.pitches) { + for (const pitch of routeIn.pitches ?? []) { await this.savePitch(queryRunner, activityRoute, pitch); }