initial changes
This commit is contained in:
127
src/api.js
Normal file
127
src/api.js
Normal file
@@ -0,0 +1,127 @@
|
||||
import {
|
||||
DeleteObjectCommand,
|
||||
GetObjectCommand,
|
||||
ListObjectsCommand,
|
||||
S3Client,
|
||||
} from "@aws-sdk/client-s3";
|
||||
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
||||
|
||||
const BUCKET = "repertory";
|
||||
|
||||
const oldItems = [];
|
||||
|
||||
const s3 = new S3Client({
|
||||
region: "any",
|
||||
endpoint: "https://gateway.storjshare.io",
|
||||
forcePathStyle: true,
|
||||
credentials: {
|
||||
accessKeyId: process.env.R_AWS_KEY,
|
||||
secretAccessKey: process.env.R_AWS_SECRET,
|
||||
},
|
||||
});
|
||||
|
||||
const cleanOldItems = async () => {
|
||||
console.log("cleanOldItems", oldItems.length);
|
||||
while (oldItems.length > 0) {
|
||||
const key = oldItems.pop();
|
||||
await s3.send(
|
||||
new DeleteObjectCommand({
|
||||
Bucket: BUCKET,
|
||||
Key: key,
|
||||
}),
|
||||
);
|
||||
console.log(key);
|
||||
}
|
||||
};
|
||||
|
||||
const createDownloadLink = async (key) => {
|
||||
let filename = key.split("/");
|
||||
filename = filename[filename.length - 1];
|
||||
return await getSignedUrl(
|
||||
s3,
|
||||
new GetObjectCommand({
|
||||
Bucket: BUCKET,
|
||||
Key: key,
|
||||
ResponseContentDisposition: `attachment; filename="${filename}"`,
|
||||
}),
|
||||
{ expiresIn: 3600 },
|
||||
);
|
||||
};
|
||||
|
||||
const getAllFiles = async () => {
|
||||
const data = await s3.send(
|
||||
new ListObjectsCommand({
|
||||
Bucket: BUCKET,
|
||||
Delimiter: "/",
|
||||
}),
|
||||
);
|
||||
console.log(data);
|
||||
};
|
||||
|
||||
const getBucketFiles = async (folderName) => {
|
||||
try {
|
||||
folderName = folderName.toLowerCase();
|
||||
const folderKey = encodeURIComponent(folderName) + "/";
|
||||
const data = await s3.send(
|
||||
new ListObjectsCommand({
|
||||
Bucket: BUCKET,
|
||||
Prefix: folderKey,
|
||||
}),
|
||||
);
|
||||
const ret = data.Contents.filter((item) => item.Key !== folderKey)
|
||||
.map((item) => {
|
||||
return {
|
||||
date: item.LastModified.toLocaleDateString("en-US", {
|
||||
year: "numeric",
|
||||
month: "2-digit",
|
||||
day: "2-digit",
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
}).replace(/,/g, ""),
|
||||
sort: item.LastModified.getTime(),
|
||||
name: item.Key.replace(folderKey, ""),
|
||||
key: item.Key,
|
||||
};
|
||||
})
|
||||
.sort((a, b) => {
|
||||
return a.sort > b.sort ? -1 : a.sort < b.sort ? 1 : 0;
|
||||
});
|
||||
const itemCount = {};
|
||||
const filteredItems = ret
|
||||
.filter((item) => item.name.endsWith(".tar.gz"))
|
||||
.filter((item) => {
|
||||
if (folderName === "nightly") {
|
||||
const parts = item.name.split("_");
|
||||
const groupId = `${parts[0]}_${parts[3]}_${parts[4]}`;
|
||||
itemCount[groupId] = itemCount[groupId] || 0;
|
||||
if (++itemCount[groupId] <= 3) {
|
||||
return true;
|
||||
}
|
||||
if (!oldItems.find((key) => key === item.key)) {
|
||||
oldItems.push(item.key);
|
||||
oldItems.push(item.key + ".sha256");
|
||||
oldItems.push(item.key + ".sig");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
const totalCount = filteredItems.length * 3;
|
||||
for (let i = 0; i < totalCount && i < filteredItems.length; i += 3) {
|
||||
let item = ret.filter(
|
||||
(item) => item.name === filteredItems[i].name + ".sha256",
|
||||
);
|
||||
filteredItems.splice(i + 1, 0, ...item);
|
||||
item = ret.filter((item) => item.name === filteredItems[i].name + ".sig");
|
||||
filteredItems.splice(i + 2, 0, ...item);
|
||||
}
|
||||
return filteredItems;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
|
||||
return [];
|
||||
};
|
||||
|
||||
export { cleanOldItems, createDownloadLink, getBucketFiles };
|
Reference in New Issue
Block a user