docyrus-api-dev

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Docyrus API Developer

Docyrus API 开发者指南

Integrate with the Docyrus API using
@docyrus/api-client
(REST client) and
@docyrus/signin
(React auth provider). Authenticate via OAuth2 PKCE, query data sources with powerful filtering/aggregation, and consume REST endpoints.
使用
@docyrus/api-client
(REST客户端)和
@docyrus/signin
(React认证提供者)与Docyrus API集成。通过OAuth2 PKCE进行认证,使用强大的筛选/聚合功能查询数据源,并调用REST端点。

Authentication Quick Start

认证快速入门

React Apps — Use @docyrus/signin

React 应用 — 使用@docyrus/signin

tsx
import { DocyrusAuthProvider, useDocyrusAuth, useDocyrusClient, SignInButton } from '@docyrus/signin'

// 1. Wrap root
<DocyrusAuthProvider
  apiUrl={import.meta.env.VITE_API_BASE_URL}
  clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
  redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
  scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
  callbackPath="/auth/callback"
>
  <App />
</DocyrusAuthProvider>

// 2. Use hooks
function App() {
  const { status, signOut } = useDocyrusAuth()
  const client = useDocyrusClient()  // RestApiClient | null

  if (status === 'loading') return <Spinner />
  if (status === 'unauthenticated') return <SignInButton />

  // client is ready — make API calls
  const user = await client!.get('/v1/users/me')
}
tsx
import { DocyrusAuthProvider, useDocyrusAuth, useDocyrusClient, SignInButton } from '@docyrus/signin'

// 1. Wrap root
<DocyrusAuthProvider
  apiUrl={import.meta.env.VITE_API_BASE_URL}
  clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
  redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
  scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
  callbackPath="/auth/callback"
>
  <App />
</DocyrusAuthProvider>

// 2. Use hooks
function App() {
  const { status, signOut } = useDocyrusAuth()
  const client = useDocyrusClient()  // RestApiClient | null

  if (status === 'loading') return <Spinner />
  if (status === 'unauthenticated') return <SignInButton />

  // client is ready — make API calls
  const user = await client!.get('/v1/users/me')
}

Non-React / Server — Use OAuth2Client Directly

非React / 服务端 — 直接使用OAuth2Client

typescript
import { RestApiClient, OAuth2Client, OAuth2TokenManagerAdapter, BrowserOAuth2TokenStorage } from '@docyrus/api-client'

const tokenStorage = new BrowserOAuth2TokenStorage(localStorage)
const oauth2 = new OAuth2Client({
  baseURL: 'https://api.docyrus.com',
  clientId: 'your-client-id',
  redirectUri: 'http://localhost:3000/callback',
  usePKCE: true,
  tokenStorage,
})

// Auth Code flow
const { url } = await oauth2.getAuthorizationUrl({ scope: 'openid offline_access Users.Read' })
window.location.href = url
// After redirect:
const tokens = await oauth2.handleCallback(window.location.href)

// Create API client with auto-refresh
const client = new RestApiClient({
  baseURL: 'https://api.docyrus.com',
  tokenManager: new OAuth2TokenManagerAdapter(tokenStorage, async () => {
    return (await oauth2.refreshAccessToken()).accessToken
  }),
})
typescript
import { RestApiClient, OAuth2Client, OAuth2TokenManagerAdapter, BrowserOAuth2TokenStorage } from '@docyrus/api-client'

const tokenStorage = new BrowserOAuth2TokenStorage(localStorage)
const oauth2 = new OAuth2Client({
  baseURL: 'https://api.docyrus.com',
  clientId: 'your-client-id',
  redirectUri: 'http://localhost:3000/callback',
  usePKCE: true,
  tokenStorage,
})

// Auth Code flow
const { url } = await oauth2.getAuthorizationUrl({ scope: 'openid offline_access Users.Read' })
window.location.href = url
// After redirect:
const tokens = await oauth2.handleCallback(window.location.href)

// Create API client with auto-refresh
const client = new RestApiClient({
  baseURL: 'https://api.docyrus.com',
  tokenManager: new OAuth2TokenManagerAdapter(tokenStorage, async () => {
    return (await oauth2.refreshAccessToken()).accessToken
  }),
})

API Endpoints

API 端点

Data Source Items (Dynamic per tenant)

数据源项(按租户动态生成)

GET    /v1/apps/{appSlug}/data-sources/{slug}/items          — List with query payload
GET    /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Get one
POST   /v1/apps/{appSlug}/data-sources/{slug}/items          — Create
PATCH  /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Update
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Delete one
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items          — Delete many (body: { recordIds })
Endpoints exist only if the data source is defined in the tenant. Check the tenant's OpenAPI spec at
GET /v1/api/openapi.json
.
GET    /v1/apps/{appSlug}/data-sources/{slug}/items          — List with query payload
GET    /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Get one
POST   /v1/apps/{appSlug}/data-sources/{slug}/items          — Create
PATCH  /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Update
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items/{id}     — Delete one
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items          — Delete many (body: { recordIds })
仅当租户中定义了对应数据源时,这些端点才会存在。可通过
GET /v1/api/openapi.json
查看租户的OpenAPI规范。

System Endpoints (Always Available)

系统端点(始终可用)

GET    /v1/users          — List users
POST   /v1/users          — Create user
GET    /v1/users/me       — Current user profile
PATCH  /v1/users/me       — Update current user
GET    /v1/users          — List users
POST   /v1/users          — Create user
GET    /v1/users/me       — Current user profile
PATCH  /v1/users/me       — Update current user

Making API Calls

调用API

typescript
// List items with query payload
const items = await client.get('/v1/apps/base/data-sources/project/items', {
  columns: 'name, status, record_owner(firstname,lastname)',
  filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
  orderBy: 'created_on DESC',
  limit: 50,
})

// Get single item
const item = await client.get('/v1/apps/base/data-sources/project/items/uuid-here', {
  columns: 'name, description, status',
})

// Create
const newItem = await client.post('/v1/apps/base/data-sources/project/items', {
  name: 'New Project',
  status: 'status-enum-id',
})

// Update
await client.patch('/v1/apps/base/data-sources/project/items/uuid-here', {
  name: 'Updated Name',
})

// Delete
await client.delete('/v1/apps/base/data-sources/project/items/uuid-here')
typescript
// List items with query payload
const items = await client.get('/v1/apps/base/data-sources/project/items', {
  columns: 'name, status, record_owner(firstname,lastname)',
  filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
  orderBy: 'created_on DESC',
  limit: 50,
})

// Get single item
const item = await client.get('/v1/apps/base/data-sources/project/items/uuid-here', {
  columns: 'name, description, status',
})

// Create
const newItem = await client.post('/v1/apps/base/data-sources/project/items', {
  name: 'New Project',
  status: 'status-enum-id',
})

// Update
await client.patch('/v1/apps/base/data-sources/project/items/uuid-here', {
  name: 'Updated Name',
})

// Delete
await client.delete('/v1/apps/base/data-sources/project/items/uuid-here')

Query Payload Summary

查询负载概览

The GET items endpoint accepts a powerful query payload:
FeaturePurpose
columns
Select fields, expand relations
field(subfields)
, alias
alias:field
, spread
...field()
filters
Nested AND/OR groups with 50+ operators (comparison, date shortcuts, user-related)
filterKeyword
Full-text search across all searchable fields
orderBy
Sort by fields with direction, including related fields
limit
/
offset
Pagination (default limit: 100)
fullCount
Return total matching count alongside results
calculations
Aggregations: count, sum, avg, min, max with grouping
formulas
Computed virtual columns (simple functions, block AST, correlated subqueries)
childQueries
Fetch related child records as nested JSON arrays
pivot
Cross-tab matrix queries with date range series
expand
Return full objects for relation/user/enum fields instead of IDs
For full query reference, read:
references/query-and-formulas.md
GET 项端点支持功能强大的查询负载:
功能用途
columns
选择字段、展开关联关系
field(subfields)
、设置别名
alias:field
、展开字段
...field()
filters
嵌套的AND/OR分组,支持50+种运算符(比较、日期快捷方式、用户相关)
filterKeyword
在所有可搜索字段中进行全文搜索
orderBy
按字段及方向排序,包括关联字段
limit
/
offset
分页(默认限制:100)
fullCount
在返回结果的同时返回匹配的总数量
calculations
聚合操作:计数、求和、平均值、最小值、最大值及分组
formulas
计算虚拟列(简单函数、块AST、关联子查询)
childQueries
获取相关的子记录并以嵌套JSON数组形式返回
pivot
带日期范围序列的交叉表矩阵查询
expand
返回关联/用户/枚举字段的完整对象而非ID
完整查询参考,请阅读
references/query-and-formulas.md

Critical Rules

重要规则

  1. Always send
    columns
    in list/get calls. Without it, only
    id
    is returned.
  2. Data source endpoints are dynamic — they exist only for data sources defined in the tenant.
  3. Use
    id
    field
    for
    count
    calculations. Use the actual field slug for
    sum
    ,
    avg
    ,
    min
    ,
    max
    .
  4. Child query keys must appear in
    columns
    — if childQuery key is
    orders
    , include
    orders
    in columns.
  5. Formula keys must appear in
    columns
    — if formula key is
    total
    , include
    total
    in columns.
  6. Filter by related field using
    rel_{{relation_field}}/{{field}}
    syntax.
  1. 始终在列表/获取调用中传入
    columns
    。如果不传入,将仅返回
    id
    字段。
  2. 数据源端点是动态的 —— 仅当租户中定义了对应数据源时才存在。
  3. 使用
    id
    字段进行
    count
    计算
    。使用实际字段别名进行
    sum
    avg
    min
    max
    计算。
  4. 子查询键必须出现在
    columns
    —— 如果子查询键为
    orders
    ,需在columns中包含
    orders
  5. 公式键必须出现在
    columns
    —— 如果公式键为
    total
    ,需在columns中包含
    total
  6. 按关联字段筛选 使用
    rel_{{relation_field}}/{{field}}
    语法。

References

参考文档

Read these files when you need detailed information:
  • references/api-client.md
    — Full RestApiClient API, OAuth2Client (all flows: PKCE, client credentials, device code), token managers, interceptors, error classes, SSE/streaming, file upload/download, HTML to PDF, retry logic
  • references/authentication.md
    — @docyrus/signin React provider, useDocyrusAuth/useDocyrusClient hooks, SignInButton, standalone vs iframe auth modes, env vars, module-level API client pattern
  • references/query-and-formulas.md
    — Complete query payload reference: column syntax, all 50+ filter operators, aggregations, simple formulas, block (AST) formulas with all block kinds, subquery formulas, child queries, pivot tables, expand, allowed SQL functions, cast types, full examples
需要详细信息时,请阅读以下文件:
  • references/api-client.md
    —— 完整的RestApiClient API、OAuth2Client(所有流程:PKCE、客户端凭证、设备码)、令牌管理器、拦截器、错误类、SSE/流、文件上传/下载、HTML转PDF、重试逻辑
  • references/authentication.md
    —— @docyrus/signin React提供者、useDocyrusAuth/useDocyrusClient钩子、SignInButton、独立模式与iframe认证模式、环境变量、模块级API客户端模式
  • references/query-and-formulas.md
    —— 完整的查询负载参考:列语法、所有50+种筛选运算符、聚合、简单公式、所有块类型的块(AST)公式、子查询公式、子查询、数据透视表、展开、允许的SQL函数、类型转换、完整示例