Skip to content

Commit 6eced81

Browse files
authored
chore: iterate and remove on publish (#379)
1 parent b8b3e5d commit 6eced81

File tree

5 files changed

+78
-212
lines changed

5 files changed

+78
-212
lines changed

.eslintcache

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

.github/workflows/remove-stale.yml

Lines changed: 0 additions & 29 deletions
This file was deleted.

packages/app/server/routes/publish.post.ts

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import type { H3Event } from "h3";
12
import type { components as OctokitComponents } from "@octokit/openapi-types";
23
import type { Comment, PackageManager } from "@pkg-pr-new/utils";
34
import { isPullRequest, isWhitelisted } from "@pkg-pr-new/utils";
45
import { randomUUID } from "uncrypto";
56
import { setItemStream, useTemplatesBucket } from "../utils/bucket";
67
import { useOctokitInstallation } from "../utils/octokit";
78
import { generateTemplateHtml } from "../utils/template";
9+
import { joinKeys } from "unstorage";
810

911
export 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+
}

packages/app/server/routes/rm/stale.post.ts

Lines changed: 0 additions & 122 deletions
This file was deleted.

script/remove-stale.js

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)