Open20

アプリ作成記録

おにおに

ポートフォリオ制作のアプリをスクラップで残していく予定。
Figmaである程度のワイヤーは出来上がったのでまずは環境構築から。

おにおに

技術選定は以下の通り

フロントエンド

  • TypeScript
  • React
  • Next.js

バックエンド

  • Supabase

ORM

  • Prisma

コード解析

  • ESLint

フォーマッター

  • Prettier

CSSフレームワーク

  • TailwindCSS
  • shadcn/ui

インフラ・CI / CD

  • Vercel

テスト

  • Jest
おにおに

gitのcommitにルールを設けたいので調べてみる

おにおに

上記の記事の内容に沿いつつ、ChatGPTですぐに生成できるようにした。

chore: 🔧 #456 プロダクションに影響のないタスクファイルの修正
docs: 📚 #789 READMEファイルの更新
feat: ✨ #123 新しいログイン機能の追加
fix: 🐛 #234 ログインバグの修正
refactor: ♻️ #345 コードのリファクタリング
style: 💄 #567 コードフォーマットの修正
test: ✅ #678 テストコードの追加と修正

おにおに

tsconfig.jsonを下記のURLから一部引用して修正
https://zenn.dev/yoshinoki/articles/next-ts-tailwind-setting


tsconfig.json
{
  "compilerOptions": {
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
+   "forceConsistentCasingInFileNames": true,
+   "noImplicitReturns": true,
+   "noUncheckedIndexedAccess": true,
    "plugins": [
      {
        "name": "next"
      }
    ],
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
  "exclude": ["node_modules"]
}
おにおに
  • prettierとESLint周りの設定を追加
  • markuplintの追加
  • husky, lint-stagedの追加
おにおに

markuplint

  • コマンド経由のリントだと通るけど、拡張機能側のリントが通らない
  • jsx-parserが見つからないとerrorでるけどインストールしてる

時間かかりそうなのでとりあえず放置

おにおに

公式のAuth認証を参考にGitHub認証を実装
https://supabase.com/docs/guides/auth/social-login/auth-github

おにおに

認証後にアカウント情報を紐づけて登録させたいので、PrizmaでSupabaseにusersとprofilesテーブルを作成して、usersとauth.usersを紐づける。
手順としては以下の通りにする予定

  1. GitHub認証を実装
  2. Prizmaを利用してprofiles, usersテーブルを作成してマイグレーションを行う
  3. supabaseで作成したusersテーブルとauth.usersを連携
  4. React Hook FormとZodを利用してアカウント作成用フォームを作成
  5. 作成したフォームとprofileテーブルの連携
  6. 認証後にアカウント作成が済んでいるかどうかをチェックする実装を行う

ひとまずできるかどうかが曖昧なのでひとつずつ実践していく。

おにおに
  • 初回のマイグレーション処理などにはsesstionモードを、CRUD処理にはTranscationモードを利用する
    • 今回はマイグレーションなのでSessionモードを利用してマイグレーションを行う
# Transactionモード(アプリケーション用)
DATABASE_URL="postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:6543/[db-name]?pgbouncer=true&connection_limit=1"

# Sessionモード(マイグレーション用)
MIGRATION_DATABASE_URL="postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:5432/[db-name]"
おにおに

設定後マイグレーションを実行

npx prisma migrate dev --name init

完了するとSupabase側にテーブルが作成される。

おにおに

SQLエディターで以下を実行

-- 既存のトリガーを削除
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;

-- トリガー関数を作成
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS trigger AS $$
BEGIN
  INSERT INTO public.users (id, email, created_at, updated_at)
  VALUES (NEW.id, NEW.email, NEW.created_at, NEW.updated_at);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public;

-- 新しいトリガーを作成
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();

トリガー関数の中身はテーブルで利用するカラムに合わせて適宜修正を行う必要がある。
実行後、GitHub認証でサインアップされた場合に自動的にpublic.usersにもユーザーが登録される。

参考

https://zenn.dev/matken/articles/use-user-info-with-supabase
https://qiita.com/Naoya_pro/items/a2eb6bd5b076a5ae06df