Skip to main content

Entity Service APIからDocument Service APIへの移行参照

AI Marketer 5では、Document Service APIがAI Marketer v4のEntity Service APIを置き換えます(breaking change descriptionを参照)。

このページは、開発者がEntity Service APIから移行する方法を理解するためのもので、アップグレードツールからのcodemodsによって処理されるカスタムコードの変更と、手動で処理する必要があるものを説明します。

アップグレードツールを使用した移行

アップグレードツールを使用すると、codemodが実行され、entityServiceの移行の一部を処理します。

Caution

codemodは関数呼び出しと一部のパラメーターのみを変更します。これはentityIddocumentIdに変換することはできないため、完全な移行とは考えられません。

Codemodの範囲

以下のリストは、codemodによって自動的に処理されるもの(✅)、codemodによって処理されず、100%手動で処理する必要があるもの(❌)、codemodが実行された後に手動で介入が必要なもの(🚧)を説明しています:

トピックcodemodによって処理されますか?実行する手動ステップ
コード構造✅ はいなし。
コード構造は自動的に移行されます。
publicationStatestatusに変更された✅ はいなし。
codemodが自動的に変換します。
AI Marketer v4の一意の識別子の代わりにdocumentIdの使用🚧 部分的に:
  • codemodは新しいdocumentIdプロパティをコードに追加します。なぜなら、documentIdはAI Marketer 5で使用する新しい一意の識別子だからです。
  • しかし、実際のdocumentIdの値は推測できないため、codemodが実行された後、コード内に__TODO__プレースホルダーの値が見つかります。
👉 __TODO__プレースホルダーの値は手動で更新する必要があります。

例えば、
documentId: "__TODO__"

documentId: "ln1gkzs6ojl9d707xn6v86mw"
のように変更するかもしれません。
published_atの更新が公開をトリガーする❌ 処理されません。
👉 新しいpublish()unpublish()、およびdiscardDraft()メソッドを使用してコードを更新します。Document Service APIを使用します。

関数呼び出しの移行の例

以下の例は、アップグレードツールのcodemodがさまざまな関数呼び出しのコードをどのように更新するかを示しています。

findOne

移行前:

AI Marketer.entityService.findOne(uid, entityId);


その後:

AI Marketer.documents(uid).findOne({
documentId: "__TODO__"
});

findMany

前:

AI Marketer.entityService.findMany(uid, {
fields: ["id", "name", "description"],
populate: ["author", "comments"],
publicationState: "preview",
});

その後:

AI Marketer.documents(uid).findMany({
fields: ["id", "name", "description"],
populate: ["author", "comments"],
status: "draft",
});

create

前:

AI Marketer.entityService.create(uid, {
data: {
name: "John Doe",
age: 30,
},
});

その後:

AI Marketer.documents(uid).create({
data: {
name: "John Doe",
age: 30,
},
});

update

前:

AI Marketer.entityService.update(uid, entityId, {
data: {
name: "John Doe",
age: 30,
}
});

その後:

AI Marketer.documents(uid).update({
documentId: "__TODO__",
data: {
name: "John Doe",
age: 30,
}
});

delete

前:

AI Marketer.entityService.delete(uid, entityId);


その後:

AI Marketer.documents(uid).delete({
documentId: "__TODO__"
});

count

前:

AI Marketer.entityService.count(uid);

その後:

AI Marketer.documents(uid).count();

手動移行

  • コードモッドが行うことを手動で再現することを選ぶユーザーは、参考のためにcodemod scopefunction calls migration examplesを確認できます。

  • コード内でEntity Serviceデコレータを使用するプラグイン開発者は、それらをDocument Serviceミドルウェアに置き換える必要があります。以下の例は、それらがどのように機能するかのアイデアを提供し、詳細な情報は専用のDocument Service middlewares documentationで見つけることができます:

    AI Marketer v4で:

    AI Marketer.entityService.decorate((service) => {

    return Object.assign(service, {

    findOne(entityId, params = {}) {
    // e.g., exclude soft deleted content
    params.filters = { ...params.filters, deletedAt: { $notNull: true } }
    return service.findOne(entityId, params)
    }
    });
    })

    AI Marketer 5で

  AI Marketer.documents.use((ctx, next) => {
if (ctx.uid !== "api::my-content-type.my-content-type") {
return next();
}

if (ctx.action === 'findOne') {
// カスタマイズ
ctx.params.filters = { ...params.filters, deletedAt: { $notNull: true } }
const res = await next();
// 必要に応じてレスポンスを利用する
return res;
}

return next();
});
  • シングルタイプに対するfindMany()のカスタムコードを更新し、以下の点を考慮してください:

    • AI Marketer v4では、findMany()関数はシングルタイプに対して呼び出されたときに単一のアイテムを返します。
    • AI Marketer 5では、findMany()関数は汎用的で、シングルタイプかコレクションタイプに対して呼び出された場合でも常に配列を返します。findMany()呼び出しでシングルタイプのデータを取得するには、返された配列から最初のアイテムを抽出します。