zamza
Version:
Apache Kafka discovery, indexing, searches, storage, hooks and HTTP gateway
171 lines (170 loc) • 6.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const express = require("express");
const Promise = require("bluebird");
const ZAMZA_TOPIC_PREFIX = "__zamza";
const routeTopicConfig = (zamza) => {
const router = express.Router();
const topicConfigModel = zamza.mongoWrapper.getTopicConfig();
const keyIndexModel = zamza.mongoWrapper.getKeyIndex();
const topicMetadataModel = zamza.mongoWrapper.getTopicMetadata();
router.get("/", (req, res) => {
res.json({
parent: "/api",
self: "/api/config",
children: [
"/api/config/topic",
"/api/config/topic/many",
"/api/config/topic/:topic",
"/api/config/hook",
"/api/config/hook/name/:name",
"/api/config/replay",
"/api/config/replays",
"/api/config/replay/lag",
"/api/config/replay/analytics",
"/api/config/replay/:topic",
"/api/config/replay/flushone",
"/api/config/replay/flushall",
],
});
});
router.get("/topic", async (req, res) => {
try {
res.status(200).json(await topicConfigModel.list());
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
router.get("/topic/:topic", async (req, res) => {
try {
const topicConfig = await topicConfigModel.get(req.params.topic);
if (topicConfig) {
res.status(200).json(topicConfig);
return;
}
res.status(404).json({
error: req.params.topic + " does not exist.",
});
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
router.post("/topic", async (req, res) => {
if (!res.locals.access.topicConfigAccessAllowedForRequest(req)) {
res.status(403).json({
error: "Access not allowed",
});
return;
}
if (!req.body || !req.body.topic) {
res.status(400).json({
error: "Body should be a valid object, {topic, cleanupPolicy, retentionMs}",
});
return;
}
try {
const { topic, cleanupPolicy, retentionMs, queryable = false } = req.body;
if (topic && topic.startsWith(ZAMZA_TOPIC_PREFIX)) {
res.status(400).json({
error: "Cannot do that for a zamza internal topic, " + topic,
});
return;
}
const topicConfig = await topicConfigModel.get(topic);
if (topicConfig) {
res.status(400).json({
error: topic + " topic configuration already exists.",
});
return;
}
res.status(202).json(await topicConfigModel.upsert(topic, cleanupPolicy, retentionMs, undefined, queryable));
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
router.put("/topic", async (req, res) => {
if (!res.locals.access.topicConfigAccessAllowedForRequest(req)) {
res.status(403).json({
error: "Access not allowed",
});
return;
}
try {
const { topic, cleanupPolicy, retentionMs, queryable = false } = req.body;
if (topic && topic.startsWith(ZAMZA_TOPIC_PREFIX)) {
res.status(400).json({
error: "Cannot do that for a zamza internal topic, " + topic,
});
return;
}
res.status(202).json(await topicConfigModel.upsert(topic, cleanupPolicy, retentionMs, undefined, queryable));
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
router.put("/topic/many", async (req, res) => {
if (!res.locals.access.topicConfigAccessAllowedForRequest(req)) {
res.status(403).json({
error: "Access not allowed",
});
return;
}
if (!req.body || !req.body.topics || !Array.isArray(req.body.topics)) {
res.status(400).json({
error: "Body should be a valid object, {topics: []}",
});
return;
}
try {
await Promise.map(req.body.topics, ((topicConfig) => {
const { topic, cleanupPolicy, retentionMs, queryable = false } = topicConfig;
if (topic && topic.startsWith(ZAMZA_TOPIC_PREFIX)) {
throw new Error("Cannot do that for a zamza internal topic, " + topic);
}
return topicConfigModel.upsert(topic, cleanupPolicy, retentionMs, undefined, queryable);
}), { concurrency: 1 });
res.status(200).json(await topicConfigModel.list());
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
router.delete("/topic/:topic", async (req, res) => {
if (!res.locals.access.topicConfigAccessAllowedForRequest(req)) {
res.status(403).json({
error: "Access not allowed",
});
return;
}
try {
const topic = req.params.topic;
await topicConfigModel.delete(topic);
await topicMetadataModel.delete(topic);
if (req.query.purge) {
await keyIndexModel.deleteForTopic(topic);
}
res.status(204).end();
}
catch (error) {
res.status(500).json({
error: "An error occured " + error.message,
});
}
});
return router;
};
exports.routeTopicConfig = routeTopicConfig;