Tip

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

ResourceManager リソース管理

NocoBase のリソース管理機能は、既存のコレクションや関連(association)を自動的にリソースへ変換します。これにより、開発者は組み込みの様々な操作タイプを活用して、REST API のリソース操作を素早く構築できます。従来の REST API とは少し異なり、NocoBase のリソース操作は HTTP リクエストメソッドに依存しません。代わりに、明示的に :action を定義することで、実行する具体的な操作を決定します。

リソースの自動生成

NocoBase は、データベースで定義された collectionassociation を自動的にリソースへ変換します。例えば、poststags という2つのコレクションを定義した場合、以下のようになります。

db.defineCollection({
  name: 'posts',
  fields: [
    { type: 'belongsToMany', name: 'tags' },
  ],
});

db.defineCollection({
  name: 'tags',
  fields: [],
});

これによって、以下のリソースが自動的に生成されます。

  • posts リソース
  • tags リソース
  • posts.tags 関連リソース

リクエスト例:

リクエスト方式パス操作
GET/api/posts:listリストのクエリ
GET/api/posts:get/1単一レコードのクエリ
POST/api/posts:create新規追加
POST/api/posts:update/1更新
POST/api/posts:destroy/1削除
リクエスト方式パス操作
GET/api/tags:listリストのクエリ
GET/api/tags:get/1単一レコードのクエリ
POST/api/tags:create新規追加
POST/api/tags:update/1更新
POST/api/tags:destroy/1削除
リクエスト方式パス操作
GET/api/posts/1/tags:list特定の post に関連するすべての tags をクエリ
GET/api/posts/1/tags:get/1特定の post に紐づく単一の tags をクエリ
POST/api/posts/1/tags:create特定の post に紐づく単一の tags を新規追加
POST/api/posts/1/tags:update/1特定の post に紐づく単一の tags を更新
POST/api/posts/1/tags:destroy/1特定の post に紐づく単一の tags を削除
POST/api/posts/1/tags:add特定の post に関連する tags を追加
POST/api/posts/1/tags:remove特定の post から関連する tags を削除
POST/api/posts/1/tags:set特定の post のすべての関連 tags を設定
POST/api/posts/1/tags:toggle特定の posttags 関連をトグル
ヒント

NocoBase のリソース操作は、リクエストメソッドに直接依存せず、明示的に :action を定義することで実行する操作を決定します。

リソース操作

NocoBase は、様々なビジネス要件に対応できるよう、豊富な組み込み操作タイプを提供しています。

基本的な CRUD 操作

操作名説明適用リソースタイプリクエスト方式示例パス
listリストデータをクエリすべてのリソースGET/POST/api/posts:list
get単一データをクエリすべてのリソースGET/POST/api/posts:get/1
create新規レコードを作成すべてのリソースPOST/api/posts:create
updateレコードを更新すべてのリソースPOST/api/posts:update/1
destroyレコードを削除すべてのリソースPOST/api/posts:destroy/1
firstOrCreate最初のレコードを検索し、存在しない場合は作成すべてのリソースPOST/api/users:firstOrCreate
updateOrCreateレコードを更新し、存在しない場合は作成すべてのリソースPOST/api/users:updateOrCreate

関連操作

操作名説明適用関連タイプ示例パス
add関連を追加hasMany, belongsToMany/api/posts/1/tags:add
remove関連を削除hasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
set関連をリセットhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggle関連を追加または削除belongsToMany/api/posts/1/tags:toggle

操作パラメータ

一般的な操作パラメータには以下が含まれます。

  • filter:クエリ条件
  • values:設定する値
  • fields:返されるフィールドを指定
  • appends:関連データを含める
  • except:フィールドを除外
  • sort:ソート順
  • pagepageSize:ページネーションパラメータ
  • paginate:ページネーションを有効にするか
  • tree:ツリー構造で返すか
  • whitelistblacklist:フィールドのホワイトリスト/ブラックリスト
  • updateAssociationValues:関連値を更新するか

カスタムリソース操作

NocoBase では、既存のリソースに追加の操作を登録できます。registerActionHandlers を使用して、すべてのリソースまたは特定のリソースに対して操作をカスタマイズできます。

グローバル操作の登録

resourceManager.registerActionHandlers({
  customAction: async (ctx) => {
    ctx.body = { resource: ctx.action.resourceName };
  },
});

特定リソースの操作の登録

resourceManager.registerActionHandlers({
  'posts:publish': async (ctx) => publishPost(ctx),
  'posts.comments:pin': async (ctx) => pinComment(ctx),
});

リクエスト例:

POST /api/posts:customAction
POST /api/posts:publish
POST /api/posts/1/comments:pin

命名規則は resourceName:actionName です。関連を含む場合はドット記法(posts.comments)を使用します。

カスタムリソース

コレクションとは関係のないリソースを提供したい場合は、resourceManager.define メソッドを使用して定義できます。

resourceManager.define({
  name: 'app',
  actions: {
    getInfo: async (ctx) => {
      ctx.body = { version: 'v1' };
    },
  },
});

リクエスト方式は、自動生成されるリソースと同じです。

  • GET /api/app:getInfo
  • POST /api/app:getInfo(デフォルトで GET/POST の両方をサポートしています)

カスタムミドルウェア

resourceManager.use() メソッドを使用して、グローバルミドルウェアを登録できます。例えば、以下のようなグローバルロギングミドルウェアを定義できます。

resourceManager.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const duration = Date.now() - start;
  console.log(`${ctx.method} ${ctx.path} - ${duration}ms`);
});

特有の Context プロパティ

resourceManager レイヤーのミドルウェアやアクションに入ることができるということは、そのリソースが必ず存在することを意味します。

ctx.action

  • ctx.action.actionName:操作名
  • ctx.action.resourceNameコレクションまたは関連(association)である可能性があります
  • ctx.action.params:操作パラメータ

ctx.dataSource

現在のデータソースオブジェクトです。

ctx.getCurrentRepository()

現在のリポジトリオブジェクトです。

異なるデータソースの resourceManager オブジェクトを取得する方法

resourceManagerデータソースに属しており、異なるデータソースに対して個別に操作を登録できます。

メインデータソース

メインデータソースの場合、app.resourceManager を直接使用して操作できます。

app.resourceManager.registerActionHandlers();

その他のデータソース

その他のデータソースの場合、dataSourceManager を介して特定のデータソースインスタンスを取得し、そのインスタンスの resourceManager を使用して操作できます。

const dataSource = dataSourceManager.get('external');
dataSource.resourceManager.registerActionHandlers();

すべてのデータソースを反復処理する

追加されたすべてのデータソースに対して同じ操作を実行する必要がある場合は、dataSourceManager.afterAddDataSource メソッドを使用して反復処理し、各データソースresourceManager が対応する操作を登録できるようにします。

dataSourceManager.afterAddDataSource((dataSource) => {
  dataSource.resourceManager.registerActionHandlers();
});