1+ import type { H3Event } from "h3" ;
12import type { components as OctokitComponents } from "@octokit/openapi-types" ;
23import type { Comment , PackageManager } from "@pkg-pr-new/utils" ;
34import { isPullRequest , isWhitelisted } from "@pkg-pr-new/utils" ;
45import { randomUUID } from "uncrypto" ;
56import { setItemStream , useTemplatesBucket } from "../utils/bucket" ;
67import { useOctokitInstallation } from "../utils/octokit" ;
78import { generateTemplateHtml } from "../utils/template" ;
9+ import { joinKeys } from "unstorage" ;
810
911export default eventHandler ( async ( event ) => {
1012 const origin = getRequestURL ( event ) . origin ;
@@ -92,13 +94,19 @@ export default eventHandler(async (event) => {
9294
9395 const currentCursor = await cursorBucket . getItem ( cursorKey ) ;
9496
97+ let lastPackageKey : string ;
9598 await Promise . all (
96- packages . map ( ( packageNameWithPrefix ) => {
99+ packages . map ( ( packageNameWithPrefix , i ) => {
97100 const packageName = packageNameWithPrefix . slice ( "package:" . length ) ;
98101 const packageKey = `${ baseKey } :${ workflowData . sha } :${ packageName } ` ;
99102
100103 const file = formData . get ( packageNameWithPrefix ) ! ;
101104 if ( file instanceof File ) {
105+ lastPackageKey =
106+ i === packages . length - 1
107+ ? joinKeys ( usePackagesBucket . base , packageKey )
108+ : lastPackageKey ;
109+
102110 const stream = file . stream ( ) ;
103111 return setItemStream (
104112 event ,
@@ -116,8 +124,9 @@ export default eventHandler(async (event) => {
116124
117125 const templatesMap = new Map < string , Record < string , string > > ( ) ;
118126
127+ let lastTemplateKey : string ;
119128 await Promise . all (
120- templateAssets . map ( ( templateAssetWithPrefix ) => {
129+ templateAssets . map ( ( templateAssetWithPrefix , i ) => {
121130 const file = formData . get ( templateAssetWithPrefix ) ! ;
122131 const [ template , encodedTemplateAsset ] = templateAssetWithPrefix
123132 . slice ( "template:" . length )
@@ -135,6 +144,11 @@ export default eventHandler(async (event) => {
135144 } ) ;
136145
137146 if ( isBinary ) {
147+ lastTemplateKey =
148+ i === templateAssets . length - 1
149+ ? joinKeys ( useTemplatesBucket . base , uuid )
150+ : lastTemplateKey ;
151+
138152 const stream = file . stream ( ) ;
139153 return setItemStream ( event , useTemplatesBucket . base , uuid , stream ) ;
140154 }
@@ -295,8 +309,69 @@ export default eventHandler(async (event) => {
295309 }
296310 }
297311
312+ event . waitUntil (
313+ iterateAndDelete ( event , usePackagesBucket . base , lastPackageKey ! ) ,
314+ ) ;
315+ event . waitUntil (
316+ iterateAndDelete ( event , useTemplatesBucket . base , lastTemplateKey ! ) ,
317+ ) ;
318+
298319 return {
299320 ok : true ,
300321 urls,
301322 } ;
302323} ) ;
324+
325+ async function iterateAndDelete (
326+ event : H3Event ,
327+ base : string ,
328+ startAfter : string ,
329+ ) {
330+ const binding = useBinding ( event ) ;
331+ const removedItems : Array < {
332+ key : string ;
333+ uploaded : Date ;
334+ downloadedAt ?: Date ;
335+ } > = [ ] ;
336+ const downloadedAtBucket = useDownloadedAtBucket ( event ) ;
337+ const today = Date . parse ( new Date ( ) . toString ( ) ) ;
338+
339+ const next = await binding . list ( {
340+ prefix : base ,
341+ limit : 1000 ,
342+ startAfter,
343+ } ) ;
344+
345+ for ( const object of next . objects ) {
346+ const uploaded = Date . parse ( object . uploaded . toString ( ) ) ;
347+ const uploadedDate = new Date ( uploaded ) ;
348+ const sixMonthsAgo = new Date ( today ) ;
349+ sixMonthsAgo . setMonth ( sixMonthsAgo . getMonth ( ) - 6 ) ;
350+ if ( uploadedDate <= sixMonthsAgo ) {
351+ removedItems . push ( {
352+ key : object . key ,
353+ uploaded : new Date ( object . uploaded ) ,
354+ } ) ;
355+ await binding . delete ( object . key ) ;
356+ await downloadedAtBucket . removeItem ( object . key ) ;
357+ return ;
358+ }
359+ const downloadedAt = await downloadedAtBucket . getItem ( object . key ) ;
360+ if ( ! downloadedAt ) {
361+ return ;
362+ }
363+ const downloadedAtDate = new Date ( downloadedAt ) ;
364+ const oneMonthAgo = new Date ( today ) ;
365+ oneMonthAgo . setMonth ( oneMonthAgo . getMonth ( ) - 1 ) ;
366+ const uploadedDate2 = new Date ( uploaded ) ;
367+ if ( downloadedAtDate <= oneMonthAgo && uploadedDate2 <= oneMonthAgo ) {
368+ removedItems . push ( {
369+ key : object . key ,
370+ uploaded : new Date ( object . uploaded ) ,
371+ downloadedAt : new Date ( downloadedAt ) ,
372+ } ) ;
373+ await binding . delete ( object . key ) ;
374+ await downloadedAtBucket . removeItem ( object . key ) ;
375+ }
376+ }
377+ }
0 commit comments