@veecode-platform/plugin-kong-service-manager
Version:
300 lines (297 loc) • 9.28 kB
JavaScript
import { PluginsInfoData } from '../data/data.esm.js';
import { GitManager } from './GitManager.esm.js';
class Client {
config;
fetchApi;
gitManager;
constructor(opts) {
this.config = opts.config;
this.fetchApi = opts.fetchApi;
this.gitManager = new GitManager(opts.scmAuthApi, opts.config);
}
async fetch(input, init) {
const apiUrl = `${this.config.getString("backend.baseUrl")}/api/kong`;
const resp = await this.fetchApi.fetch(`${apiUrl}${input}`, {
...init
});
if (!resp.ok) {
throw new Error(
`[${resp.type}] Request failed with ${resp.status} - ${resp.statusText}`
);
}
if (resp.status === 204) return { message: "deleted" };
return await resp.json();
}
}
class KongServiceManagerApiClient extends Client {
async getServiceInfo(instanceName, serviceName) {
const response = await this.fetch(
`/${instanceName}/services/${serviceName}`
);
return response.service;
}
async getEnabledPlugins(instanceName, serviceName, searchFilter) {
const response = await this.fetch(`/${instanceName}/plugins`);
const availablePluginsResponse = response.plugins;
let availablePluginsList = availablePluginsResponse;
if (searchFilter !== "" && searchFilter) {
availablePluginsList = availablePluginsResponse.filter(
(plugin) => plugin.toLowerCase().includes(searchFilter.toLowerCase())
);
}
const associatedPluginsList = await this.getServiceAssociatedPlugins(
instanceName,
serviceName
);
const mapedEnabledPluginsList = await Promise.all(
PluginsInfoData.categories.map(async (category) => {
const plugins = await Promise.all(
category.plugins.map(async (categoryPlugin) => {
const filteredPluginMatch = availablePluginsList.find(
(availablePlugin) => availablePlugin === categoryPlugin.slug
);
if (!filteredPluginMatch) return null;
const filteredAssocietedPluginMatch = associatedPluginsList.find(
(associatedPlugin) => associatedPlugin.name === categoryPlugin.slug
);
return {
id: filteredAssocietedPluginMatch?.id ?? null,
name: categoryPlugin.name,
slug: categoryPlugin.slug,
associated: filteredAssocietedPluginMatch?.enabled ?? false,
tags: categoryPlugin.tags,
description: categoryPlugin.description
};
})
);
return {
category: category.category,
plugins: plugins.filter((plugin) => plugin !== null)
};
})
);
return mapedEnabledPluginsList;
}
async getEnabledRoutePlugins(instanceName, routeId, searchFilter) {
const response = await this.fetch(`/${instanceName}/plugins`);
const availablePluginsResponse = response.plugins;
let availablePluginsList = availablePluginsResponse;
if (searchFilter !== "" && searchFilter) {
availablePluginsList = availablePluginsResponse.filter(
(plugin) => plugin.toLowerCase().includes(searchFilter.toLowerCase())
);
}
const associatedPluginsList = await this.getRouteAssociatedPlugins(
instanceName,
routeId
);
const mapedEnabledPluginsList = await Promise.all(
PluginsInfoData.categories.map(async (category) => {
const plugins = await Promise.all(
category.plugins.map(async (categoryPlugin) => {
const filteredPluginMatch = availablePluginsList.find(
(availablePlugin) => availablePlugin === categoryPlugin.slug
);
if (!filteredPluginMatch) return null;
const filteredAssocietedPluginMatch = associatedPluginsList.find(
(associatedPlugin) => associatedPlugin.name === categoryPlugin.slug
);
return {
id: filteredAssocietedPluginMatch?.id ?? null,
name: categoryPlugin.name,
slug: categoryPlugin.slug,
associated: filteredAssocietedPluginMatch?.enabled ?? false,
tags: categoryPlugin.tags,
description: categoryPlugin.description
};
})
);
return {
category: category.category,
plugins: plugins.filter((plugin) => plugin !== null)
};
})
);
return mapedEnabledPluginsList;
}
async getPluginFields(instanceName, pluginName) {
const response = await this.fetch(
`/${instanceName}/services/plugins/${pluginName}/fields`
);
return response.fields;
}
async getServiceAssociatedPlugins(instanceName, serviceName) {
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/plugins/associated`
);
return response.plugins;
}
async createServicePlugin(instanceName, serviceName, config) {
const body = {
config
};
const headers = {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/plugins`,
headers
);
return response;
}
async editServicePlugin(instanceName, serviceName, pluginId, config) {
const body = {
...config
};
const headers = {
method: "PATCH",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/plugins/${pluginId}`,
headers
);
return response;
}
async removeServicePlugin(instanceName, serviceName, pluginId) {
const headers = {
method: "DELETE"
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/plugins/${pluginId}`,
headers
);
return response.message;
}
async getRoutesFromService(instanceName, serviceName) {
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/routes`
);
return response.routes;
}
async getRouteFromService(instanceName, serviceName, routeId) {
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/routes/${routeId}`
);
return response.route;
}
async createRouteFromService(instanceName, serviceName, config) {
const body = {
config
};
const headers = {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/routes`,
headers
);
return response.route;
}
async editRouteFromService(instanceName, serviceName, routeId, config) {
const body = {
config
};
const headers = {
method: "PATCH",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/routes/${routeId}`,
headers
);
return response;
}
async removeRouteFromService(instanceName, serviceName, routeId) {
const headers = {
method: "DELETE"
};
const response = await this.fetch(
`/${instanceName}/services/${serviceName}/routes/${routeId}`,
headers
);
return response.message;
}
async getRouteAssociatedPlugins(instanceName, routeId) {
const response = await this.fetch(
`/${instanceName}/routes/${routeId}/plugins/associated`
);
return response.plugins;
}
async addRoutePlugin(instanceName, routeId, config) {
const body = {
config
};
const headers = {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/routes/${routeId}/plugins`,
headers
);
return response;
}
async editRoutePlugin(instanceName, routeId, pluginId, config) {
const body = {
...config
};
const headers = {
method: "PATCH",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json"
}
};
const response = await this.fetch(
`/${instanceName}/routes/${routeId}/plugins/${pluginId}`,
headers
);
return response;
}
async removeRoutePlugin(instanceName, routeId, pluginId) {
const headers = {
method: "DELETE"
};
const response = await this.fetch(
`/${instanceName}/routes/${routeId}/plugins/${pluginId}`,
headers
);
return response.message;
}
async getAllSpecs(location, filePath) {
return this.gitManager.getContentSpec(location, filePath);
}
async getPluginsFromSpec(entityName) {
const response = await this.fetch(`/spec/${entityName}/plugins`);
return response.plugins;
}
async applyPluginsToSpec(specName, location, fileContent, title, message) {
return this.gitManager.createPullRequest(
specName,
location,
fileContent,
title,
message
);
}
}
export { KongServiceManagerApiClient };
//# sourceMappingURL=KongServiceManagerClient.esm.js.map