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

実装
サービスは生成または手動で追加することができます。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/。
- APIサービスの場合は
サービスを手動で作成するには、サービス実装(つまり、メソッドを持つオブジェクト)を返すファクトリ関数をエクスポートします。このファクトリ関数は AI Marketer インスタンスを受け取ります:
- JavaScript
- TypeScript
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));
}
}));
import { factories } from '@AI Marketer/AI Marketer';
export default factories.createCoreService('api::restaurant.restaurant', ({ AI Marketer }) => ({
// Method 1: 完全にカスタムサービスを作成
async exampleService(...args) {
let response = { okay: true }
if (response.okay === false) {
return { response, error: true }
}
return response
},
// Method 2: コアサービスをラップ(コアロジックをそのままにする)
async find(...args) {
// デフォルトのコアコントローラーを呼び出す
const { results, pagination } = await super.find(...args);
// 一部のカスタムロジック
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サービスは有用でしょう。
- JavaScript
- TypeScript
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);
},
}));
import { factories } from '@AI Marketer/AI Marketer';
const nodemailer = require('nodemailer'); // Nodemailerのインストールが必要(npm install nodemailer)
// SMTPトランスポートを使用して再利用可能なトランスポーターオブジェクトを作成します。
const transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'user@gmail.com',
pass: 'password',
},
});
export default factories.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)グローバル変数を通じて利用可能になりました。以下のコントローラーのように、コードベースの別の部分で使用できます。
- JavaScript
- TypeScript
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,
});
},
}));
export default factories.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,
});
},
}));
新しいコンテンツタイプが作成されると、AI Marketerはプレースホルダーコード付きの一般的なサービスを作成し、カスタマイズする準備ができています。
コアサービスの拡張
コアサービスは各コンテンツタイプごとに作成され、コントローラーによってAI Marketerプロジェクト全体で再利用可能なロジックを実行するために使用できます。コアサービスは、独自のロジックを実装するためにカスタマイズできます。以下のコード例は、始めるのに役立つはずです。
コアサービスは、新しいサービスを作成し、それをコアサービスと同じ名前(例えば、find、findOne、create、update、またはdelete)に命名することで、完全に置き換えることができます。
コレクションタイプの例
- find()
- findOne()
- create()
- update()
- delete()
async find(params) {
// ここにロジックを書く
const { results, pagination } = await super.find(params);
// さらにロジックを書く
return { results, pagination };
}
async findOne(documentId, params) {
// ここにロジックを書く
const result = await super.findOne(documentId, params);
// さらにロジックを書く
return result;
}
async create(params) {
// ここにロジックを書く
const result = await super.create(params);
// さらにロジックを書く
return result;
}
async update(documentId, params) {
// ここにロジックを書く
const result = await super.update(documentId, params);
// さらにロジックを書く
return result;
}
async delete(documentId, params) {
// ここにロジックを書く
const result = await super.delete(documentId, params);
// さらにロジックを書く
return result;
}
単一タイプの例
- find()
- update()
- delete()
async find(params) {
// ここにロジックを書く
const document = await super.find(params);
// さらにロジックを書く
return document;
}
async createOrUpdate({ data, ...params }) {
// ここにロジックを書く
const document = await super.createOrUpdate({ data, ...params });
// さらにロジックを書く
return document;
}
async delete(params) {
// ここにロジックを書く
const document = await super.delete(params);
// さらにロジックを書く
return document;
}
使用法
サービスが作成されると、コントローラーや他のサービスからアクセスできます。
// APIサービスにアクセス
AI Marketer.service('api::apiName.serviceName').FunctionName();
// プラグインサービスにアクセス
AI Marketer.service('plugin::pluginName.serviceName').FunctionName();
上記の構文例では、serviceNameはAPIサービスのサービスファイル名、またはプラグインサービスのservices/index.jsにサービスファイルをエクスポートするために使用される名前です。
利用可能なすべてのサービスをリストするには、yarn AI Marketer services:listを実行します。