| const express = require('express'); |
| const cors = require('cors'); |
| const fs = require('fs'); |
| const path = require('path'); |
| const multer = require('multer'); |
|
|
| const app = express(); |
| const PORT = process.env.PORT || 7860; |
|
|
| |
| const UPLOAD_DIR = '/data/uploads'; |
| const DATA_FILE = '/data/data.json'; |
|
|
| |
| try { |
| if (!fs.existsSync('/data')) fs.mkdirSync('/data', { recursive: true }); |
| if (!fs.existsSync(UPLOAD_DIR)) fs.mkdirSync(UPLOAD_DIR, { recursive: true }); |
| } catch (e) { |
| console.log('Dir note:', e.message); |
| } |
|
|
| app.use(cors({ origin: '*' })); |
| app.use(express.json({ limit: '500mb' })); |
| app.use('/uploads', express.static(UPLOAD_DIR)); |
|
|
| |
| app.use(express.static(path.join(__dirname, 'public'))); |
|
|
| const storage = multer.diskStorage({ |
| destination: (req, file, cb) => cb(null, UPLOAD_DIR), |
| filename: (req, file, cb) => { |
| const ext = path.extname(file.originalname); |
| const name = `${Date.now()}-${Math.round(Math.random() * 1e9)}${ext}`; |
| cb(null, name); |
| } |
| }); |
|
|
| const upload = multer({ |
| storage, |
| limits: { fileSize: 500 * 1024 * 1024 } |
| }); |
|
|
| function readData() { |
| try { |
| if (!fs.existsSync(DATA_FILE)) return { articles: [], videos: [] }; |
| return JSON.parse(fs.readFileSync(DATA_FILE, 'utf-8')); |
| } catch (e) { |
| return { articles: [], videos: [] }; |
| } |
| } |
|
|
| function writeData(data) { |
| try { |
| fs.writeFileSync(DATA_FILE, JSON.stringify(data, null, 2)); |
| } catch (e) { |
| console.error('Write error:', e.message); |
| } |
| } |
|
|
| |
| app.get('/', (req, res) => { |
| res.json({ status: 'ok', message: 'Tera News Server Running!' }); |
| }); |
|
|
| |
| app.get('/api/data', (req, res) => { |
| res.json(readData()); |
| }); |
|
|
| |
| app.put('/api/data', (req, res) => { |
| const data = { |
| articles: req.body.articles || [], |
| videos: req.body.videos || [] |
| }; |
| writeData(data); |
| res.json({ success: true, data }); |
| }); |
|
|
| |
| app.post('/api/articles', (req, res) => { |
| const data = readData(); |
| const article = req.body; |
| if (!article || !article.id) return res.status(400).json({ error: 'Invalid article' }); |
| data.articles.unshift(article); |
| writeData(data); |
| res.json({ success: true, article }); |
| }); |
|
|
| |
| app.post('/api/videos', (req, res) => { |
| const data = readData(); |
| const video = req.body; |
| if (!video || !video.id) return res.status(400).json({ error: 'Invalid video' }); |
| data.videos.unshift(video); |
| writeData(data); |
| res.json({ success: true, video }); |
| }); |
|
|
| |
| app.delete('/api/articles/:id', (req, res) => { |
| const data = readData(); |
| data.articles = data.articles.filter(a => a.id !== parseInt(req.params.id)); |
| writeData(data); |
| res.json({ success: true }); |
| }); |
|
|
| |
| app.delete('/api/videos/:id', (req, res) => { |
| const data = readData(); |
| data.videos = data.videos.filter(v => v.id !== parseInt(req.params.id)); |
| writeData(data); |
| res.json({ success: true }); |
| }); |
|
|
| |
| app.post('/api/articles/:id/views', (req, res) => { |
| const data = readData(); |
| const article = data.articles.find(a => a.id === parseInt(req.params.id)); |
| if (!article) return res.status(404).json({ error: 'Not found' }); |
| article.views = (article.views || 0) + 1; |
| writeData(data); |
| res.json({ success: true, views: article.views }); |
| }); |
|
|
| |
| app.post('/api/upload', upload.single('file'), (req, res) => { |
| if (!req.file) return res.status(400).json({ error: 'No file uploaded' }); |
| const url = `${req.protocol}://${req.get('host')}/uploads/${req.file.filename}`; |
| res.json({ success: true, url, filename: req.file.filename }); |
| }); |
|
|
| |
| app.get('/api/files', (req, res) => { |
| try { |
| const files = fs.readdirSync(UPLOAD_DIR).map(f => ({ |
| name: f, |
| url: `${req.protocol}://${req.get('host')}/uploads/${f}`, |
| size: fs.statSync(path.join(UPLOAD_DIR, f)).size |
| })); |
| res.json({ success: true, files }); |
| } catch (e) { |
| res.json({ success: true, files: [] }); |
| } |
| }); |
|
|
| app.listen(PORT, '0.0.0.0', () => { |
| console.log(`Tera News Server running on port ${PORT}`); |
| }); |
|
|