85 lines
2.6 KiB
TypeScript
85 lines
2.6 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { auth } from "@clerk/nextjs/server";
|
|
import { db } from "@/lib/db";
|
|
import { stories, pages } from "@/lib/schema";
|
|
import { eq, desc, sql } from "drizzle-orm";
|
|
|
|
export async function GET() {
|
|
try {
|
|
const { userId } = await auth();
|
|
|
|
if (!userId) {
|
|
return NextResponse.json(
|
|
{ error: "Authentication required" },
|
|
{ status: 401 }
|
|
);
|
|
}
|
|
|
|
// Get all stories for the user with their pages
|
|
const userStories = await db
|
|
.select({
|
|
id: stories.id,
|
|
title: stories.title,
|
|
slug: stories.slug,
|
|
createdAt: stories.createdAt,
|
|
pageCount: pages.pageNumber,
|
|
coverImage: pages.generatedImageUrl,
|
|
pageCreatedAt: pages.createdAt,
|
|
pageUpdatedAt: pages.updatedAt,
|
|
})
|
|
.from(stories)
|
|
.leftJoin(pages, eq(stories.id, pages.storyId))
|
|
.where(eq(stories.userId, userId));
|
|
|
|
// Group by story and find the max page number, first page image, and most recent update
|
|
const storyMap = new Map();
|
|
|
|
userStories.forEach((row) => {
|
|
const storyId = row.id;
|
|
if (!storyMap.has(storyId)) {
|
|
storyMap.set(storyId, {
|
|
id: row.id,
|
|
title: row.title,
|
|
slug: row.slug,
|
|
createdAt: row.createdAt,
|
|
pageCount: 0,
|
|
coverImage: null,
|
|
lastUpdated: row.createdAt, // Default to story creation date
|
|
});
|
|
}
|
|
|
|
const story = storyMap.get(storyId);
|
|
if (row.pageCount && row.pageCount > story.pageCount) {
|
|
story.pageCount = row.pageCount;
|
|
}
|
|
if (row.pageCount === 1 && row.coverImage) {
|
|
story.coverImage = row.coverImage;
|
|
}
|
|
// Track the most recent page update
|
|
if (row.pageUpdatedAt && row.pageUpdatedAt > story.lastUpdated) {
|
|
story.lastUpdated = row.pageUpdatedAt;
|
|
} else if (row.pageCreatedAt && row.pageCreatedAt > story.lastUpdated) {
|
|
story.lastUpdated = row.pageCreatedAt;
|
|
}
|
|
});
|
|
|
|
const storiesWithCovers = Array.from(storyMap.values());
|
|
|
|
// Sort by most recently updated (stories with newest pages first)
|
|
storiesWithCovers.sort((a, b) => {
|
|
const aTime = new Date(a.lastUpdated).getTime();
|
|
const bTime = new Date(b.lastUpdated).getTime();
|
|
return bTime - aTime; // Most recent first
|
|
});
|
|
|
|
return NextResponse.json({
|
|
stories: storiesWithCovers
|
|
});
|
|
} catch (error) {
|
|
console.error("Error fetching user stories:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to fetch stories" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |