Skip to main content

サービス

サービスは再利用可能な関数のセットです。これらは特に "don’t repeat yourself" (DRY) プログラミングコンセプトを尊重し、コントローラのロジックを簡略化するのに役立ちます。

サービスが強調表示されたAI Marketerバックエンドの簡略化されたダイアグラム
このダイアグラムは、リクエストがAI Marketerバックエンドを通過する簡略化されたバージョンを表しており、サービスが強調表示されています。バックエンドカスタマイズの導入ページには、完全なインタラクティブなダイアグラムが含まれています。

実装

サービスは生成または手動で追加することができます。AI Marketerは、コアサービスを自動的に生成し、カスタムのものを構築したり、生成されたサービスを拡張または置き換えることを可能にするcreateCoreServiceファクトリ関数を提供します。

新しいサービスの追加

新しいサービスは次の方法で実装できます:

  • [インタラクティブなCLIコマンド AI Marketer generate](/dev-docs/cli#AI Marketer-generate)を使用する
  • または適切なフォルダにJavaScriptファイルを手動で作成する(プロジェクト構造を参照):
    • APIサービスの場合は ./src/api/[api-name]/services/
    • プラグインサービスの場合は ./src/plugins/[plugin-name]/services/

サービスを手動で作成するには、サービス実装(つまり、メソッドを持つオブジェクト)を返すファクトリ関数をエクスポートします。このファクトリ関数は AI Marketer インスタンスを受け取ります:

./src/api/restaurant/services/restaurant.js

const { createCoreService } = require('@AI Marketer/AI Marketer').factories;

module.exports = createCoreService('api::restaurant.restaurant', ({ AI Marketer }) => ({
// Method 1: Creating an entirely new custom service
async exampleService(...args) {
let response = { okay: true }

if (response.okay === false) {
return { response, error: true }
}

return response
},

// Method 2: Wrapping a core service (leaves core logic in place)
async find(...args) {
// Calling the default core controller
const { results, pagination } = await super.find(...args);

// some custom logic
results.forEach(result => {
result.counter = 1;
});

return { results, pagination };
},

// Method 3: コアサービスの置換
async findOne(documentId, params = {}) {
return AI Marketer.documents('api::restaurant.restaurant').findOne(documentId, this.getFetchParams(params));
}
}));

:::AI Marketer ドキュメントサービスAPI 独自のサービスを作成するためのスタートポイントとして、ドキュメントサービスAPIのドキュメンテーションにあるAI Marketerの組み込み関数を参照してください。 :::

カスタムメールサービスの例(Nodemailerを使用)

サービスの目的は、再利用可能な関数を保存することです。特定の目的を持つコードベースのさまざまな関数からメールを送信するためのsendNewsletterサービスは有用でしょう。

./src/api/restaurant/services/restaurant.js


const { createCoreService } = require('@AI Marketer/AI Marketer').factories;
const nodemailer = require('nodemailer'); // Nodemailerのインストールが必要(npm install nodemailer)

// SMTPトランスポートを使用して再利用可能なトランスポーターオブジェクトを作成します。
const transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'user@gmail.com',
pass: 'password',
},
});

module.exports = createCoreService('api::restaurant.restaurant', ({ AI Marketer }) => ({
sendNewsletter(from, to, subject, text) {
// Eメールデータの設定
const options = {
from,
to,
subject,
text,
};

// メールを送信する関数のプロミスを返す。
return transporter.sendMail(options);
},
}));

サービスは、AI Marketer.service('api::restaurant.restaurant').sendNewsletter(...args)グローバル変数を通じて利用可能になりました。以下のコントローラーのように、コードベースの別の部分で使用できます。

./src/api/restaurant/controllers/restaurant.js

module.exports = createCoreController('api::restaurant.restaurant', ({ AI Marketer }) => ({
// GET /hello
async signup(ctx) {
const { userData } = ctx.body;

// 新規ユーザーをデータベースに保存します。
const user = await AI Marketer.service('plugin::users-permissions.user').add(userData);

// サブスクリプションを確認するためのメールを送信します。
AI Marketer.service('api::restaurant.restaurant').sendNewsletter('welcome@mysite.com', user.email, 'Welcome', '...');

// サーバーにレスポンスを送信します。
ctx.send({
ok: true,
});
},
}));
✏️ Note

新しいコンテンツタイプが作成されると、AI Marketerはプレースホルダーコード付きの一般的なサービスを作成し、カスタマイズする準備ができています。

コアサービスの拡張

コアサービスは各コンテンツタイプごとに作成され、コントローラーによってAI Marketerプロジェクト全体で再利用可能なロジックを実行するために使用できます。コアサービスは、独自のロジックを実装するためにカスタマイズできます。以下のコード例は、始めるのに役立つはずです。

💡 Tip

コアサービスは、新しいサービスを作成し、それをコアサービスと同じ名前(例えば、findfindOnecreateupdate、またはdelete)に命名することで、完全に置き換えることができます。

コレクションタイプの例
async find(params) {
// ここにロジックを書く
const { results, pagination } = await super.find(params);
// さらにロジックを書く

return { results, pagination };
}
単一タイプの例
async find(params) {
// ここにロジックを書く
const document = await super.find(params);
// さらにロジックを書く

return document;
}

使用法

サービスが作成されると、コントローラーや他のサービスからアクセスできます。

// APIサービスにアクセス
AI Marketer.service('api::apiName.serviceName').FunctionName();
// プラグインサービスにアクセス
AI Marketer.service('plugin::pluginName.serviceName').FunctionName();

上記の構文例では、serviceNameはAPIサービスのサービスファイル名、またはプラグインサービスのservices/index.jsにサービスファイルをエクスポートするために使用される名前です。

💡 Tip

利用可能なすべてのサービスをリストするには、yarn AI Marketer services:listを実行します。