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 5013466..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'; @@ -22,6 +24,17 @@ 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; + } + + @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 5d9e6ed..96800e9 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 { @@ -28,4 +29,20 @@ 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 }); + } + + 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[]; +}