オフィスに行ったらNotionに通勤記録を残す仕組みを作ってみた with Deno
リモート勤務だったり、オフィスへの出社だったりを併用している人の中には、通勤回数を申告して会社から交通費をもらっている人も多いのではないでしょうか。
かく言う自分もその一人です。前職では社用の端末をオフィスのWi-Fiに接続することで自動的に記録してくれる仕組みが運用されていたので、何も考える必要がなかったのですが、転職して自分で記録を残す必要が出てきたので、試しに作ってみました。
とりあえず自分だけしか使わない仕組みなので、位置情報をベースにした設計にしてみました。
具体的には
- iPhoneのShortcutsアプリでオフィスに近づいた時にHTTPリクエストを送るように設定しておく
- 自前のHTTPサーバーでそのリクエストを受けて、NotionのAPIを叩いて通勤記録を残す
- お昼ご飯とかでオフィスを離れて戻ってきた時に再度記録されないように一定期間内に1回しか記録されないようにしておく
といった仕組みで作ってみます。
実装
今回はDenoを使って実装してみました。
要件がシンプルなので、なんでもよかったのですが、使ったことなかったので試してみたかったのと、Deno Deployを使うと簡単にHTTPサーバーを立てることができることからDenoを選択しました。
実際の実装は以下に貼っておきます。(書き捨てスクリプトくらいのつもりで作ったのでmain.tsに全部が書いてあります。これ以上拡張するつもりも特にないので良いでしょう…。)
iPhone側はこのような感じで。一応サーバーサイドからメッセージを返すように実装したので、そのメッセージを通知で表示させてみることにしました。
あとは上記のShortcutsをAutomationのタブからオフィスに近づいた時に実行するように設定するだけです。このタイミングで、発火させたくない時間帯などがあれば指定することができます。
Deno/Deno Deployを使った感想
Nodeとの違いについて
初めてDenoやDeno Deployを使ってみましたが、基本的には普段TypeScriptを書いている人であれば依存関係の管理方法やimportのpathの差、グローバルオブジェクトがDeno
であるといった基本的なところだけを抑えておけば特に問題なくコードを書くことができるのではないかなと思いました。
自分は上記だけサッと目を通して書き始めました。
npm packageの利用について
NotionのAPIを叩く部分は、本当はNotion公式のJS SDKを使うと楽です。
Denoではnpm:
というプレフィックスを使うことでnpm packageをインポートすることもできるので、試してみました。動作は問題なくするものの、TypeScriptの型の解決がうまくいっていないのか、別の型を参照してしまうような挙動がみられてうまくエラーを解決することができなかったので、fetchを使ってAPIを叩くようにしました。
また、どちらにせよnpm packageを使用している場合、Deno Deployでそのまま動作させることができないので、その辺は注意が必要だと感じました。
Deno Deployの体験が良い
npm packageが使えないみたいな落とし穴(ドキュメント読まずに使い始めたのがいかんのですが)さえ理解して使っておけば、Deno Deployの体験はとても良かったです。
Vercelのように、GitHubのリポジトリを連携すれば指定したブランチのコードを勝手にfetchしてきてデプロイしてくれます。もちろん、新規にpushすれば自動的に更新されます。
また、デプロイも非常に高速で、自分の上記コードでは30秒かからずに実行可能なエンドポイントが作成されました。
今回のような用途では到底オーバーしないであろう無料枠があるのも良いところと感じました。
cronjob的なことができるとよりいろいろ幅が広がりそうだなと思いました。(似たようなことができるCloudflare WorkersではCronの機能が提供されているらしいのでDenoにも期待したいところではあります)
Discussion