loopback/common/models/key-value-model.js

110 lines
3.1 KiB
JavaScript

var g = require('strong-globalize')();
module.exports = function(KeyValueModel) {
// TODO add api docs
KeyValueModel.get = function(key, options, callback) {
throwNotAttached(this.modelName, 'get');
};
// TODO add api docs
KeyValueModel.set = function(key, value, options, callback) {
throwNotAttached(this.modelName, 'set');
};
// TODO add api docs
KeyValueModel.expire = function(key, ttl, options, callback) {
throwNotAttached(this.modelName, 'expire');
};
// TODO add api docs
KeyValueModel.ttl = function(key, options, callback) {
throwNotAttached(this.modelName, 'ttl');
};
// TODO add api docs
KeyValueModel.keys = function(filter, options, callback) {
throwNotAttached(this.modelName, 'keys');
};
// TODO add api docs
KeyValueModel.iterateKeys = function(filter, options) {
throwNotAttached(this.modelName, 'iterateKeys');
};
KeyValueModel.setup = function() {
KeyValueModel.base.setup.apply(this, arguments);
this.remoteMethod('get', {
accepts: {
arg: 'key', type: 'string', required: true,
http: { source: 'path' },
},
returns: { arg: 'value', type: 'any', root: true },
http: { path: '/:key', verb: 'get' },
rest: { after: convertNullToNotFoundError },
});
this.remoteMethod('set', {
accepts: [
{ arg: 'key', type: 'string', required: true,
http: { source: 'path' }},
{ arg: 'value', type: 'any', required: true,
http: { source: 'body' }},
{ arg: 'ttl', type: 'number',
http: { source: 'query' },
description: 'time to live in milliseconds' },
],
http: { path: '/:key', verb: 'put' },
});
this.remoteMethod('expire', {
accepts: [
{ arg: 'key', type: 'string', required: true,
http: { source: 'path' }},
{ arg: 'ttl', type: 'number', required: true,
http: { source: 'form' }},
],
http: { path: '/:key/expire', verb: 'put' },
});
this.remoteMethod('ttl', {
accepts: {
arg: 'key', type: 'string', required: true,
http: { source: 'path' },
},
returns: { arg: 'value', type: 'any', root: true },
http: { path: '/:key/ttl', verb: 'get' },
});
this.remoteMethod('keys', {
accepts: {
arg: 'filter', type: 'object', required: false,
http: { source: 'query' },
},
returns: { arg: 'keys', type: ['string'], root: true },
http: { path: '/keys', verb: 'get' },
});
};
};
function throwNotAttached(modelName, methodName) {
throw new Error(g.f(
'Cannot call %s.%s(). ' +
'The %s method has not been setup. ' +
'The {{KeyValueModel}} has not been correctly attached ' +
'to a {{DataSource}}!',
modelName, methodName, methodName));
}
function convertNullToNotFoundError(ctx, cb) {
if (ctx.result !== null) return cb();
var modelName = ctx.method.sharedClass.name;
var id = ctx.getArgByName('id');
var msg = g.f('Unknown "%s" {{key}} "%s".', modelName, id);
var error = new Error(msg);
error.statusCode = error.status = 404;
error.code = 'KEY_NOT_FOUND';
cb(error);
}