backendless-console-sdk
Version:
Backendless Console SDK for Node.js and browser
260 lines (193 loc) • 8.12 kB
JavaScript
/* eslint-disable max-len */
import { DataTypes } from './constants/data'
import urls from './urls'
import totalRows from './utils/total-rows'
import { TABLE_DATA } from './utils/cache-tags'
import { tableRecordsReq, tableRecordsCountReq, buildRecordsSearch } from './utils/table'
import { prepareRoutes } from './utils/routes'
const RELATION_URL_SUFFIX = 'relation'
const GEO_RELATION_URL_SUFFIX = 'georelation'
const COLUMNS_URL_SUFFIX = {
[DataTypes.DATA_REF]: RELATION_URL_SUFFIX,
[DataTypes.GEO_REF] : GEO_RELATION_URL_SUFFIX
}
const isRelType = dataType => dataType === DataTypes.DATA_REF || dataType === DataTypes.GEO_REF
const tableColumnsUrl = (appId, table) => urls.tableColumns(appId, table.name)
const tableUrl = (appId, table) => `${urls.dataTables(appId)}/${encodeURI(table.name)}`
const removeRecordsUrl = (appId, table, removeAll) => `${tableUrl(appId, table)}/${removeAll ? 'all' : 'records'}`
const assignedUserRoles = appId => `${urls.security(appId)}/assignedroles`
export const dataTableFindUrl = (appId, tableName) => `${urls.dataTable(appId, tableName)}/find`
const updateRelationsUrl = (appId, table, columnName, recordId) => {
return `${urls.dataRecord(appId, table.name, recordId)}/${columnName}`
}
const removeRelationsUrl = (appId, table, columnName, recordId) => {
return `${updateRelationsUrl(appId, table, columnName, recordId)}/relations`
}
const recordsReq = (req, appId, table, query, resetCache) => {
return tableRecordsReq(req, dataTableFindUrl(appId, table.name), table, query, resetCache)
}
const recordsCountReq = (req, appId, table, query, resetCache) => {
const newQuery = { ...query }
delete newQuery.property
return tableRecordsCountReq(req, urls.dataTable(appId, table.name), table, newQuery, resetCache)
}
const getRelationColumn = (table, columnName) => {
return [...table.relations, ...table.geoRelations].find(r => r.name === columnName)
}
const routes = prepareRoutes({
tableOwnerPolicyDelayCheck: '/:appId/console/data/tables/:tableName/acl/owner-policy-delay-check',
})
export default req => ({
get(appId, query) {
return req.get(urls.dataTables(appId)).query(query)
.then(resp => ({
...resp,
tables: resp.tables.map(normalizeTable)
}))
},
create(appId, table) {
return req.post(urls.dataTables(appId), table).then(normalizeTable)
},
update(appId, table, props) {
return req.put(tableUrl(appId, table), props).then(normalizeTable)
},
remove(appId, table) {
return req.delete(tableUrl(appId, table))
},
async loadRecords(appId, table, query, ignoreCounter) {
const dataRequest = recordsReq(req, appId, table, query)
if (ignoreCounter) {
return dataRequest
}
const countRequest = totalRows(req).getViaPostFor(recordsCountReq(req, appId, table, query))
const [total, data] = await Promise.all([countRequest, dataRequest])
return {
totalRows: total,
data
}
},
exportRecords(appId, connectorId, table, query) {
const { sqlSearch, where, filterString, sortBy, props } = query
const tableName = connectorId ? `${connectorId}.${table.name}` : table.name
const search = buildRecordsSearch(table, sqlSearch, where, filterString)
const params = {
sortBy,
props,
}
if (search) {
params.where = search
}
if (Array.isArray(params.sortBy)) {
params.sortBy = params.sortBy.join(',')
}
if (Array.isArray(params.props)) {
params.props = params.props.join(',')
}
if (!params.sortBy) {
delete params.sortBy
}
if (!params.props) {
delete params.props
}
return req.post(`${urls.dataTable(appId, tableName)}/csv`, params)
},
getRecordsCount(appId, table, query, resetCache) {
return totalRows(req).getViaPostFor(recordsCountReq(req, appId, table, query, resetCache))
},
getCount(appId, table, query) {
return totalRows(req).getFor(recordsCountReq(req, appId, table, query))
},
getRecordsCountForTables(appId, tables, connectorId, resetCache) {
return req.post(`${urls.data(appId)}/tables-counters`, { tables, connectorId, resetCache })
},
getCellData(appId, tableName, recordId, columnName) {
return req.get(`${urls.dataCell(appId, tableName, recordId, columnName)}/retrieve-value`)
},
createRecord(appId, table, record) {
return req.post(urls.dataTable(appId, table.name), record).cacheTags(TABLE_DATA(table.tableId))
},
bulkCreateRecords(appId, tableName, records) {
return req.post(urls.dataTableBulkCreate(appId, tableName), records)
},
bulkUpsertRecords(appId, tableName, records) {
return req.put(urls.dataTableBulkUpsert(appId, tableName), records)
},
updateRecord(appId, table, record) {
return req.put(urls.dataRecord(appId, table.name, record.objectId), record)
},
updateImageTypeRecord(appId, table, record) {
return req.put(`${urls.dataTable(appId, table.name)}/file/${ record.columnName }/${ record.objectId }`, record.value)
},
deleteRecords(appId, table, recordIds) {
const url = removeRecordsUrl(appId, table, !recordIds)
const removeItems = recordIds && recordIds.map(objectId => ({ objectId }))
return req.delete(url, removeItems).cacheTags(TABLE_DATA(table.tableId))
},
deleteImageTypeRecord(appId, tableName, columnName, recordId) {
return req.delete(`${urls.dataTable(appId, tableName)}/file/${ columnName }/${ recordId }`)
},
updateRelations(appId, table, columnName, recordId, relationIds) {
const relationColumn = getRelationColumn(table, columnName)
return req
.put(updateRelationsUrl(appId, table, columnName, recordId), relationIds)
.cacheTags(TABLE_DATA(relationColumn.toTableId))
},
removeRelations(appId, table, columnName, recordId, relationIds) {
const relationColumn = getRelationColumn(table, columnName)
return req
.delete(removeRelationsUrl(appId, table, columnName, recordId), relationIds)
.cacheTags(TABLE_DATA(relationColumn.toTableId))
},
createColumn(appId, table, column) {
const url = tableColumnsUrl(appId, table)
const urlSuffix = COLUMNS_URL_SUFFIX[column.dataType]
return req.post(url + (urlSuffix ? `/${urlSuffix}` : ''), column).then(resp => {
return { ...resp, dataType: column.dataType }
})
},
deleteColumn(appId, table, column) {
const path = tableColumnsUrl(appId, table)
const columnName = encodeURI(column.name)
if (isRelType(column.dataType)) {
return req.delete(`${path}/${RELATION_URL_SUFFIX}/${columnName}`)
}
return req.delete(`${path}/${columnName}`)
},
updateColumn(appId, table, prevColumn, column) {
const urlSuffix = COLUMNS_URL_SUFFIX[prevColumn.dataType] || prevColumn.name
const url = tableColumnsUrl(appId, table)
return req.put(`${url}/${urlSuffix}`, column).then(resp => ({
...resp,
dataType: resp.dataType || prevColumn.dataType
}))
},
loadConfigs(appId) {
return req.get(urls.dataConfigs(appId))
},
setConfigs(appId, configs) {
return req.put(urls.dataConfigs(appId), configs)
},
loadAssignedUserRoles(appId, users) {
return req.get(assignedUserRoles(appId)).query({ users: users.join(',') })
},
updateAssignedUserRoles(appId, roles, users) {
return req.put(assignedUserRoles(appId), { roles, users })
},
loadTableOwnerPolicyDelayCheck(appId, tableName) {
return req.get(routes.tableOwnerPolicyDelayCheck(appId, tableName))
},
changeTableOwnerPolicyDelayCheck(appId, tableName, data) {
return req.put(routes.tableOwnerPolicyDelayCheck(appId, tableName), data)
},
})
const normalizeTable = table => ({
...table,
relations : table.relations && table.relations.map(normalizeDataRelationTableColumn) || [],
geoRelations: table.geoRelations && table.geoRelations.map(normalizeGEORelationTableColumn) || []
})
const normalizeDataRelationTableColumn = relation => {
return { ...relation, dataType: DataTypes.DATA_REF }
}
const normalizeGEORelationTableColumn = relation => {
return { ...relation, dataType: DataTypes.GEO_REF }
}