anke-to v3リリース

プロジェクト#traP

はじめに

所属しているサークル(traP)では、traQという部内SNSとそのアカウントを中心とした様々なサービスが開発運用されています。
今回私がメジャーバージョンアップに携わったanke-toというのはそのようなサービス群の中の一つで、アンケートフォーム的な役割を担うサービスです。

これは2016年ごろに部内ハッカソンによって開発されたものでした。しかし、当時はまだGoとOpenAPIスキーマを自動生成で繋ぐようなツールもなく、ハッカソン開発なため実装しきれていない機能もあり、といった状況でバージョンアップが求められていました。

何をしたのか

v3によってどのような機能が実装されたのかということについては、traPのblogに任せまして、ここではバックエンドがv3になるにあたっての大きな変更をいくつか紹介します。

oapi-codegenの導入

先にも述べたようにv1においては、OpenAPI スキーマとの対応の確保について自動生成などを採用できておらず、バックエンド開発時に人力で対応を確保していました。しかし、見落としが発生しうることからもここでスキーマ駆動開発に寄せていこうという意思決定をしました。

自動生成のツールについては複数ありますが、今回は自分が使い慣れていることや、サークル内の技術スタックにおいてechoを主に使っていることとの相性が良いことなどから、oapi-codegenを採用しました。

と、ここまでの判断は順調だったのですが、想定外だったのは、router周りのコードの書き換えでした。今回のv3においては、過去のアンケートについて表示や回答可能な状況を維持するといった目的のもと、可能な限りデータベース側のフィールドには手を加えないことにしていました。(そこまでスコープを広げるといつになってもリリースできなさそうというのもありました) すると、DBとinterfaceで使っていた型と、これまでrouter側で使っていた型とoapi-codegenが生成するechoのコードが使っている型の3つが異なることになってしまいました。

そこで、今回は一旦oapi-codegenの作るrouterに引き渡す前にアダプター的な関数をおいて、型変換を行うことにしました。しかし、これがとにかく量が多く、中を見ていくと、どう見ても複数選択に見える変数名が単一選択に使われているなど、なかなか骨の折れる作業でした。といっても実際に作業を進めていた2025年の年始くらいにはcopilotがだいぶ優秀になっていたこともあり、作業を始めた2024年の見立てよりはだいぶ簡単になっていました。

また、細かいこととしてはoapi-codegenを導入することで、dev用のホストのdomainに対してのvalidateが発生したり、middlewareの実装が微妙にやりにくかったりといった点でのバックエンドの開発体験の悪さはありましたが、すでにフロントはスキーマ駆動だったので、より一層やりやすくなったのではないかと思っています。

グループを対象者/管理者にできるように

まず、前提としてtraQにはグループという概念があり、これはメンバーを変更することができるユーザーの部分集合で構成されています。そして、アンケートを立てる際にはこのグループの人たちを対象にしたいというニーズがしばしば発生します。しかし、過去のanke-toでは、グループ自体を対象にすることはできず、作成時にグループのメンバーを全員そのタイミングで対象にするという仕組みでした。

このような場合にどのような不満が出るかというと、UIにおいて、これが一体何のグループを対象にしているのかが分かりにくい、グループを更新した時にメンバーを更新することが難しいといったことが起きました。

これに取り組むにあたって難しかったのは、グループが編集された時にどうするかという問題でした。特にあるアンケートが作成された時にはそのグループに入っておらず、対象としても考えられていないユーザーが対象になってしまうことや、そもそもグループ自体が削除された場合など、そして、リマインドを送るときにはグループのメンバーが解決されている必要があるのですが、これをどのタイミングで扱うかといった課題です。

結果としては、作成時のグループとメンバーをanke-to側に保存するということで落ち着きましたが、これについては今後traP全体のユーザー管理とRBACに向けた整理の中でより良い解決策が取れることを期待しています。

最後に

今回のメジャーバージョンアップは3年以上かかったプロジェクトになりましたが、何とかリリースすることができました。これを開発する中で、大学生がサークルで開発をする際にどうすると開発ペースが上がるのか、逆にどういう場合だとあまり進まないのかといったことなども経験することができたほか、決めたはずの仕様がどこにあるのかわからなくなるといったこともあり、今後開発者向けのドキュメントの整理などにも取り組んでいく必要があるなということを痛感しました。