in dashboards-observability/server/routes/custom_panels/panels_router.ts [16:375]
export function PanelsRouter(router: IRouter) {
const customPanelBackend = new CustomPanelsAdaptor();
// Fetch all the custom panels available
router.get(
{
path: `${API_PREFIX}/panels`,
validate: {},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const panelsList = await customPanelBackend.viewPanelList(opensearchNotebooksClient);
return response.ok({
body: {
panels: panelsList,
},
});
} catch (error) {
console.error('Issue in fetching panel list:', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// Fetch the required panel by id
router.get(
{
path: `${API_PREFIX}/panels/{panelId}`,
validate: {
params: schema.object({
panelId: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const panelObject = await customPanelBackend.getPanel(
opensearchNotebooksClient,
request.params.panelId
);
return response.ok({
body: panelObject,
});
} catch (error) {
console.error('Issue in fetching panel:', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
//Create a new panel
router.post(
{
path: `${API_PREFIX}/panels`,
validate: {
body: schema.object({
panelName: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const newPanelId = await customPanelBackend.createNewPanel(
opensearchNotebooksClient,
request.body.panelName
);
return response.ok({
body: {
message: 'Panel Created',
newPanelId: newPanelId,
},
});
} catch (error) {
console.error('Issue in creating new panel', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// rename an existing panel
router.patch(
{
path: `${API_PREFIX}/panels/rename`,
validate: {
body: schema.object({
panelId: schema.string(),
panelName: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const responseBody = await customPanelBackend.renamePanel(
opensearchNotebooksClient,
request.body.panelId,
request.body.panelName
);
return response.ok({
body: {
message: 'Panel Renamed',
},
});
} catch (error) {
console.error('Issue in renaming panel', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// clones an existing panel
// returns new panel Id
router.post(
{
path: `${API_PREFIX}/panels/clone`,
validate: {
body: schema.object({
panelId: schema.string(),
panelName: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const cloneResponse = await customPanelBackend.clonePanel(
opensearchNotebooksClient,
request.body.panelId,
request.body.panelName
);
return response.ok({
body: {
message: 'Panel Cloned',
clonePanelId: cloneResponse.clonePanelId,
dateCreated: cloneResponse.dateCreated,
dateModified: cloneResponse.dateModified,
},
});
} catch (error) {
console.error('Issue in cloning panel', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// delete an existing panel
router.delete(
{
path: `${API_PREFIX}/panels/{panelId}`,
validate: {
params: schema.object({
panelId: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const deleteResponse = await customPanelBackend.deletePanel(
opensearchNotebooksClient,
request.params.panelId
);
return response.noContent({
body: {
message: 'Panel Deleted',
},
});
} catch (error) {
console.error('Issue in deleting panel', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// delete an existing panel(s)
router.delete(
{
path: `${API_PREFIX}/panelList/{panelIdList}`,
validate: {
params: schema.object({
panelIdList: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const deleteResponse = await customPanelBackend.deletePanelList(
opensearchNotebooksClient,
request.params.panelIdList
);
return response.noContent({
body: {
message: 'Panel Deleted',
},
});
} catch (error) {
console.error('Issue in deleting panel', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// replaces the ppl query filter in panel
router.patch(
{
path: `${API_PREFIX}/panels/filter`,
validate: {
body: schema.object({
panelId: schema.string(),
query: schema.string(),
language: schema.string(),
to: schema.string(),
from: schema.string(),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const panelFilterResponse = await customPanelBackend.addPanelFilter(
opensearchNotebooksClient,
request.body.panelId,
request.body.query,
request.body.language,
request.body.to,
request.body.from
);
return response.ok({
body: {
message: 'Panel PPL Filter Changed',
},
});
} catch (error) {
console.error('Issue in adding query filter', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
// Add Sample Panels
router.post(
{
path: `${API_PREFIX}/panels/addSamplePanels`,
validate: {
body: schema.object({
savedVisualizationIds: schema.arrayOf(schema.string()),
}),
},
},
async (
context,
request,
response
): Promise<IOpenSearchDashboardsResponse<any | ResponseError>> => {
const opensearchNotebooksClient: ILegacyScopedClusterClient = context.observability_plugin.observabilityClient.asScoped(
request
);
try {
const panelsData = await customPanelBackend.addSamplePanels(
opensearchNotebooksClient,
request.body.savedVisualizationIds
);
return response.ok({
body: {
demoPanelsData: panelsData,
},
});
} catch (error) {
console.error('Issue in fetching panel list:', error);
return response.custom({
statusCode: error.statusCode || 500,
body: error.message,
});
}
}
);
}