export function registerAPIRoutes()

in src/platform/plugins/shared/dashboard/server/api/register_routes.ts [40:407]


export function registerAPIRoutes({
  http,
  contentManagement,
  restCounter,
  logger,
}: RegisterAPIRoutesArgs) {
  const { versioned: versionedRouter } = http.createRouter();

  // Create API route
  const createRoute = versionedRouter.post({
    path: `${PUBLIC_API_PATH}/{id?}`,
    access: 'public',
    summary: 'Create a dashboard',
    description: TECHNICAL_PREVIEW_WARNING,
    options: {
      tags: ['oas-tag:Dashboards'],
      availability: {
        stability: 'experimental',
      },
    },
    security: {
      authz: {
        enabled: false,
        reason: 'Relies on Content Client for authorization',
      },
    },
  });

  createRoute.addVersion(
    {
      version: PUBLIC_API_VERSION,
      validate: {
        request: {
          params: schema.object({
            id: schema.maybe(
              schema.string({
                meta: { description: 'A unique identifier for the dashboard.' },
              })
            ),
          }),
          body: schema.object({
            attributes: dashboardAttributesSchema,
            references: schema.maybe(schema.arrayOf(referenceSchema)),
            spaces: schema.maybe(schema.arrayOf(schema.string())),
          }),
        },
        response: {
          200: {
            body: () => dashboardCreateResultSchema,
          },
        },
      },
    },
    async (ctx, req, res) => {
      const { id } = req.params;
      const { attributes, references, spaces: initialNamespaces } = req.body;
      const client = contentManagement.contentClient
        .getForRequest({ request: req, requestHandlerContext: ctx })
        .for(CONTENT_ID, PUBLIC_API_CONTENT_MANAGEMENT_VERSION);
      let result;
      try {
        ({ result } = await client.create(attributes, {
          id,
          references,
          initialNamespaces,
        }));
      } catch (e) {
        if (e.isBoom && e.output.statusCode === 409) {
          return res.conflict({
            body: {
              message: `A dashboard with saved object ID ${id} already exists.`,
            },
          });
        }

        if (e.isBoom && e.output.statusCode === 403) {
          return res.forbidden();
        }

        return res.badRequest();
      }

      return res.ok({ body: result });
    }
  );

  // Update API route

  const updateRoute = versionedRouter.put({
    path: `${PUBLIC_API_PATH}/{id}`,
    access: 'public',
    summary: `Update an existing dashboard`,
    description: TECHNICAL_PREVIEW_WARNING,
    options: {
      tags: ['oas-tag:Dashboards'],
      availability: {
        stability: 'experimental',
      },
    },
    security: {
      authz: {
        enabled: false,
        reason: 'Relies on Content Client for authorization',
      },
    },
  });

  updateRoute.addVersion(
    {
      version: PUBLIC_API_VERSION,
      validate: {
        request: {
          params: schema.object({
            id: schema.string({
              meta: { description: 'A unique identifier for the dashboard.' },
            }),
          }),
          body: schema.object({
            attributes: dashboardAttributesSchema,
            references: schema.maybe(schema.arrayOf(referenceSchema)),
          }),
        },
        response: {
          200: {
            body: () => dashboardCreateResultSchema,
          },
        },
      },
    },
    async (ctx, req, res) => {
      const { attributes, references } = req.body;
      const client = contentManagement.contentClient
        .getForRequest({ request: req, requestHandlerContext: ctx })
        .for(CONTENT_ID, PUBLIC_API_CONTENT_MANAGEMENT_VERSION);
      let result;
      try {
        ({ result } = await client.update(req.params.id, attributes, { references }));
      } catch (e) {
        if (e.isBoom && e.output.statusCode === 404) {
          return res.notFound({
            body: {
              message: `A dashboard with saved object ID ${req.params.id} was not found.`,
            },
          });
        }
        if (e.isBoom && e.output.statusCode === 403) {
          return res.forbidden();
        }
        return res.badRequest(e.message);
      }
      return res.ok({ body: result });
    }
  );

  // List API route
  const listRoute = versionedRouter.get({
    path: `${PUBLIC_API_PATH}`,
    access: 'public',
    summary: `Get a list of dashboards`,
    description: TECHNICAL_PREVIEW_WARNING,
    options: {
      tags: ['oas-tag:Dashboards'],
      availability: {
        stability: 'experimental',
      },
    },
    security: {
      authz: {
        enabled: false,
        reason: 'Relies on Content Client for authorization',
      },
    },
  });

  listRoute.addVersion(
    {
      version: PUBLIC_API_VERSION,
      validate: {
        request: {
          query: schema.object({
            page: schema.number({
              meta: { description: 'The page number to return. Default is "1".' },
              min: 1,
              defaultValue: 1,
            }),
            perPage: schema.maybe(
              schema.number({
                meta: {
                  description:
                    'The number of dashboards to display on each page (max 1000). Default is "20".',
                },
                defaultValue: 20,
                min: 1,
                max: 1000,
              })
            ),
          }),
        },
        response: {
          200: {
            body: () =>
              schema.object({
                items: schema.arrayOf(dashboardSearchResultsSchema),
                total: schema.number(),
              }),
          },
        },
      },
    },
    async (ctx, req, res) => {
      const { page, perPage: limit } = req.query;
      const client = contentManagement.contentClient
        .getForRequest({ request: req, requestHandlerContext: ctx })
        .for(CONTENT_ID, PUBLIC_API_CONTENT_MANAGEMENT_VERSION);
      let result;
      try {
        // TODO add filtering
        ({ result } = await client.search(
          {
            cursor: page.toString(),
            limit,
          },
          {
            fields: ['title', 'description', 'timeRestore'],
          }
        ));
      } catch (e) {
        if (e.isBoom && e.output.statusCode === 403) {
          return res.forbidden();
        }

        return res.badRequest();
      }

      const body = {
        items: result.hits,
        total: result.pagination.total,
      };
      return res.ok({ body });
    }
  );

  // Get API route
  const getRoute = versionedRouter.get({
    path: `${PUBLIC_API_PATH}/{id}`,
    access: 'public',
    summary: `Get a dashboard`,
    description: TECHNICAL_PREVIEW_WARNING,
    options: {
      tags: ['oas-tag:Dashboards'],
      availability: {
        stability: 'experimental',
      },
    },
    security: {
      authz: {
        enabled: false,
        reason: 'Relies on Content Client for authorization',
      },
    },
  });

  getRoute.addVersion(
    {
      version: PUBLIC_API_VERSION,
      validate: {
        request: {
          params: schema.object({
            id: schema.string({
              meta: {
                description: 'A unique identifier for the dashboard.',
              },
            }),
          }),
        },
        response: {
          200: {
            body: () => dashboardGetResultSchema,
          },
        },
      },
    },
    async (ctx, req, res) => {
      const client = contentManagement.contentClient
        .getForRequest({ request: req, requestHandlerContext: ctx })
        .for(CONTENT_ID, PUBLIC_API_CONTENT_MANAGEMENT_VERSION);
      let result;
      try {
        ({ result } = await client.get(req.params.id));
      } catch (e) {
        if (e.isBoom && e.output.statusCode === 404) {
          return res.notFound({
            body: {
              message: `A dashboard with saved object ID ${req.params.id}] was not found.`,
            },
          });
        }

        if (e.isBoom && e.output.statusCode === 403) {
          return res.forbidden();
        }

        return res.badRequest(e.message);
      }

      return res.ok({ body: result });
    }
  );

  // Delete API route
  const deleteRoute = versionedRouter.delete({
    path: `${PUBLIC_API_PATH}/{id}`,
    access: 'public',
    summary: `Delete a dashboard`,
    description: TECHNICAL_PREVIEW_WARNING,
    options: {
      tags: ['oas-tag:Dashboards'],
      availability: {
        stability: 'experimental',
      },
    },
    security: {
      authz: {
        enabled: false,
        reason: 'Relies on Content Client for authorization',
      },
    },
  });

  deleteRoute.addVersion(
    {
      version: PUBLIC_API_VERSION,
      validate: {
        request: {
          params: schema.object({
            id: schema.string({
              meta: {
                description: 'A unique identifier for the dashboard.',
              },
            }),
          }),
        },
      },
    },
    async (ctx, req, res) => {
      const client = contentManagement.contentClient
        .getForRequest({ request: req, requestHandlerContext: ctx })
        .for(CONTENT_ID, PUBLIC_API_CONTENT_MANAGEMENT_VERSION);
      try {
        await client.delete(req.params.id);
      } catch (e) {
        if (e.isBoom && e.output.statusCode === 404) {
          return res.notFound({
            body: {
              message: `A dashboard with saved object ID ${req.params.id} was not found.`,
            },
          });
        }
        if (e.isBoom && e.output.statusCode === 403) {
          return res.forbidden();
        }
        return res.badRequest();
      }

      return res.ok();
    }
  );
}