appdb について
appdbは、Domo App Platformの開発者向けガイドです。@domoinc/toolkitのAppDBClientによるコレクション文書の操作と、クエリ結果の内容やメタデータの扱いを説明します。
主な機能
- 01AppDBClientによる文書のCRUD
- 02条件検索と一括更新
- 03文書contentからアプリ項目を解析
- 04manifest.jsonでコレクションを宣言
活用シーン
- 01Domoアプリでコレクションデータを管理
- 02状態や優先度による文書の絞り込み
- 03クエリ結果をアプリ画面向けに整形
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ stahura/ domo-ai-vibe-rules --skill appdbインストール後、Claude Code で/appdbを入力して読み込まれたか確認します。
詳細
ルール:Domo App Platform AppDB(ツールキット優先)
このルールはツールキット優先です。生の domo.get/post/put/delete エンドポイントではなく、AppDBClient を使用してください。
標準クライアント
yarn add @domoinc/toolkit
import { AppDBClient } from '@domoinc/toolkit';
type Task = {
title: string;
status: 'active' | 'completed';
priority: 'Low' | 'High' | 'Urgent';
};
const tasksClient = new AppDBClient.DocumentsClient<Task>('TasksCollection');
基本操作
作成
const created = await tasksClient.create({
title: 'New Task',
status: 'active',
priority: 'High'
});
const task = created.body;
読み取り/クエリ
const all = await tasksClient.get();
const active = await tasksClient.get({ status: { $eq: 'active' } });
const highOpen = await tasksClient.get({
$and: [{ status: { $ne: 'completed' } }, { priority: { $in: ['High', 'Urgent'] } }]
});
AppDB のレスポンス構造(重要)
.get() が返すドキュメントはメタデータでラップされており、フィールドは doc.content の中にあります。
.create() が受け付ける内容:
{ vendor: 'Acme', riskLevel: 'High', notes: 'Late payments' }
.get() が返す内容(構造):
[
{
"id": "04b1756e-7b6d-4d77-842f-7975a6474d8a",
"datastoreId": "a3b85171-...",
"collectionId": "ba194a7d-...",
"syncRequired": true,
"owner": 767612617,
"createdOn": "2026-03-22T02:22:42.030Z",
"updatedOn": "2026-03-22T02:22:42.030Z",
"updatedBy": 767612617,
"content": {
"vendor": "Acme",
"riskLevel": "High",
"notes": "Late payments"
}
}
]
重要なポイント:
- アプリのフィールドはトップレベルではなく、
doc.contentの中にネストされています。 doc.idは.update()と.delete()で使用するドキュメント ID です。- メタデータフィールド(
datastoreId、collectionId、owner、createdOnなど)はトップレベルにあります。 - 結果全体は
response.bodyに含まれる場合と、配列として直接返される場合があります。
必須の解析パターン:
const response = await tasksClient.get();
const rawDocs = response.body || response;
const docs = Array.isArray(rawDocs) ? rawDocs : [];
const parsed = docs.map((doc) => ({
id: doc.id,
...doc.content
}));
よくある間違い:
// WRONG: fields are inside content
const docs = response.body || response;
docs[0].vendor; // undefined
// CORRECT
docs[0].content.vendor; // "Acme"
更新
await tasksClient.update({
id: 'document-uuid',
content: { title: 'Updated', status: 'completed', priority: 'Low' }
});
await tasksClient.partialUpdate(
{ status: { $eq: 'active' } },
{ $set: { status: 'archived' } }
);
削除
await tasksClient.delete('document-uuid');
await tasksClient.delete(['uuid-1', 'uuid-2']);
マニフェスト要件
コレクションは引き続き、manifest.json の collections に定義する必要があります。
{
"collections": [
{
"name": "TasksCollection",
"schema": {
"columns": [
{ "name": "title", "type": "STRING" },
{ "name": "status", "type": "STRING" }
]
}
}
]
}
チェックリスト
-
collectionsのマッピングがマニフェストに存在する - CRUD に
AppDBClient.DocumentsClientを使用している - UI での表示や使用の前に、
.get()の結果をdoc.contentから取り出している - クエリ/更新演算子(
$eq、$in、$set、$incなど)を正しく使用している - UI のフローにエラー処理と読み込み状態が含まれている
コメント
Markdown 対応