Requestに適正な値が入ってなかったら400エラーを返す

該当のPR external_link

Global Notification 設定の POST api 作成時のレビューです。

レビュー

notifyToType の値が mail になるか slack になるかによって処理を変えていました。
switch を使用して、notifyToType に適正な値が入ってなかったらエラーを返す想定でした。

しかし、ここで返さなければいけないのは エラーコード 400 です。

HyperText Transfer Protocol (HTTP) の 400 Bad Request レスポンスステータスコードは、何らかのクライアント側のエラーであると分かったために、サーバーがそのリクエストを処理しない (できない) ことを表します1

そして、400 エラーを返すのはバリデーションの責務です。

notification-setting.js
const validator = { slackConfiguration: [ body('webhookUrl').isString().trim(), body('isIncomingWebhookPrioritized').isBoolean(), body('slackToken').isString().trim(), ], userNotification: [ body('pathPattern').isString().trim(), body('channel').isString().trim(), ], globalNotification: [ body('triggerPath').isString().trim().not() .isEmpty(), body('notifyToType').isString().trim().isIn(['mail', 'slack']), body('toEmail').trim().custom((value, { req }) => { return (req.body.notifyToType === 'mail') ? (!!value && value.match(/.+@.+\..+/)) : true; }), body('slackChannels').trim().custom((value, { req }) => { return (req.body.notifyToType === 'slack') ? !!value : true; }), ], };

validator に globalNotification 追加しました。

Validation Chain である isIn(['mail','slack']) を使用して notifyToType の値が正しいかチェックしています。
また、 notifyToType の値に応じたカスタムバリデーターも使用しています。

今後 Twitter 通知などで機能を追加するときはバリデーターも修正する必要がありそうです。

Footnotes

  1. https://developer.mozilla.org/ja/docs/Web/HTTP/Status/400 external_link