Move row view controllers in their own file
This commit is contained in:
parent
752e901b3d
commit
5cfddabac7
|
@ -11,10 +11,6 @@ import {
|
||||||
Row,
|
Row,
|
||||||
PatchRowRequest,
|
PatchRowRequest,
|
||||||
PatchRowResponse,
|
PatchRowResponse,
|
||||||
SearchResponse,
|
|
||||||
SortOrder,
|
|
||||||
SortType,
|
|
||||||
ViewV2,
|
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import * as utils from "./utils"
|
import * as utils from "./utils"
|
||||||
import { gridSocket } from "../../../websockets"
|
import { gridSocket } from "../../../websockets"
|
||||||
|
@ -23,6 +19,7 @@ import { fixRow } from "../public/rows"
|
||||||
import sdk from "../../../sdk"
|
import sdk from "../../../sdk"
|
||||||
import * as exporters from "../view/exporters"
|
import * as exporters from "../view/exporters"
|
||||||
import { apiFileReturn } from "../../../utilities/fileSystem"
|
import { apiFileReturn } from "../../../utilities/fileSystem"
|
||||||
|
export * as views from "./views"
|
||||||
|
|
||||||
function pickApi(tableId: any) {
|
function pickApi(tableId: any) {
|
||||||
if (isExternalTable(tableId)) {
|
if (isExternalTable(tableId)) {
|
||||||
|
@ -222,83 +219,6 @@ export async function search(ctx: any) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSortOptions(
|
|
||||||
ctx: Ctx,
|
|
||||||
view: ViewV2
|
|
||||||
):
|
|
||||||
| {
|
|
||||||
sort: string
|
|
||||||
sortOrder?: SortOrder
|
|
||||||
sortType?: SortType
|
|
||||||
}
|
|
||||||
| undefined {
|
|
||||||
const { sort_column, sort_order, sort_type } = ctx.query
|
|
||||||
if (Array.isArray(sort_column)) {
|
|
||||||
ctx.throw(400, "sort_column cannot be an array")
|
|
||||||
}
|
|
||||||
if (Array.isArray(sort_order)) {
|
|
||||||
ctx.throw(400, "sort_order cannot be an array")
|
|
||||||
}
|
|
||||||
if (Array.isArray(sort_type)) {
|
|
||||||
ctx.throw(400, "sort_type cannot be an array")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sort_column) {
|
|
||||||
return {
|
|
||||||
sort: sort_column,
|
|
||||||
sortOrder: sort_order as SortOrder,
|
|
||||||
sortType: sort_type as SortType,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (view.sort) {
|
|
||||||
return {
|
|
||||||
sort: view.sort.field,
|
|
||||||
sortOrder: view.sort.order,
|
|
||||||
sortType: view.sort.type,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function searchView(ctx: Ctx<void, SearchResponse>) {
|
|
||||||
const { viewId } = ctx.params
|
|
||||||
|
|
||||||
const view = await sdk.views.get(viewId)
|
|
||||||
if (!view) {
|
|
||||||
ctx.throw(404, `View ${viewId} not found`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (view.version !== 2) {
|
|
||||||
ctx.throw(400, `This method only supports viewsV2`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const table = await sdk.tables.getTable(view?.tableId)
|
|
||||||
|
|
||||||
const viewFields =
|
|
||||||
(view.columns &&
|
|
||||||
Object.entries(view.columns).length &&
|
|
||||||
Object.keys(sdk.views.enrichSchema(view, table.schema).schema)) ||
|
|
||||||
undefined
|
|
||||||
|
|
||||||
ctx.status = 200
|
|
||||||
const result = await quotas.addQuery(
|
|
||||||
() =>
|
|
||||||
sdk.rows.search({
|
|
||||||
tableId: view.tableId,
|
|
||||||
query: view.query || {},
|
|
||||||
fields: viewFields,
|
|
||||||
...getSortOptions(ctx, view),
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
datasourceId: view.tableId,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
result.rows.forEach(r => (r._viewId = view.id))
|
|
||||||
ctx.body = result
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function validate(ctx: Ctx) {
|
export async function validate(ctx: Ctx) {
|
||||||
const tableId = utils.getTableId(ctx)
|
const tableId = utils.getTableId(ctx)
|
||||||
// external tables are hard to validate currently
|
// external tables are hard to validate currently
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
import { quotas } from "@budibase/pro"
|
||||||
|
import {
|
||||||
|
Ctx,
|
||||||
|
SearchResponse,
|
||||||
|
SortOrder,
|
||||||
|
SortType,
|
||||||
|
ViewV2,
|
||||||
|
} from "@budibase/types"
|
||||||
|
import sdk from "../../../sdk"
|
||||||
|
|
||||||
|
export async function searchView(ctx: Ctx<void, SearchResponse>) {
|
||||||
|
const { viewId } = ctx.params
|
||||||
|
|
||||||
|
const view = await sdk.views.get(viewId)
|
||||||
|
if (!view) {
|
||||||
|
ctx.throw(404, `View ${viewId} not found`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (view.version !== 2) {
|
||||||
|
ctx.throw(400, `This method only supports viewsV2`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const table = await sdk.tables.getTable(view?.tableId)
|
||||||
|
|
||||||
|
const viewFields =
|
||||||
|
(view.columns &&
|
||||||
|
Object.entries(view.columns).length &&
|
||||||
|
Object.keys(sdk.views.enrichSchema(view, table.schema).schema)) ||
|
||||||
|
undefined
|
||||||
|
|
||||||
|
ctx.status = 200
|
||||||
|
const result = await quotas.addQuery(
|
||||||
|
() =>
|
||||||
|
sdk.rows.search({
|
||||||
|
tableId: view.tableId,
|
||||||
|
query: view.query || {},
|
||||||
|
fields: viewFields,
|
||||||
|
...getSortOptions(ctx, view),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
datasourceId: view.tableId,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result.rows.forEach(r => (r._viewId = view.id))
|
||||||
|
ctx.body = result
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSortOptions(
|
||||||
|
ctx: Ctx,
|
||||||
|
view: ViewV2
|
||||||
|
):
|
||||||
|
| {
|
||||||
|
sort: string
|
||||||
|
sortOrder?: SortOrder
|
||||||
|
sortType?: SortType
|
||||||
|
}
|
||||||
|
| undefined {
|
||||||
|
const { sort_column, sort_order, sort_type } = ctx.query
|
||||||
|
if (Array.isArray(sort_column)) {
|
||||||
|
ctx.throw(400, "sort_column cannot be an array")
|
||||||
|
}
|
||||||
|
if (Array.isArray(sort_order)) {
|
||||||
|
ctx.throw(400, "sort_order cannot be an array")
|
||||||
|
}
|
||||||
|
if (Array.isArray(sort_type)) {
|
||||||
|
ctx.throw(400, "sort_type cannot be an array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sort_column) {
|
||||||
|
return {
|
||||||
|
sort: sort_column,
|
||||||
|
sortOrder: sort_order as SortOrder,
|
||||||
|
sortType: sort_type as SortType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (view.sort) {
|
||||||
|
return {
|
||||||
|
sort: view.sort.field,
|
||||||
|
sortOrder: view.sort.order,
|
||||||
|
sortType: view.sort.type,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
|
@ -146,11 +146,6 @@ router
|
||||||
authorized(PermissionType.TABLE, PermissionLevel.READ),
|
authorized(PermissionType.TABLE, PermissionLevel.READ),
|
||||||
rowController.search
|
rowController.search
|
||||||
)
|
)
|
||||||
.get(
|
|
||||||
"/api/v2/views/:viewId/search",
|
|
||||||
authorized(PermissionType.VIEW, PermissionLevel.READ),
|
|
||||||
rowController.searchView
|
|
||||||
)
|
|
||||||
/**
|
/**
|
||||||
* @api {post} /api/:tableId/rows Creates a new row
|
* @api {post} /api/:tableId/rows Creates a new row
|
||||||
* @apiName Creates a new row
|
* @apiName Creates a new row
|
||||||
|
@ -268,4 +263,35 @@ router
|
||||||
rowController.exportRows
|
rowController.exportRows
|
||||||
)
|
)
|
||||||
|
|
||||||
|
router
|
||||||
|
.get(
|
||||||
|
"/api/v2/views/:viewId/search",
|
||||||
|
authorized(PermissionType.VIEW, PermissionLevel.READ),
|
||||||
|
rowController.views.searchView
|
||||||
|
)
|
||||||
|
/**
|
||||||
|
* @api {post} /api/:tableId/rows Creates a new row
|
||||||
|
* @apiName Creates a new row
|
||||||
|
* @apiGroup rows
|
||||||
|
* @apiPermission table write access
|
||||||
|
* @apiDescription This API will create a new row based on the supplied body. If the
|
||||||
|
* body includes an "_id" field then it will update an existing row if the field
|
||||||
|
* links to one. Please note that "_id", "_rev" and "tableId" are fields that are
|
||||||
|
* already used by Budibase tables and cannot be used for columns.
|
||||||
|
*
|
||||||
|
* @apiParam {string} tableId The ID of the table to save a row to.
|
||||||
|
*
|
||||||
|
* @apiParam (Body) {string} [_id] If the row exists already then an ID for the row must be provided.
|
||||||
|
* @apiParam (Body) {string} [_rev] If working with an existing row for an internal table its revision
|
||||||
|
* must also be provided.
|
||||||
|
* @apiParam (Body) {string} _viewId The ID of the view should be specified in the row body itself.
|
||||||
|
* @apiParam (Body) {string} tableId The ID of the table should also be specified in the row body itself.
|
||||||
|
* @apiParam (Body) {any} [any] Any field supplied in the body will be assessed to see if it matches
|
||||||
|
* a column in the specified table. All other fields will be dropped and not stored.
|
||||||
|
*
|
||||||
|
* @apiSuccess {string} _id The ID of the row that was just saved, if it was just created this
|
||||||
|
* is the rows new ID.
|
||||||
|
* @apiSuccess {string} [_rev] If saving to an internal table a revision will also be returned.
|
||||||
|
* @apiSuccess {object} body The contents of the row that was saved will be returned as well.
|
||||||
|
*/
|
||||||
export default router
|
export default router
|
||||||
|
|
Loading…
Reference in New Issue