UNPKG

@wepublish/api

Version:
291 lines 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createEventOrder = exports.EventService = void 0; const tslib_1 = require("tslib"); const common_1 = require("@nestjs/common"); const client_1 = require("@prisma/client"); const api_1 = require("../../../utils-api/src"); const event_dataloader_service_1 = require("./event-dataloader.service"); const event_model_1 = require("./event.model"); let EventService = exports.EventService = class EventService { constructor(prisma) { this.prisma = prisma; } getEvents({ filter, cursorId, sort = event_model_1.EventSort.StartsAt, order = api_1.SortOrder.Ascending, take = 10, skip }) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const orderBy = (0, exports.createEventOrder)(sort, order); const where = createEventFilter(filter); const [totalCount, events] = yield Promise.all([ this.prisma.event.count({ where, orderBy }), this.prisma.event.findMany({ where, skip, take: (0, api_1.getMaxTake)(take) + 1, orderBy, cursor: cursorId ? { id: cursorId } : undefined }) ]); const nodes = events.slice(0, take); const firstEvent = nodes[0]; const lastEvent = nodes[nodes.length - 1]; const hasPreviousPage = Boolean(skip); const hasNextPage = events.length > nodes.length; return { nodes, totalCount, pageInfo: { hasPreviousPage, hasNextPage, startCursor: firstEvent === null || firstEvent === void 0 ? void 0 : firstEvent.id, endCursor: lastEvent === null || lastEvent === void 0 ? void 0 : lastEvent.id } }; }); } getEventById(id) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const event = yield this.prisma.event.findUnique({ where: { id } }); if (!event) { throw new common_1.NotFoundException(); } return event; }); } updateEvent(_a) { var { id, tagIds, description } = _a, input = tslib_1.__rest(_a, ["id", "tagIds", "description"]); return tslib_1.__awaiter(this, void 0, void 0, function* () { const oldEvent = yield this.prisma.event.findUnique({ where: { id } }); if (!oldEvent) { throw new common_1.NotFoundException(); } validateEvent(Object.assign(Object.assign({}, oldEvent), input)); return this.prisma.event.update({ where: { id }, data: Object.assign(Object.assign({}, input), { description: description, tags: tagIds ? { connectOrCreate: tagIds.map(tagId => ({ where: { eventId_tagId: { eventId: id, tagId } }, create: { tagId } })), deleteMany: { eventId: id, tagId: { notIn: tagIds } } } : undefined }) }); }); } createEvent(_a) { var { tagIds, description } = _a, input = tslib_1.__rest(_a, ["tagIds", "description"]); return tslib_1.__awaiter(this, void 0, void 0, function* () { validateEvent(input); return this.prisma.event.create({ data: Object.assign(Object.assign({}, input), { description: description, tags: (tagIds === null || tagIds === void 0 ? void 0 : tagIds.length) ? { createMany: { data: tagIds === null || tagIds === void 0 ? void 0 : tagIds.map(tagId => ({ tagId })) } } : undefined }) }); }); } deleteEvent(id) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return this.prisma.event.delete({ where: { id } }); }); } }; tslib_1.__decorate([ (0, api_1.PrimeDataLoader)(event_dataloader_service_1.EventDataloaderService), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [event_model_1.EventListArgs]), tslib_1.__metadata("design:returntype", Promise) ], EventService.prototype, "getEvents", null); tslib_1.__decorate([ (0, api_1.PrimeDataLoader)(event_dataloader_service_1.EventDataloaderService), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [String]), tslib_1.__metadata("design:returntype", Promise) ], EventService.prototype, "getEventById", null); tslib_1.__decorate([ (0, api_1.PrimeDataLoader)(event_dataloader_service_1.EventDataloaderService), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [event_model_1.UpdateEventInput]), tslib_1.__metadata("design:returntype", Promise) ], EventService.prototype, "updateEvent", null); tslib_1.__decorate([ (0, api_1.PrimeDataLoader)(event_dataloader_service_1.EventDataloaderService), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [event_model_1.CreateEventInput]), tslib_1.__metadata("design:returntype", Promise) ], EventService.prototype, "createEvent", null); exports.EventService = EventService = tslib_1.__decorate([ (0, common_1.Injectable)(), tslib_1.__metadata("design:paramtypes", [client_1.PrismaClient]) ], EventService); const validateEvent = ({ startsAt, endsAt }) => { if (endsAt && new Date(startsAt) > new Date(endsAt)) { throw new common_1.BadRequestException('endsAt can not be earlier than startsAt'); } }; const createEventOrder = (field, sortOrder) => { switch (field) { case event_model_1.EventSort.ModifiedAt: return { modifiedAt: (0, api_1.graphQLSortOrderToPrisma)(sortOrder) }; case event_model_1.EventSort.CreatedAt: return { createdAt: (0, api_1.graphQLSortOrderToPrisma)(sortOrder) }; case event_model_1.EventSort.EndsAt: return { endsAt: (0, api_1.graphQLSortOrderToPrisma)(sortOrder) }; case event_model_1.EventSort.StartsAt: default: return { startsAt: (0, api_1.graphQLSortOrderToPrisma)(sortOrder) }; } }; exports.createEventOrder = createEventOrder; const createTagFilter = (filter) => { var _a; if ((_a = filter === null || filter === void 0 ? void 0 : filter.tags) === null || _a === void 0 ? void 0 : _a.length) { return { tags: { some: { tagId: { in: filter === null || filter === void 0 ? void 0 : filter.tags } } } }; } return {}; }; const createUpcomingOnlyFilter = (filter) => { if (filter === null || filter === void 0 ? void 0 : filter.upcomingOnly) { return { OR: [ { startsAt: { gte: new Date() } }, { endsAt: { gte: new Date() } } ] }; } return {}; }; const createFromFilter = (filter) => { if (filter === null || filter === void 0 ? void 0 : filter.from) { return { OR: [ { startsAt: { gte: filter.from } }, { endsAt: { gte: filter.from } } ] }; } return {}; }; const createToFilter = (filter) => { if (filter === null || filter === void 0 ? void 0 : filter.to) { return { OR: [ { startsAt: { lte: filter.to } }, { endsAt: { lte: filter.to } } ] }; } return {}; }; const createNameFilter = (filter) => { if (filter === null || filter === void 0 ? void 0 : filter.name) { return { OR: [ { name: { contains: filter.name, mode: 'insensitive' } } ] }; } return {}; }; const createLocationFilter = (filter) => { if (filter === null || filter === void 0 ? void 0 : filter.location) { return { OR: [ { location: { contains: filter.location, mode: 'insensitive' } } ] }; } return {}; }; const createEventFilter = (filter) => ({ AND: [ createUpcomingOnlyFilter(filter), createFromFilter(filter), createToFilter(filter), createTagFilter(filter), createNameFilter(filter), createLocationFilter(filter) ] }); //# sourceMappingURL=event.service.js.map