Back to News
Next.jsSupabase開発記録Claude Code

お気に入り機能を追加しました - ブログ記事やアプリを保存できるように

お気に入り機能を追加しました

メンバーシップ機能の実装に続いて、お気に入り機能を追加しました。

「あの記事、あとで読み返したい」 「このアプリ、また使いたい」

そんなときに、ハートボタンをクリックするだけで保存できます。

できること

  • ブログ記事やアプリの詳細ページでハートボタンをクリック
  • クリックするとお気に入りに追加、もう一度クリックで解除
  • ダッシュボードでお気に入り一覧を確認
  • メンバー限定コンテンツもお気に入り可能
  • 未ログインの場合はサインインページへ誘導

技術的な仕組み

データベース(Supabase)

favoritesテーブルを新設しました。

CREATE TABLE favorites (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  user_email TEXT NOT NULL REFERENCES memberships(email),
  content_type TEXT NOT NULL,  -- 'blog', 'app' など
  content_slug TEXT NOT NULL,  -- 記事やアプリのslug
  created_at TIMESTAMPTZ DEFAULT NOW(),
  UNIQUE(user_email, content_type, content_slug)
);

ポイントはUNIQUE制約。同じユーザーが同じコンテンツを重複登録できないようにしています。

API Routes(Next.js)

お気に入りの操作は/api/favoritesエンドポイントで処理します。

  • POST - お気に入り追加
  • DELETE - お気に入り解除
  • GET - お気に入り状態チェック

いずれもNextAuthのセッションで認証チェックを行い、未ログインユーザーのリクエストは401で拒否します。

FavoriteButton(React Client Component)

ハートボタンはClient Componentとして実装。ページ読み込み時にAPIでお気に入り状態を取得し、クリックで追加/解除をトグルします。

設置場所

4種類の詳細ページにボタンを配置しました:

  • ブログ記事 - Share欄の横
  • アプリ紹介 - タイトル下
  • メンバー限定ブログ - 日付の横
  • メンバー限定ツール - 説明文の下

ダッシュボードでは、お気に入り一覧がリンク付きで表示されます。

一覧ページのハートマーク表示

詳細ページのボタンだけでなく、一覧ページでもお気に入り状態がひと目でわかるようにしました。

ブログ一覧・アプリ一覧・メンバー限定ブログ一覧・メンバー限定ツール一覧の各カード右上に、お気に入り済みのコンテンツには赤いハートアイコンが表示されます。

これにより、一覧を眺めるだけで「どれをお気に入りにしたか」がすぐにわかります。

技術的には、各一覧ページのServer Componentでユーザーのお気に入り情報をサーバーサイドで取得し、カードコンポーネントにisFavoritedプロパティとして渡しています。APIリクエストなしでページ描画時にハートが表示されるので、表示も高速です。

Claude Codeとの開発

今回もClaude Codeに実装を任せました。

  • SQLスキーマ設計
  • CRUD関数(lib/favorites.ts
  • APIエンドポイント
  • FavoriteButtonコンポーネント
  • 4つの詳細ページへの配置
  • ダッシュボードへの一覧追加
  • 一覧ページへのハートマーク表示対応

これだけの実装が、指示から数分で完了。ビルド確認まで含めてもすぐにデプロイできました。

まとめ

お気に入り機能は小さな機能ですが、「また見返したい」を簡単にできるのは地味に便利です。一覧ページのハートマークのおかげで、お気に入りしたコンテンツを見失うこともありません。

ぜひサインインして、気になる記事やアプリをお気に入り登録してみてください。ダッシュボードからいつでもアクセスできます。