Skip to content

Latest commit

 

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

スタッフ向け統合フォームサイト

Google フォームで運用していた ソレイイネ!!MVBe を、同一の Web アプリ上で利用できるようにしたプロジェクトです。スタッフマスタや回答データは Google スプレッドシート を正とし、サーバー側から Google Sheets API で読み書きします。

詳細な要件は別途の社内資料(またはローカルに置いた 要件定義書.md)を参照してください。当リポジトリには同ファイルは含みません。

技術スタック

区分 内容
フレームワーク Next.js 15(App Router)
言語 TypeScript
認証 Auth.js / next-auth v5 — Google アカウント(OAuth)のみ
データ Google Sheets API(googleapis)、スプレッドシート ID・サービスアカウント JSON は環境変数で指定
UI React 19、Tailwind CSS 4
ホスティング想定 Vercel 等(Node ランタイム)

ディレクトリ構成(概要)

各フォームサイト化/
├── README.md                 … 本ファイル
├── 要件定義書.md             … 機能・非機能要件
└── web/                      … Next.js アプリケーション(メインのコード)
    ├── app/                  … ページ・API ルート・コンポーネント
    ├── lib/                  … スプレッドシート・認証・集計などのロジック
    ├── auth.ts               … NextAuth 設定
    └── middleware.ts         … 認可ミドルウェア

セットアップ

前提

  • Node.js(LTS 推奨)
  • npm または互換のパッケージマネージャ

依存関係のインストール

cd web
npm install

web/.npmrclegacy-peer-deps=true を有効にしています。next-auth がメール送信用に宣言している optional peer(nodemailer)をプロジェクトでは直接入れていないため、npm の peer 解決が衝突するのを避けるためです。アプリの認証は Google OAuth のみです。

環境変数

web/.env.local に設定します(実際の値はチームのポリシーに従ってください)。主要な項目は次のとおりです。

変数 説明
AUTH_SECRET セッション暗号化用(本番では必須。NEXTAUTH_SECRET でも可)
AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET Google OAuth クライアント
AUTH_GOOGLE_ALLOWED_HOSTED_DOMAINS (任意)許可する Workspace ドメインのみに制限するとき。カンマ区切り、@ なし。未設定ならドメイン制限なし
DYNAMODB_USER_STAFF_TABLE (推奨)職員と Google sub の紐づけ用 DynamoDB テーブル名。パーティションキーは pk(String)。未設定時は AUTH_STAFF_LINK_FALLBACK_GOOGLE がないとログイン後に職員 ID が付かない
DYNAMODB_REGION (任意)DynamoDB リージョン。未指定時は AWS_REGION または ap-northeast-1
AUTH_STAFF_LINK_FALLBACK_GOOGLE (移行用)1 / true のとき、Dynamo に行が無いユーザーは従来どおり Google プロフィールでマスタ突合。本番で Dynamo 運用が安定したら外す
GOOGLE_SERVICE_ACCOUNT_JSON サービスアカウント JSON(文字列またはファイルパス運用は実装に準拠)
GOOGLE_SPREADSHEET_ID マスタ等に使うスプレッドシート ID
GOOGLE_RESPONSES_* フォーム別の回答先ブック/シート(未設定時はフォールバックあり)
ADMIN_NAMES 管理者として扱う氏名(カンマ区切り。マスタ氏名と照合)
MVBE_DEPT_WEIGHT_MAX MVBe のポイント傾斜の上限(既定 3)。最大所属人数の部署は 1.0 pt、それ以外は 非最大に現れる在籍人数の種類を昇順に並べ、その順で [1.5, この値] を等間隔(同一人数の部署は同じ pt)。小数第1位で四捨五入してシートに保存。緩くしたいときは 999 など
NEXT_PUBLIC_APP_ORIGIN (推奨)本番のオリジン(例 https://forms.example.com)。Discord リマインドのフォーム URL に利用
DISCORD_MVBE_REMINDER_WEBHOOK_URL MVBe 未提出リマインド用 Discord Incoming Webhook
MVBE_REMINDER_CRON_SECRET POST /api/cron/mvbe-reminderAuthorization: Bearer … と一致させるシークレット
MVBE_REMINDER_TEMPLATE (フォールバック)リマインド文案。プレースホルダ: {{unsubmittedCount}} {{namesMultiline}} {{mentions}} {{formUrl}} {{periodSummary}}
SHEET_MVBE_REMINDER_TEMPLATE / SHEET_MVBE_REMINDER_TEMPLATE_CELL マスタブック内の文案セル(既定: シート MVBeリマインドA1

MVBe 未提出リマインドのメンションは、ソレイイネと同じ メンバー対応表SHEET_MEMBER_DISCORD_MAP/ソレイイネ用スプレッドシート)と DISCORD_BOT_TOKEN のギルド検索で名前から解決します。MVBe 回答は GOOGLE_RESPONSES_MVBE_SPREADSHEET_ID のブック内タブ(既定 フォーム回答_202605以降SHEET_RESPONSES_MVBE で変更可)に 13列・末尾 MVBE_V2 の行として追記されます。ポイント傾斜は 回答者のメイン部署の在籍人数 に基づき、最大人数の部署は 1.0、それ以外は 人数の階層(ユニークな headcount)ごとに [1.5, MVBE_DEPT_WEIGHT_MAX(既定 3)] を等間隔割り当てし、係数・付与ポイントは小数第1位で四捨五入します。

開発・ビルド

cd web
npm run dev      # 開発サーバー(Turbopack)
npm run build    # 本番ビルド
npm run start    # 本番サーバー(build 後)
npm run lint     # ESLint

ブラウザでは開発時は通常 http://localhost:3000 です。

認証について

  • Google アカウントでのログインのみです。初回は /complete-profile で在籍マスタと同じ氏名(漢字)を登録し、DynamoDB に USER#<googleSub>STAFF#<staffId> を保存します(1 職員につき 1 Google アカウント)。誤登録時は管理者画面から紐づけを解除できます。
  • AUTH_GOOGLE_ALLOWED_HOSTED_DOMAINS を設定した場合のみ、該当ドメインの Google アカウントに制限されます。
  • 移行中のみ AUTH_STAFF_LINK_FALLBACK_GOOGLE を有効にすると、Dynamo 未登録ユーザーは従来の Google 表示名でのマスタ自動突合が残ります。

ライセンス・公開範囲

社内向けの前提で開発されている場合が多いため、外部公開時は認証情報・スプレッドシート権限・ホスティング設定を十分に確認してください。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages