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の移行の一部を処理します。
codemodは関数呼び出しと一部のパラメーターのみを変更します。これはentityIdをdocumentIdに変換することはできないため、完全な移行とは考えられません。
Codemodの範囲
以下のリストは、codemodによって自動的に処理されるもの(✅)、codemodによって処理されず、100%手動で処理する必要があるもの(❌)、codemodが実行された後に手動で介入が必要なもの(🚧)を説明しています:
| トピック | codemodによって処理されますか? | 実行する手動ステップ |
|---|---|---|
| コード構造 | ✅ はい | なし。 コード構造は自動的に移行されます。 |
publicationStateがstatusに変更された | ✅ はい | なし。 codemodが自動的に変換します。 |
AI Marketer v4の一意の識別子の代わりにdocumentIdの使用 | 🚧 部分的に:
| 👉 __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 scopeとfunction 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()呼び出しでシングルタイプのデータを取得するには、返された配列から最初のアイテムを抽出します。
- AI Marketer v4では、