@eleven-am/nestjs-graphql-crud
Version:
nestjs-graphql-crud is a library that aims to reduce the boilerplate code needed to create a GraphQL CRUD API.
86 lines • 4.09 kB
JavaScript
;
/**
* @module createSubscriptionResolver
* @description Creates a resolver for GraphQL subscriptions
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createSubscriptionResolver = createSubscriptionResolver;
const common_1 = require("@nestjs/common");
const decorators_1 = require("./decorators");
/**
* Creates a subscription resolver class for handling real-time updates
*
* @template EntityType - The entity type for the subscription
*
* @param {string} modelName - The name of the model
* @param {symbol} dataProviderToken - Symbol for the data provider token
* @param {symbol} fieldSelectionToken - Symbol for the field selection provider token
* @param {Type<SubscriptionResolver<EntityType, Type>>} [resolver] - Optional custom resolver implementation
* @returns {Type<SubscriptionResolver<EntityType, any>>} The subscription resolver class
*/
function createSubscriptionResolver(modelName, dataProviderToken, fieldSelectionToken, resolver) {
if (resolver) {
return resolver;
}
let SubscriptionResolverImpl = class SubscriptionResolverImpl {
constructor(fieldSelectionProvider, dataProvider) {
this.fieldSelectionProvider = fieldSelectionProvider;
this.dataProvider = dataProvider;
}
/**
* Filter subscription events based on the provided filter
*
* @param {DefaultSubscriptionFilter} filter - The subscription filter
* @param {EntityType[]} changes - The changed entities
* @returns {boolean} Whether the changes match the filter
*/
filter(filter, changes) {
if (!filter) {
return true;
}
const items = changes;
return filter.inIds.some((id) => items.some((item) => item.id === id));
}
/**
* Resolve entities for subscription updates
*
* @param {DefaultSubscriptionFilter} filter - The subscription filter
* @param {EntityType[]} changes - The changed entities
* @param {any} info - The selection criteria
* @returns {Promise<EntityType[]>} The resolved entities
*/
async resolve(filter, changes, info) {
const select = this.fieldSelectionProvider.parseSelection(info);
return this.dataProvider.findManyWithoutAbility(modelName, {
where: filter ? {
id: { in: filter.inIds },
} : undefined,
}, select);
}
};
SubscriptionResolverImpl = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, common_1.Inject)(fieldSelectionToken)),
__param(1, (0, common_1.Inject)(dataProviderToken)),
__metadata("design:paramtypes", [Object, Object])
], SubscriptionResolverImpl);
// Give the dynamic class a descriptive name for debugging
Object.defineProperty(SubscriptionResolverImpl, 'name', {
value: `${(0, decorators_1.firstLetterUppercase)(modelName)}SubscriptionResolver`,
writable: false,
});
return SubscriptionResolverImpl;
}
//# sourceMappingURL=createSubscriptionResolver.js.map