@avonjs/avonjs
Version:
A fluent Node.js API generator.
120 lines (119 loc) • 4.3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_crypto_1 = require("node:crypto");
const collect_js_1 = __importDefault(require("collect.js"));
const Contracts_1 = require("../Contracts");
const Models_1 = require("../Models");
exports.default = (Parent) => {
class FillsActionEvents extends Parent {
/**
* Store multiple model's into the storage.
*/
async insert(models) {
return Promise.all(models.map((model) => this.store(model)));
}
/**
* Fill event model for successful resource store.
*/
forResourceStore(params) {
return new Models_1.Fluent({
...this.defaultAttributes(params),
name: 'Create',
changes: params.resource.toSerializable(),
});
}
/**
* Fill event model for successful resource update.
*/
forResourceUpdate(params) {
return new Models_1.Fluent({
...this.defaultAttributes(params),
name: 'Update',
changes: (0, collect_js_1.default)(params.resource.toSerializable())
.diffAssoc((0, collect_js_1.default)(params.previous.toSerializable()))
.all(),
original: params.previous.toSerializable(),
});
}
/**
* Fill event model for successful resource destroy.
*/
forResourceDelete(params) {
return new Models_1.Fluent({
...this.defaultAttributes(params),
name: 'Delete',
changes: {},
original: params.resource.toSerializable(),
});
}
/**
* Fill event model for successful resource restore.
*/
forResourceRestore(params) {
return new Models_1.Fluent({
...this.defaultAttributes(params),
name: 'Restore',
changes: {},
});
}
/**
* Fill event model for successful action ran.
*/
forActionRan(params) {
return new Models_1.Fluent({
...this.defaultAttributes(params),
batch_id: params.batchId ?? (0, node_crypto_1.randomUUID)(),
name: params.action.name(),
original: params.previous.toSerializable(),
changes: (0, collect_js_1.default)(params.resource.toSerializable())
.diffAssoc((0, collect_js_1.default)(params.previous.toSerializable()))
.all(),
});
}
/**
* Get the default attributes for creating a new action event.
*/
defaultAttributes(params) {
return {
payload: params.payload ?? {},
resource_name: params.resourceName,
resource_id: params.resource.getKey(),
model_type: params.resource.constructor.name,
model_id: params.resource.getKey(),
changes: {},
original: {},
user_id: params.userId ?? null,
batch_id: params.batchId ?? (0, node_crypto_1.randomUUID)(),
};
}
/**
* Delete resource events for ever.
*/
async flush(resourceName, key) {
const events = await this.scopeResource(resourceName, key).all();
await Promise.all(events.map((event) => this.delete(event.getKey())));
return events;
}
/**
* Limit query to the given resource.
*/
scopeResource(resourceName, key) {
return this.where([
{
key: 'resource_id',
value: key,
operator: Contracts_1.Operator.eq,
},
{
key: 'resource_name',
value: resourceName,
operator: Contracts_1.Operator.eq,
},
]);
}
}
return FillsActionEvents;
};