refactor: update environment variable usage and add caching

This commit is contained in:
2025-02-23 14:20:23 +01:00
parent bdc2b42f27
commit 23a145b37e
6 changed files with 72 additions and 16 deletions

View File

@@ -11,8 +11,8 @@ export async function POST(request: NextRequest) {
}; };
const { email, name, message } = body; const { email, name, message } = body;
const user = process.env.NEXT_PUBLIC_MY_EMAIL ?? ""; const user = process.env.MY_EMAIL ?? "";
const pass = process.env.NEXT_PUBLIC_MY_PASSWORD ?? ""; const pass = process.env.MY_PASSWORD ?? "";
if (!user || !pass) { if (!user || !pass) {
console.error("Missing email/password environment variables"); console.error("Missing email/password environment variables");

View File

@@ -1,25 +1,54 @@
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import http from "http";
import fetch from "node-fetch";
import NodeCache from "node-cache";
export const runtime = "nodejs"; // Force Node runtime export const runtime = "nodejs"; // Force Node runtime
const GHOST_API_URL = process.env.NEXT_PUBLIC_GHOST_API_URL; const GHOST_API_URL = process.env.GHOST_API_URL;
const GHOST_API_KEY = process.env.NEXT_PUBLIC_GHOST_API_KEY; const GHOST_API_KEY = process.env.GHOST_API_KEY;
const cache = new NodeCache({ stdTTL: 300 }); // Cache für 5 Minuten
type GhostPost = {
slug: string;
id: string;
title: string;
feature_image: string;
visibility: string;
published_at: string;
updated_at: string;
html: string;
reading_time: number;
meta_description: string;
};
type GhostPostsResponse = {
posts: Array<GhostPost>;
};
export async function GET() { export async function GET() {
const cacheKey = "ghostPosts";
const cachedPosts = cache.get<GhostPostsResponse>(cacheKey);
if (cachedPosts) {
return NextResponse.json(cachedPosts);
}
try { try {
const agent = new http.Agent({ keepAlive: true });
const response = await fetch( const response = await fetch(
`${GHOST_API_URL}/ghost/api/content/posts/?key=${GHOST_API_KEY}&limit=all`, `${GHOST_API_URL}/ghost/api/content/posts/?key=${GHOST_API_KEY}&limit=all`,
{ agent: agent as unknown as undefined }
); );
if (!response.ok) { const posts: GhostPostsResponse = await response.json() as GhostPostsResponse;
console.error(`Failed to fetch posts: ${response.statusText}`);
return NextResponse.json([]);
}
const posts = await response.json();
if (!posts || !posts.posts) { if (!posts || !posts.posts) {
console.error("Invalid posts data"); console.error("Invalid posts data");
return NextResponse.json([]); return NextResponse.json([]);
} }
cache.set(cacheKey, posts); // Daten im Cache speichern
return NextResponse.json(posts); return NextResponse.json(posts);
} catch (error) { } catch (error) {
console.error("Failed to fetch posts from Ghost:", error); console.error("Failed to fetch posts from Ghost:", error);

View File

@@ -2,8 +2,8 @@ import { NextResponse } from "next/server";
export const runtime = "nodejs"; // Force Node runtime export const runtime = "nodejs"; // Force Node runtime
const GHOST_API_URL = process.env.NEXT_PUBLIC_GHOST_API_URL; const GHOST_API_URL = process.env.GHOST_API_URL;
const GHOST_API_KEY = process.env.NEXT_PUBLIC_GHOST_API_KEY; const GHOST_API_KEY = process.env.GHOST_API_KEY;
export async function GET(request: Request) { export async function GET(request: Request) {
const { searchParams } = new URL(request.url); const { searchParams } = new URL(request.url);

View File

@@ -7,11 +7,15 @@ dotenv.config({ path: path.resolve(__dirname, '.env') });
const nextConfig: NextConfig = { const nextConfig: NextConfig = {
env: { env: {
NEXT_PUBLIC_GHOST_API_KEY: process.env.NEXT_PUBLIC_GHOST_API_KEY, NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL
NEXT_PUBLIC_GHOST_API_URL: process.env.NEXT_PUBLIC_GHOST_API_URL, },
NEXT_PUBLIC_MY_EMAIL: process.env.NEXT_PUBLIC_MY_EMAIL, serverRuntimeConfig: {
NEXT_PUBLIC_MY_PASSWORD: process.env.NEXT_PUBLIC_MY_PASSWORD, GHOST_API_URL: process.env.GHOST_API_URL,
NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL, GHOST_API_KEY: process.env.GHOST_API_KEY,
MY_EMAIL: process.env.MY_EMAIL,
MY_INFO_EMAIL: process.env.MY_INFO_EMAIL,
MY_PASSWORD: process.env.MY_PASSWORD,
MY_INFO_PASSWORD: process.env.MY_INFO_PASSWORD
}, },
}; };

22
package-lock.json generated
View File

@@ -15,6 +15,7 @@
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"gray-matter": "^4.0.3", "gray-matter": "^4.0.3",
"next": "15.1.7", "next": "15.1.7",
"node-cache": "^5.1.2",
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2",
"nodemailer": "^6.10.0", "nodemailer": "^6.10.0",
"react": "^19.0.0", "react": "^19.0.0",
@@ -3631,6 +3632,15 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/co": { "node_modules/co": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -8039,6 +8049,18 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/node-cache": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
"integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
"license": "MIT",
"dependencies": {
"clone": "2.x"
},
"engines": {
"node": ">= 8.0.0"
}
},
"node_modules/node-domexception": { "node_modules/node-domexception": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",

View File

@@ -18,6 +18,7 @@
"dotenv": "^16.4.7", "dotenv": "^16.4.7",
"gray-matter": "^4.0.3", "gray-matter": "^4.0.3",
"next": "15.1.7", "next": "15.1.7",
"node-cache": "^5.1.2",
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2",
"nodemailer": "^6.10.0", "nodemailer": "^6.10.0",
"react": "^19.0.0", "react": "^19.0.0",