Skip to content

購読URLがサブパス配下で404になる不具合を修正し、カレンダー名を分かりやすくする - #74

Merged
champierre merged 1 commit into
mainfrom
fix/ical-url-subpath-and-calendar-name
Sep 15, 2026
Merged

champierre merged 1 commit into
mainfrom
fix/ical-url-subpath-and-calendar-name

Conversation

@champierre

Copy link
Copy Markdown
Contributor

不具合の報告

「購読URLをGoogleカレンダーに追加しても表示されない」という報告を受けて調査しました。PR #73 で私が作り込んだバグです。

原因: 購読URLから /shift2 が欠落していた

本番は https://tukumana.si.aoyama.ac.jp/shift2/ のようにサブパス配下で配信されていますが、購読URLを window.location.origin を基準に組み立てていたため、サブパスが落ちていました。

誤: https://tukumana.si.aoyama.ac.jp/api/ical/user/...        → 404
正: https://tukumana.si.aoyama.ac.jp/shift2/api/ical/user/... → 200

window.location.origin は https://ホスト名 までしか含まないため、/shift2 が失われます。Googleカレンダー側は404を受け取るだけなので、エラーも出さず「何も表示されない」状態になっていました。

config.API_BASE_URL(既にサブパスを考慮済み)を基準にする toAbsoluteApiUrl() を追加し、自分用・管理者用の両方で使うようにしました。管理者用の購読URLも同じバグの影響を受けていました。

本番での確認

/api/ical/user/...        -> 404
/shift2/api/ical/user/... -> 200 (text/calendar, VEVENT 1件)

カレンダー名を分かりやすくした

購読したカレンダーが全員「シフト管理」という名前で追加され、カレンダーアプリ上で誰のシフトか区別できませんでした。

変更前 変更後
個人用 シフト管理 〇〇さんのシフト(0件時は「マイシフト」)
全体用 シフト管理 全員のシフト

テスト

js/modules/shifts.js にエクスポートガードを追加し、テストから実コードを直接 import して検証しています。本リポジトリで最初のガード追加です(docs/refactoring/phase-1-test-foundation.md の方針に沿ったもの)。ブラウザでは module が未定義のため no-op です。

今回、コピー方式のテストを書いたところ「自分で書いたスタブを検証するだけ」で実装のバグを検出できない状態になり、2度書き直しました。実コードを import する方式に切り替えて初めて、旧挙動で6件中5件が落ちることを確認できています。

Test Suites: 31 passed, 31 total
Tests:       422 passed, 422 total

マージ後に必要な作業

  • 本番へのデプロイ(現在 /shift2/js/modules/shifts.js は旧コードのままです)
  • すでに購読済みの人は、カレンダーを削除して新しいURLで登録し直す必要があります(旧URLは404のままのため)

セキュリティ上のお願い

デバッグの過程で購読URLがチャットに共有されました。購読トークンは実質パスワードなので、.env の ICAL_TOKEN を再生成することをおすすめします。再生成すると全員の購読URLが一括で失効し、各自が新しいURLで登録し直す形になります。

🤖 Generated with Claude Code

## 購読URLの404

本番は https://tukumana.si.aoyama.ac.jp/shift2/ のようにサブパス配下で
配信されているが、購読URLを window.location.origin を基準に組み立てていたため
/shift2 が欠落し、Googleカレンダーに追加しても404で購読できなかった。

  誤: https://tukumana.si.aoyama.ac.jp/api/ical/user/...        → 404
  正: https://tukumana.si.aoyama.ac.jp/shift2/api/ical/user/... → 200

config.API_BASE_URL(サブパスを含む)を基準に組み立てる toAbsoluteApiUrl() を
追加し、自分用・管理者用の両方の購読URLで使うようにした。

## カレンダー名

購読したカレンダーが全員「シフト管理」という名前で追加され、
カレンダーアプリ上で誰のシフトか区別できなかった。

  個人用: 「〇〇さんのシフト」(シフト0件時は「マイシフト」)
  全体用: 「全員のシフト」

## テスト

js/modules/shifts.js にエクスポートガードを追加し、テストから実コードを
直接 import して検証している(docs/refactoring/phase-1-test-foundation.md の方針)。
本リポジトリで最初のガード追加。ブラウザでは module が未定義のため no-op。

旧挙動に一時的に戻して該当テストが落ちることも確認済み。

テスト: 422 passed (31 suites)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@champierre
champierre merged commit 6db0554 into main Sep 15, 2026
2 checks passed
@champierre
champierre deleted the fix/ical-url-subpath-and-calendar-name branch September 15, 2026 08:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant