Google OAuth認証とExpress + SQLiteバックエンドによる高機能なシフト管理アプリケーションです。
このアプリケーションは、アルバイトや小規模チームのシフト管理を効率化するWebアプリケーションです。Google のサービス群(Google Identity Services、Google Calendar)とExpress + TypeScript + SQLiteを活用し、認証からデータ管理、カレンダー連携まで統合的にサポートします。
- 統合バックエンド: Express + TypeScript + SQLiteによる一元管理
- リアルタイム管理: 即座に反映される空き枠と申請状況
- 直感的UI: カレンダーベースの視覚的なシフト管理
- 権限ベースアクセス: 一般ユーザー・管理者の役割分担
- 自動化: カレンダー連携による手作業削減
- Google Cloud Consoleにアクセス
- 新しいプロジェクトを作成または既存のプロジェクトを選択
- 「APIとサービス」→「認証情報」に移動
- 「認証情報を作成」→「OAuth 2.0 クライアントID」を選択
- アプリケーションの種類で「ウェブアプリケーション」を選択
- 承認済みのJavaScript生成元に以下を追加:
http://localhost:3000http://127.0.0.1:3000- その他必要なドメイン
- クライアントIDをコピー
.envファイルを作成し、必要な環境変数を設定(.env.exampleを参照)- 取得したクライアントIDを
.envのGOOGLE_CLIENT_IDに設定(フロントエンドは起動時にGET /api/configから実行時取得します。HTMLやJSへのハードコードは不要です)
ローカルサーバーを起動してテスト:
npm run devブラウザで http://localhost:3000 にアクセス
- Googleアカウントログイン: Google Identity Services (GSI) による安全な認証
- メールアドレス制限: 指定されたメールアドレスのみアクセス可能
- 管理者権限: 管理者ユーザーには追加機能を提供
- ユーザープロフィール表示: 名前、メール、プロフィール画像
- リアルタイム可用性表示: 人数設定と現在の申請数に基づく残り枠表示
- 30分単位の時間枠: 13:00-18:00の範囲で30分間隔の柔軟なシフト設定
- 重複申請防止: 同一ユーザーが同じ日時に複数申請することを防止
- シフトデータキャッシュ: 初回読み込み後はキャッシュを使用してパフォーマンス向上
- シフト申請: カレンダービューから直感的にシフト申請
- 自分のシフト一覧: 申請済みシフトの確認と管理
- 日付詳細モーダル: 各日付の詳細情報と申請可能枠を表示
- 全員のシフト一覧: カレンダー形式で全スタッフのシフトを一覧表示
- シフト詳細ダイアログ: 日付クリックで詳細なシフト情報を表示
- 時間帯ごとのグループ化表示
- スタッフ名、メールアドレス、備考の詳細表示
- 各時間帯の人数カウント表示
- 人数設定管理: 日付・曜日別の必要人数設定
- カレンダー連携: 承認されたシフトをGoogleカレンダーに自動同期
- iCal購読URL: 全シフトをカレンダーアプリから購読できるURLを表示・コピー
- SQLite統合: データの永続化にSQLiteを使用
- Express + TypeScript: 型安全なバックエンド処理
- RESTful API設計: GET/POST/PUT/DELETEリクエストによるデータ操作
- 環境変数管理: 設定情報の安全な保存
- レスポンシブデザイン: デスクトップとモバイルデバイス対応
- ローディング表示: データ読み込み中の視覚的フィードバック
- エラーハンドリング: 適切なエラーメッセージ表示
- 直感的なカレンダーUI: 月単位表示と簡単な日付選択
シフト予定を標準の iCal(.ics / RFC 5545)形式で公開し、Google Calendar・Apple カレンダー・Outlook などから購読できます。
.env に ICAL_TOKEN を設定します。推測困難なランダム文字列を使用してください。
# トークン生成例
python3 -c "import secrets; print(secrets.token_urlsafe(32))"ICAL_TOKEN=生成したトークン文字列| URL | 用途 |
|---|---|
GET /api/ical/all?token=<token> |
全スタッフのシフト(管理者用) |
GET /api/ical/user/{user_id}?token=<token> |
特定ユーザーのシフト |
管理者モードの「シフト一覧」タブ上部に購読URL(全シフト)が表示されます。「コピー」ボタンでクリップボードにコピーできます。
Google Calendar
- 左側「他のカレンダー」横の「+」→「URL で追加」
- 購読URLを貼り付けて「カレンダーを追加」
Apple カレンダー
- メニュー「ファイル」→「新規カレンダー購読」
- 購読URLを貼り付けて「購読」
Outlook
- 「カレンダーを追加」→「インターネットから」
- 購読URLを貼り付けて「インポート」
- 更新頻度: Pull 型のため、カレンダーアプリのポーリング間隔に依存します。Google Calendar・Outlook は約24時間、Apple カレンダーは約15分が目安です(リアルタイム更新は現行の Google Calendar 直接同期が適切)。
- 連続シフトの統合: 同一ユーザーの連続する30分シフトは1つのイベントにまとめて表示されます(例: 13:00-13:30 + 13:30-14:00 → 13:00-14:00)。
- 特別シフトも含む: 通常シフト(
shifts)と特別シフト(special_shifts)の両方が含まれます。 - セキュリティ: URLに含まれる
ICAL_TOKENが認証情報です。漏洩した場合は.envのトークンを再生成してサーバーを再起動してください。
- HTML5: セマンティックなマークアップ
- CSS3: レスポンシブデザインとモダンなUI
- Vanilla JavaScript: フレームワークを使わない軽量な実装
- Google Identity Services (GSI): OAuth2認証
- Express.js: RESTful APIサーバー
- TypeScript: 型安全な開発
- SQLite: 軽量データベース(better-sqlite3)
- Google Calendar API: カレンダー連携
- Google Cloud Console: OAuth設定とAPI管理
- Nodemon: ホットリロード
- Jest: テストフレームワーク
- ESLint/Prettier: コード品質
- npm: パッケージ管理とスクリプト実行
- Git: バージョン管理
- HTTPSまたはlocalhostでのみ動作します(Google OAuth要件)
- 認証されたメールアドレスのみアクセス可能
- 本番環境では適切なセキュリティ対策を実装してください
- OAuth設定が必要です
- 開発サーバーはデフォルトでポート3000で起動します(.envで変更可能)
- SQLiteデータベースの定期的なバックアップを推奨
- データはSQLiteファイル(
data/shift.db、.envのDATABASE_PATHで変更可)に保存されます - 定期的なバックアップを推奨
- Googleアカウントの2段階認証を有効にすることを推奨
# 全テストを実行
npm test
# カバレッジ付きで実行
npm run test:coverage
# ウォッチモードで実行
npm run test:watch