From 1b8a229e8508548fecdae8a1072003960dc3088c Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 30 Jan 2025 16:36:44 +0000 Subject: [PATCH] Functions to get source type and usage endpoint for screens. --- packages/backend-core/src/docIds/params.ts | 6 +++++- packages/server/src/api/controllers/screen.ts | 7 +++++++ packages/server/src/api/routes/screen.ts | 5 +++++ packages/server/src/sdk/app/common/index.ts | 1 + packages/server/src/sdk/app/common/utils.ts | 15 +++++++++++++++ packages/server/src/sdk/index.ts | 2 ++ packages/types/src/api/web/app/screen.ts | 7 +++++++ packages/types/src/documents/app/datasource.ts | 7 +++++++ 8 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/server/src/sdk/app/common/index.ts create mode 100644 packages/server/src/sdk/app/common/utils.ts diff --git a/packages/backend-core/src/docIds/params.ts b/packages/backend-core/src/docIds/params.ts index 016604b69b..5f1c053bde 100644 --- a/packages/backend-core/src/docIds/params.ts +++ b/packages/backend-core/src/docIds/params.ts @@ -83,11 +83,15 @@ export function isViewId(id: string): boolean { /** * Check if a given ID is that of a datasource or datasource plus. */ -export const isDatasourceId = (id: string): boolean => { +export function isDatasourceId(id: string): boolean { // this covers both datasources and datasource plus return !!id && id.startsWith(`${DocumentType.DATASOURCE}${SEPARATOR}`) } +export function isQueryId(id: string): boolean { + return !!id && id.startsWith(`${DocumentType.QUERY}${SEPARATOR}`) +} + /** * Gets parameters for retrieving workspaces. */ diff --git a/packages/server/src/api/controllers/screen.ts b/packages/server/src/api/controllers/screen.ts index ad000871fe..99a6b5ab52 100644 --- a/packages/server/src/api/controllers/screen.ts +++ b/packages/server/src/api/controllers/screen.ts @@ -16,8 +16,10 @@ import { SaveScreenRequest, SaveScreenResponse, DeleteScreenResponse, + UsageScreenResponse, } from "@budibase/types" import { builderSocket } from "../../websockets" +import sdk from "../../sdk" export async function fetch(ctx: UserCtx) { const db = context.getAppDB() @@ -140,3 +142,8 @@ function findPlugins(component: ScreenProps, foundPlugins: string[]) { } component._children.forEach(child => findPlugins(child, foundPlugins)) } + +export async function usage(ctx: UserCtx) { + const sourceId = ctx.params.sourceId + const sourceType = sdk.common.getSourceType(sourceId) +} diff --git a/packages/server/src/api/routes/screen.ts b/packages/server/src/api/routes/screen.ts index 7caa37bbfc..6329175fb6 100644 --- a/packages/server/src/api/routes/screen.ts +++ b/packages/server/src/api/routes/screen.ts @@ -19,5 +19,10 @@ router authorized(permissions.BUILDER), controller.destroy ) + .post( + "/api/screens/usage/:sourceId", + authorized(permissions.BUILDER), + controller.usage + ) export default router diff --git a/packages/server/src/sdk/app/common/index.ts b/packages/server/src/sdk/app/common/index.ts new file mode 100644 index 0000000000..3eeaeaa90c --- /dev/null +++ b/packages/server/src/sdk/app/common/index.ts @@ -0,0 +1 @@ +export * from "./utils" diff --git a/packages/server/src/sdk/app/common/utils.ts b/packages/server/src/sdk/app/common/utils.ts new file mode 100644 index 0000000000..ed4e4c9a4f --- /dev/null +++ b/packages/server/src/sdk/app/common/utils.ts @@ -0,0 +1,15 @@ +import { SourceType } from "@budibase/types" +import { docIds } from "@budibase/backend-core" + +export function getSourceType(sourceId: string): SourceType { + if (docIds.isTableId(sourceId)) { + return SourceType.TABLE + } else if (docIds.isViewId(sourceId)) { + return SourceType.VIEW + } else if (docIds.isDatasourceId(sourceId)) { + return SourceType.DATASOURCE + } else if (docIds.isQueryId(sourceId)) { + return SourceType.QUERY + } + throw new Error("Unknown source type - cannot find document type") +} diff --git a/packages/server/src/sdk/index.ts b/packages/server/src/sdk/index.ts index a871546b60..91dd3dffff 100644 --- a/packages/server/src/sdk/index.ts +++ b/packages/server/src/sdk/index.ts @@ -11,6 +11,7 @@ import { default as plugins } from "./plugins" import * as views from "./app/views" import * as permissions from "./app/permissions" import * as rowActions from "./app/rowActions" +import * as common from "./app/common" const sdk = { backups, @@ -26,6 +27,7 @@ const sdk = { permissions, links, rowActions, + common, } // default export for TS diff --git a/packages/types/src/api/web/app/screen.ts b/packages/types/src/api/web/app/screen.ts index 372d1ba2ea..f7cd5c0bf7 100644 --- a/packages/types/src/api/web/app/screen.ts +++ b/packages/types/src/api/web/app/screen.ts @@ -15,3 +15,10 @@ export interface SaveScreenResponse extends Screen {} export interface DeleteScreenResponse { message: string } + +export interface UsageScreenResponse { + screens: { + url: string + _id: string + }[] +} diff --git a/packages/types/src/documents/app/datasource.ts b/packages/types/src/documents/app/datasource.ts index a0be7bd80d..46d2a81de0 100644 --- a/packages/types/src/documents/app/datasource.ts +++ b/packages/types/src/documents/app/datasource.ts @@ -57,3 +57,10 @@ export interface RestConfig { } dynamicVariables?: DynamicVariable[] } + +export enum SourceType { + DATASOURCE = "datasource", + QUERY = "query", + TABLE = "table", + VIEW = "view", +}