import RemoteObject from '../remote-objects/remote-object.mjs';
import EditObject from "../remote-objects/edit.mjs";
/**
* Class with methods that contain executeBatch commands
* @extends RemoteObject
*/
class WsObject extends RemoteObject {
constructor(remoteAPI) {
super(remoteAPI);
}
/**
*
* @param {EditObject} editObject
* @param {string} filter - Server-side SQL filter expression, added as filter property of [TDataSet](https://help.efficy.io/extras/serverjs.html#TDataSet)
* @param {boolean} includeBlobContent - On true, returns all blob streams (e.g. attachment, thumb)
* @returns {Promise<Array>}
* @example
* await crm.ws.getFiles(document, `COMMENT like '%.docx'`, false);
*/
async getFiles(editObject, filter, includeBlobContent) {
await this.api.executeBatch();
const dsFiles = editObject.getDetailDataSet("file", filter, includeBlobContent);
await this.api.executeBatch();
if (!Array.isArray(dsFiles.items) || dsFiles.items.length === 0) return [];
// Sort like in UI, highest/latest K_SORT first
const fnSort = (a, b) => b.K_SORT - a.K_SORT;
const sortedFiles = dsFiles.items.sort(fnSort);
return sortedFiles;
}
/**
* Instantly delete files, optionally SQL expression filtered
* @param {EditObject} editObject
* @param {string} [filter=""] - SQL filter expression, e.g. "COMMENT like '%template%'"
* @example
* await crm.ws.deleteFiles(document);
* await crm.ws.deleteFiles(document, `COMMENT like '%template%'`);
*/
async deleteFiles(editObject, filter) {
const files = await this.getFiles(editObject, filter, false);
files.forEach(file => {
editObject.deleteDetail("file", file.K_FILE + "_" + file.VERSION);
})
await this.api.executeBatch();
}
/**
* Instantly cleanup files, but keep top X, optionally SQL expression filtered
* @param {EditObject} editObject
* @param {string} [filter=""] - SQL filter expression, e.g. "COMMENT like '%template%'"
* @param {number} [keepTopX=7] - Keep only the top X files, sorted highest/latest K_SORT first
* @example
* await crm.ws.cleanupFiles(document, "", 7);
* await crm.ws.cleanupFiles(document, `COMMENT like '%template%'`, 0);
*/
async cleanupFiles(editObject, filter, keepTopX = 7) {
const files = await this.getFiles(editObject, filter, false);
files.filter((file, index) => index >= keepTopX).forEach(file => {
editObject.deleteDetail("file", file.K_FILE + "_" + file.VERSION);
})
await this.api.executeBatch();
}
}
export default WsObject;