-
Notifications
You must be signed in to change notification settings - Fork 1
Add a Redis command
Nitzan Tomer edited this page Jun 24, 2017
·
3 revisions
Adding a command is a simple task.
Choose a command from the list of redis commands which isn't yet implemented (list in the README) and implement it in the same way the existing commands are implemented.
The application uses the node_redis package to access the running redis service.
All commands reside in the same file: scripts/src/redis.ts, and they all have the same format:
function COMMAND_NAME(ctx: connector.server.Request): Promise<connector.server.Response> {
// execute command on redis and return a response
}
COMMANDS.push((module: connector.components.ModuleBuilder) => {
module
.command("COMMAND_NAME", {
title: "COMMAND_TITLE",
returns: "COMMAND_RETURN_TYPE",
syntax: [
"SYNTAX_RULE_1",
"SYNTAX_RULE_N"
]
})
.method("HTTP_METHOD")
.handler(HANDLER);
});
function dbsize(request: connector.server.Request): Promise<connector.server.Response> {
if (!client) {
throw new Error("not connected");
}
return new Promise(resolve => {
if (!client!.dbsize((err: Error, size: number) => {
if (err) {
resolve(errorResponse(err.message));
} else {
resolve(successResponse(size));
}
})) {
resolve(errorResponse("failed to get dbsize"));
}
});
}
COMMANDS.push((module: connector.components.ModuleBuilder) => {
module
.command("dbsize", {
title: "DBSIZE command",
returns: "number[numbers.integer]",
syntax: [
"dbsize",
"DBSIZE"
]
})
.handler(dbsize);
});
function get(request: connector.server.Request): Promise<connector.server.Response> {
if (!client) {
throw new Error("not connected");
}
if (!request.data.has("key")) {
return Promise.resolve(errorResponse("expected 'key' path parameter"));
}
const key = request.data("key");
return new Promise(resolve => {
if (!client!.get(key, (err: Error, value: string) => {
if (err) {
resolve(errorResponse(err.message));
} else {
try {
value = JSON.parse(value);
} catch (e) {}
if (value == null) {
resolve(errorResponse("key not found"));
} else {
resolve(successResponse(value));
}
}
})) {
resolve(errorResponse(`failed to get ${ key }`));
}
});
}
COMMANDS.push((module: connector.components.ModuleBuilder) => {
module
.command("get", {
title: "GET command",
returns: "any",
syntax: [
"get (key string)",
"GET (key string)"
]
})
.endpoint("get/{key}")
.handler(get);
});
function set(request: connector.server.Request): Promise<connector.server.Response> {
if (!client) {
throw new Error("not connected");
}
if (!request.data.has("key")) {
return Promise.resolve(errorResponse("expected 'key' in body"));
}
if (!request.data.has("value")) {
return Promise.resolve(errorResponse("expected 'value' in body"));
}
const key = request.data("key");
const value = request.data("value");
return new Promise(resolve => {
if (!client!.set(key, value, (err: Error, obj: string) => {
if (err) {
resolve(errorResponse(err.message));
} else {
resolve(successResponse(obj));
}
})) {
resolve(errorResponse(`failed to set ${ key }`));
}
});
}
COMMANDS.push((module: connector.components.ModuleBuilder) => {
module
.command("set", {
title: "SET command",
returns: "ui.message",
syntax: [
"set (key string) to (value any)",
"SET (key string) to (value any)"
]
})
.method("post")
.handler(set);
});
function del(request: connector.server.Request): Promise<connector.server.Response> {
if (!client) {
throw new Error("not connected");
}
let keys: string[];
if (request.data.has("key")) {
keys = [request.data("key")];
} else if (request.data.has("keys")) {
keys = request.data("keys").split(",");
} else {
return Promise.resolve(errorResponse("expecting 'key' or 'keys' in body"));
}
return new Promise(resolve => {
if (!client!.del(keys, (err: Error, value: number) => {
if (err) {
resolve(errorResponse(err.message));
} else {
resolve(successResponse(value));
}
})) {
resolve(errorResponse("failed to remove keys"));
}
});
}
COMMANDS.push((module: connector.components.ModuleBuilder) => {
module
.command("del", {
title: "DEL command",
returns: "ui.message",
syntax: [
"del (key string)",
"DEL (key string)",
"del (keys list<string>)",
"DEL (keys list<string>)",
]
})
.method("delete")
.handler(del);
});