2025-11-21 13:36:06 +08:00
|
|
|
import { DEFAULT_LOCALE } from '@/i18n/routing';
|
|
|
|
|
import { BlogPost } from '@/types/blog';
|
|
|
|
|
|
2025-11-21 17:49:17 +08:00
|
|
|
export async function getPosts(locale: string = DEFAULT_LOCALE, category?: string): Promise<{ posts: BlogPost[], total: number }> {
|
|
|
|
|
const Id_Map: Record<string, string> = {
|
|
|
|
|
'announce': '1989174108560080897',
|
|
|
|
|
'news': '1988814504336605185',
|
|
|
|
|
'event': '1989174018231549954',
|
|
|
|
|
}
|
2025-11-21 13:36:06 +08:00
|
|
|
|
2025-11-21 17:49:17 +08:00
|
|
|
let url = 'http://49.232.154.205:18081/export/article/list?pageNum=1&pageSize=10&langCode=' + locale;
|
|
|
|
|
if (category) {
|
|
|
|
|
url += '&categoryId=' + Id_Map[category || 'announce']
|
2025-11-21 13:36:06 +08:00
|
|
|
}
|
|
|
|
|
|
2025-11-21 17:49:17 +08:00
|
|
|
console.log(url);
|
|
|
|
|
|
|
|
|
|
const response = await fetch(url);
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
const posts = data.rows.map((item: any) => {
|
|
|
|
|
return {
|
|
|
|
|
locale, // use locale parameter
|
|
|
|
|
title: item.title,
|
|
|
|
|
description: item.summary,
|
|
|
|
|
image: item.cover || '',
|
|
|
|
|
slug: item.articleId,
|
|
|
|
|
tags: '',
|
|
|
|
|
date: item.publishedTime,
|
|
|
|
|
// visible: data.visible || 'published',
|
|
|
|
|
pin: false,
|
|
|
|
|
content: item.content,
|
|
|
|
|
metadata: data,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}) || [];
|
|
|
|
|
|
|
|
|
|
// // is directory exist
|
|
|
|
|
// if (!fs.existsSync(postsDirectory)) {
|
|
|
|
|
// return { posts: [] };
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// let filenames = await fs.promises.readdir(postsDirectory);
|
|
|
|
|
// filenames = filenames.reverse();
|
2025-11-21 13:36:06 +08:00
|
|
|
|
2025-11-21 17:49:17 +08:00
|
|
|
// let allPosts: BlogPost[] = [];
|
2025-11-21 13:36:06 +08:00
|
|
|
|
|
|
|
|
// read file by batch
|
2025-11-21 17:49:17 +08:00
|
|
|
// for (let i = 0; i < filenames.length; i += POSTS_BATCH_SIZE) {
|
|
|
|
|
// const batchFilenames = filenames.slice(i, i + POSTS_BATCH_SIZE);
|
|
|
|
|
|
|
|
|
|
// const batchPosts: BlogPost[] = await Promise.all(
|
|
|
|
|
// batchFilenames.map(async (filename) => {
|
|
|
|
|
// const fullPath = path.join(postsDirectory, filename);
|
|
|
|
|
// const fileContents = await fs.promises.readFile(fullPath, 'utf8');
|
|
|
|
|
|
|
|
|
|
// const { data, content } = matter(fileContents);
|
|
|
|
|
|
|
|
|
|
// return {
|
|
|
|
|
// locale, // use locale parameter
|
|
|
|
|
// title: data.title,
|
|
|
|
|
// description: data.description,
|
|
|
|
|
// image: data.image || '',
|
|
|
|
|
// slug: data.slug,
|
|
|
|
|
// tags: data.tags,
|
|
|
|
|
// date: data.date,
|
|
|
|
|
// visible: data.visible || 'published',
|
|
|
|
|
// pin: data.pin || false,
|
|
|
|
|
// content,
|
|
|
|
|
// metadata: data,
|
|
|
|
|
// };
|
|
|
|
|
// })
|
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
// allPosts.push(...batchPosts);
|
|
|
|
|
// }
|
2025-11-21 13:36:06 +08:00
|
|
|
|
|
|
|
|
// filter out non-published articles
|
2025-11-21 17:49:17 +08:00
|
|
|
// allPosts = allPosts.filter(post => post.visible === 'published');
|
2025-11-21 13:36:06 +08:00
|
|
|
|
|
|
|
|
// sort posts by pin and date
|
2025-11-21 17:49:17 +08:00
|
|
|
// allPosts = allPosts.sort((a, b) => {
|
|
|
|
|
// if (a.pin !== b.pin) {
|
|
|
|
|
// return (b.pin ? 1 : 0) - (a.pin ? 1 : 0);
|
|
|
|
|
// }
|
|
|
|
|
// return new Date(b.date).getTime() - new Date(a.date).getTime();
|
|
|
|
|
// });
|
2025-11-21 13:36:06 +08:00
|
|
|
|
|
|
|
|
return {
|
2025-11-21 17:49:17 +08:00
|
|
|
posts,
|
|
|
|
|
total: data.total,
|
2025-11-21 13:36:06 +08:00
|
|
|
};
|
|
|
|
|
}
|