UNPKG

@kevisual/noco

Version:

一个轻量级的 NocoDB API SDK,支持表记录操作和 Base 管理功能。

159 lines (152 loc) 3.81 kB
import { Query, Result } from './api.ts'; import { Meta } from './meta/index.ts'; /** * https://nocodb.com/docs/product-docs/developer-resources/rest-apis#v3-where-query-parameter */ export type QueryParams = { /** * fields=field1,field2 */ fields?: string | string[]; /** * sort=field1,-field2 */ sort?: string | string[]; /** * where=(field1,eq,value1)~and(field2,eq,value2) */ where?: string; offset?: number; limit?: number; viewId?: string; [key: string]: any; }; type ResultList<T = any> = { code: number; data: { list: T[]; pageInfo?: { totalRows?: number; page?: number; pageSize?: number; isFirstPage?: boolean; isLastPage?: boolean; }; } }; type Id = string | number; const stystemFields = ['nc_order', 'nc_created_by', 'nc_updated_by'] /** * @url https://nocodb.com/apis/v2/data#tag/Table-Records */ export class Record { query: Query; table: string; meta: Meta constructor({ query, table, meta }: { query: Query, table: string, meta?: Meta }) { this.query = query; this.table = table; this.meta = meta; } list<T = any>(params: QueryParams = {}): Promise<ResultList<T>> { return this.query.makeRequest(`/api/v2/tables/${this.table}/records`, { method: 'GET', params, }); } create(data: any) { return this.query.makeRequest(`/api/v2/tables/${this.table}/records`, { method: 'POST', data, }); } read(id: Id) { return this.query.makeRequest(`/api/v2/tables/${this.table}/records/${id}`, { method: 'GET', }); } update(data: { Id?: Id;[key: string]: any }) { return this.query.makeRequest(`/api/v2/tables/${this.table}/records`, { method: 'PATCH', data, }); } delete(data: { Id?: Id }) { return this.query.makeRequest(`/api/v2/tables/${this.table}/records`, { method: 'DELETE', data, }); } count() { return this.query.makeRequest(`/api/v2/tables/${this.table}/records/count`, { method: 'GET', }); } listLinks(linkFieldId: Id, Id: Id) { return this.query.makeRequest(`/api/v2/tables/${this.table}/links/${linkFieldId}/records/${Id}`, { method: 'GET', }); } updateLinks(linkFieldId: Id, Id: Id, data: any) { return this.query.makeRequest(`/api/v2/tables/${this.table}/links/${linkFieldId}/records/${Id}`, { method: 'POST', data, }); } deleteLinks(linkFieldId: Id, Id: Id) { return this.query.makeRequest(`/api/v2/tables/${this.table}/links/${linkFieldId}/records/${Id}`, { method: 'DELETE', }); } getTableMeta() { return this.meta.tables.getTableMeta(this.table); } async getTableSchema(): Promise<Result<TableSchema>> { const res = await this.getTableMeta(); if (res.code === 200) { const columns = res.data.columns; const _columns = columns.filter(col => !stystemFields.includes(col.title)).map(col => ({ id: col.id, name: col.title, type: col.uidt, required: col.rqd, primary: col.pv, options: col.colOptions, })); const schema: Schema = {}; for (const col of _columns) { schema[col.name] = { type: col.type, required: col.required, options: col.options, }; } return { code: 200, data: { columns: _columns, schema, } }; } return res as { code: number; data: { columns: any[]; schema: Schema } }; } } export type Schema<T = {}> = { [key: string]: any; } & T; export type TableSchema<T = {}> = { columns: { id: string; name: string; type: string; required: boolean; primary: boolean; options: any; }[]; schema: Schema<T>; }