@wepublish/api-db-mongodb
Version:
We.publish Database adapter for mongoDB
216 lines • 9.58 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MongoDBMemberPlanAdapter = void 0;
const api_1 = require("@wepublish/api");
const schema_1 = require("./schema");
const defaults_1 = require("./defaults");
const cursor_1 = require("./cursor");
const utility_1 = require("../utility");
class MongoDBMemberPlanAdapter {
constructor(db, locale) {
this.memberPlans = db.collection(schema_1.CollectionName.MemberPlans);
this.locale = locale;
}
async createMemberPlan({ input }) {
const { ops } = await this.memberPlans.insertOne({
createdAt: new Date(),
modifiedAt: new Date(),
name: input.name,
slug: input.slug,
tags: input.tags ? input.tags : [],
imageID: input.imageID,
description: input.description,
active: input.active,
amountPerMonthMin: input.amountPerMonthMin,
availablePaymentMethods: input.availablePaymentMethods
});
const _a = ops[0], { _id: id } = _a, memberPlan = __rest(_a, ["_id"]);
return Object.assign({ id }, memberPlan);
}
async updateMemberPlan({ id, input }) {
const { value } = await this.memberPlans.findOneAndUpdate({ _id: id }, {
$set: {
modifiedAt: new Date(),
name: input.name,
slug: input.slug,
tags: input.tags,
imageID: input.imageID,
description: input.description,
active: input.active,
amountPerMonthMin: input.amountPerMonthMin,
availablePaymentMethods: input.availablePaymentMethods
}
}, { returnOriginal: false });
if (!value)
return null;
const { _id: outID } = value, memberPlan = __rest(value, ["_id"]);
return Object.assign({ id: outID }, memberPlan);
}
async deleteMemberPlan({ id }) {
const { deletedCount } = await this.memberPlans.deleteOne({ _id: id });
return deletedCount !== 0 ? id : null;
}
async getMemberPlanById(id) {
const memberPlan = await this.memberPlans.findOne({ _id: id });
if (memberPlan) {
const { _id: id } = memberPlan;
return Object.assign({ id }, memberPlan);
}
return null;
}
async getMemberPlansByID(ids) {
const memberPlans = await this.memberPlans.find({ _id: { $in: ids } }).toArray();
const memberPlanMap = Object.fromEntries(memberPlans.map((_a) => {
var { _id: id } = _a, memberPlan = __rest(_a, ["_id"]);
return [id, Object.assign({ id }, memberPlan)];
}));
return ids.map(id => { var _a; return (_a = memberPlanMap[id]) !== null && _a !== void 0 ? _a : null; });
}
async getMemberPlansBySlug(slugs) {
const memberPlans = await this.memberPlans.find({ slug: { $in: slugs } }).toArray();
const memberPlansMap = Object.fromEntries(memberPlans.map((_a) => {
var { _id: id, slug } = _a, memberPlan = __rest(_a, ["_id", "slug"]);
return [slug, Object.assign({ id, slug }, memberPlan)];
}));
return slugs.map(slug => { var _a; return (_a = memberPlansMap[slug]) !== null && _a !== void 0 ? _a : null; });
}
async getMemberPlans({ filter, sort, order, cursor, limit }) {
var _a, _b, _c;
const limitCount = Math.min(limit.count, defaults_1.MaxResultsPerPage);
const sortDirection = limit.type === api_1.LimitType.First ? order : -order;
const cursorData = cursor.type !== api_1.InputCursorType.None ? cursor_1.Cursor.from(cursor.data) : undefined;
const expr = order === api_1.SortOrder.Ascending
? cursor.type === api_1.InputCursorType.After
? '$gt'
: '$lt'
: cursor.type === api_1.InputCursorType.After
? '$lt'
: '$gt';
const sortField = memberPlanSortFieldForSort(sort);
const cursorFilter = cursorData
? {
$or: [
{ [sortField]: { [expr]: cursorData.date } },
{ _id: { [expr]: cursorData.id }, [sortField]: cursorData.date }
]
}
: {};
const textFilter = {};
if (filter && JSON.stringify(filter) !== '{}') {
textFilter.$and = [];
}
// TODO: Rename to search
if ((filter === null || filter === void 0 ? void 0 : filter.name) !== undefined) {
(_a = textFilter.$and) === null || _a === void 0 ? void 0 : _a.push({ name: { $regex: (0, utility_1.escapeRegExp)(filter.name), $options: 'i' } });
}
if ((filter === null || filter === void 0 ? void 0 : filter.active) !== undefined) {
(_b = textFilter.$and) === null || _b === void 0 ? void 0 : _b.push({ active: filter.active });
}
if (filter === null || filter === void 0 ? void 0 : filter.tags) {
(_c = textFilter.$and) === null || _c === void 0 ? void 0 : _c.push({ tags: { $in: filter.tags } });
}
const [totalCount, memberPlans] = await Promise.all([
this.memberPlans.countDocuments(textFilter, {
collation: { locale: this.locale, strength: 2 }
}),
// MongoCountPreferences doesn't include collation
this.memberPlans
.aggregate([], { collation: { locale: this.locale, strength: 2 } })
.match(textFilter)
.match(cursorFilter)
.sort({ [sortField]: sortDirection, _id: sortDirection })
.limit(limitCount + 1)
.toArray()
]);
const nodes = memberPlans.slice(0, limitCount);
if (limit.type === api_1.LimitType.Last) {
nodes.reverse();
}
const hasNextPage = limit.type === api_1.LimitType.First
? memberPlans.length > limitCount
: cursor.type === api_1.InputCursorType.Before;
const hasPreviousPage = limit.type === api_1.LimitType.Last
? memberPlans.length > limitCount
: cursor.type === api_1.InputCursorType.After;
const firstMemberPlan = nodes[0];
const lastMemberPlan = nodes[nodes.length - 1];
const startCursor = firstMemberPlan
? new cursor_1.Cursor(firstMemberPlan._id, memberPlanDateForSort(firstMemberPlan, sort)).toString()
: null;
const endCursor = lastMemberPlan
? new cursor_1.Cursor(lastMemberPlan._id, memberPlanDateForSort(lastMemberPlan, sort)).toString()
: null;
return {
nodes: nodes.map((_a) => {
var { _id: id } = _a, memberPlan = __rest(_a, ["_id"]);
return (Object.assign({ id }, memberPlan));
}),
pageInfo: {
startCursor,
endCursor,
hasNextPage,
hasPreviousPage
},
totalCount
};
}
async getActiveMemberPlansByID(ids) {
const memberPlans = await this.memberPlans.find({ _id: { $in: ids }, active: true }).toArray();
const memberPlansMap = Object.fromEntries(memberPlans.map((_a) => {
var { _id: id } = _a, memberPlan = __rest(_a, ["_id"]);
return [id, Object.assign({ id }, memberPlan)];
}));
return ids.map(id => { var _a; return (_a = memberPlansMap[id]) !== null && _a !== void 0 ? _a : null; });
}
async getActiveMemberPlansBySlug(slugs) {
const memberPlans = await this.memberPlans.find({ slug: { $in: slugs }, active: true }).toArray();
const memberPlansMap = Object.fromEntries(memberPlans.map((_a) => {
var { _id: id, slug } = _a, memberPlan = __rest(_a, ["_id", "slug"]);
return [slug, Object.assign({ id, slug }, memberPlan)];
}));
return slugs.map(slug => { var _a; return (_a = memberPlansMap[slug]) !== null && _a !== void 0 ? _a : null; });
}
async getActiveMemberPlans({ filter, sort, order, cursor, limit }) {
const { nodes, pageInfo, totalCount } = await this.getMemberPlans({
filter: Object.assign(Object.assign({}, filter), { active: true }),
sort,
order,
cursor,
limit
});
return {
nodes,
pageInfo,
totalCount
};
}
}
exports.MongoDBMemberPlanAdapter = MongoDBMemberPlanAdapter;
function memberPlanSortFieldForSort(sort) {
switch (sort) {
case api_1.MemberPlanSort.CreatedAt:
return 'createdAt';
case api_1.MemberPlanSort.ModifiedAt:
return 'modifiedAt';
}
}
function memberPlanDateForSort(memberPlan, sort) {
switch (sort) {
case api_1.MemberPlanSort.CreatedAt:
return memberPlan.createdAt;
case api_1.MemberPlanSort.ModifiedAt:
return memberPlan.modifiedAt;
}
}
//# sourceMappingURL=memberPlan.js.map
;