developer239/node-type-orm-graphql

View on GitHub
src/modules/Core/resolvers/deleteResolver.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { Resolver, Mutation, Arg, UseMiddleware, Ctx } from 'type-graphql'
import { Middleware } from 'type-graphql/dist/interfaces/Middleware'
import { IAppContext } from '~/types'
import { notFoundError, unauthorizedError } from '~/modules/Core/errors'

// TODO: I want to do this in one query
// https://github.com/typeorm/typeorm/issues/2660
export const deleteResolver = (entity: any, middleware?: Middleware<any>[]) => {
  @Resolver()
  class BaseResolver {
    @Mutation(() => entity, { name: `delete${entity.className}` })
    @UseMiddleware(...(middleware || []))
    async delete(@Arg('id', () => Number) id: number, @Ctx() ctx: IAppContext) {
      const entityInstance = await entity.findOne(id)

      if (!entityInstance) {
        throw notFoundError({
          id,
          mutationName: `delete${entity.className}`,
          session: ctx.req.session,
        })
      }

      if (entity.belongsToUser && entityInstance.userId !== ctx.req.session.userId) {
        throw unauthorizedError({
          id,
          mutationName: `delete${entity.className}`,
          session: ctx.req.session,
        })
      }

      // Note that we are not waiting for the promise here
      entityInstance.remove()

      return entityInstance
    }
  }

  return BaseResolver
}