@lightningkite/lightning-server-simplified
Version:
201 lines • 9.14 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mockRestEndpointFunctions = void 0;
const Condition_1 = require("./Condition");
const Modification_1 = require("./Modification");
const otherModels_1 = require("./otherModels");
function mockRestEndpointFunctions(items, label) {
return {
default(userToken) {
return Promise.reject(new Error("Not implemented"));
},
query(input, userToken) {
const { limit, skip = 0, orderBy, condition } = input;
const filteredItems = condition
? items.filter((item) => (0, Condition_1.evaluateCondition)(condition, item))
: items;
let sortedItems = filteredItems;
if (orderBy === null || orderBy === void 0 ? void 0 : orderBy.length) {
const sortModel = orderBy.map((orderItem) => {
const ascending = !orderItem.toString().startsWith("-");
const key = (ascending ? orderItem : orderItem.toString().substring(1));
return { key, ascending };
});
sortedItems = filteredItems.sort((a, b) => {
for (const { key, ascending } of sortModel) {
const aValue = a[key];
const bValue = b[key];
if (aValue < bValue) {
return ascending ? -1 : 1;
}
else if (aValue > bValue) {
return ascending ? 1 : -1;
}
}
return 0;
});
}
const paginatedItems = limit
? sortedItems.slice(skip, skip + limit)
: sortedItems.slice(skip);
const result = paginatedItems;
console.info(label, "query", { query: input, result });
return Promise.resolve(result);
},
queryPartial(input, userToken) {
return this.query(input, userToken);
},
detail(id, userToken) {
const result = items.find((item) => item._id === id);
console.info(label, "detail", { id, result });
return new Promise((resolve, reject) => {
if (result)
resolve(result);
else
reject();
});
},
insertBulk(input, userToken) {
input.forEach((item) => items.push(item));
console.info(label, "insertBulk", { input });
return Promise.resolve(input);
},
insert(input, userToken) {
items.push(input);
console.info(label, "insert", { input });
return Promise.resolve(input);
},
upsert(id, input, userToken) {
console.info(label, "upsert", { id, input });
const existingItemIndex = items.findIndex((item) => item._id === id);
if (existingItemIndex >= 0) {
items[existingItemIndex] = input;
}
else {
items.push(input);
}
return Promise.resolve(input);
},
bulkReplace(input, userToken) {
console.info(label, "bulkReplace", { input });
input.forEach((item) => this.replace(item._id, item, userToken));
return Promise.resolve(input);
},
replace(id, input, userToken) {
console.info(label, "replace", { id, input });
const existingItemIndex = items.findIndex((item) => item._id === id);
if (existingItemIndex >= 0) {
items[existingItemIndex] = input;
return Promise.resolve(input);
}
return Promise.reject();
},
bulkModify(input, userToken) {
return __awaiter(this, void 0, void 0, function* () {
console.info(label, "bulkModify", { input });
const filteredItems = items.filter((item) => (0, Condition_1.evaluateCondition)(input.condition, item));
return filteredItems.length;
});
},
modifyWithDiff(id, input, userToken) {
return Promise.resolve({});
},
modify(id, input, userToken) {
console.info(label, "modify", { id, input });
const existingItemIndex = items.findIndex((item) => item._id === id);
if (existingItemIndex < 0)
return Promise.reject();
const newItem = (0, Modification_1.evaluateModification)(input, items[existingItemIndex]);
items[existingItemIndex] = newItem;
return Promise.resolve(newItem);
},
bulkDelete(input, userToken) {
console.info(label, "bulkDelete", { input });
if (!items)
return Promise.reject();
const previousLength = items.length;
items = items.filter((item) => !(0, Condition_1.evaluateCondition)(input, item));
return Promise.resolve(previousLength - items.length);
},
delete(id, userToken) {
console.info(label, "delete", { id });
const existingItemIndex = items.findIndex((item) => item._id === id);
if (existingItemIndex >= 0) {
items.splice(existingItemIndex, 1);
return Promise.resolve();
}
else {
return Promise.reject();
}
},
count(input, userToken) {
console.info(label, "count", { input });
return this.query({ condition: input }, userToken).then((it) => it.length);
},
groupCount(input, userToken) {
const { condition, groupBy } = input;
const filteredItems = condition
? items.filter((item) => (0, Condition_1.evaluateCondition)(condition, item))
: items;
const result = filteredItems.reduce((result, item) => {
const key = typeof item[groupBy] === "string"
? item[groupBy]
: JSON.stringify(item[groupBy]);
result[key] = (result[key] || 0) + 1;
return result;
}, {});
console.info(label, "groupCount", { input, result });
return Promise.resolve(result);
},
aggregate(input, userToken) {
const { condition, aggregate, property } = input;
const filteredItems = condition
? items.filter((item) => (0, Condition_1.evaluateCondition)(condition, item))
: items;
const result = performAggregate(filteredItems.map((item) => Number(item[property])), aggregate);
console.info(label, "aggregate", { input, result });
return Promise.resolve(result);
},
groupAggregate(input, userToken) {
const { aggregate, condition, property, groupBy } = input;
const filteredItems = condition
? items.filter((item) => (0, Condition_1.evaluateCondition)(condition, item))
: items;
const numberArrays = filteredItems.reduce((result, item) => {
const key = typeof item[groupBy] === "string"
? item[groupBy]
: JSON.stringify(item[groupBy]);
result[key] = [...(result[key] || []), Number(item[property])];
return result;
}, {});
const result = Object.keys(numberArrays).reduce((result, key) => {
const array = numberArrays[key];
result[key] = performAggregate(array, aggregate);
return result;
}, {});
console.info(label, "groupAggregate", { input, result });
return Promise.resolve(result);
},
};
}
exports.mockRestEndpointFunctions = mockRestEndpointFunctions;
function performAggregate(array, aggregate) {
switch (aggregate) {
case otherModels_1.Aggregate.Sum:
return array.reduce((sum, value) => sum + value, 0);
case otherModels_1.Aggregate.Average:
return array.reduce((sum, value) => sum + value, 0) / array.length;
default:
throw new Error(`Not implemented aggregate: ${aggregate}`);
}
}
//# sourceMappingURL=mockRestEndpoints.js.map