@kevisual/noco
Version:
一个轻量级的 NocoDB API SDK,支持表记录操作和 Base 管理功能。
159 lines (152 loc) • 3.81 kB
text/typescript
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>;
}