getSourceId returns table & view data

This commit is contained in:
Adria Navarro 2024-08-28 12:41:42 +02:00
parent 6d8b0881a1
commit 9459dd1820
7 changed files with 38 additions and 55 deletions

View File

@ -38,7 +38,7 @@ export async function handleRequest<T extends Operation>(
} }
export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) { export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const { _id, ...rowData } = ctx.request.body const { _id, ...rowData } = ctx.request.body
const table = await sdk.tables.getTable(tableId) const table = await sdk.tables.getTable(tableId)
@ -93,7 +93,7 @@ export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) {
} }
export async function destroy(ctx: UserCtx) { export async function destroy(ctx: UserCtx) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const _id = ctx.request.body._id const _id = ctx.request.body._id
const { row } = await handleRequest(Operation.DELETE, tableId, { const { row } = await handleRequest(Operation.DELETE, tableId, {
id: breakRowIdField(_id), id: breakRowIdField(_id),
@ -104,7 +104,7 @@ export async function destroy(ctx: UserCtx) {
export async function bulkDestroy(ctx: UserCtx) { export async function bulkDestroy(ctx: UserCtx) {
const { rows } = ctx.request.body const { rows } = ctx.request.body
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
let promises: Promise<{ row: Row; table: Table }>[] = [] let promises: Promise<{ row: Row; table: Table }>[] = []
for (let row of rows) { for (let row of rows) {
promises.push( promises.push(
@ -123,7 +123,7 @@ export async function bulkDestroy(ctx: UserCtx) {
export async function fetchEnrichedRow(ctx: UserCtx) { export async function fetchEnrichedRow(ctx: UserCtx) {
const id = ctx.params.rowId const id = ctx.params.rowId
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const { datasourceId, tableName } = breakExternalTableId(tableId) const { datasourceId, tableName } = breakExternalTableId(tableId)
const datasource: Datasource = await sdk.datasources.get(datasourceId) const datasource: Datasource = await sdk.datasources.get(datasourceId)
if (!datasource || !datasource.entities) { if (!datasource || !datasource.entities) {

View File

@ -47,7 +47,7 @@ export async function patch(
ctx: UserCtx<PatchRowRequest, PatchRowResponse> ctx: UserCtx<PatchRowRequest, PatchRowResponse>
): Promise<any> { ): Promise<any> {
const appId = ctx.appId const appId = ctx.appId
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const body = ctx.request.body const body = ctx.request.body
// if it doesn't have an _id then its save // if it doesn't have an _id then its save
@ -72,7 +72,7 @@ export async function patch(
export const save = async (ctx: UserCtx<Row, Row>) => { export const save = async (ctx: UserCtx<Row, Row>) => {
const appId = ctx.appId const appId = ctx.appId
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const body = ctx.request.body const body = ctx.request.body
// user metadata doesn't exist yet - don't allow creation // user metadata doesn't exist yet - don't allow creation
@ -98,12 +98,11 @@ export const save = async (ctx: UserCtx<Row, Row>) => {
} }
export async function fetchView(ctx: any) { export async function fetchView(ctx: any) {
const tableId = utils.getSourceId(ctx)
const viewName = decodeURIComponent(ctx.params.viewName) const viewName = decodeURIComponent(ctx.params.viewName)
const { calculation, group, field } = ctx.query const { calculation, group, field } = ctx.query
ctx.body = await sdk.rows.fetchView(tableId, viewName, { ctx.body = await sdk.rows.fetchView(viewName, {
calculation, calculation,
group: calculation ? group : null, group: calculation ? group : null,
field, field,
@ -111,12 +110,12 @@ export async function fetchView(ctx: any) {
} }
export async function fetch(ctx: any) { export async function fetch(ctx: any) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
ctx.body = await sdk.rows.fetch(tableId) ctx.body = await sdk.rows.fetch(tableId)
} }
export async function find(ctx: UserCtx<void, GetRowResponse>) { export async function find(ctx: UserCtx<void, GetRowResponse>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const rowId = ctx.params.rowId const rowId = ctx.params.rowId
ctx.body = await sdk.rows.find(tableId, rowId) ctx.body = await sdk.rows.find(tableId, rowId)
@ -132,7 +131,7 @@ function isDeleteRow(input: any): input is DeleteRow {
async function processDeleteRowsRequest(ctx: UserCtx<DeleteRowRequest>) { async function processDeleteRowsRequest(ctx: UserCtx<DeleteRowRequest>) {
let request = ctx.request.body as DeleteRows let request = ctx.request.body as DeleteRows
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const processedRows = request.rows.map(row => { const processedRows = request.rows.map(row => {
let processedRow: Row = typeof row == "string" ? { _id: row } : row let processedRow: Row = typeof row == "string" ? { _id: row } : row
@ -148,7 +147,7 @@ async function processDeleteRowsRequest(ctx: UserCtx<DeleteRowRequest>) {
} }
async function deleteRows(ctx: UserCtx<DeleteRowRequest>) { async function deleteRows(ctx: UserCtx<DeleteRowRequest>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const appId = ctx.appId const appId = ctx.appId
let deleteRequest = ctx.request.body as DeleteRows let deleteRequest = ctx.request.body as DeleteRows
@ -170,7 +169,7 @@ async function deleteRows(ctx: UserCtx<DeleteRowRequest>) {
async function deleteRow(ctx: UserCtx<DeleteRowRequest>) { async function deleteRow(ctx: UserCtx<DeleteRowRequest>) {
const appId = ctx.appId const appId = ctx.appId
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const resp = await pickApi(tableId).destroy(ctx) const resp = await pickApi(tableId).destroy(ctx)
if (!tableId.includes("datasource_plus")) { if (!tableId.includes("datasource_plus")) {
@ -204,7 +203,7 @@ export async function destroy(ctx: UserCtx<DeleteRowRequest>) {
} }
export async function search(ctx: Ctx<SearchRowRequest, SearchRowResponse>) { export async function search(ctx: Ctx<SearchRowRequest, SearchRowResponse>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
await context.ensureSnippetContext(true) await context.ensureSnippetContext(true)
@ -226,7 +225,7 @@ export async function search(ctx: Ctx<SearchRowRequest, SearchRowResponse>) {
} }
export async function validate(ctx: Ctx<Row, ValidateResponse>) { export async function validate(ctx: Ctx<Row, ValidateResponse>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
// external tables are hard to validate currently // external tables are hard to validate currently
if (isExternalTableID(tableId)) { if (isExternalTableID(tableId)) {
ctx.body = { valid: true, errors: {} } ctx.body = { valid: true, errors: {} }
@ -239,14 +238,14 @@ export async function validate(ctx: Ctx<Row, ValidateResponse>) {
} }
export async function fetchEnrichedRow(ctx: UserCtx<void, Row>) { export async function fetchEnrichedRow(ctx: UserCtx<void, Row>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
ctx.body = await pickApi(tableId).fetchEnrichedRow(ctx) ctx.body = await pickApi(tableId).fetchEnrichedRow(ctx)
} }
export const exportRows = async ( export const exportRows = async (
ctx: Ctx<ExportRowsRequest, ExportRowsResponse> ctx: Ctx<ExportRowsRequest, ExportRowsResponse>
) => { ) => {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const format = ctx.query.format const format = ctx.query.format
@ -279,7 +278,7 @@ export const exportRows = async (
export async function downloadAttachment(ctx: UserCtx) { export async function downloadAttachment(ctx: UserCtx) {
const { columnName } = ctx.params const { columnName } = ctx.params
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const rowId = ctx.params.rowId const rowId = ctx.params.rowId
const row = await sdk.rows.find(tableId, rowId) const row = await sdk.rows.find(tableId, rowId)

View File

@ -23,7 +23,7 @@ import { getLinkedTableIDs } from "../../../db/linkedRows/linkUtils"
import { flatten } from "lodash" import { flatten } from "lodash"
export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) { export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const inputs = ctx.request.body const inputs = ctx.request.body
const isUserTable = tableId === InternalTables.USER_METADATA const isUserTable = tableId === InternalTables.USER_METADATA
let oldRow let oldRow
@ -97,7 +97,7 @@ export async function patch(ctx: UserCtx<PatchRowRequest, PatchRowResponse>) {
export async function destroy(ctx: UserCtx) { export async function destroy(ctx: UserCtx) {
const db = context.getAppDB() const db = context.getAppDB()
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const { _id } = ctx.request.body const { _id } = ctx.request.body
let row = await db.get<Row>(_id) let row = await db.get<Row>(_id)
let _rev = ctx.request.body._rev || row._rev let _rev = ctx.request.body._rev || row._rev
@ -136,7 +136,7 @@ export async function destroy(ctx: UserCtx) {
} }
export async function bulkDestroy(ctx: UserCtx) { export async function bulkDestroy(ctx: UserCtx) {
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const table = await sdk.tables.getTable(tableId) const table = await sdk.tables.getTable(tableId)
let { rows } = ctx.request.body let { rows } = ctx.request.body
@ -178,7 +178,7 @@ export async function bulkDestroy(ctx: UserCtx) {
export async function fetchEnrichedRow(ctx: UserCtx) { export async function fetchEnrichedRow(ctx: UserCtx) {
const fieldName = ctx.request.query.field as string | undefined const fieldName = ctx.request.query.field as string | undefined
const db = context.getAppDB() const db = context.getAppDB()
const tableId = utils.getSourceId(ctx) const { tableId } = utils.getSourceId(ctx)
const rowId = ctx.params.rowId as string const rowId = ctx.params.rowId as string
// need table to work out where links go in row, as well as the link docs // need table to work out where links go in row, as well as the link docs
const [table, links] = await Promise.all([ const [table, links] = await Promise.all([

View File

@ -1,4 +1,4 @@
import { InternalTables } from "../../../../db/utils" import * as utils from "../../../../db/utils"
import { context } from "@budibase/backend-core" import { context } from "@budibase/backend-core"
import { import {
@ -67,7 +67,7 @@ export async function findRow(tableId: string, rowId: string) {
const db = context.getAppDB() const db = context.getAppDB()
let row: Row let row: Row
// TODO remove special user case in future // TODO remove special user case in future
if (tableId === InternalTables.USER_METADATA) { if (tableId === utils.InternalTables.USER_METADATA) {
row = await getFullUser(rowId) row = await getFullUser(rowId)
} else { } else {
row = await db.get(rowId) row = await db.get(rowId)
@ -78,22 +78,25 @@ export async function findRow(tableId: string, rowId: string) {
return row return row
} }
export function getSourceId(ctx: Ctx): string { export function getSourceId(ctx: Ctx): { tableId: string; viewId?: string } {
// top priority, use the URL first // top priority, use the URL first
if (ctx.params?.sourceId) { if (ctx.params?.sourceId) {
return ctx.params.sourceId const { sourceId } = ctx.params
if (utils.isViewID(sourceId)) {
return {
tableId: utils.extractViewInfoFromID(sourceId).tableId,
viewId: sourceId,
}
}
return { tableId: ctx.params.sourceId }
} }
// now check for old way of specifying table ID // now check for old way of specifying table ID
if (ctx.params?.tableId) { if (ctx.params?.tableId) {
return ctx.params.tableId return { tableId: ctx.params.tableId }
} }
// check body for a table ID // check body for a table ID
if (ctx.request.body?.tableId) { if (ctx.request.body?.tableId) {
return ctx.request.body.tableId return { tableId: ctx.request.body.tableId }
}
// now check if a specific view name
if (ctx.params?.viewName) {
return ctx.params.viewName
} }
throw new Error("Unable to find table ID in request") throw new Error("Unable to find table ID in request")
} }
@ -198,7 +201,7 @@ export async function sqlOutputProcessing(
} }
export function isUserMetadataTable(tableId: string) { export function isUserMetadataTable(tableId: string) {
return tableId === InternalTables.USER_METADATA return tableId === utils.InternalTables.USER_METADATA
} }
export async function enrichArrayContext( export async function enrichArrayContext(

View File

@ -1,33 +1,23 @@
import { Ctx, Row } from "@budibase/types" import { Ctx, Row } from "@budibase/types"
import * as utils from "../db/utils"
import sdk from "../sdk" import sdk from "../sdk"
import { Next } from "koa" import { Next } from "koa"
import { getSourceId } from "../api/controllers/row/utils" import { getSourceId } from "../api/controllers/row/utils"
export default async (ctx: Ctx<Row>, next: Next) => { export default async (ctx: Ctx<Row>, next: Next) => {
const { body } = ctx.request const { body } = ctx.request
let { _viewId: viewId } = body const viewId = getSourceId(ctx).viewId ?? body._viewId
const possibleViewId = getSourceId(ctx)
if (utils.isViewID(possibleViewId)) {
viewId = possibleViewId
}
// nothing to do, it is not a view (just a table ID) // nothing to do, it is not a view (just a table ID)
if (!viewId) { if (!viewId) {
return next() return next()
} }
const { tableId } = utils.extractViewInfoFromID(viewId)
// don't need to trim delete requests // don't need to trim delete requests
if (ctx?.method?.toLowerCase() !== "delete") { if (ctx?.method?.toLowerCase() !== "delete") {
await trimViewFields(ctx.request.body, viewId) await trimViewFields(ctx.request.body, viewId)
} }
ctx.params.sourceId = tableId
ctx.params.viewId = viewId
return next() return next()
} }

View File

@ -122,9 +122,8 @@ export async function fetchRaw(tableId: string): Promise<Row[]> {
} }
export async function fetchView( export async function fetchView(
tableId: string,
viewName: string, viewName: string,
params: ViewParams params: ViewParams
): Promise<Row[]> { ): Promise<Row[]> {
return pickApi(tableId).fetchView(viewName, params) return internal.fetchView(viewName, params)
} }

View File

@ -272,11 +272,3 @@ export async function fetchRaw(tableId: string): Promise<Row[]> {
}) })
return response.rows return response.rows
} }
export async function fetchView(viewName: string) {
// there are no views in external datasources, shouldn't ever be called
// for now just fetch
const split = viewName.split("all_")
const tableId = split[1] ? split[1] : split[0]
return fetch(tableId)
}