C#およびASP.NET MVCを使用した予約リマインダー
Ready to implement appointment reminders in your application? Here's how it works:
- 管理者は、将来の日時に対するアポイントメントを作成し、そのアポイントメント用に顧客の電話番号をデータベースに保存します。
- バックグラウンドプロセスは、データベースを定期的にチェックし、リマインダーを送信する必要があるアポイントメントを探します。
- アポイントメントより前の設定済み時間に、アポイントメントを思い出させるために SMS リマインダーが顧客に送信されます。
Yelpが飲食店に対してレストランの予約確認に、いかにしてSMSを使用しているのか見てみましょう。
ビルディングブロック
これを行うために使用するテクノロジーは以下のとおりです。
- データベースドリブンのウェブアプリケーションを作成するためのASP.NET MVC
- Messages Resource:Twilio の REST API からテキストメッセージを送信します。
- バックグラウンドタスクを反復的にスケジュールおよび実行するためのHangfire
In this tutorial, we'll point out key snippets of code that make this application work. Check out the project README on GitHub to see how to run the code yourself.
このチュートリアルの読み方
予約リマインダーを実装するため、Webアプリケーション内で予約リマインダーをもれなく実装する方法について述べられた一連のユーザーストーリーに取り組みます。 各ストーリーの要件を満たすために必要なコードについて見ていき、各ステップで何を追加すべきかについて調べます。
これはTwilioの助けを借りれば30分以内で完了できます。
アポイントメントの作成
ユーザーとして、名前、ゲスト電話番号、および将来の時間を使ってアポイントメントを作成します。
自動アポイントメントリマインダーアプリケーションを構築するには、ほとんどの場合アポイントメントから始めます。このストーリーでは、システムで新しい Appointment
を作成および保存するために、UI およびモデルオブジェクトを多少作成する必要があります。追加する必要があるのは、おおまかに以下のとおりです。
- アポイントメントに関する詳細を入力するためのフォーム
- フォームをレンダリングするためのサーバー上のルートおよびコントローラー関数
- フォーム POST リクエストを処理するためのサーバー上のルートおよびコントローラー関数
- ユーザーに関する情報を保存するための永続的な
Appointment
モデルオブジェクト
これで申し分ないでしょう。 新規アプリケーションの作成に必要なものが把握できました。 まずは、予約にどのような情報を保存すべきかについて決定するためのモデルについて見ていきましょう。
アポイントメントモデル
アポイントメントモデルはかなり明快ですが、人間がかかわるので、データ検証を追加しておきましょう。
アプリケーションは ASP.NET Data Annotations を利用しています。今回は、一部のフィールドが必須であることを検証するだけにとどめます。これを実現するには、[Required]
データアノテーションを使います。
既定では、ASP.NET MVCはコントロールのレンダリング時に、プロパティー名を表示します。 今回のサンプルでは、これらのプロパティー名はName
またはPhoneNumber
になります。 Name
のレンダリングに関しては問題はないでしょう。 しかしPhoneNumber
に関しては、「Phone Number」のようなもう少し見やすく表示にした方が良いでしょう。 このようなシナリオでは別の、 [Display(Name = "Phone Number")]
といったデータ注釈が使用できます。
PhoneNumber
フィールドの内容を検証するために、[Phone]
データアノテーションを使って、ユーザーが入力した電話番号が E.164 フォーマット基準にほぼ準拠していることを確認しています。
これで予約モデルが定義されました。 それでは、管理者が新規予約を作成できるようにするためのフォームを見てみましょう。
新規アポイントメントフォーム
新しいアポントメントを作成する際は、ゲスト名、電話番号、時刻が必要です。HTML Helper クラスを使って、モデルオブジェクトにフォームをバインドできます。これらのヘルパーにより、必要な HTML マークアップが生成され、送信時に新しいアポイントメントが作成されます。
これでモデルとUIが用意できたので、Appointments
とのインタラクション方法を見ておきましょう。
アポイントメントとのインタラクション
ユーザーとして、今後のすべてのアポイントメントのリストを表示するとともに、 これらのアポイントメントを削除できるようにします。
大量のアポイントメントを扱う組織の場合は、おそらくそれらのアポイントメントを単一のインターフェイスで表示および管理できるようにしたいと考えるでしょう。このユーザーストーリーでは、それに取り組みます。以下の操作を行う UI を作成します。
- すべてのアポイントメントを表示する
- 個々のアポイントメントを削除する
We know what interactions we want to implement, so let's look first at how to list all upcoming Appointments.
Getting a List of Appointments
コントローラーレベルで、データベース内のすべてのアポイントメントのリストを取得し、ビューでレンダリングします。また、アポイントメントがない場合に、admin ユーザーが作成できるよう、メニューも追加します。
これが予約一覧を返す方法です。 さて、これをレンダリングしましょう。 そのための予約テンプレートを見てみましょう。
全予約の表示
インデックスビューではID順にソートされた全予約が一覧されます。 ユーザーストーリーを全うするのために追加が必要なのは、削除ボタンだけです。 余興として編集ボタンも追加しましょう。
HTML ヘルパー
「編集」および「削除」用のURLをハードコーディングするのではなく、ASP.NET MVC HTMLヘルパーを使用していることにお気づきかもしれません。 レンダリング済みのマークアップを確認すれば、これらのパスがご覧いただけるでしょう。
/Appointments/Edit/
id
(編集の場合)/Appointments/Delete/
id
削除
AppointmentsController.cs
編集と削除両方の操作を処理するメソッドが含まれます。
これで予約の作成、表示、編集、および削除ができるようになったので、いよいよここからお楽しみパートです: 予約が近づいてきたらリマインダーをSMS経由で送信する繰り返しジョブをスケジューリングしましょう。
Hangfire の操作
以前にスケジュールしたジョブをまったく使っていない場合は、ASP.NET MVC でバックグラウンドタスクを実行するためのいくつかの方法を示した Scott Hanselman によるこの投稿を参照してください。Hangfire は、シンプルなので、使うことにしました。 ASP.NET MVC でジョブをスケジュールするためのもっと良い方法があれば、お知らせください。
Hangfireでは、近く予定されているジョブを待ち行列に追加するための何らかのバックエンドが必要です。 今回の実装ではSQL Serverデータベースを使用しますが、他のデータストアを使用することもできます。 さらなる詳細については、ドキュメントを参照してください。
Now that we have included Hangfire dependencies into the project, let's take a look at how to configure it to use it in our appointment reminders application.
Hangfire の設定クラス
ジョブスケジューラーを設定するために、Hangfire
という名前のクラスを作成しました。このクラスは、2 つのスタティックメソッドを定義します。
ConfigureHangfire
ジョブスケジューラーの初期化パラメーターを設定する。InitialzeJobs
どの反復ジョブをどの程度の頻度で実行するかを指定する。
構成は以上になります。 次はジョブスケジューラーを起動する方法を少し見てみましょう。
ジョブスケジューラーの起動
この ASP.NET MVC プロジェクトは OWIN ベースのアプリケーションで、アプリケーションで必要となるカスタムな初期化ロジックを実行するための起動クラスを作成できます。Hangfire を起動するには、これは望ましい場所です。詳細については、設定ドキュメントを参照してください。
これでジョブスケジューラーが起動されたので、ジョブが実行されたときに実行されるロジックを確認しておきましょう。
通知バックグラウンドジョブ
このクラスでは、1 分ごとに Hangfire で呼び出される Execute
という名前のメソッドを定義します。ジョブが実行されるたびに、以下が必要になります。
- 通知の送信を必要とする近く予定されているアポイントメントのリストを取得する
- Twilio を使い、アポイントメントリマインダーを SMS を介して送信する
AppointmentsFinder
クラスは、SQL Server データベースに問い合わせ、近く予定されているすべてのアポイントメントを探します。このようなアポイントメントごとに、Twilio REST API を使って、フォーマット化されたメッセージを送信します。
これで近い将来の予約の一覧が取得できましたので、Twilioを使用してSMS通知を送信する方法を見ていきましょう。
Twilio REST API リクエスト
このクラスは Twilio アカウントクレデンシャルを Web.config
から読み取り、Twilio REST API を使って実際に通知をユーザーに送信します。テキストメッセージの送信者として使う Twilio 番号も必要です。実際にメッセージを送信するのはは、たった 1 行のコードです。
楽しいチュートリアルだったしょう? ここから先はどうしましょうか?
次はどこでしょうか?
多少のコードとわずかな設定で、自動アポイントメントリマインダーをアプリケーションで起動できます。お疲れ様でした。
If you are a C# developer working with Twilio, you might want to check out other tutorials:
ウェブページのボタンを押して、電話を介して訪問者をライブサポートまたはセールス担当者に接続します。
テキストメッセージを介した二要素認証を追加することで、Flask アプリのログイン機能のセキュリティを強化します。
これは役に立ちましたか?
Thanks for checking out this tutorial! If you have any feedback to share with us, please reach out on Twitter... we'd love to hear your thoughts, and know what you're building!
ヘルプが必要ですか?
誰しもが一度は考える「コーディングって難しい」。そんな時は、お問い合わせフォームから質問してください。 または、Stack Overflow でTwilioタグのついた情報から欲しいものを探してみましょう。