Skip to content

Commit dc390f1

Browse files
committed
chore: ui fix
1 parent 04a0c19 commit dc390f1

3 files changed

Lines changed: 40 additions & 22 deletions

File tree

apps/web/src/app/api/newsletters/[slug]/route.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,25 @@ import { createAuthenticatedClient } from "@/lib/trpc-server";
99

1010
// Configure marked for rich markdown support
1111
marked.setOptions({
12-
gfm: true, // GitHub Flavored Markdown: tables, task lists, etc.
13-
breaks: true, // Line breaks
12+
gfm: true, // GitHub Flavored Markdown: tables, task lists, etc.
13+
breaks: true, // Line breaks
1414
});
1515

1616
// Cache individual newsletters
1717
const newsletterCache = new Map<string, { data: any; time: number }>();
18-
const CACHE_DURATION = 60_000; // 1 minute
18+
// cache longer in production since newsletter content changes infrequently
19+
const CACHE_DURATION =
20+
process.env.NODE_ENV === "production"
21+
? 3600000
22+
: 60000;
1923

2024
export async function GET(
2125
_request: Request,
2226
{ params }: { params: Promise<{ slug: string }> }
2327
) {
2428
// Authenticate user
2529
const session = await getServerSession(authConfig);
26-
30+
2731
if (!session || !session.user?.email) {
2832
return NextResponse.json(
2933
{ error: "Unauthorized - Please sign in" },
@@ -34,8 +38,10 @@ export async function GET(
3438
// Verify paid subscription
3539
try {
3640
const trpc = createAuthenticatedClient(session);
37-
const subscriptionStatus = await (trpc.user as any).subscriptionStatus.query();
38-
41+
const subscriptionStatus = await (
42+
trpc.user as any
43+
).subscriptionStatus.query();
44+
3945
if (!subscriptionStatus.isPaidUser) {
4046
return NextResponse.json(
4147
{ error: "Forbidden - Premium subscription required" },
@@ -63,7 +69,10 @@ export async function GET(
6369

6470
try {
6571
if (!fs.existsSync(filePath)) {
66-
return NextResponse.json({ error: "Newsletter not found" }, { status: 404 });
72+
return NextResponse.json(
73+
{ error: "Newsletter not found" },
74+
{ status: 404 }
75+
);
6776
}
6877

6978
const fileContent = fs.readFileSync(filePath, "utf8");
@@ -84,6 +93,9 @@ export async function GET(
8493
return NextResponse.json(result);
8594
} catch (error) {
8695
console.error("Error reading newsletter:", error);
87-
return NextResponse.json({ error: "Newsletter not found" }, { status: 404 });
96+
return NextResponse.json(
97+
{ error: "Newsletter not found" },
98+
{ status: 404 }
99+
);
88100
}
89101
}

apps/web/src/app/api/newsletters/route.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ import { createAuthenticatedClient } from "@/lib/trpc-server";
99
// Cache newsletters in memory for faster subsequent loads
1010
let cachedNewsletters: any[] | null = null;
1111
let lastCacheTime = 0;
12-
const CACHE_DURATION = 60000;
12+
// cache longer in production since newsletter content changes infrequently
13+
const CACHE_DURATION =
14+
process.env.NODE_ENV === "production"
15+
? 3600000 // 1 hour in production
16+
: 60000; // 1 minute in dev
1317

1418
export async function GET() {
1519
// Authenticate user
1620
const session = await getServerSession(authConfig);
17-
21+
1822
if (!session || !session.user?.email) {
1923
return NextResponse.json(
2024
{ error: "Unauthorized - Please sign in" },
@@ -25,8 +29,10 @@ export async function GET() {
2529
// Verify paid subscription
2630
try {
2731
const trpc = createAuthenticatedClient(session);
28-
const subscriptionStatus = await (trpc.user as any).subscriptionStatus.query();
29-
32+
const subscriptionStatus = await (
33+
trpc.user as any
34+
).subscriptionStatus.query();
35+
3036
if (!subscriptionStatus.isPaidUser) {
3137
return NextResponse.json(
3238
{ error: "Forbidden - Premium subscription required" },
@@ -42,29 +48,29 @@ export async function GET() {
4248
}
4349

4450
const now = Date.now();
45-
51+
4652
// Return cached data if available and fresh
4753
if (cachedNewsletters && now - lastCacheTime < CACHE_DURATION) {
4854
return NextResponse.json(cachedNewsletters);
4955
}
5056

5157
const newslettersDir = path.join(process.cwd(), "src/content/newsletters");
52-
58+
5359
try {
5460
if (!fs.existsSync(newslettersDir)) {
5561
fs.mkdirSync(newslettersDir, { recursive: true });
5662
return NextResponse.json([]);
5763
}
5864

5965
const files = fs.readdirSync(newslettersDir);
60-
66+
6167
const newsletters = files
6268
.filter((file) => file.endsWith(".md"))
6369
.map((file) => {
6470
const filePath = path.join(newslettersDir, file);
6571
const fileContent = fs.readFileSync(filePath, "utf8");
6672
const { data } = matter(fileContent);
67-
73+
6874
return {
6975
id: file.replace(".md", ""),
7076
title: data.title || "Untitled",
@@ -75,11 +81,11 @@ export async function GET() {
7581
};
7682
})
7783
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
78-
84+
7985
// Update cache
8086
cachedNewsletters = newsletters;
8187
lastCacheTime = now;
82-
88+
8389
return NextResponse.json(newsletters);
8490
} catch (error) {
8591
console.error("Error reading newsletters:", error);

apps/web/src/components/dashboard/Sidebar.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const PREMIUM_ROUTES: RouteConfig[] = [
6565
path: "/dashboard/newsletters",
6666
label: "Newsletter",
6767
icon: <NewspaperIcon className="size-5" />,
68-
badge: "New"
68+
badge: "New",
6969
},
7070
];
7171

@@ -188,7 +188,7 @@ export default function Sidebar({ overlay = false }: { overlay?: boolean }) {
188188
{route.label}
189189
</h1>
190190
{route.badge && (
191-
<span className="px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-brand-purple rounded border border-brand-purple/30 shrink-0">
191+
<span className="px-1.5 py-0.5 text-[8px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-text-primary rounded border border-brand-purple/30 shrink-0">
192192
{route.badge}
193193
</span>
194194
)}
@@ -318,7 +318,7 @@ export default function Sidebar({ overlay = false }: { overlay?: boolean }) {
318318
{route.label}
319319
</h1>
320320
{route.badge && (
321-
<span className="px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-brand-purple rounded border border-brand-purple/30 shrink-0">
321+
<span className="px-1.5 py-0.5 text-[8px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-text-primary rounded border border-brand-purple/30 shrink-0">
322322
{route.badge}
323323
</span>
324324
)}
@@ -362,7 +362,7 @@ export default function Sidebar({ overlay = false }: { overlay?: boolean }) {
362362
{route.label}
363363
</h1>
364364
{route.badge && (
365-
<span className="px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-brand-purple rounded border border-brand-purple/30 shrink-0 opacity-75">
365+
<span className="px-1.5 py-0.5 text-[8px] font-semibold uppercase tracking-wider bg-brand-purple/20 text-text-primary rounded border border-brand-purple/30 shrink-0 opacity-75">
366366
{route.badge}
367367
</span>
368368
)}

0 commit comments

Comments
 (0)