File size: 3,614 Bytes
b688d12
 
 
 
 
 
0806a3e
b688d12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
const express = require('express');
const multer = require('multer');
const AWS = require('aws-sdk');
const path = require('path');
const axios = require('axios');
const app = express();
const port = process.env.PORT || 7860 || 7861 ||  8000 || 3000 || 8080 || 2022;

// Configure AWS R2
const r2 = new AWS.S3({
    endpoint: 'https://90ea285cb6b03a79a36923f11a34c3a2.r2.cloudflarestorage.com',
    accessKeyId: '769433fbf8d0d975144746b83eb2619e',
    secretAccessKey: '1679293fecd820a92788bbc6825ff948117284e0a5bcdea025903f06bfc57716',
    region: 'auto',
    signatureVersion: 'v4',
});

// Use memory storage for multer
const upload = multer({ storage: multer.memoryStorage() });

// Function to upload buffer to R2
async function uploadToR2(buffer, filename) {
    const params = {
        Bucket: 'bookworm',
        Key: `file/${filename}`, // Path in bucket
        Body: buffer,
        ACL: 'public-read',
    };
    return r2.upload(params).promise();
}

// Handle GET requests at /
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'index.html'), (err) => {
        if (err) {
            res.status(err.status).end();
        }
    });
});

// Handle GET requests at /upload
app.get('/upload', (req, res) => {
    res.status(405).json({ 
        status: false, 
        message: "Method not allowed. Please use POST to upload files." 
    });
});

// Handle POST requests at /upload
app.post('/upload', upload.single('file'), async (req, res) => {
    if (!req.file) {
        return res.status(400).json({ status: false, message: "No file uploaded" });
    }

    const encodedOriginalName = encodeURIComponent(req.file.originalname);
    const filename = `v-${randomName(4)}-${encodedOriginalName}`;

    try {
        const r2Response = await uploadToR2(req.file.buffer, filename);
        res.status(200).json({
            status: true,
            message: "File uploaded successfully",
            result: {
                size: req.file.size,
                original_name: req.file.originalname,
                mimetype: req.file.mimetype,
                url: `https://file.curvee.eu.org/file/${filename}`,
            }
        });
    } catch (error) {
        console.error(error);
        res.status(500).json({
            status: false,
            message: "Error uploading to R2",
            error: error.message,
        });
    }
});

// Fetcher

app.get('/get', async (req, res) => {
  const userAgent = req.get('User-Agent');
  const { url } = req.query;

  // Validasi parameter url
  if (!url) {
    return res.status(400).json({
      status: 400,
      message: "Please input parameter url!"
    });
  }

  try {
    // Ambil data dari URL menggunakan axios
    const response = await axios.get(url, {
      headers: {
        "User-Agent": userAgent
      }
    });

    // Kirimkan data hasil fetch
    res.status(200).send(response.data);

  } catch (e) {
    // Tangani error jika ada
    res.status(500).json({
      status: 500,
      message: "Error fetching the URL.",
      error: e.message
    });
    console.log(e);
  }
});

// Handle 404 and redirect to /
app.use((req, res) => {
    res.redirect('/');
});


// Start server
app.listen(port, () => {
    console.log(`App listening at http://localhost:${port}`);
});

// Function to generate random name
function randomName(length) {
    let result = '';
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    for (let i = 0; i < length; i++) {
        result += characters.charAt(Math.floor(Math.random() * characters.length));
    }
    return result;
}