@webda/core
Version:
Expose API with Lambda
80 lines • 2.15 kB
JavaScript
import MapperService, { MapperParameters } from "./mapper.js";
export class AggregatorParameters extends MapperParameters {
constructor(params) {
super(params);
this.key ?? (this.key = "index");
}
}
/**
* Service that aggregate several CoreModel into one
*
* Similar to a Mapper except that the target is constant
*
* @WebdaModda Aggregator
*/
export default class AggregatorService extends MapperService {
/**
* Create index if not existing
*
* @inheritdoc
*/
async init() {
await this.createAggregate();
return this;
}
/**
* @override
*/
loadParameters(params) {
return new AggregatorParameters(params);
}
/**
* Make sure the aggregate document exist
*/
async createAggregate() {
if (!(await this.targetStore.exists(this.parameters.key))) {
await this.targetStore.save({
uuid: this.parameters.key
});
}
}
/**
* Create an aggregation
*
* @param object
* @param updates
* @returns
*/
async handleMap(object, updates) {
let mapUpdates = {};
if (typeof updates === "object") {
let toUpdate = false;
for (let i in updates) {
if (this.parameters.fields.indexOf(i) >= 0) {
toUpdate = true;
}
}
if (!toUpdate) {
return;
}
}
else if (updates === "deleted") {
await this.targetStore.removeAttribute(this.parameters.key, object.getUuid());
return;
}
else if (updates === "created") {
updates = object;
}
// Create mapper
let mapper = {};
this.parameters.fields.forEach(id => {
mapper[id] = updates[id];
});
mapUpdates[object.getUuid()] = mapper;
mapUpdates._lastUpdate = new Date();
// @ts-ignore
await this.targetStore._patch(mapUpdates, this.parameters.key);
}
}
export { AggregatorService };
//# sourceMappingURL=aggregator.js.map