// api:

function create_api_error(err_code, err_data, err_message) {
    return {
        error: err_code || 'internal:unknown',
        data: err_data || '',
        message: err_message || ''
    };
}

var api = {
    not_allowed: function(err_message) {
        return create_api_error('permission:notallowed', '', err_message);
    },
    not_found: function(err_data, err_message) {
        return create_api_error('resource:notfound', err_data, err_message);
    },
    server_error: function(err_code, err_data, err_message) {
        if (err_code instanceof Error) {
            return create_api_error('', err_code.message, err_code.stack);
        }
        if (err_code && err_code.error) {
            return err_code;
        }
        return create_api_error(err_code, err_data, err_message);
    }
}

exports = module.exports = api;

@@ -210,16 +210,160 @@
 api = %7B%0A
+    invalid_param: function(paramName) %7B%0A        return create_api_error('param:invalid', paramName, 'Invalid parameter: ' + paramName);%0A    %7D,%0A
     not_
@@ -941,24 +941,359 @@
 r_message);%0A
+    %7D,%0A    error: function(err_code, err_data, err_message) %7B%0A        if (err_code instanceof Error) %7B%0A            return create_api_error('', err_code.message, err_code.stack);%0A        %7D%0A        if (err_code && err_code.error) %7B%0A            return err_code;%0A        %7D%0A        return create_api_error(err_code, err_data, err_message);%0A
     %7D%0A%7D%0A%0Aexp

refactor api error