diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8dddd05d..2344793b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: ls ${{ github.workspace }} - name: Install and prepare run: | - docker-compose -f docker-compose.e2e.yml up -d + docker compose -f docker-compose.e2e.yml up -d npm install - name: Run tests run: | diff --git a/src/activities/entities/activity-route.entity.ts b/src/activities/entities/activity-route.entity.ts index b80d71aa..235a8f84 100644 --- a/src/activities/entities/activity-route.entity.ts +++ b/src/activities/entities/activity-route.entity.ts @@ -8,62 +8,68 @@ import { ManyToOne, Index, } from 'typeorm'; -import { ObjectType, Field } from '@nestjs/graphql'; +import { ObjectType, Field, registerEnumType } from '@nestjs/graphql'; import { Route } from '../../crags/entities/route.entity'; import { Activity } from './activity.entity'; import { Pitch } from '../../crags/entities/pitch.entity'; import { User } from '../../users/entities/user.entity'; export enum AscentType { - ONSIGHT = 'onsight', - FLASH = 'flash', - REDPOINT = 'redpoint', - REPEAT = 'repeat', - ALLFREE = 'allfree', - AID = 'aid', - ATTEMPT = 'attempt', - T_ONSIGHT = 't_onsight', - T_FLASH = 't_flash', - T_REDPOINT = 't_redpoint', - T_REPEAT = 't_repeat', - T_ALLFREE = 't_allfree', - T_AID = 't_aid', - T_ATTEMPT = 't_attempt', - TICK = 'tick', + onsight = 'onsight', + flash = 'flash', + redpoint = 'redpoint', + repeat = 'repeat', + allfree = 'allfree', + aid = 'aid', + attempt = 'attempt', + t_onsight = 't_onsight', + t_flash = 't_flash', + t_redpoint = 't_redpoint', + t_repeat = 't_repeat', + t_allfree = 't_allfree', + t_aid = 't_aid', + t_attempt = 't_attempt', + tick = 'tick', } +registerEnumType(AscentType, { + name: 'AscentType', +}); export const tickAscentTypes = new Set([ - AscentType.ONSIGHT, - AscentType.FLASH, - AscentType.REDPOINT, - AscentType.REPEAT, + AscentType.onsight, + AscentType.flash, + AscentType.redpoint, + AscentType.repeat, ]); export const firstTickAscentTypes = new Set([ - AscentType.ONSIGHT, - AscentType.FLASH, - AscentType.REDPOINT, + AscentType.onsight, + AscentType.flash, + AscentType.redpoint, ]); export const trTickAscentTypes = new Set([ - AscentType.T_ONSIGHT, - AscentType.T_FLASH, - AscentType.T_REDPOINT, - AscentType.T_REPEAT, + AscentType.t_onsight, + AscentType.t_flash, + AscentType.t_redpoint, + AscentType.t_repeat, ]); export const firstTrTickAscentTypes = new Set([ - AscentType.T_ONSIGHT, - AscentType.T_FLASH, - AscentType.T_REDPOINT, + AscentType.t_onsight, + AscentType.t_flash, + AscentType.t_redpoint, ]); export enum PublishType { - PUBLIC = 'public', - CLUB = 'club', - LOG = 'log', - PRIVATE = 'private', + public = 'public', + club = 'club', + log = 'log', + private = 'private', } +registerEnumType(PublishType, { + name: 'PublishType', +}); /** * Has Triggers: @@ -109,17 +115,17 @@ export class ActivityRoute extends BaseEntity { @Column({ type: 'enum', enum: AscentType, - default: AscentType.REDPOINT, + default: AscentType.redpoint, }) - @Field() + @Field((type) => AscentType) ascentType: AscentType; @Column({ type: 'enum', enum: PublishType, - default: PublishType.PRIVATE, + default: PublishType.private, }) - @Field() + @Field((type) => PublishType) publish: PublishType; @Column({ nullable: true }) diff --git a/src/activities/resolvers/activity-routes.resolver.ts b/src/activities/resolvers/activity-routes.resolver.ts index f0f0c410..e6077e26 100644 --- a/src/activities/resolvers/activity-routes.resolver.ts +++ b/src/activities/resolvers/activity-routes.resolver.ts @@ -131,7 +131,6 @@ export class ActivityRoutesResolver { return this.activityRoutesService.getStats(input, currentUser); } - @UseGuards(UserAuthGuard) @Query(() => [ActivityRoute]) myCragSummary( diff --git a/src/activities/services/activities.service.ts b/src/activities/services/activities.service.ts index 6e3088a0..933d32f1 100644 --- a/src/activities/services/activities.service.ts +++ b/src/activities/services/activities.service.ts @@ -219,7 +219,6 @@ export class ActivitiesService { params: FindActivitiesInput = {}, currentUser: User = null, ): Promise { - const builder = this.activitiesRepository .createQueryBuilder('ac') .select('EXTRACT(YEAR FROM ac.date)', 'year') @@ -247,7 +246,6 @@ export class ActivitiesService { } as StatsActivities; }); return myStats; - } async find(params: FindActivitiesInput = {}): Promise { @@ -326,7 +324,7 @@ export class ActivitiesService { ActivityRoute, 'ar', 'ar.activity_id = a.id AND (ar."publish" IN (:...publish))', - { publish: ['log', 'public'] }, + { publish: ['public'] }, ); // Allow/disallow based on publishStatus of contained activity routes diff --git a/src/activities/services/activity-routes.service.ts b/src/activities/services/activity-routes.service.ts index 707cdf92..0877cc39 100644 --- a/src/activities/services/activity-routes.service.ts +++ b/src/activities/services/activity-routes.service.ts @@ -247,8 +247,8 @@ export class ActivityRoutesService { // boulders cannot be onsighted at all if (routeTypeId === 'boulder') { if ( - ascentType === AscentType.ONSIGHT || - ascentType === AscentType.T_ONSIGHT + ascentType === AscentType.onsight || + ascentType === AscentType.t_onsight ) return false; } @@ -256,10 +256,10 @@ export class ActivityRoutesService { // already tried routes cannot be onsighted or flashed if (routeTried) { if ( - ascentType === AscentType.ONSIGHT || - ascentType === AscentType.T_ONSIGHT || - ascentType === AscentType.FLASH || - ascentType === AscentType.T_FLASH + ascentType === AscentType.onsight || + ascentType === AscentType.t_onsight || + ascentType === AscentType.flash || + ascentType === AscentType.t_flash ) return false; } @@ -267,26 +267,26 @@ export class ActivityRoutesService { // already ticked routes cannot be redpointed (flash, sight included above) if (routeTicked) { if ( - ascentType === AscentType.REDPOINT || - ascentType === AscentType.T_REDPOINT + ascentType === AscentType.redpoint || + ascentType === AscentType.t_redpoint ) return false; } // routes one already 'ticked' on toprope cannot be tr redpointed if (routeTrTicked) { - if (ascentType === AscentType.T_REDPOINT) { + if (ascentType === AscentType.t_redpoint) { return false; } } // routes not ticked before cannot be repeated - if (ascentType === AscentType.REPEAT && !routeTicked) { + if (ascentType === AscentType.repeat && !routeTicked) { return false; } // routes not ticked (real or tr) before cannot be toprope repeated - if (ascentType === AscentType.T_REPEAT && !(routeTicked || routeTrTicked)) { + if (ascentType === AscentType.t_repeat && !(routeTicked || routeTrTicked)) { return false; } @@ -646,7 +646,7 @@ export class ActivityRoutesService { if (!currentUser) { // Allow showing only public ascents to guests builder.andWhere('ar."publish" IN (:...publish)', { - publish: ['log', 'public'], + publish: ['public'], }); // Allow showing only published routes (no drafts or in_reviews) @@ -657,7 +657,7 @@ export class ActivityRoutesService { '(ar.user_id = :userId OR ar."publish" IN (:...publish))', { userId: currentUser.id, - publish: ['log', 'public'], + publish: ['public'], }, ); // TODO: should also allow showing club ascents diff --git a/src/crags/crags.module.ts b/src/crags/crags.module.ts index e342f18b..a1b38752 100644 --- a/src/crags/crags.module.ts +++ b/src/crags/crags.module.ts @@ -71,6 +71,10 @@ import { RouteEvent } from './entities/route-event.entity'; import { Parking } from './entities/parking.entity'; import { ParkingsService } from './services/parkings.service'; import { AreaLoader } from './loaders/area.loader'; +import { ActivityRoutesService } from '../activities/services/activity-routes.service'; +import { ActivitiesModule } from '../activities/activities.module'; +import { ClubMember } from '../users/entities/club-member.entity'; +import { Club } from '../users/entities/club.entity'; import { env } from 'process'; @Module({ @@ -99,7 +103,10 @@ import { env } from 'process'; IceFallProperty, StarRatingVote, Parking, + Club, + ClubMember, ]), + forwardRef(() => ActivitiesModule), forwardRef(() => AuditModule), BullModule.registerQueue({ name: 'summary', @@ -150,6 +157,7 @@ import { env } from 'process'; CragLoader, RouteLoader, ParkingsService, + ActivityRoutesService, ], controllers: [UploadController], exports: [ diff --git a/src/crags/dtos/find-difficulty-votes.input.ts b/src/crags/dtos/find-difficulty-votes.input.ts new file mode 100644 index 00000000..35c95ce1 --- /dev/null +++ b/src/crags/dtos/find-difficulty-votes.input.ts @@ -0,0 +1,9 @@ +import { InputType, Field } from '@nestjs/graphql'; +import { IsOptional } from 'class-validator'; + +@InputType() +export class FindDifficultyVotesInput { + @Field({ nullable: true }) + @IsOptional() + userId?: string; +} diff --git a/src/crags/dtos/find-star-rating-votes.input.ts b/src/crags/dtos/find-star-rating-votes.input.ts new file mode 100644 index 00000000..32148c4a --- /dev/null +++ b/src/crags/dtos/find-star-rating-votes.input.ts @@ -0,0 +1,9 @@ +import { InputType, Field } from '@nestjs/graphql'; +import { IsOptional } from 'class-validator'; + +@InputType() +export class FindStarRatingVotesInput { + @Field({ nullable: true }) + @IsOptional() + userId?: string; +} diff --git a/src/crags/entities/crag.entity.ts b/src/crags/entities/crag.entity.ts index ada4b813..f91840ec 100644 --- a/src/crags/entities/crag.entity.ts +++ b/src/crags/entities/crag.entity.ts @@ -41,34 +41,34 @@ export enum CragType { } export enum Orientation { - NORTH = 'north', - NORTHEAST = 'northeast', - EAST = 'east', - SOUTHEAST = 'southeast', - SOUTH = 'south', - SOUTHWEST = 'southwest', - WEST = 'west', - NORTHWEST = 'northwest', + north = 'north', + northeast = 'northeast', + east = 'east', + southeast = 'southeast', + south = 'south', + southwest = 'southwest', + west = 'west', + northwest = 'northwest', } registerEnumType(Orientation, { name: 'Orientation', }); export enum WallAngle { - SLAB = 'slab', - VERTICAL = 'vertical', - OVERHANG = 'overhang', - ROOF = 'roof', + slab = 'slab', + vertical = 'vertical', + overhang = 'overhang', + roof = 'roof', } registerEnumType(WallAngle, { name: 'WallAngle', }); export enum Season { - SPRING = 'spring', - SUMMER = 'summer', - AUTUMN = 'autumn', - WINTER = 'winter', + spring = 'spring', + summer = 'summer', + autumn = 'autumn', + winter = 'winter', } registerEnumType(Season, { name: 'Season', diff --git a/src/crags/resolvers/routes.resolver.ts b/src/crags/resolvers/routes.resolver.ts index 1785f062..aecd72a3 100644 --- a/src/crags/resolvers/routes.resolver.ts +++ b/src/crags/resolvers/routes.resolver.ts @@ -49,6 +49,13 @@ import { LatestDifficultyVotesInput } from '../dtos/latest-difficulty-votes.inpu import { PaginatedDifficultyVotes } from '../utils/paginated-difficulty-votes'; import { MoveRouteToSectorInput } from '../dtos/move-route-to-sector.input'; import { SectorsService } from '../services/sectors.service'; +import { PaginatedActivityRoutes } from '../../activities/utils/paginated-activity-routes.class'; +import { ActivityRoutesService } from '../../activities/services/activity-routes.service'; +import { FindActivityRoutesInput } from '../../activities/dtos/find-activity-routes.input'; +import { StarRatingVotesService } from '../services/star-rating-votes.service'; +import { StarRatingVote } from '../entities/star-rating-vote.entity'; +import { FindDifficultyVotesInput } from '../dtos/find-difficulty-votes.input'; +import { FindStarRatingVotesInput } from '../dtos/find-star-rating-votes.input'; @Resolver(() => Route) @UseInterceptors(DataLoaderInterceptor) @@ -57,14 +64,18 @@ export class RoutesResolver { private routesService: RoutesService, private sectorsService: SectorsService, private difficultyVotesService: DifficultyVotesService, + private starRatingVotesService: StarRatingVotesService, private entityPropertiesService: EntityPropertiesService, private notificationService: NotificationService, + private activityRoutesService: ActivityRoutesService, ) {} /* QUERIES */ @Query(() => Route) @UseFilters(NotFoundFilter) + @AllowAny() + @UseGuards(UserAuthGuard) async route(@Args('id') id: string): Promise { return this.routesService.findOneById(id); } @@ -247,8 +258,19 @@ export class RoutesResolver { } @ResolveField('difficultyVotes', () => [DifficultyVote]) - async difficultyVotes(@Parent() route: Route): Promise { - return this.difficultyVotesService.findByRouteId(route.id); + async difficultyVotes( + @Parent() route: Route, + @Args('input', { nullable: true }) input: FindDifficultyVotesInput = {}, + ): Promise { + return this.difficultyVotesService.findByRouteId(route.id, input); + } + + @ResolveField('starRatingVotes', () => [StarRatingVote]) + async starRatingVotes( + @Parent() route: Route, + @Args('input', { nullable: true }) input: FindStarRatingVotesInput = {}, + ): Promise { + return this.starRatingVotesService.findByRouteId(route.id, input); } @ResolveField('crag', () => Crag) @@ -286,4 +308,17 @@ export class RoutesResolver { ): Promise { return loader.load(route.routeTypeId); } + + @ResolveField('activityRoutes', () => PaginatedActivityRoutes) + @UseGuards(UserAuthGuard) + async activityRoutes( + @Parent() route: Route, + @Args('input', { nullable: true }) input: FindActivityRoutesInput = {}, + @CurrentUser() currentUser: User, + ): Promise { + return this.activityRoutesService.paginate( + { ...input, routeId: route.id }, + currentUser, + ); + } } diff --git a/src/crags/services/difficulty-votes.service.ts b/src/crags/services/difficulty-votes.service.ts index fff6bf5b..6de81b3d 100644 --- a/src/crags/services/difficulty-votes.service.ts +++ b/src/crags/services/difficulty-votes.service.ts @@ -7,6 +7,7 @@ import { setBuilderCache } from '../../core/utils/entity-cache/entity-cache-help import { LatestDifficultyVotesInputServiceInput } from '../dtos/latest-difficulty-votes-service.input'; import { DifficultyVote } from '../entities/difficulty-vote.entity'; import { PaginatedDifficultyVotes } from '../utils/paginated-difficulty-votes'; +import { FindDifficultyVotesInput } from '../dtos/find-difficulty-votes.input'; @Injectable() export class DifficultyVotesService { @@ -15,9 +16,17 @@ export class DifficultyVotesService { private difficultyVoteRepository: Repository, ) {} - async findByRouteId(routeId: string): Promise { + async findByRouteId( + routeId: string, + input: FindDifficultyVotesInput = {}, + ): Promise { + const where = { + ...(input.userId && { userId: input.userId }), + ...{ routeId }, + }; + const grades = this.difficultyVoteRepository.find({ - where: { routeId: routeId }, + where, order: { difficulty: 'ASC' }, }); diff --git a/src/crags/services/star-rating-votes.service.ts b/src/crags/services/star-rating-votes.service.ts index 6f3a1e3d..a9218688 100644 --- a/src/crags/services/star-rating-votes.service.ts +++ b/src/crags/services/star-rating-votes.service.ts @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from '../../users/entities/user.entity'; import { StarRatingVote } from '../entities/star-rating-vote.entity'; +import { FindStarRatingVotesInput } from '../dtos/find-star-rating-votes.input'; @Injectable() export class StarRatingVotesService { @@ -18,4 +19,19 @@ export class StarRatingVotesService { .andWhere('srv.route_id IN (:...routeIds)', { routeIds }) .getMany(); } + + async findByRouteId( + routeId: string, + input: FindStarRatingVotesInput = {}, + ): Promise { + const where = { + ...(input.userId && { userId: input.userId }), + ...{ routeId }, + }; + + return this.starRatingVoteRepository.find({ + where, + order: { stars: 'ASC' }, + }); + } } diff --git a/src/crags/utils/calculate-scores.ts b/src/crags/utils/calculate-scores.ts index 3ab230de..c703eb2c 100644 --- a/src/crags/utils/calculate-scores.ts +++ b/src/crags/utils/calculate-scores.ts @@ -50,35 +50,35 @@ function calculateScore( const scoreTypeFactor = scoreType === 'order' ? 1 : 0; switch (ascentType) { - case AscentType.ONSIGHT: + case AscentType.onsight: return difficulty + 100; - case AscentType.FLASH: + case AscentType.flash: return difficulty + 50; - case AscentType.REDPOINT: + case AscentType.redpoint: return difficulty; - case AscentType.REPEAT: + case AscentType.repeat: return (difficulty - 10) * scoreTypeFactor; - case AscentType.ALLFREE: + case AscentType.allfree: return difficulty * 0.01 * scoreTypeFactor; - case AscentType.AID: + case AscentType.aid: return difficulty * 0.001 * scoreTypeFactor; - case AscentType.ATTEMPT: + case AscentType.attempt: return difficulty * 0.0001 * scoreTypeFactor; - case AscentType.T_ONSIGHT: + case AscentType.t_onsight: return (difficulty + 100) * 0.0001 * scoreTypeFactor; - case AscentType.T_FLASH: + case AscentType.t_flash: return (difficulty + 50) * 0.0001 * scoreTypeFactor; - case AscentType.T_REDPOINT: + case AscentType.t_redpoint: return difficulty * 0.0001 * scoreTypeFactor; - case AscentType.T_REPEAT: + case AscentType.t_repeat: return (difficulty - 10) * 0.0001 * scoreTypeFactor; - case AscentType.T_ALLFREE: + case AscentType.t_allfree: return difficulty * 0.01 * 0.0001 * scoreTypeFactor; - case AscentType.T_AID: + case AscentType.t_aid: return difficulty * 0.001 * 0.0001 * scoreTypeFactor; - case AscentType.T_ATTEMPT: + case AscentType.t_attempt: return difficulty * 0.0001 * 0.0001 * scoreTypeFactor; - case AscentType.TICK: + case AscentType.tick: // TODO: what is TICK ascent type, and is it even used?? prob not, 1 ar in db... suggest removal, discuss return 0; } diff --git a/src/crags/utils/convert-ascents.ts b/src/crags/utils/convert-ascents.ts index 5bc31a83..09d11647 100644 --- a/src/crags/utils/convert-ascents.ts +++ b/src/crags/utils/convert-ascents.ts @@ -49,7 +49,7 @@ async function convertFirstTickAfterToRepeat( ); // Convert it to repeat - futureTick.ascentType = AscentType.REPEAT; + futureTick.ascentType = AscentType.repeat; await queryRunner.manager.save(futureTick); sideEffects.push({ before: futureTickBeforeChange, after: futureTick }); } @@ -86,7 +86,7 @@ async function convertFirstTrTickAfterToTrRepeat( ); // Convert it to toprope repeat - futureTrTick.ascentType = AscentType.T_REPEAT; + futureTrTick.ascentType = AscentType.t_repeat; await queryRunner.manager.save(futureTrTick); sideEffects.push({ before: futureTrTickBeforeChange, @@ -110,7 +110,7 @@ async function convertFirstSightOrFlashAfterToRedpoint( .where('ar.route_id = :routeId', { routeId: routeId }) .andWhere('ar.user_id = :userId', { userId: userId }) .andWhere('ar.ascent_type IN (:...aTypes)', { - aTypes: [AscentType.ONSIGHT, AscentType.FLASH], + aTypes: [AscentType.onsight, AscentType.flash], }) .andWhere('ar.date > :arDate', { arDate: date }) .getOne(); // If data is valid there can only be one such ascent logged (or none) @@ -126,7 +126,7 @@ async function convertFirstSightOrFlashAfterToRedpoint( ); // Convert it to redpoint - futureSightOrFlash.ascentType = AscentType.REDPOINT; + futureSightOrFlash.ascentType = AscentType.redpoint; await queryRunner.manager.save(futureSightOrFlash); sideEffects.push({ before: futureSightOrFlashBeforeChange, @@ -150,7 +150,7 @@ async function convertFirstTrSightOrFlashAfterToTrRedpoint( .where('ar.route_id = :routeId', { routeId: routeId }) .andWhere('ar.user_id = :userId', { userId: userId }) .andWhere('ar.ascent_type IN (:...aTypes)', { - aTypes: [AscentType.T_ONSIGHT, AscentType.T_FLASH], + aTypes: [AscentType.t_onsight, AscentType.t_flash], }) .andWhere('ar.date > :arDate', { arDate: date }) .getOne(); // If data is valid there can only be one such ascent logged (or none) @@ -166,7 +166,7 @@ async function convertFirstTrSightOrFlashAfterToTrRedpoint( ); // Convert it to toprope redpoint - futureTrSightOrFlash.ascentType = AscentType.T_REDPOINT; + futureTrSightOrFlash.ascentType = AscentType.t_redpoint; await queryRunner.manager.save(futureTrSightOrFlash); sideEffects.push({ before: futureTrSightOrFlashBeforeChange, diff --git a/test/e2e/activity.e2e-spec.ts b/test/e2e/activity.e2e-spec.ts index a1579af6..ca4d6261 100644 --- a/test/e2e/activity.e2e-spec.ts +++ b/test/e2e/activity.e2e-spec.ts @@ -6,7 +6,10 @@ import { MailService } from '../../src/notification/services/mail.service'; import { initializeDbConn, prepareEnvironment, seedDatabase } from './helpers'; import { UsersModule } from '../../src/users/users.module'; import { CragsModule } from '../../src/crags/crags.module'; -import { AscentType } from '../../src/activities/entities/activity-route.entity'; +import { + AscentType, + PublishType, +} from '../../src/activities/entities/activity-route.entity'; import { Activity, ActivityType, @@ -127,7 +130,7 @@ describe('Activity', () => { await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithPublicRoutes.activityRoutes.publicActivityRoute.id}', '${AscentType.ONSIGHT}', 'public', '${mockData.activities.activityWithPublicRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithPublicRoutes.activityRoutes.publicActivityRoute.id}', '${AscentType.onsight}', 'public', '${mockData.activities.activityWithPublicRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activity with only private activity routes @@ -138,7 +141,7 @@ describe('Activity', () => { await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithPrivateRoutes.activityRoutes.privateActivityRoute.id}', '${AscentType.REPEAT}', 'private', '${mockData.activities.activityWithPrivateRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithPrivateRoutes.activityRoutes.privateActivityRoute.id}', '${AscentType.repeat}', 'private', '${mockData.activities.activityWithPrivateRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activity with only log activity routes @@ -149,7 +152,7 @@ describe('Activity', () => { await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithLogRoutes.activityRoutes.logActivityRoute.id}', '${AscentType.REPEAT}', 'log', '${mockData.activities.activityWithLogRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithLogRoutes.activityRoutes.logActivityRoute.id}', '${AscentType.repeat}', 'log', '${mockData.activities.activityWithLogRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activty with mixed activity routes (public, private, log) @@ -160,15 +163,15 @@ describe('Activity', () => { await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.publicActivityRoute.id}', '${AscentType.REPEAT}', 'public', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.publicActivityRoute.id}', '${AscentType.repeat}', 'public', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.logActivityRoute.id}', '${AscentType.REPEAT}', 'log', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.logActivityRoute.id}', '${AscentType.repeat}', 'log', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.privateActivityRoute.id}', '${AscentType.REPEAT}', 'private', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityWithMixedRoutes.activityRoutes.privateActivityRoute.id}', '${AscentType.repeat}', 'private', '${mockData.activities.activityWithMixedRoutes.id}', '${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activity in a draft crag @@ -178,7 +181,7 @@ describe('Activity', () => { ); await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityInDraftCrag.activityRoutes.activityRoute1.id}', '${AscentType.REPEAT}', 'public', '${mockData.activities.activityInDraftCrag.id}', '${mockData.crags.draftCrag.sectors.draftSector.routes.draftRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityInDraftCrag.activityRoutes.activityRoute1.id}', '${AscentType.repeat}', 'public', '${mockData.activities.activityInDraftCrag.id}', '${mockData.crags.draftCrag.sectors.draftSector.routes.draftRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activity in an in_review crag @@ -188,7 +191,7 @@ describe('Activity', () => { ); await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityInInReviewCrag.activityRoutes.activityRoute1.id}', '${AscentType.REPEAT}', 'public', '${mockData.activities.activityInInReviewCrag.id}', '${mockData.crags.inReviewCrag.sectors.inReviewSector.routes.inReviewRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityInInReviewCrag.activityRoutes.activityRoute1.id}', '${AscentType.repeat}', 'public', '${mockData.activities.activityInInReviewCrag.id}', '${mockData.crags.inReviewCrag.sectors.inReviewSector.routes.inReviewRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); // add activity in a published crag and draft sector @@ -198,7 +201,7 @@ describe('Activity', () => { ); await queryRunner.query( `INSERT INTO activity_route (id, ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) - VALUES ('${mockData.activities.activityInPublishedCragDraftSector.activityRoutes.activityRoute1.id}', '${AscentType.REPEAT}', 'public', '${mockData.activities.activityInPublishedCragDraftSector.id}', '${mockData.crags.publishedCrag.sectors.draftSector.routes.draftRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, + VALUES ('${mockData.activities.activityInPublishedCragDraftSector.activityRoutes.activityRoute1.id}', '${AscentType.repeat}', 'public', '${mockData.activities.activityInPublishedCragDraftSector.id}', '${mockData.crags.publishedCrag.sectors.draftSector.routes.draftRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000)`, ); }); @@ -276,7 +279,7 @@ describe('Activity', () => { expect(activitiesIds).not.toContain(mockData.activities.nonCragActivity.id); }); - it('should get only public (or log) activity routes and only activities containing at least one public (or log) activity route when fetching as a guest', async () => { + it('should get only public activity routes and only activities containing at least one public activity route when fetching as a guest', async () => { const response = await request(app.getHttpServer()) .post('/graphql') .send({ @@ -304,14 +307,18 @@ describe('Activity', () => { const numOfNonPublicActivityRoutes = response.body.data.activities.items.filter( (a) => - a.routes.filter((ar) => !['log', 'public'].includes(ar.publish)) - .length > 0, + a.routes.filter( + (ar) => ![PublishType.public].includes(ar.publish.toLowerCase()), + ).length > 0, ).length; expect(numOfNonPublicActivityRoutes).toEqual(0); const numOfActivitiesWithNoPublicActivityRoutes = response.body.data.activities.items.filter( - (a) => !a.routes.some((ar) => ['log', 'public'].includes(ar.publish)), + (a) => + !a.routes.some((ar) => + [PublishType.public].includes(ar.publish.toLowerCase()), + ), ).length; expect(numOfActivitiesWithNoPublicActivityRoutes).toEqual(0); @@ -320,7 +327,7 @@ describe('Activity', () => { const returnedActivitiesIds = response.body.data.activities.items.map( (a) => a.id, ); - expect(returnedActivitiesIds).toContain( + expect(returnedActivitiesIds).not.toContain( mockData.activities.activityWithLogRoutes.id, ); expect(returnedActivitiesIds).toContain( @@ -340,7 +347,7 @@ describe('Activity', () => { mockData.activities.activityWithPublicRoutes.activityRoutes .publicActivityRoute.id, ); - expect(returnedActivityRoutesIds).toContain( + expect(returnedActivityRoutesIds).not.toContain( mockData.activities.activityWithLogRoutes.activityRoutes.logActivityRoute .id, ); @@ -348,7 +355,7 @@ describe('Activity', () => { mockData.activities.activityWithMixedRoutes.activityRoutes .publicActivityRoute.id, ); - expect(returnedActivityRoutesIds).toContain( + expect(returnedActivityRoutesIds).not.toContain( mockData.activities.activityWithMixedRoutes.activityRoutes .logActivityRoute.id, ); diff --git a/test/e2e/activityMutations.e2e-spec.ts b/test/e2e/activityMutations.e2e-spec.ts index 6f2c1aab..b4d0ec6e 100644 --- a/test/e2e/activityMutations.e2e-spec.ts +++ b/test/e2e/activityMutations.e2e-spec.ts @@ -104,8 +104,8 @@ describe('ActivityMutations', () => { }, routes: [ { - ascentType: "${AscentType.ONSIGHT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.onsight}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockData.crags.publishedCrag.sectors.publishedSector.routes.publishedRoute.id}" } diff --git a/test/e2e/activityRoutes.e2e-spec.ts b/test/e2e/activityRoutes.e2e-spec.ts index 9bc2b8b3..6f10eaae 100644 --- a/test/e2e/activityRoutes.e2e-spec.ts +++ b/test/e2e/activityRoutes.e2e-spec.ts @@ -60,86 +60,86 @@ describe('Activity', () => { }, routes: [ { - ascentType: "${AscentType.ONSIGHT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.onsight}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[0].id}" }, { - ascentType: "${AscentType.FLASH}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.flash}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[1].id}" }, { - ascentType: "${AscentType.REDPOINT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.redpoint}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[2].id}" }, { - ascentType: "${AscentType.REPEAT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.repeat}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[2].id}" } { - ascentType: "${AscentType.ALLFREE}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.allfree}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[3].id}" }, { - ascentType: "${AscentType.AID}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.aid}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[4].id}" }, { - ascentType: "${AscentType.ATTEMPT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.attempt}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[5].id}" }, { - ascentType: "${AscentType.T_ONSIGHT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_onsight}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[6].id}" }, { - ascentType: "${AscentType.T_FLASH}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_flash}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[7].id}" }, { - ascentType: "${AscentType.T_REDPOINT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_redpoint}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[8].id}" }, { - ascentType: "${AscentType.T_REPEAT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_repeat}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[8].id}" }, { - ascentType: "${AscentType.T_ALLFREE}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_allfree}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[9].id}" }, { - ascentType: "${AscentType.T_AID}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_aid}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[10].id}" } { - ascentType: "${AscentType.T_ATTEMPT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.t_attempt}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[11].id}" } @@ -182,7 +182,7 @@ describe('Activity', () => { queryResponse.body.data.activity.routes.filter( (r) => r.route.id == mockRoutes[0].id && - !(r.ascentType == AscentType.REPEAT), + !(r.ascentType == AscentType.repeat), )[0].orderScore, ).toBe(mockRoutes[0].difficulty + 100); expect( @@ -207,13 +207,13 @@ describe('Activity', () => { expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[2].id && r.AscentType != AscentType.REPEAT, + r.route.id == mockRoutes[2].id && r.ascentType != AscentType.repeat, )[0].orderScore, ).toBe(mockRoutes[2].difficulty); expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[2].id && r.AscentType != AscentType.REPEAT, + r.route.id == mockRoutes[2].id && r.ascentType != AscentType.repeat, )[0].rankingScore, ).toBe(mockRoutes[2].difficulty); @@ -221,13 +221,13 @@ describe('Activity', () => { expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[2].id && r.ascentType == AscentType.REPEAT, + r.route.id == mockRoutes[2].id && r.ascentType == AscentType.repeat, )[0].orderScore, ).toBe(mockRoutes[2].difficulty - 10); expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[2].id && r.ascentType == AscentType.REPEAT, + r.route.id == mockRoutes[2].id && r.ascentType == AscentType.repeat, )[0].rankingScore, ).toBe(0); @@ -295,13 +295,15 @@ describe('Activity', () => { expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[8].id && r.AscentType != AscentType.T_REPEAT, + r.route.id == mockRoutes[8].id && + r.ascentType.toLowerCase() != AscentType.t_repeat, )[0].orderScore, ).toBe(mockRoutes[8].difficulty * 0.0001); expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[8].id && r.AscentType != AscentType.T_REPEAT, + r.route.id == mockRoutes[8].id && + r.ascentType.toLowerCase() != AscentType.t_repeat, )[0].rankingScore, ).toBe(0); @@ -309,13 +311,15 @@ describe('Activity', () => { expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[8].id && r.ascentType == AscentType.T_REPEAT, + r.route.id == mockRoutes[8].id && + r.ascentType.toLowerCase() == AscentType.t_repeat, )[0].orderScore, ).toBe((mockRoutes[8].difficulty - 10) * 0.0001); expect( queryResponse.body.data.activity.routes.filter( (r) => - r.route.id == mockRoutes[8].id && r.ascentType == AscentType.T_REPEAT, + r.route.id == mockRoutes[8].id && + r.ascentType.toLowerCase() == AscentType.t_repeat, )[0].rankingScore, ).toBe(0); diff --git a/test/e2e/routeMigration.e2e-spec.ts b/test/e2e/routeMigration.e2e-spec.ts index 596dd2df..13463cf3 100644 --- a/test/e2e/routeMigration.e2e-spec.ts +++ b/test/e2e/routeMigration.e2e-spec.ts @@ -59,8 +59,8 @@ describe('RouteMigration', () => { await queryRunner.query( `INSERT INTO activity_route (ascent_type, publish, activity_id, route_id, user_id, date, order_score, ranking_score) VALUES - ('${AscentType.ONSIGHT}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', '${mockData.activities.activityAcrossSectors.date}', 1000, 1000), - ('${AscentType.ONSIGHT}', 'log', '${mockData.activities.activityWithDuplicateRoute.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', '${mockData.activities.activityWithDuplicateRoute.date}', 1000, 1000) + ('${AscentType.onsight}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', '${mockData.activities.activityAcrossSectors.date}', 1000, 1000), + ('${AscentType.onsight}', 'log', '${mockData.activities.activityWithDuplicateRoute.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', '${mockData.activities.activityWithDuplicateRoute.date}', 1000, 1000) `, ); @@ -164,7 +164,7 @@ describe('RouteMigration', () => { it('should change ascent types if invalid state happens after merge', async () => { const onsightAscentsOfRoute = await queryRunner.query( - `SELECT * FROM activity_route WHERE route_id = '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}' AND user_id = '${mockData.users.basicUser1.id}' AND ascent_type = '${AscentType.ONSIGHT}'`, + `SELECT * FROM activity_route WHERE route_id = '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}' AND user_id = '${mockData.users.basicUser1.id}' AND ascent_type = '${AscentType.onsight}'`, ); expect(onsightAscentsOfRoute.length).toBe(1); }); @@ -232,8 +232,8 @@ describe('RouteMigration', () => { }, routes: [ { - ascentType: "${AscentType.ONSIGHT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.onsight}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[0].id}" } @@ -315,8 +315,8 @@ describe('RouteMigration', () => { }, routes: [ { - ascentType: "${AscentType.REDPOINT}", - publish: "${PublishType.PUBLIC}", + ascentType: "${AscentType.redpoint}", + publish: "${PublishType.public}", date: "2017-03-07", routeId: "${mockRoutes[1].id}" } diff --git a/test/e2e/sectorMigration.e2e-spec.ts b/test/e2e/sectorMigration.e2e-spec.ts index 95eae4e5..eac6a789 100644 --- a/test/e2e/sectorMigration.e2e-spec.ts +++ b/test/e2e/sectorMigration.e2e-spec.ts @@ -49,10 +49,10 @@ describe('SectorMigration', () => { await queryRunner.query( `INSERT INTO activity_route (ascent_type, publish, activity_id, route_id, user_id, order_score, ranking_score) VALUES - ('${AscentType.ALLFREE}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), - ('${AscentType.ALLFREE}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.secondRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), - ('${AscentType.ALLFREE}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), - ('${AscentType.ALLFREE}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.secondRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000) + ('${AscentType.allfree}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), + ('${AscentType.allfree}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.firstSector.routes.secondRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), + ('${AscentType.allfree}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.firstRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000), + ('${AscentType.allfree}', 'log', '${mockData.activities.activityAcrossSectors.id}', '${mockData.crags.cragWithMultipleSectors.sectors.secondSector.routes.secondRoute.id}', '${mockData.users.basicUser1.id}', 1000, 1000) `, ); }); diff --git a/test/e2e/user-delete.e2e-spec.ts b/test/e2e/user-delete.e2e-spec.ts index d66ec6f4..52d56ea2 100644 --- a/test/e2e/user-delete.e2e-spec.ts +++ b/test/e2e/user-delete.e2e-spec.ts @@ -56,15 +56,15 @@ describe('UserDelete', () => { [ { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[0], - ascentType: AscentType.REDPOINT, - publishType: PublishType.PRIVATE, + ascentType: AscentType.redpoint, + publishType: PublishType.private, votedDifficulty: 1100, votedStarRating: 2, }, { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[1], - ascentType: AscentType.ONSIGHT, - publishType: PublishType.PUBLIC, + ascentType: AscentType.onsight, + publishType: PublishType.public, }, ], ); @@ -81,8 +81,8 @@ describe('UserDelete', () => { await logRoutes(app, mockData.users.basicUser2, mockData.crags.simpleCrag, [ { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[0], - ascentType: AscentType.REDPOINT, - publishType: PublishType.PRIVATE, + ascentType: AscentType.redpoint, + publishType: PublishType.private, votedDifficulty: 1200, votedStarRating: 2, }, @@ -90,8 +90,8 @@ describe('UserDelete', () => { await logRoutes(app, mockData.users.basicUser3, mockData.crags.simpleCrag, [ { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[0], - ascentType: AscentType.REDPOINT, - publishType: PublishType.PRIVATE, + ascentType: AscentType.redpoint, + publishType: PublishType.private, votedDifficulty: 1300, votedStarRating: 2, }, @@ -102,16 +102,16 @@ describe('UserDelete', () => { await logRoutes(app, mockData.users.basicUser4, mockData.crags.simpleCrag, [ { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[0], - ascentType: AscentType.REDPOINT, - publishType: PublishType.PRIVATE, + ascentType: AscentType.redpoint, + publishType: PublishType.private, votedStarRating: 2, }, ]); await logRoutes(app, mockData.users.basicUser5, mockData.crags.simpleCrag, [ { route: mockData.crags.simpleCrag.sectors.simpleSector1.routes[0], - ascentType: AscentType.REDPOINT, - publishType: PublishType.PRIVATE, + ascentType: AscentType.redpoint, + publishType: PublishType.private, votedStarRating: 2, }, ]);