調整さんで絶対に回答させるline botを作ってみた【6】
会社で発表したら緊張しすぎて手汗がすごい、ナナオです。 今回でおそらく完成させたい、LineBotのヤバいさんを早速実装していきます。 line_groupテーブルに調整さんのIDを設定できるようにする まずはマイグレーションを追加します。 sqlx-cliを使用しましょう。 sqlx migrate add add_column_chousei_id 作成されたマイグレーションファイルを実装します。 PostgreSQL: Documentation: 18: ALTER TABLE 調整さんのIDは小文字の英数字32桁からなる文字列なので、そのように定義します。 -- 調整さんのイベントIDを設定できる列を追加 ALTER TABLE "line_group" ADD COLUMN "chousei_id" varchar(32); この定義だと1グループにつき一つのイベントまでしか設定できませんが、そんなに立て続けに同じグループでイベントの出欠を取ることはないと信じています。 一旦この状態でshuttleを起動して、マイグレーションが問題なく適用されるか確認します。 cargo shuttle run DBを確認してみます。 postgres=# select * from line_group; id | deadline_date | chousei_id -----------------------------------+---------------+------------ C480b2f8b56ecaf62c2033867e2ff78b2 | 2023-11-12 | (1 行) 既存データにchousei_idが追加されています! 続けて、LineGroupのモデルにchousei_idプロパティを追加してあげましょう。 #[derive(Debug, FromRow, Serialize, Deserialize)] pub struct LineGroup { pub id: String, pub deadline_date: NaiveDate, pub chousei_id: Option<String>, } 期日設定を行うCommandの実装にLineGroupの初期化処理があるので、ここにchousei_idの初期化も追加しておきます。 impl BotSetDeadlineCommand { async fn new( pool: Arc<PgPool>, group_id: &str, deadline_date: &str, ) -> Self { let repository = LineGroupRepository::new(&pool); let id = group_id.to_string(); let line_group_option = repository.select(id.clone()) .await .expect("期日設定中のline_groupの取得に失敗しました"); let deadline_date = NaiveDate::parse_from_str(deadline_date, "%Y-%m-%d") .expect("日付型への変換に失敗しました"); let line_group = match line_group_option { Some(mut line_group) => { line_group.id = id; line_group.deadline_date = deadline_date; line_group }, _ => LineGroup { id, deadline_date, chousei_id: None, } }; Self { pool, line_group } } } 期日設定によってchousei_idがリセットされないように、line_groupの初期化処理の前に既存のline_groupを取得するようにしました。 ...