Commit c26205b1 authored by duanjinfei's avatar duanjinfei

fix bug

parent 873005dd
// Follow this setup guide to integrate the Deno language server with your editor:
// https://deno.land/manual/getting_started/setup_your_environment
// This enables autocomplete, go to definition, etc.
// Setup type definitions for built-in Supabase Runtime APIs
import "jsr:@supabase/functions-js/edge-runtime.d.ts"
import { createClient } from 'jsr:@supabase/supabase-js@2'
// 分页查询函数
async function fetchAllData(supabase, table: string, pageSize: number = 1000) {
let allData: any[] = [];
let offset = 0;
while (true) {
const { data, error } = await supabase
.from(table)
.select('*') // 可以根据需要调整字段
.gt('is_show_num', 0)
// .eq('is_show', 1)
.order('created_at', { ascending: true }) // 按照创建时间排序
.range(offset, offset + pageSize - 1); // 分页范围
if (error) {
console.error(`Error fetching data from ${table}:`, error);
throw error;
}
if (data && data.length > 0) {
allData = allData.concat(data); // 合并当前页数据
offset += pageSize; // 移动到下一页
} else {
break; // 如果没有更多数据,则退出循环
}
}
return allData;
}
const getTimestampForMidnight3AM = () => {
const timestamp = Math.floor(Date.now() / 3600000) * 3600; // 计算整点的时间戳
return timestamp
};
async function cacheTaskCount(supabase, directory, bucketName) {
const pageFileName = `${directory}/task_count.json`;
// // 获取所有任务组 ID
// const { data: taskGroupArr, error: groupError } = await supabase
// .from('task')
// .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,
});
if (pageUploadError) {
console.error(`Error uploading cacheTaskCount JSON:`, pageUploadError);
} else {
console.log(`Uploading cacheTaskCount JSON scuccessful`);
}
}
async function cacheRecommendApp(supabase, allApps, directory, bucketName) {
const recommendPageSize = 3;
const recommendApps = allApps.filter(app => app.recommend > 0)
.sort((a, b) => b.recommend - a.recommend); // 按 recommend 字段降序排序
const recommendTotalCount = recommendApps.length;
const recommendPaginatedApps = [];
for (let i = 0; i < recommendTotalCount; i += recommendPageSize) {
recommendPaginatedApps.push(recommendApps.slice(i, i + recommendPageSize));
}
console.log("total page:", recommendPaginatedApps.length);
// 遍历分页后的数据并上传
for (let pageNum = 1; pageNum <= recommendPaginatedApps.length; pageNum++) {
const pageApps = recommendPaginatedApps[pageNum - 1];
const pageJson = JSON.stringify({
total_count: recommendTotalCount,
apps: pageApps,
});
const pageFileName = `${directory}/app_recommend_${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);
} else {
console.log(`Uploading page app_recommend_${pageNum}.json JSON successful`);
}
}
}
// Mark the longRunningTask's returned promise as a background task.
// note: we are not using await because we don't want it to block.
// Use beforeunload event handler to be notified when function is about to shutdown
addEventListener('beforeunload', (ev) => {
console.log('Function will be shutdown due to', ev.detail?.reason)
// save state or log the current progress
})
Deno.serve(async (req) => {
if (req.method === 'OPTIONS') {
return new Response('ok', { headers: corsHeaders })
}
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}`;
const bucketName = 'cache'; // 替换为存储桶名称
EdgeRuntime.waitUntil(cacheTaskCount(supabase, directory, bucketName));
EdgeRuntime.waitUntil(cacheRecommendApp(supabase, allApps, directory, bucketName));
// (async () => {
// try {
// await cacheTaskCount(supabase, directory, bucketName)
// await cacheRecommendApp(supabase, allApps, directory, bucketName)
// } catch (error) {
// console.error('Background crawl error:', error)
// }
// })()
return new Response(
JSON.stringify({
message: 'All data uploaded successfully',
}),
{
headers: { 'Content-Type': 'application/json' },
status: 200
}
);
} catch (err) {
console.error('Unexpected error:', err);
return new Response(JSON.stringify({ error: 'Internal server error' }), {
headers: { 'Content-Type': 'application/json' },
status: 500,
});
}
})
\ No newline at end of file
...@@ -15,7 +15,7 @@ async function fetchAllData(supabase, table: string, pageSize: number = 1000) { ...@@ -15,7 +15,7 @@ async function fetchAllData(supabase, table: string, pageSize: number = 1000) {
const { data, error } = await supabase const { data, error } = await supabase
.from(table) .from(table)
.select('*') // 可以根据需要调整字段 .select('*') // 可以根据需要调整字段
.gt('is_show', 0) .gt('is_show_num', 0)
// .eq('is_show', 1) // .eq('is_show', 1)
.order('created_at', { ascending: true }) // 按照创建时间排序 .order('created_at', { ascending: true }) // 按照创建时间排序
.range(offset, offset + pageSize - 1); // 分页范围 .range(offset, offset + pageSize - 1); // 分页范围
...@@ -70,11 +70,12 @@ async function cacheAllApp(supabase, allApps, directory, bucketName) { ...@@ -70,11 +70,12 @@ async function cacheAllApp(supabase, allApps, directory, bucketName) {
if (pageUploadError) { if (pageUploadError) {
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError); console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError);
} else {
console.log(`Uploading page app_all_${pageNum}.json JSON successful`);
} }
} }
} }
async function cacheCategoryApp(supabase, allApps, directory, bucketName) { async function cacheCategoryApp(supabase, allApps, directory, bucketName) {
// 按 category_id 分组 // 按 category_id 分组
const groupedData: Record<string, any[]> = {}; const groupedData: Record<string, any[]> = {};
...@@ -117,86 +118,10 @@ async function cacheCategoryApp(supabase, allApps, directory, bucketName) { ...@@ -117,86 +118,10 @@ async function cacheCategoryApp(supabase, allApps, directory, bucketName) {
`Error uploading category ${categoryId} page ${pageNum} JSON:`, `Error uploading category ${categoryId} page ${pageNum} JSON:`,
categoryPageUploadError categoryPageUploadError
); );
}
}
}
}
async function cacheRecommendApp(supabase, allApps, directory, bucketName) {
const recommendPageSize = 3;
const recommendApps = allApps.filter(app => app.recommend > 0)
.sort((a, b) => b.recommend - a.recommend); // 按 recommend 字段降序排序
const recommendTotalCount = recommendApps.length;
const recommendPaginatedApps = [];
for (let i = 0; i < recommendTotalCount; i += recommendPageSize) {
recommendPaginatedApps.push(recommendApps.slice(i, i + recommendPageSize));
}
// 遍历分页后的数据并上传
for (let pageNum = 1; pageNum <= recommendPaginatedApps.length; pageNum++) {
const pageApps = recommendPaginatedApps[pageNum - 1];
const pageJson = JSON.stringify({
total_count: recommendTotalCount,
apps: pageApps,
});
const pageFileName = `${directory}/app_recommend_${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);
} else { } else {
console.log(`Uploading page ${pageNum} JSON successful`); console.log(`Uploading page ${categoryId}_${pageNum}.json JSON successful`);
} }
} }
}
async function cacheTaskCount(supabase, directory, bucketName) {
const pageFileName = `${directory}/task_count.json`;
// // 获取所有任务组 ID
// const { data: taskGroupArr, error: groupError } = await supabase
// .from('task')
// .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,
});
if (pageUploadError) {
console.error(`Error uploading page ${pageNum} JSON:`, pageUploadError);
} }
} }
...@@ -222,12 +147,8 @@ Deno.serve(async (req) => { ...@@ -222,12 +147,8 @@ Deno.serve(async (req) => {
await cacheAllApp(supabase, allApps, directory, bucketName) await cacheAllApp(supabase, allApps, directory, bucketName)
await cacheRecommendApp(supabase, allApps, directory, bucketName)
await cacheCategoryApp(supabase, allApps, directory, bucketName) await cacheCategoryApp(supabase, allApps, directory, bucketName)
await cacheTaskCount(supabase, directory, bucketName)
return new Response( return new Response(
JSON.stringify({ JSON.stringify({
message: 'All data uploaded successfully', message: 'All data uploaded successfully',
......
...@@ -6,6 +6,17 @@ ...@@ -6,6 +6,17 @@
import "jsr:@supabase/functions-js/edge-runtime.d.ts" import "jsr:@supabase/functions-js/edge-runtime.d.ts"
import { createClient } from 'jsr:@supabase/supabase-js@2' import { createClient } from 'jsr:@supabase/supabase-js@2'
async function count_holders(supabase) {
let { data, count, error } = await supabase
.from("user")
.select("*", { count: "exact" })
.or('invite_points.gt.0,earn_points.gt.0,task_points.gt.0');
if (error) {
throw error;
}
return count
}
Deno.serve(async (req) => { Deno.serve(async (req) => {
if (req.method === 'OPTIONS') { if (req.method === 'OPTIONS') {
return new Response('ok', { headers: corsHeaders }) return new Response('ok', { headers: corsHeaders })
...@@ -18,7 +29,7 @@ Deno.serve(async (req) => { ...@@ -18,7 +29,7 @@ Deno.serve(async (req) => {
{ global: { headers: { Authorization: req.headers.get('Authorization')! } } } { global: { headers: { Authorization: req.headers.get('Authorization')! } } }
) )
const { data: userData, error: userError } = await supabase.from('user').select('*').order('rank', { ascending: true }).limit(100); const { data: userData, error: userError } = await supabase.from('user').select('*').neq('rank', 0).order('rank', { ascending: true }).limit(100);
if (userError) { if (userError) {
console.error('Error fetching top 100 users:', error); console.error('Error fetching top 100 users:', error);
...@@ -46,6 +57,24 @@ Deno.serve(async (req) => { ...@@ -46,6 +57,24 @@ Deno.serve(async (req) => {
return new Response(JSON.stringify({ error: 'Failed to upload file' }), { status: 500 }); return new Response(JSON.stringify({ error: 'Failed to upload file' }), { status: 500 });
} }
const holdersCountFileName = `${directory}/user_holders.json`;
let holdersCount = await count_holders(supabase);
const holdersJson = JSON.stringify({
holders_count: holdersCount
});
const { error: uploadHolderError } = await supabase.storage
.from(bucketName)
.upload(holdersCountFileName, new Blob([holdersJson]), {
contentType: 'application/json',
upsert: true, // 如果文件已存在则覆盖
});
if (uploadHolderError) {
console.error('Error uploading file to storage:', uploadHolderError);
return new Response(JSON.stringify({ error: 'Failed to upload file' }), { status: 500 });
}
return new Response(JSON.stringify({ return new Response(JSON.stringify({
code: 200, code: 200,
data: null, data: null,
......
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