【個人開発】当意即妙なツッコミでいいねを獲得せよ

2023/08/20に公開

概要

ツッコミを投稿して、良いツッコミにいいねを投票するWebアプリSOKUMYOを作りました。

https://sokumyo.com/lp

lp

動機:大喜利のツッコミ版を作りたい

今日における「大喜利」は、おおむね「司会者が出す《お題》に対して、複数の回答者が、当意即妙に洒落の利いた回答をして面白さを競う」といった遊び・余興・演目、を指す意味で用いられる語。

https://www.weblio.jp/content/大喜利

大喜利とはボケの腕を競うものともいえますが、ツッコミにも腕が必要です。お笑い芸人の中には切れ味の鋭いツッコミで人気を博している方もいるように、ツッコミが陽の目を見る機会がもっとあっても良いのではないかと思いました。

使い方

DiscordまたはGoogleアカウントが必要です。

初回ログイン

login

選んだ認証プロバイダの認証ページにリダイレクトします(Discordの場合)

discord

プロフィール作成

初回ログインが終わったらプロフィールを作成します。

after login

bio

ボケる

boke

ツッコむ

tsukkomi

自分のツッコミは削除できます。

delete

技術的なこと

T3 Stackで作ってVercelにデプロイしました。DBはPostgresRailwayにデプロイしています。この構成は普段から使っているので特段目新しいことはありませんでした。強いて工夫したところを挙げれば、管理者向け機能を作りました。

管理者専用のAPIの呼び出し時にmiddlewareを挟んで管理者ロールを持っているか判定し、アクセスを制御します。tRPCで以下のように書けます。

trpc.ts
const enforceUserIsAdmin = t.middleware(async ({ ctx, next }) => {
  if (!ctx.session?.user) {
    throw new TRPCError({ code: "UNAUTHORIZED" });
  }
  const profile = await prisma.userProfile.findUnique({
    where: {
      userId: ctx.session.user.id ?? ''
    }
  });

  if (profile?.role === '1') {
    return next({
      ctx: {
        session: { ...ctx.session, user: ctx.session.user },
      },
    });
  } else {
    throw new TRPCError({ code: "FORBIDDEN" });
  }

});

export const adminProcedure = t.procedure.use(enforceUserIsAdmin);

Discussion