temp-cloud / app.js
fullpwerr's picture
add expiration
04e7338
raw
history blame
6.18 kB
const express = require("express");
const cors = require("cors");
const multer = require("multer");
const fs = require("fs");
const path = require("path");
const os = require("os");
const { execSync } = require("child_process");
const FILE_DIR = path.join(__dirname, "files");
const EXPIRATION_TIME = 24 * 60 * 60 * 1000; // 24 jam dalam milidetik
const META_FILE = path.join(__dirname, "files.json");
// Load metadata file (kalau ada)
let fileData = {};
if (fs.existsSync(META_FILE)) {
fileData = JSON.parse(fs.readFileSync(META_FILE));
}
function formatRemainingTime(expiresAt) {
const remainingMs = expiresAt - Date.now();
if (remainingMs <= 0) return "Expired";
const hours = Math.floor(remainingMs / (1000 * 60 * 60));
const minutes = Math.floor((remainingMs % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((remainingMs % (1000 * 60)) / 1000);
return `${hours}h ${minutes}m ${seconds}s`;
}
const app = express();
const port = process.env.PORT || 7860;
const uploadDir = path.join(__dirname, "files");
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}
app.use(cors());
app.use("/files", express.static(uploadDir));
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, FILE_DIR);
},
filename: (req, file, cb) => {
const uniqueName = `${Date.now()}-${file.originalname}`;
cb(null, uniqueName);
}
});
const upload = multer({ storage });
app.post("/upload", upload.single("file"), (req, res) => {
if (!req.file) {
return res.status(400).json({ success: false, message: "No file uploaded" });
}
const filePath = req.file.filename;
const expiresAt = Date.now() + EXPIRATION_TIME;
fileData[filePath] = expiresAt;
fs.writeFileSync(META_FILE, JSON.stringify(fileData));
res.json({
success: true,
file_url: `http://yourdomain.com/files/${filePath}`,
expires_in: formatRemainingTime(expiresAt) // Format sesuai sisa waktu
});
});
app.get("/files", (req, res) => {
fs.readdir(uploadDir, (err, files) => {
if (err) return res.status(500).json({ success: false, message: "Error reading files" });
const fileList = files.map(filename => ({
filename,
file_url: `${req.protocol}://${req.get("host")}/files/${filename}`,
expires_in: formatRemainingTime(fileData[filename])
}));
res.json({ success: true, files: fileList });
});
});
app.delete("/files/:filename", (req, res) => {
const filePath = path.join(uploadDir, req.params.filename);
fs.unlink(filePath, err => {
if (err) return res.status(404).json({ success: false, message: "File not found" });
res.json({ success: true, message: "File deleted successfully!" });
});
});
app.get("/", (req, res) => {
res.json({
success: true,
message: "Welcome to Temporary Cloud File API ๐Ÿš€",
usage: {
upload_file: {
method: "POST",
endpoint: "/upload",
description: "Upload a file",
body: "FormData (key: file)",
response: {
success: true,
file_url: "http://yourdomain.com/files/filename.ext",
expires_in: "24h"
}
},
list_files: {
method: "GET",
endpoint: "/files",
description: "Get all uploaded files",
response: {
success: true,
files: [
{
filename: "example.txt",
file_url: "http://yourdomain.com/files/example.txt"
}
]
}
},
delete_file: {
method: "DELETE",
endpoint: "/files/:filename",
description: "Delete a file",
response: {
success: true,
message: "File deleted successfully!"
}
},
check_server: {
method: "GET",
endpoint: "/status",
description: "Check server status (RAM, CPU, uptime, etc.)"
}
},
author: "rizxyu",
github: "https://github.com/rizxyu"
});
});
app.get("/status", (req, res) => {
const uptime = process.uptime();
const memoryUsage = process.memoryUsage();
const cpuLoad = os.loadavg();
let diskUsage = "Not available";
try {
diskUsage = execSync("df -h / | tail -1 | awk '{print $3 \" used / \" $2 \" total (\" $5 \" used)\"}'").toString().trim();
} catch (err) {
diskUsage = "Error fetching disk usage";
}
res.json({
success: true,
server_time: new Date().toISOString(),
uptime: `${Math.floor(uptime / 3600)}h ${Math.floor((uptime % 3600) / 60)}m ${Math.floor(uptime % 60)}s`,
memory: {
total: `${(os.totalmem() / 1024 / 1024).toFixed(2)} MB`,
used: `${(memoryUsage.rss / 1024 / 1024).toFixed(2)} MB`
},
cpu: {
cores: os.cpus().length,
load_avg: cpuLoad.map(load => load.toFixed(2))
},
disk: diskUsage,
node_version: process.version
});
});
setInterval(() => {
const now = Date.now();
let updatedFileData = {};
Object.keys(fileData).forEach(filename => {
if (fileData[filename] <= now) {
const filePath = path.join(FILE_DIR, filename);
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
console.log(`๐Ÿ—‘๏ธ File expired dihapus: ${filename}`);
}
} else {
updatedFileData[filename] = fileData[filename];
}
});
// Update metadata file
fileData = updatedFileData;
fs.writeFileSync(META_FILE, JSON.stringify(fileData));
}, 60 * 60 * 1000); // Cek tiap 1 jam
app.listen(port, () => {
console.log("Listening on http://localhost:" + port);
});