Commit 873005dd authored by duanjinfei's avatar duanjinfei

fix cache recommend app data

parent ec0e7219
...@@ -42,34 +42,59 @@ const getTimestampForMidnight3AM = () => { ...@@ -42,34 +42,59 @@ const getTimestampForMidnight3AM = () => {
}; };
Deno.serve(async (req) => { async function cacheAllApp(supabase, allApps, directory, bucketName) {
if (req.method === 'OPTIONS') { // 分页参数
return new Response('ok', { headers: corsHeaders }) const pageSize = 30;
const totalCount = allApps.length;
const paginatedApps = [];
for (let i = 0; i < totalCount; i += pageSize) {
paginatedApps.push(allApps.slice(i, i + pageSize));
} }
try {
// const { name } = await req.json()
const supabase = createClient(
Deno.env.get('SUPABASE_URL') ?? '',
Deno.env.get('SUPABASE_ANON_KEY') ?? '',
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
)
// 获取所有 app 数据
const allApps = await fetchAllData(supabase, 'app');
// 获取当前时间的整点时间戳
const timestamp = getTimestampForMidnight3AM();
// 上传所有 app 数据到 storage // 遍历分页后的数据并上传
const directory = `app-category/${timestamp}`; for (let pageNum = 1; pageNum <= paginatedApps.length; pageNum++) {
const bucketName = 'cache'; // 替换为存储桶名称 const pageApps = paginatedApps[pageNum - 1];
// 分页参数 const pageJson = JSON.stringify({
total_count: totalCount,
apps: pageApps,
});
const pageFileName = `${directory}/app_all_${pageNum}.json`;
const { error: pageUploadError } = await supabase.storage
.from(bucketName)
.upload(pageFileName, new Blob([pageJson]), {
contentType: 'application/json',
upsert: true,
});
if (pageUploadError) {
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError);
}
}
}
async function cacheCategoryApp(supabase, allApps, directory, bucketName) {
// 按 category_id 分组
const groupedData: Record<string, any[]> = {};
allApps.forEach((app) => {
if (!groupedData[app.category_id]) {
groupedData[app.category_id] = [];
}
groupedData[app.category_id].push(app);
});
// 上传每个 category_id 的分页数据
for (const [categoryId, apps] of Object.entries(groupedData)) {
const totalCount = apps.length; // 当前分类的总数
const pageSize = 30; const pageSize = 30;
const totalCount = allApps.length;
const paginatedApps = []; const paginatedApps = [];
for (let i = 0; i < totalCount; i += pageSize) { for (let i = 0; i < totalCount; i += pageSize) {
paginatedApps.push(allApps.slice(i, i + pageSize)); paginatedApps.push(apps.slice(i, i + pageSize));
} }
// 遍历分页后的数据并上传 // 遍历分页数据并上传
for (let pageNum = 1; pageNum <= paginatedApps.length; pageNum++) { for (let pageNum = 1; pageNum <= paginatedApps.length; pageNum++) {
const pageApps = paginatedApps[pageNum - 1]; const pageApps = paginatedApps[pageNum - 1];
const pageJson = JSON.stringify({ const pageJson = JSON.stringify({
...@@ -77,112 +102,135 @@ Deno.serve(async (req) => { ...@@ -77,112 +102,135 @@ Deno.serve(async (req) => {
apps: pageApps, apps: pageApps,
}); });
const pageFileName = `${directory}/app_all_${pageNum}.json`; // 文件名格式:{categoryId}_{pageNum}.json
const categoryPageFileName = `${directory}/${categoryId}_${pageNum}.json`;
const { error: pageUploadError } = await supabase.storage const { error: categoryPageUploadError } = await supabase.storage
.from(bucketName) .from(bucketName)
.upload(pageFileName, new Blob([pageJson]), { .upload(categoryPageFileName, new Blob([pageJson]), {
contentType: 'application/json', contentType: 'application/json',
upsert: true, upsert: true,
}); });
if (pageUploadError) { if (categoryPageUploadError) {
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError); console.error(
return new Response( `Error uploading category ${categoryId} page ${pageNum} JSON:`,
JSON.stringify({ error: `Failed to upload app_all_${pageNum}.json` }), categoryPageUploadError
{ status: 500 }
); );
} }
} }
}
}
const recommandPageSize = 3; async function cacheRecommendApp(supabase, allApps, directory, bucketName) {
const recommandApps = allApps.filter(app => app.recommand > 0); const recommendPageSize = 3;
const recommandTotalCount = recommandApps.length; const recommendApps = allApps.filter(app => app.recommend > 0)
const recommandPaginatedApps = []; .sort((a, b) => b.recommend - a.recommend); // 按 recommend 字段降序排序
for (let i = 0; i < recommandTotalCount; i += recommandPageSize) { const recommendTotalCount = recommendApps.length;
recommandPaginatedApps.push(recommandApps.slice(i, i + recommandPageSize)); const recommendPaginatedApps = [];
} for (let i = 0; i < recommendTotalCount; i += recommendPageSize) {
recommendPaginatedApps.push(recommendApps.slice(i, i + recommendPageSize));
}
// 遍历分页后的数据并上传 // 遍历分页后的数据并上传
for (let pageNum = 1; pageNum <= recommandPageSize.length; pageNum++) { for (let pageNum = 1; pageNum <= recommendPaginatedApps.length; pageNum++) {
const pageApps = recommandPageSize[pageNum - 1]; const pageApps = recommendPaginatedApps[pageNum - 1];
const pageJson = JSON.stringify({
total_count: recommandTotalCount,
apps: pageApps,
});
const pageFileName = `${directory}/app_recommand_${pageNum}.json`; const pageJson = JSON.stringify({
total_count: recommendTotalCount,
apps: pageApps,
});
const { error: pageUploadError } = await supabase.storage const pageFileName = `${directory}/app_recommend_${pageNum}.json`;
.from(bucketName)
.upload(pageFileName, new Blob([pageJson]), {
contentType: 'application/json',
upsert: true,
});
if (pageUploadError) { const { error: pageUploadError } = await supabase.storage
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError); .from(bucketName)
return new Response( .upload(pageFileName, new Blob([pageJson]), {
JSON.stringify({ error: `Failed to upload app_recommand_${pageNum}.json` }), contentType: 'application/json',
{ status: 500 } upsert: true,
); });
}
if (pageUploadError) {
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError);
} else {
console.log(`Uploading page ${pageNum} JSON successful`);
} }
}
}
// 按 category_id 分组 async function cacheTaskCount(supabase, directory, bucketName) {
const groupedData: Record<string, any[]> = {}; const pageFileName = `${directory}/task_count.json`;
allApps.forEach((app) => {
if (!groupedData[app.category_id]) { // // 获取所有任务组 ID
groupedData[app.category_id] = []; // const { data: taskGroupArr, error: groupError } = await supabase
} // .from('task')
groupedData[app.category_id].push(app); // .select('task_group_id');
// if (groupError) {
// console.error("Error fetching task groups:", groupError);
// return;
// }
// // 提取所有任务组 ID
// const groupIds = taskGroupArr.map(group => group.task_group_id);
// // 使用 IN 操作符来一次性查询所有匹配的任务组任务数量
// const { data, error } = await supabase
// .from('taskcenter.task')
// .select('group_id, id', { count: 'exact' })
// .in('group_id', groupIds);
// if (error) {
// console.error("Error fetching task counts:", error);
// return;
// }
const pageJson = JSON.stringify({
total_count: 4,
});
const { error: pageUploadError } = await supabase.storage
.from(bucketName)
.upload(pageFileName, new Blob([pageJson]), {
contentType: 'application/json',
upsert: true,
}); });
// 上传每个 category_id 的分页数据 if (pageUploadError) {
for (const [categoryId, apps] of Object.entries(groupedData)) { console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError);
const totalCount = apps.length; // 当前分类的总数 }
const pageSize = 30; }
const paginatedApps = [];
for (let i = 0; i < totalCount; i += pageSize) {
paginatedApps.push(apps.slice(i, i + pageSize));
}
// 遍历分页数据并上传 Deno.serve(async (req) => {
for (let pageNum = 1; pageNum <= paginatedApps.length; pageNum++) { if (req.method === 'OPTIONS') {
const pageApps = paginatedApps[pageNum - 1]; return new Response('ok', { headers: corsHeaders })
const pageJson = JSON.stringify({ }
total_count: totalCount, try {
apps: pageApps, // const { name } = await req.json()
}); const supabase = createClient(
Deno.env.get('SUPABASE_URL') ?? '',
Deno.env.get('SUPABASE_ANON_KEY') ?? '',
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } }
)
// 获取所有 app 数据
const allApps = await fetchAllData(supabase, 'app');
// 获取当前时间的整点时间戳
const timestamp = getTimestampForMidnight3AM();
// 上传所有 app 数据到 storage
const directory = `app-category/${timestamp}`;
const bucketName = 'cache'; // 替换为存储桶名称
await cacheAllApp(supabase, allApps, directory, bucketName)
await cacheRecommendApp(supabase, allApps, directory, bucketName)
await cacheCategoryApp(supabase, allApps, directory, bucketName)
await cacheTaskCount(supabase, directory, bucketName)
// 文件名格式:{categoryId}_{pageNum}.json
const categoryPageFileName = `${directory}/${categoryId}_${pageNum}.json`;
const { error: categoryPageUploadError } = await supabase.storage
.from(bucketName)
.upload(categoryPageFileName, new Blob([pageJson]), {
contentType: 'application/json',
upsert: true,
});
if (categoryPageUploadError) {
console.error(
`Error uploading category ${categoryId} page ${pageNum} JSON:`,
categoryPageUploadError
);
return new Response(
JSON.stringify({
error: `Failed to upload category ${categoryId} page ${pageNum} JSON`,
}),
{ status: 500 }
);
}
}
}
return new Response( return new Response(
JSON.stringify({ JSON.stringify({
message: 'All data uploaded successfully', message: 'All data uploaded successfully',
fileName: allAppsFileName,
}), }),
{ {
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
...@@ -196,19 +244,4 @@ Deno.serve(async (req) => { ...@@ -196,19 +244,4 @@ Deno.serve(async (req) => {
status: 500, status: 500,
}); });
} }
}) })
\ No newline at end of file
/* To invoke locally:
1. Run `supabase start` (see: https://supabase.com/docs/reference/cli/supabase-start)
2. Make an HTTP request:
curl -i --location --request POST 'http://127.0.0.1:54321/functions/v1/hello-world' \
--header 'Authorization: Bearer ' \
--header 'Content-Type: application/json' \
--data '{"name":"Functions"}'
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment