smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
厚生労働省「職業性ストレス簡易調査票(57項目)」準拠のストレスチェックシステムです。判定は合計点数法(B≧77、またはB≧63かつA+C≧76)。Next.js (App Router) + Supabase (Auth / Postgres / RLS) + Vercel で構成された、産業医事務所による複数企業(マルチテナント)運用向けの実装です。 現在の運用では company(事業者担当者)アカウントは発行しません(実施事務従事者に統一)。RLS・スキーマ上のcompanyロールの制御は将来のために残していますが、招待画面のロール選択は 従業員 / 実施事務従事者 のみです。 氏名・社員番号・部署は従業員本人が受検時に入力します(管理者は招待時にメールアドレスと企業のみ指定)。 企業間分離はすべてのRLSポリシーが company_id で行分離しており、企業Aのアカウントから企業Bのデータは1行も取得できません(受け入れテストで自動検証)。README 전문 보기 ↗
厚生労働省「職業性ストレス簡易調査票(57項目)」準拠のストレスチェックシステムです。判定は合計点数法(B≧77、またはB≧63かつA+C≧76)。Next.js (App Router) + Supabase (Auth / Postgres / RLS) + Vercel で構成された、産業医事務所による複数企業(マルチテナント)運用向けの実装です。
| ロール | 想定者 | 個人結果 | 集団分析 | 面接指導申出 | アクセスログ |
|---|---|---|---|---|---|
| office | 産業医事務所 | 全企業・全結果 | 全企業 | 全企業分を閲覧・状態更新 | 閲覧可 |
| jimu | 実施事務従事者(企業ごと) | 自社の全結果 ※誓約必須 | 自社 | 自社分を閲覧・状態更新 | 不可 |
| company | 事業者側担当者 | 自社の同意ありのみ | 自社 | 不可 | 不可 |
| employee | 従業員 | 自分のみ | 不可 | 自分の申出のみ | 不可 |
現在の運用では company(事業者担当者)アカウントは発行しません(実施事務従事者に統一)。RLS・スキーマ上のcompanyロールの制御は将来のために残していますが、招待画面のロール選択は 従業員 / 実施事務従事者 のみです。
氏名・生年月日・部署は従業員本人が受検時に入力します(管理者は招待時にメールアドレスと企業のみ指定)。
企業間分離はすべてのRLSポリシーが company_id で行分離しており、企業Aのアカウントから企業Bのデータは1行も取得できません(受け入れテストで自動検証)。
Supabase SQL Editor で以下を順に実行:
supabase/migrations/0002_production.sql(適用済みの場合はスキップ)supabase/migrations/0003_app_fixes.sql — 必ず実行してください。内容:
auth.users に残したトリガーの削除(これを実行しないとユーザー招待が全件失敗します)consented_resultssupabase/migrations/0004_employee_self_entry.sql — 必ず実行してください。従業員本人が社員番号を入力できるようにする列権限の追加ですinsert into public.profiles (user_id, role, name)
values ('<officeユーザーのUID>', 'office', '植松 太郎');
以後のユーザー(従業員・jimu)は、officeダッシュボードの「ユーザー管理」から招待できます(単発またはCSV一括: メール, 企業コード の2列)。氏名・社員番号・部署は本人が受検時に入力します。
実施事務従事者(jimu)も自社の従業員を招待できます(jimuダッシュボードの「従業員招待」タブ。単発またはメールアドレス1列のCSV一括)。jimuが招待できるのは自社・従業員ロールのみで、他社への招待やjimu/officeロールの発行はAPI側で拒否されます。
個別招待の代わりに、受検用の配布URLで従業員が自己登録する方式が使えます:
/join/<トークン>)を開くと会社名・実施年度が表示され、自分のメールアドレス+パスワードで登録(登録したメールアドレスはログインに必要)環境変数(Settings > Environment Variables):
| 変数 | 用途 | 公開範囲 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | SupabaseプロジェクトURL | クライアント公開(問題なし) |
NEXT_PUBLIC_SUPABASE_ANON_KEY | anonキー(RLS前提の操作のみ) | クライアント公開(問題なし) |
SUPABASE_SERVICE_ROLE_KEY | 招待API・通知API専用 | サーバーのみ。絶対にNEXT_PUBLIC_を付けない |
RESEND_API_KEY | 面接指導申出の通知メール送信 | サーバーのみ |
SENDER_EMAIL | 通知メールの送信元(Resend認証済みドメインのアドレス) | サーバーのみ |
GitHubへのpushで自動デプロイされます。
独自ドメイン(例: check.mestate.jp)の設定手順:
check.mestate.jp を追加cname.vercel-dns.com)をドメインのDNSに追加https://check.mestate.jp と https://check.mestate.jp/auth/callback){アプリURL}/auth/callback を追加通知はアプリ本体(/api/notify-interview)に組み込まれており、Edge FunctionやDatabase Webhookの設定は不要です。Vercelの環境変数に RESEND_API_KEY と SENDER_EMAIL を設定すれば動作します。
# ユニットテスト(スコアリング・年度判定・CSV生成/BOM・CSVパーサ)
npm test
# 受け入れテスト(実Supabaseに対する統合テスト。仕様書7章の1〜6+セキュリティ検証)
SUPABASE_URL=https://xxxx.supabase.co \
SUPABASE_ANON_KEY=eyJ... \
SUPABASE_SERVICE_ROLE_KEY=eyJ... \
npm run test:acceptance
受け入れテストはテスト用の企業・ユーザー・結果を作成して検証し、終了時に削除します(検証用プロジェクトでの実行推奨)。検証項目:
src/
app/
exam/ 従業員: 受検(年度重複時はブロック)
my/ 従業員: 結果・同意変更・面接指導申出
office/ 実施者: 企業横断ダッシュボード(結果/申出/集団分析/招待/ログ)
jimu/ 実施事務従事者: 誓約→自社ダッシュボード
company/ 事業者担当者: 集団分析+同意あり結果
api/invite/ 招待API(service_roleキーをサーバー内でのみ使用)
api/notify-interview/ 面接指導申出の通知メールAPI(Resend)
login, reset-password, account/update-password, auth/callback
components/ 共有UI(結果一覧・申出一覧・集団分析グラフ・招待・ログ)
lib/ スコアリング・年度・CSV・アクセスログ・Supabaseクライアント
supabase/
migrations/ 0002_production.sql(スキーマ+RLS) / 0003・0004(必須の補正)
tests/
unit/ ユニットテスト
acceptance/ 受け入れテスト(実Supabase統合)