@ptc-org/nestjs-query-graphql
Version:
Nestjs graphql query adapter
191 lines • 10.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeleteResolver = exports.Deletable = void 0;
const tslib_1 = require("tslib");
// eslint-disable-next-line max-classes-per-file
const graphql_1 = require("@nestjs/graphql");
const nestjs_query_core_1 = require("@ptc-org/nestjs-query-core");
const lodash_omit_1 = tslib_1.__importDefault(require("lodash.omit"));
const auth_1 = require("../auth");
const common_1 = require("../common");
const decorators_1 = require("../decorators");
const hooks_1 = require("../hooks");
const interceptors_1 = require("../interceptors");
const subscription_1 = require("../subscription");
const types_1 = require("../types");
const helpers_1 = require("./helpers");
const resolver_interface_1 = require("./resolver.interface");
/** @internal */
const defaultDeleteManyInput = (dtoNames, DTOClass) => {
const { pluralBaseName } = dtoNames;
let DM = class DM extends (0, types_1.DeleteManyInputType)(DTOClass) {
};
DM = tslib_1.__decorate([
(0, graphql_1.InputType)(`DeleteMany${pluralBaseName}Input`)
], DM);
return DM;
};
/** @internal */
const defaultDeleteOneInput = (dtoNames, DTOClass) => {
const { baseName } = dtoNames;
let DM = class DM extends (0, types_1.DeleteOneInputType)(DTOClass) {
};
DM = tslib_1.__decorate([
(0, graphql_1.InputType)(`DeleteOne${baseName}Input`)
], DM);
return DM;
};
/**
* @internal
* Mixin to add `delete` graphql endpoints.
*/
const Deletable = (DTOClass, opts) => (BaseClass) => {
const dtoNames = (0, common_1.getDTONames)(DTOClass, opts);
const { baseName, pluralBaseName } = dtoNames;
const enableSubscriptions = opts.enableSubscriptions === true;
const enableOneSubscriptions = opts.one?.enableSubscriptions ?? enableSubscriptions;
const enableManySubscriptions = opts.many?.enableSubscriptions ?? enableSubscriptions;
const deletedOneEvent = (0, subscription_1.getDTOEventName)(subscription_1.EventType.DELETED_ONE, DTOClass);
const deletedManyEvent = (0, subscription_1.getDTOEventName)(subscription_1.EventType.DELETED_MANY, DTOClass);
const { DeleteOneInput = defaultDeleteOneInput(dtoNames, DTOClass), DeleteManyInput = defaultDeleteManyInput(dtoNames, DTOClass) } = opts;
const deleteOneMutationName = opts.one?.name ?? `deleteOne${baseName}`;
const deleteManyMutationName = opts.many?.name ?? `deleteMany${pluralBaseName}`;
const DMR = (0, types_1.DeleteManyResponseType)();
const commonResolverOpts = (0, lodash_omit_1.default)(opts, 'dtoName', 'one', 'many', 'DeleteOneInput', 'DeleteManyInput', 'useSoftDelete');
let DeleteOneResponse =
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
class DeleteOneResponse extends (0, graphql_1.PartialType)(DTOClass, graphql_1.ObjectType) {
};
DeleteOneResponse = tslib_1.__decorate([
(0, graphql_1.ObjectType)(`${baseName}DeleteResponse`)
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
], DeleteOneResponse);
let DO = class DO extends (0, types_1.MutationArgsType)(DeleteOneInput) {
};
DO = tslib_1.__decorate([
(0, graphql_1.ArgsType)()
], DO);
let DM = class DM extends (0, types_1.MutationArgsType)(DeleteManyInput) {
};
DM = tslib_1.__decorate([
(0, graphql_1.ArgsType)()
], DM);
let SI = class SI extends (0, types_1.SubscriptionFilterInputType)(DTOClass) {
};
SI = tslib_1.__decorate([
(0, graphql_1.InputType)(`DeleteOne${baseName}SubscriptionFilterInput`)
], SI);
let DOSA = class DOSA extends (0, types_1.SubscriptionArgsType)(SI) {
};
DOSA = tslib_1.__decorate([
(0, graphql_1.ArgsType)()
], DOSA);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const deleteOneSubscriptionFilter = (0, helpers_1.createSubscriptionFilter)(SI, deletedOneEvent);
let DeleteResolverBase = class DeleteResolverBase extends BaseClass {
async deleteOne(input, authorizeFilter) {
const deletedResponse = await this.service.deleteOne(input.input.id, {
filter: authorizeFilter ?? {},
useSoftDelete: opts?.useSoftDelete ?? false
});
if (enableOneSubscriptions) {
await this.publishDeletedOneEvent(deletedResponse, authorizeFilter);
}
return deletedResponse;
}
async deleteMany(input, authorizeFilter) {
const deleteManyResponse = await this.service.deleteMany((0, nestjs_query_core_1.mergeFilter)(input.input.filter, authorizeFilter ?? {}), {
useSoftDelete: opts?.useSoftDelete ?? false
});
if (enableManySubscriptions) {
await this.publishDeletedManyEvent(deleteManyResponse, authorizeFilter);
}
return deleteManyResponse;
}
async publishDeletedOneEvent(dto, authorizeFilter) {
if (this.pubSub) {
const eventName = (0, helpers_1.getSubscriptionEventName)(deletedOneEvent, authorizeFilter);
await this.pubSub.publish(eventName, { [deletedOneEvent]: dto });
}
}
async publishDeletedManyEvent(dmr, authorizeFilter) {
if (this.pubSub) {
const eventName = (0, helpers_1.getSubscriptionEventName)(deletedManyEvent, authorizeFilter);
await this.pubSub.publish(eventName, { [deletedManyEvent]: dmr });
}
}
// input required so graphql subscription filtering will work.
// eslint-disable-next-line @typescript-eslint/no-unused-vars
deletedOneSubscription(input, authorizeFilter) {
if (!enableOneSubscriptions || !this.pubSub) {
throw new Error(`Unable to subscribe to ${deletedOneEvent}`);
}
const eventName = (0, helpers_1.getSubscriptionEventName)(deletedOneEvent, authorizeFilter);
return this.pubSub.asyncIterableIterator(eventName);
}
deletedManySubscription(authorizeFilter) {
if (!enableManySubscriptions || !this.pubSub) {
throw new Error(`Unable to subscribe to ${deletedManyEvent}`);
}
const eventName = (0, helpers_1.getSubscriptionEventName)(deletedManyEvent, authorizeFilter);
return this.pubSub.asyncIterableIterator(eventName);
}
};
tslib_1.__decorate([
(0, decorators_1.ResolverMutation)(() => DeleteOneResponse, { name: deleteOneMutationName, description: opts?.one?.description, complexity: opts?.one?.complexity }, commonResolverOpts, { interceptors: [(0, interceptors_1.HookInterceptor)(hooks_1.HookTypes.BEFORE_DELETE_ONE, DTOClass), (0, interceptors_1.AuthorizerInterceptor)(DTOClass)] }, opts.one ?? {}),
tslib_1.__param(0, (0, decorators_1.MutationHookArgs)()),
tslib_1.__param(1, (0, decorators_1.AuthorizerFilter)({
operationGroup: auth_1.OperationGroup.DELETE,
many: false
})),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [DO, Object]),
tslib_1.__metadata("design:returntype", Promise)
], DeleteResolverBase.prototype, "deleteOne", null);
tslib_1.__decorate([
(0, decorators_1.ResolverMutation)(() => DMR, { name: deleteManyMutationName, description: opts?.many?.description, complexity: opts?.many?.complexity }, commonResolverOpts, { interceptors: [(0, interceptors_1.HookInterceptor)(hooks_1.HookTypes.BEFORE_DELETE_MANY, DTOClass), (0, interceptors_1.AuthorizerInterceptor)(DTOClass)] }, opts.many ?? {}),
tslib_1.__param(0, (0, decorators_1.MutationHookArgs)()),
tslib_1.__param(1, (0, decorators_1.AuthorizerFilter)({
operationGroup: auth_1.OperationGroup.DELETE,
many: true
})),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [DM, Object]),
tslib_1.__metadata("design:returntype", Promise)
], DeleteResolverBase.prototype, "deleteMany", null);
tslib_1.__decorate([
(0, decorators_1.ResolverSubscription)(() => DeleteOneResponse, { name: deletedOneEvent, filter: deleteOneSubscriptionFilter }, commonResolverOpts, {
enableSubscriptions: enableOneSubscriptions,
interceptors: [(0, interceptors_1.AuthorizerInterceptor)(DTOClass)]
})
// input required so graphql subscription filtering will work.
// eslint-disable-next-line @typescript-eslint/no-unused-vars
,
tslib_1.__param(0, (0, graphql_1.Args)()),
tslib_1.__param(1, (0, decorators_1.AuthorizerFilter)({ operationGroup: auth_1.OperationGroup.DELETE, many: false })),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [DOSA, Object]),
tslib_1.__metadata("design:returntype", Object)
], DeleteResolverBase.prototype, "deletedOneSubscription", null);
tslib_1.__decorate([
(0, decorators_1.ResolverSubscription)(() => DMR, { name: deletedManyEvent }, commonResolverOpts, {
enableSubscriptions: enableManySubscriptions,
interceptors: [(0, interceptors_1.AuthorizerInterceptor)(DTOClass)]
}),
tslib_1.__param(0, (0, decorators_1.AuthorizerFilter)({ operationGroup: auth_1.OperationGroup.DELETE, many: true })),
tslib_1.__metadata("design:type", Function),
tslib_1.__metadata("design:paramtypes", [Object]),
tslib_1.__metadata("design:returntype", Object)
], DeleteResolverBase.prototype, "deletedManySubscription", null);
DeleteResolverBase = tslib_1.__decorate([
(0, graphql_1.Resolver)(() => DTOClass, { isAbstract: true })
], DeleteResolverBase);
return DeleteResolverBase;
};
exports.Deletable = Deletable;
// eslint-disable-next-line @typescript-eslint/no-redeclare -- intentional
const DeleteResolver = (DTOClass, opts = {}) => (0, exports.Deletable)(DTOClass, opts)(resolver_interface_1.BaseServiceResolver);
exports.DeleteResolver = DeleteResolver;
//# sourceMappingURL=delete.resolver.js.map
;