@wepublish/api
Version:
API core for we.publish.
291 lines • 10.3 kB
JavaScript
;
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