From 05a3a8d978098438166132e74c3ec9c958027aa3 Mon Sep 17 00:00:00 2001 From: cbolles Date: Wed, 11 Sep 2024 16:54:35 -0400 Subject: [PATCH 1/3] Handle deletion of a service --- src/services/damplab-services.resolver.ts | 6 ++++++ src/services/damplab-services.services.ts | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/services/damplab-services.resolver.ts b/src/services/damplab-services.resolver.ts index 5013466..3e94c75 100644 --- a/src/services/damplab-services.resolver.ts +++ b/src/services/damplab-services.resolver.ts @@ -22,6 +22,12 @@ export class DampLabServicesResolver { return this.dampLabServices.update(service, changes); } + @Mutation(() => Boolean) + async deleteService(@Args('service', { type: () => ID }, DampLabServicePipe) service: DampLabService): Promise { + await this.dampLabServices.delete(service); + return true; + } + /** * Resolver which the `allowedConnections` field of the `DampLabService` * type. Allows for the recursive search on possible connections. diff --git a/src/services/damplab-services.services.ts b/src/services/damplab-services.services.ts index 5d9e6ed..d394a9e 100644 --- a/src/services/damplab-services.services.ts +++ b/src/services/damplab-services.services.ts @@ -28,4 +28,13 @@ export class DampLabServices { await this.dampLabServiceModel.updateOne({ _id: service._id }, changes); return (await this.dampLabServiceModel.findById(service._id))!; } + + async delete(service: DampLabService): Promise { + // Remove all allowed connections first + await this.dampLabServiceModel.updateMany({}, { + $pull: { allowedConnections: service._id } + }); + + await this.dampLabServiceModel.deleteOne({ _id: service._id }); + } } From 36ca87bae14c6e4a4c54b1cb636fa0e61e8223c1 Mon Sep 17 00:00:00 2001 From: cbolles Date: Thu, 12 Sep 2024 10:03:47 -0400 Subject: [PATCH 2/3] Add ability to create services --- src/services/create.pipe.ts | 17 +++++++++++++++++ src/services/damplab-services.module.ts | 3 ++- src/services/damplab-services.resolver.ts | 7 +++++++ src/services/damplab-services.services.ts | 5 +++++ src/services/dtos/create.dto.ts | 8 ++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/services/create.pipe.ts create mode 100644 src/services/dtos/create.dto.ts diff --git a/src/services/create.pipe.ts b/src/services/create.pipe.ts new file mode 100644 index 0000000..c2b3ea2 --- /dev/null +++ b/src/services/create.pipe.ts @@ -0,0 +1,17 @@ +import { Injectable, PipeTransform } from '@nestjs/common'; +import { DampLabServicePipe } from '../services/damplab-services.pipe'; +import { CreateService } from './dtos/create.dto'; + +@Injectable() +export class CreateServicePipe implements PipeTransform> { + constructor(private readonly damplabServicePipe: DampLabServicePipe) {} + + async transform(value: CreateService): Promise { + // Ensure the services are valid + for (const service of value.allowedConnections) { + await this.damplabServicePipe.transform(service); + } + + return value; + } +} diff --git a/src/services/damplab-services.module.ts b/src/services/damplab-services.module.ts index 8011782..a333dd9 100644 --- a/src/services/damplab-services.module.ts +++ b/src/services/damplab-services.module.ts @@ -1,5 +1,6 @@ import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; +import { CreateServicePipe } from './create.pipe'; import { DampLabServicePipe } from './damplab-services.pipe'; import { DampLabServicesResolver } from './damplab-services.resolver'; import { DampLabServices } from './damplab-services.services'; @@ -8,7 +9,7 @@ import { ServiceUpdatePipe } from './update.pipe'; @Module({ imports: [MongooseModule.forFeature([{ name: DampLabService.name, schema: DampLabServiceSchema }])], - providers: [DampLabServicesResolver, DampLabServices, DampLabServicePipe, ServiceUpdatePipe], + providers: [DampLabServicesResolver, DampLabServices, DampLabServicePipe, ServiceUpdatePipe, CreateServicePipe], exports: [DampLabServices, DampLabServicePipe] }) export class DampLabServicesModule {} diff --git a/src/services/damplab-services.resolver.ts b/src/services/damplab-services.resolver.ts index 3e94c75..0741b3f 100644 --- a/src/services/damplab-services.resolver.ts +++ b/src/services/damplab-services.resolver.ts @@ -1,6 +1,8 @@ import { Resolver, Query, ResolveField, Parent, ID, Args, Mutation } from '@nestjs/graphql'; +import { CreateServicePipe } from './create.pipe'; import { DampLabServicePipe } from './damplab-services.pipe'; import { DampLabServices } from './damplab-services.services'; +import { CreateService } from './dtos/create.dto'; import { ServiceChange } from './dtos/update.dto'; import { DampLabService } from './models/damplab-service.model'; import { ServiceUpdatePipe } from './update.pipe'; @@ -28,6 +30,11 @@ export class DampLabServicesResolver { return true; } + @Mutation(() => DampLabService) + async createService(@Args('service', CreateServicePipe) service: CreateService): Promise { + return this.dampLabServices.create(service); + } + /** * Resolver which the `allowedConnections` field of the `DampLabService` * type. Allows for the recursive search on possible connections. diff --git a/src/services/damplab-services.services.ts b/src/services/damplab-services.services.ts index d394a9e..d9335dc 100644 --- a/src/services/damplab-services.services.ts +++ b/src/services/damplab-services.services.ts @@ -4,6 +4,7 @@ import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import mongoose from 'mongoose'; import { ServiceChange } from './dtos/update.dto'; +import { CreateService } from './dtos/create.dto'; @Injectable() export class DampLabServices { @@ -37,4 +38,8 @@ export class DampLabServices { await this.dampLabServiceModel.deleteOne({ _id: service._id }); } + + async create(service: CreateService): Promise { + return this.dampLabServiceModel.create(service); + } } diff --git a/src/services/dtos/create.dto.ts b/src/services/dtos/create.dto.ts new file mode 100644 index 0000000..db853b8 --- /dev/null +++ b/src/services/dtos/create.dto.ts @@ -0,0 +1,8 @@ +import { ID, InputType, Field, OmitType } from '@nestjs/graphql'; +import { DampLabService } from '../models/damplab-service.model'; + +@InputType() +export class CreateService extends OmitType(DampLabService, ['_id', 'allowedConnections'] as const, InputType) { + @Field(() => [ID]) + allowedConnections: string[]; +} From 48380b8982461f6bdcc2da76dbea613d79282052 Mon Sep 17 00:00:00 2001 From: cbolles Date: Thu, 12 Sep 2024 10:06:19 -0400 Subject: [PATCH 3/3] Fix formatting --- src/services/damplab-services.services.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/services/damplab-services.services.ts b/src/services/damplab-services.services.ts index d9335dc..96800e9 100644 --- a/src/services/damplab-services.services.ts +++ b/src/services/damplab-services.services.ts @@ -32,9 +32,12 @@ export class DampLabServices { async delete(service: DampLabService): Promise { // Remove all allowed connections first - await this.dampLabServiceModel.updateMany({}, { + await this.dampLabServiceModel.updateMany( + {}, + { $pull: { allowedConnections: service._id } - }); + } + ); await this.dampLabServiceModel.deleteOne({ _id: service._id }); }