From b3a1fb547c28e89ec435b8b039c41daec3f58ab7 Mon Sep 17 00:00:00 2001 From: "Yuito Akatsuki (Tani Yutaka)" Date: Tue, 18 Feb 2025 19:21:00 +0900 Subject: [PATCH 1/8] Improve User Experience (#76) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve club data retrieval and API authentication handling (#74) * :recycle: クラブ一覧のデータ取得を改善し、非同期処理を統合 * API認証処理を改善し、セッションがない場合にAPIキーからメールアドレスを復号化してセッションを設定 * :recycle: クラブ検索の非同期処理を改善 * デフォルト値の設定 * クリーンアップ * ワークフローのブランチ設定を追加し、sandboxおよびdevブランチでのプルリクエストとプッシュをサポート * GitHub Actionsを活用したタグワークフローを追加 (#75) --- .github/workflows/Tagger.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Tagger.yaml b/.github/workflows/Tagger.yaml index 1f32760..8faefa0 100644 --- a/.github/workflows/Tagger.yaml +++ b/.github/workflows/Tagger.yaml @@ -54,5 +54,4 @@ jobs: run: | git push --follow-tags --force git push --force - env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 06ad87ab24c7bf172b781133e9ba638286e650a0 Mon Sep 17 00:00:00 2001 From: yuito-it Date: Tue, 18 Feb 2025 20:14:35 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Tagger.yaml=E3=81=A7git=20push=E3=82=B3?= =?UTF-8?q?=E3=83=9E=E3=83=B3=E3=83=89=E3=81=AB--force=E3=82=AA=E3=83=97?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Tagger.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tagger.yaml b/.github/workflows/Tagger.yaml index 8faefa0..1f32760 100644 --- a/.github/workflows/Tagger.yaml +++ b/.github/workflows/Tagger.yaml @@ -54,4 +54,5 @@ jobs: run: | git push --follow-tags --force git push --force + env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 440f8d96a3ebfcf2ae738dfb6eb11c9a91e17801 Mon Sep 17 00:00:00 2001 From: yuito-it Date: Tue, 18 Feb 2025 20:36:39 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Tagger.yaml=E3=81=A7Git=E3=81=AEcheckout?= =?UTF-8?q?=E3=82=B9=E3=83=86=E3=83=83=E3=83=97=E3=81=ABGITHUB=5FTOKEN?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Tagger.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tagger.yaml b/.github/workflows/Tagger.yaml index 1f32760..d598eab 100644 --- a/.github/workflows/Tagger.yaml +++ b/.github/workflows/Tagger.yaml @@ -40,6 +40,7 @@ jobs: - uses: actions/checkout@v4 with: token: ${{ steps.generate-token.outputs.token }} + token: ${{ secrets.GITHUB_TOKEN }} - name: Set up Git run: | git config user.name "NPM Versioner" From d8577f7dad6f08fd8b866f714499d5bab4000293 Mon Sep 17 00:00:00 2001 From: yuito-it Date: Tue, 18 Feb 2025 20:45:17 +0900 Subject: [PATCH 4/8] =?UTF-8?q?Tagger.yaml=E3=81=A7checkout=E3=82=B9?= =?UTF-8?q?=E3=83=86=E3=83=83=E3=83=97=E3=81=AE=E3=83=88=E3=83=BC=E3=82=AF?= =?UTF-8?q?=E3=83=B3=E3=82=92ID=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Tagger.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/Tagger.yaml b/.github/workflows/Tagger.yaml index d598eab..1f32760 100644 --- a/.github/workflows/Tagger.yaml +++ b/.github/workflows/Tagger.yaml @@ -40,7 +40,6 @@ jobs: - uses: actions/checkout@v4 with: token: ${{ steps.generate-token.outputs.token }} - token: ${{ secrets.GITHUB_TOKEN }} - name: Set up Git run: | git config user.name "NPM Versioner" From 93c70717c2675da22c5481c5a22b393c4674fe10 Mon Sep 17 00:00:00 2001 From: yuito-it Date: Fri, 21 Feb 2025 20:54:04 +0900 Subject: [PATCH 5/8] =?UTF-8?q?:sparkles:=20=E3=82=AF=E3=83=A9=E3=83=96?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E5=8F=96=E5=BE=97=E6=99=82=E3=81=AE=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0=E3=82=92=E6=94=B9=E5=96=84=E3=81=97=E3=80=81=E3=83=A1?= =?UTF-8?q?=E3=82=BF=E3=83=87=E3=83=BC=E3=82=BF=E7=94=9F=E6=88=90=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/clubs/[id]/route.ts | 6 ++- src/app/clubs/[...slug]/page.tsx | 68 ++++++++++++++++++++++++++++++-- src/components/clubPage/main.tsx | 25 ------------ src/lib/server/club.ts | 3 +- 4 files changed, 72 insertions(+), 30 deletions(-) diff --git a/src/app/api/clubs/[id]/route.ts b/src/app/api/clubs/[id]/route.ts index 937ceab..e3d464d 100644 --- a/src/app/api/clubs/[id]/route.ts +++ b/src/app/api/clubs/[id]/route.ts @@ -10,7 +10,11 @@ const endpoint = process.env.DB_API_ENDPOINT; export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) { const { id } = await params; const clubRes = await fetch(`${endpoint}/clubs/${id}`); - if (clubRes.status !== 200) return NextResponse.json({ status: clubRes.status }); + if (clubRes.status !== 200) + return NextResponse.json( + { status: clubRes.status, message: clubRes.statusText }, + { status: clubRes.status } + ); const clubData = (await clubRes.json()) as Club; const session = await auth(); const apiKey = request.headers.get("X-Api-Key"); diff --git a/src/app/clubs/[...slug]/page.tsx b/src/app/clubs/[...slug]/page.tsx index 3bfccb1..68018d6 100644 --- a/src/app/clubs/[...slug]/page.tsx +++ b/src/app/clubs/[...slug]/page.tsx @@ -1,14 +1,76 @@ import { notFound, unauthorized } from "next/navigation"; - import ClubPage from "@/components/clubPage/main"; import EditClub from "@/components/clubPage/edit"; import { auth } from "@/auth"; - import { Suspense } from "react"; import { CircularProgress, Stack, Typography } from "@mui/material"; import { headers } from "next/headers"; +import Club from "@/models/Club"; +import CryptoJS from "crypto-js"; +import { Metadata } from "next"; +import { metadata as notFoundMetadata } from "@/app/not-found"; +import { metadata as forbiddenMetadata } from "@/app/forbidden"; +import { metadata as unauthorizedMetadata } from "@/app/unauthorized"; + +export async function generateMetadata({ params }: { params: Promise<{ slug: string[] }> }) { + const session = await auth(); + const slug = (await params).slug; + const fetchOption = { + method: "GET", + headers: { + "Content-Type": "application/json", + "X-Api-Key": CryptoJS.AES.encrypt( + session?.user?.email || "No Auth", + process.env.API_ROUTE_SECRET as string + ).toString(), + }, + }; + const headersData = await headers(); + const host = headersData.get("host"); + const protocol = + headersData.get("x-forwarded-proto") ?? host?.startsWith("localhost") ? "http" : "https"; + const apiBase = `${protocol}://${host}`; + const res = await fetch(`${apiBase}/api/clubs/${slug[0]}`, fetchOption); + if (res.status == 401) return unauthorizedMetadata; + if (res.status == 404) return notFoundMetadata; + if (res.status == 403) return forbiddenMetadata; + const club = (await res.json()) as Club; + switch (slug[1]) { + case "edit": + if (session?.user?.email && club.owner?.includes(session?.user?.email)) { + return { + title: `同好会編集ページ - 同好会ポータル Linkle`, + description: "同好会の情報を編集します。", + } as Metadata; + } + return forbiddenMetadata; + case undefined: + return { + title: `${club.name} - 同好会ポータル Linkle`, + description: club.short_description, + openGraph: { + title: club.name, + description: club.short_description, + type: "website", + url: `${apiBase}/clubs/${slug[0]}`, + image: club.image, + siteName: "同好会ポータル Linkle", + locale: "ja_JP", + }, + twitter: { + site: "@UniPro_digital", + cardType: "summary_large_image", + title: club.name, + description: club.short_description, + image: club.image, + }, + } as Metadata; + default: + return notFoundMetadata; + } +} -export default async function Page({ params }: { params: Promise<{ slug: string }> }) { +export default async function Page({ params }: { params: Promise<{ slug: string[] }> }) { const headersData = await headers(); const host = headersData.get("host"); const protocol = diff --git a/src/components/clubPage/main.tsx b/src/components/clubPage/main.tsx index 6c20501..04e78c5 100644 --- a/src/components/clubPage/main.tsx +++ b/src/components/clubPage/main.tsx @@ -8,8 +8,6 @@ import { LongDescription } from "./md"; import { use } from "react"; import { getClubById } from "@/lib/server/club"; import { forbidden, notFound, unauthorized } from "next/navigation"; -import UpdateMetadata from "@/components/TitleChange"; -import { Metadata } from "next"; export default function Club({ id, @@ -26,29 +24,6 @@ export default function Club({ if (club == "unauthorized") unauthorized(); return ( <> - {typeof club == "string" && ( { diff --git a/src/lib/server/club.ts b/src/lib/server/club.ts index 77de6fc..5698fff 100644 --- a/src/lib/server/club.ts +++ b/src/lib/server/club.ts @@ -23,7 +23,8 @@ export const getClubById = async ( }); if (res.status == 403) return "forbidden"; const club = (await res.json()) as Club; - if (!club) return "notfound"; + if (res.status == 401) return "unauthorized"; + if (!club || res.status == 404) return "notfound"; return club; } catch (e) { throw new Error(e as string); From 6a3a65de040e86cfe0ad54857a935981485b2d45 Mon Sep 17 00:00:00 2001 From: NPM Versioner <188119480+npm-versioner[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:06:18 +0000 Subject: [PATCH 6/8] 2.2.0-alpha.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 01a5f26..bf07d75 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkle", - "version": "2.1.14", + "version": "2.2.0-alpha.0", "private": true, "scripts": { "dev": "next dev --turbopack", From 9a05ad68bb43820e248c856eb0168ddf07d5521a Mon Sep 17 00:00:00 2001 From: yuito-it Date: Fri, 21 Feb 2025 21:33:06 +0900 Subject: [PATCH 7/8] =?UTF-8?q?:bug:=20=E3=83=A1=E3=82=BF=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E7=94=9F=E6=88=90=E6=99=82=E3=81=AE=E7=94=BB?= =?UTF-8?q?=E5=83=8F=E3=83=97=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=81=97=E3=80=81'image'=E3=82=92'images'?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/clubs/[...slug]/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/clubs/[...slug]/page.tsx b/src/app/clubs/[...slug]/page.tsx index 68018d6..982a321 100644 --- a/src/app/clubs/[...slug]/page.tsx +++ b/src/app/clubs/[...slug]/page.tsx @@ -53,7 +53,7 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str description: club.short_description, type: "website", url: `${apiBase}/clubs/${slug[0]}`, - image: club.image, + images: club.image, siteName: "同好会ポータル Linkle", locale: "ja_JP", }, @@ -62,7 +62,7 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str cardType: "summary_large_image", title: club.name, description: club.short_description, - image: club.image, + images: club.image, }, } as Metadata; default: From 6704a19874a8f7240130854e7b60efd3127b5e08 Mon Sep 17 00:00:00 2001 From: NPM Versioner <188119480+npm-versioner[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:03:14 +0000 Subject: [PATCH 8/8] 2.2.0-alpha.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf07d75..2091c7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkle", - "version": "2.2.0-alpha.0", + "version": "2.2.0-alpha.1", "private": true, "scripts": { "dev": "next dev --turbopack",