All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.reprezen.genflow.rapidml.nodejs.fixed.lib.Resource.js Maven / Gradle / Ivy

// Base class for generated resource handlers, responsible for passing off request 
// processing to the custom implementation class. The implementation class for each
// resource must be in a javascript file in a top-level project folder named "custom". 
// Within that folder its path must be /.js.
//
// Individual method implementations are expected to return promises.
class Resource {

    constructor(dao) {
    	// cache of already-discovered implementation classes
    	Resource.implClasses = new Map();
    }

    callMethodImpl(resourceName, methodId, enrichments, req, res, next) {
    	let [model, api, resource] = resourceName.split('.');
        if (!Resource.implClasses.has(resourceName)) {
            let implClass = null;
            try {
                Resource.implClasses.set(resourceName, require(`../custom/${model}/${api}/${resource}Impl`));
            } catch (err) {
                // most likely custom class file does not exist so use default impl
                // and don't pointlessly try again later
                console.error(err);
                Resource.implClasses.set(resourceName, null);
            }
        }
        let implClass = Resource.implClasses.get(resourceName);
        if (implClass) {
            let impl = new implClass()
            if (impl[methodId]) {
            	// create a DAO object with this request's locals available, so they
            	// can be provided to DAO event handlers
            	let dao = this.dao.withLocals(Object.assign({}, res.app.locals, res.locals));
            	let result = impl[methodId](dao, enrichments, req, res, next);
            	if (result) {
            		result.then(_ => {
            			if (!res.headersSent) {
            				next();
            			}
            		});
            	} else if (!res.headersSent) {
            		res.status(500).send({errorMessage: 'Unexpeted service error - please contact support'});
            		next(new Error(`Method failed to send a response: req.originalUrl`));
            	}
				return;
            }
        }
        // if we get here, we either couldn't find an impl class, or that class had no
        // implementation of the method invoked by the current request
        throw new Error(`No implementation for method ${this.resourceFQN}.${methodId}`)
    }
}

module.exports = Resource;




© 2015 - 2025 Weber Informatics LLC | Privacy Policy