※ 個人ブログでマルチポスト予定です
子供が産まれて妻子の入院期間中、体温や授乳回数やおしっこ・うんちの時間を記録する紙があって、そこに毎日記録していました。
退院後もそのフォーマットを Excel で真似て紙に印刷して使っていて、子供の不調が無いか確認していました。
子供が 1 歳になった今も一応、記録内容を減らした紙を運用してはいるものの、ほとんど問題ないのであまり書いていないです。
ただその中で、絶対書いておきたいのが、うんちの記録です!
便秘だと不機嫌になったり場合によっては病院に行かないといけなくなります。
うちの子は最近は割と快便ですが、最初の頃は便秘でとても心配しました。
また、うんちがあまり出ていない状態でお風呂に入ると・・・ね。。
ということで、うんちの回数を記録するアプリを書いてみましたのでご紹介です。
インフラもアプリも、ベースとなる考え方は以前ブログでご紹介した下記のコードです。
https://github.com/hirokimatsueda/azure-managed-id-sample
アプリの概要
アプリは ASP.NET Core Blazor での記述です。
カレンダーの中の「+」ボタンを押すと、当日の枠に マークがつきます。
データは Cosmos DB に保管されます。
アプリコード
Visual Studio 2022 で作成しました。
GitHub で見れるようにしています。
https://github.com/hirokimatsueda/baby-info-recording-system
APIはリクエストされた期間のうんちデータを探します。ポイントはGetItemLinqQueryableを利用する程度です。
var iterator = container.GetItemLinqQueryable<Poop>()
.Where(p => p.UserId == userId[0])
.Where(p => startDate <= p.Date && p.Date < endDate)
.ToFeedIterator();
EF Coreの調子でWhereした後ToListしたくなるところですが、非同期処理で完結するにはToFeedIteratorを経由して取りに行く必要があります。
うんちの増減はUpsertItemAsyncを利用して上書き保存しています。
await container.UpsertItemAsync<Poop>(poop, partitionKey);
フロントの実装は大目に見てください。。
作りが微妙ですが・・・赤ちゃん ID を変更すると別々のデータを管理できるので、双子や兄弟のデータも扱えます。
インフラの概要
インフラとしては Azure の Static Web Apps での動作を想定し、情報を CosmosDB に保存するので、比較的安価に運用できるものになっています。
インフラ構築
Api は Static Web Apps のデフォルトの機能で動かすと Managed ID が使えないため、Static Web Apps とは別で構築した Functions を Static Web Apps にリンクする形を取るのがポイントです。
下記に要点をご紹介します。
Cosmos DB と Functions の作成
下記の Terraform で作成することで、Functions から Managed ID で Cosmos DB のデータの更新ができる状態に整えます
https://github.com/hirokimatsueda/azure-managed-id-sample/tree/main/infrastructure/terraform
Static Web Apps の作成
Functions のリンクをするので、Standard で作成します。
作成時にビルドの詳細で下記を指定します。
- ビルドのプリセット: Blazor
- アプリの場所: Client
- API の場所: (空欄)
- 出力先: wwwroot
作成後、Azure ポータルの「API」から、作成した Functions をリンクしてください。
他の人に見えないように、全般設定でパスワード保護を実施すると良いです。
まとめ
これで子育て環境の DX が完了ですね!
・・・とは現実的には、このレベルだとたぶん紙で運用した方が楽です。
機能追加すれば入院中の記録用紙と同じレベルで記録ができるようになると思うので、誰か作ってみて欲しいですね。