Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
appbase-edge-function
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
duanjinfei
appbase-edge-function
Commits
873005dd
Commit
873005dd
authored
Dec 12, 2024
by
duanjinfei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix cache recommend app data
parent
ec0e7219
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
153 additions
and
120 deletions
+153
-120
index.ts
supabase/functions/update-app/index.ts
+153
-120
No files found.
supabase/functions/update-app/index.ts
View file @
873005dd
...
@@ -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
(
a
llA
pps
.
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
:
p
ageUploadError
}
=
await
supabase
.
storage
const
{
error
:
categoryP
ageUploadError
}
=
await
supabase
.
storage
.
from
(
bucketName
)
.
from
(
bucketName
)
.
upload
(
p
ageFileName
,
new
Blob
([
pageJson
]),
{
.
upload
(
categoryP
ageFileName
,
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"}'
*/
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment