docyrus-api-dev by docyrus/agent-skills
npx skills add https://github.com/docyrus/agent-skills --skill docyrus-api-dev使用 @docyrus/api-client(REST 客户端)和 @docyrus/signin(React 身份验证提供程序)与 Docyrus API 集成。通过 OAuth2 PKCE 进行身份验证,使用强大的过滤/聚合功能查询数据源,并消费 REST 端点。
import { DocyrusAuthProvider, useDocyrusAuth, useDocyrusClient, SignInButton } from '@docyrus/signin'
// 1. 包装根组件
<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. 使用钩子
function App() {
const { status, signOut } = useDocyrusAuth()
const client = useDocyrusClient() // RestApiClient | null
if (status === 'loading') return <Spinner />
if (status === 'unauthenticated') return <SignInButton />
// client 已就绪 — 进行 API 调用
const user = await client!.get('/v1/users/me')
}
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,
})
// 授权码流程
const { url } = await oauth2.getAuthorizationUrl({ scope: 'openid offline_access Users.Read' })
window.location.href = url
// 重定向后:
const tokens = await oauth2.handleCallback(window.location.href)
// 创建带自动刷新的 API 客户端
const client = new RestApiClient({
baseURL: 'https://api.docyrus.com',
tokenManager: new OAuth2TokenManagerAdapter(tokenStorage, async () => {
return (await oauth2.refreshAccessToken()).accessToken
}),
})
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
GET /v1/apps/{appSlug}/data-sources/{slug}/items — 使用查询负载列出条目
GET /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — 获取单个条目
POST /v1/apps/{appSlug}/data-sources/{slug}/items — 创建条目
PATCH /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — 更新条目
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items/{id} — 删除单个条目
DELETE /v1/apps/{appSlug}/data-sources/{slug}/items — 批量删除(请求体:{ recordIds })
只有当数据源在租户中定义时,这些端点才存在。请在 GET /v1/api/openapi.json 处查看租户的 OpenAPI 规范。
GET /v1/users — 列出用户
POST /v1/users — 创建用户
GET /v1/users/me — 当前用户资料
PATCH /v1/users/me — 更新当前用户
// 使用查询负载列出条目
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,
})
// 获取单个条目
const item = await client.get('/v1/apps/base/data-sources/project/items/uuid-here', {
columns: 'name, description, status',
})
// 创建
const newItem = await client.post('/v1/apps/base/data-sources/project/items', {
name: 'New Project',
status: 'status-enum-id',
})
// 更新
await client.patch('/v1/apps/base/data-sources/project/items/uuid-here', {
name: 'Updated Name',
})
// 删除
await client.delete('/v1/apps/base/data-sources/project/items/uuid-here')
GET items 端点接受一个功能强大的查询负载:
| 功能 | 用途 |
|---|---|
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/data-source-query-guide.mdreferences/formula-design-guide-llm.mdcolumns。如果不发送,则只返回 id。count 计算使用 id 字段。对 sum、avg、min、max 使用实际的字段 slug。columns 中 — 如果 childQuery 键是 orders,则需要在 columns 中包含 orders。columns 中 — 如果公式键是 total,则需要在 columns 中包含 total。rel_{{relation_field}}/{{field}} 语法。需要详细信息时,请阅读以下文件:
references/api-client.md — 完整的 RestApiClient API、OAuth2Client(所有流程:PKCE、客户端凭证、设备代码)、令牌管理器、拦截器、错误类、SSE/流式传输、文件上传/下载、HTML 转 PDF、重试逻辑references/authentication.md — @docyrus/signin React 提供程序、useDocyrusAuth/useDocyrusClient 钩子、SignInButton、独立与 iframe 身份验证模式、环境变量、API 客户端访问模式references/data-source-query-guide.md — 最新的查询负载指南:columns、filters、orderBy、分页、calculations、formulas、child queries、pivots 以及操作符参考references/formula-design-guide-llm.md — 最新的公式设计指南,用于构建和验证 formulas 负载每周安装数
91
代码仓库
GitHub 星标数
13
首次出现
2026年2月14日
安全审计
安装于
codex90
gemini-cli88
github-copilot88
claude-code85
opencode80
amp79
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.
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')
}
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
}),
})
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/users — List users
POST /v1/users — Create user
GET /v1/users/me — Current user profile
PATCH /v1/users/me — Update current user
// 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')
The GET items endpoint accepts a powerful query payload:
| Feature | Purpose |
|---|---|
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 |
For full query and formula references, read :
references/data-source-query-guide.mdreferences/formula-design-guide-llm.mdcolumns in list/get calls. Without it, only id is returned.id field for count calculations. Use the actual field slug for sum, avg, min, max.columns — if childQuery key is orders, include in columns.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 logicreferences/authentication.md — @docyrus/signin React provider, useDocyrusAuth/useDocyrusClient hooks, SignInButton, standalone vs iframe auth modes, env vars, API client access patternreferences/data-source-query-guide.md — Up-to-date query payload guide: columns, filters, orderBy, pagination, calculations, formulas, child queries, pivots, and operator referencereferences/formula-design-guide-llm.md — Up-to-date formula design guide for building and validating formulas payloadsWeekly Installs
91
Repository
GitHub Stars
13
First Seen
Feb 14, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex90
gemini-cli88
github-copilot88
claude-code85
opencode80
amp79
lark-cli 共享规则:飞书资源操作指南与权限配置详解
39,000 周安装
Chrome CDP 命令行工具:轻量级浏览器自动化,无需 Puppeteer,支持多标签页
172 周安装
Supabase Postgres 最佳实践 - 8大优先级规则优化数据库性能与安全
175 周安装
前端设计技能:告别AI生成美学,创建独特、生产级UI界面与代码
172 周安装
ESM蛋白质语言模型:AI驱动蛋白质设计、结构预测与功能分析
176 周安装
PostgreSQL只读查询技能 - 安全连接AI助手执行数据库查询,支持SSL加密与权限控制
179 周安装
Azure Functions 最佳实践指南:独立工作进程、Node.js/Python 编程模型与反模式详解
176 周安装
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 |
orderscolumns — if formula key is total, include total in columns.rel_{{relation_field}}/{{field}} syntax.