Source

services/SaleService.js

const utils = require('../../pdm-dsu-toolkit/services/utils');

const {STATUS_MOUNT_PATH, INFO_PATH} = require('../constants');

/**
 * @param {string} domain: anchoring domain. defaults to 'default'
 * @param {strategy} strategy
 * @function ReceiptService
 * @memberOf Services
 */
function SaleService(domain, strategy){
    const strategies = require("../../pdm-dsu-toolkit/services/strategy");
    const {Sale} = require('../model');
    const endpoint = 'receipt';

    domain = domain || "default";
    let isSimple = strategies.SIMPLE === (strategy || strategies.SIMPLE);

    /**
     * Resolves the DSU and loads the OrderLine object with all its properties, mutable or not
     * @param {KeySSI} keySSI
     * @param {function(err?, OrderLine?)} callback
     */
    this.get = function(keySSI, callback){
        utils.getResolver().loadDSU(keySSI, (err, dsu) => {
            if (err)
                return callback(err);
            dsu.readFile(INFO_PATH, (err, data) => {
                if (err)
                    return callback(err);
                let sale;
                try{
                    sale = new Sale(JSON.parse(data));
                } catch (e){
                    return callback(`Could not parse ShipmentLine in DSU ${keySSI}`);
                }

                callback(undefined, sale);
            });
        });
    }

    /**
     * Creates an orderLine DSU
     * @param {string | Sale} sale
     * @param {KeySSI} statusSSI the keySSI for the OrderStus DSU
     * @param {function(err?, KeySSI?, Archive?)} callback
     */
    this.create = function(sale, callback){

        const errors = sale.validate(true);

        if (errors)
            return callback(errors);

        let data = typeof sale == 'object' ? JSON.stringify(sale) : sale;

        let keyGenData = {
            data: [
                sale.id,
                sale.sellerId
            ]
        }

        if (isSimple){
            let keyGenFunction = require('../commands/setSaleSSI').createSaleSSI;
            let keySSI = keyGenFunction(keyGenData, domain);
            utils.selectMethod(keySSI)(keySSI, (err, dsu) => {
                if (err)
                    return callback(err);

                const cb = function(err, ...results){
                    if (err)
                        return dsu.cancelBatch(err2 => {
                            callback(err);
                        });
                    callback(undefined, ...results);
                }

                try {
                    dsu.beginBatch();
                } catch (e) {
                    return callback(e);
                }

                dsu.writeFile(INFO_PATH, data, (err) => {
                    if (err)
                        return cb(err);
                    dsu.commitBatch((err) => {
                        if (err)
                            return cb(err);
                        dsu.getKeySSIAsObject(callback);
                    });
                });
            })
        } else {
            let getEndpointData = function (sale){
                return {
                    endpoint: endpoint,
                    data: [
                        sale.id,
                        sale.sellerId
                    ]
                }
            }

            utils.getDSUService().create(domain, getEndpointData(sale), (builder, cb) => {
                builder.addFileDataToDossier(INFO_PATH, data, cb);
            }, callback);
        }
    };
}

module.exports = SaleService;