feat: add gdrive backup support and update backup logic
This commit is contained in:
@@ -1,23 +1,17 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
import { requireAuth } from '@/lib/auth'
|
||||
import { readConfig } from '@/lib/config'
|
||||
import { createDbDumpBuffer, uploadToDropbox, uploadToGoogleDrive, backupFilename, testGoogleDriveCredentials } from '@/lib/backup'
|
||||
import { createDbDumpBuffer, uploadToDropbox, uploadToGoogleDriveOAuth, uploadToGCS, backupFilename } from '@/lib/backup'
|
||||
import pool from '@/lib/appDb'
|
||||
|
||||
// POST /api/backups/test
|
||||
// { db_id, cloud_type, credentials, gdrive_folder_id? }
|
||||
// → Gerçek yedek alır, buluta yükler, loglar
|
||||
export async function POST(req: NextRequest) {
|
||||
const authErr = await requireAuth(req)
|
||||
if (authErr) return authErr
|
||||
|
||||
const { db_id, cloud_type, credentials, gdrive_folder_id } = await req.json()
|
||||
|
||||
if (!credentials?.trim()) {
|
||||
return NextResponse.json({ ok: false, error: 'Credentials boş olamaz.' })
|
||||
}
|
||||
if (!credentials?.trim()) return NextResponse.json({ ok: false, error: 'Credentials boş olamaz.' })
|
||||
|
||||
// DB bilgisini al
|
||||
const config = await readConfig()
|
||||
const db = config.databases.find(d => d.id === db_id)
|
||||
if (!db) return NextResponse.json({ ok: false, error: 'Veritabanı bulunamadı.' })
|
||||
@@ -25,22 +19,21 @@ export async function POST(req: NextRequest) {
|
||||
const filename = backupFilename(db.name)
|
||||
|
||||
try {
|
||||
// 1. Dump al
|
||||
const buffer = await createDbDumpBuffer(db)
|
||||
|
||||
// 2. Buluta yükle
|
||||
if (cloud_type === 'dropbox') {
|
||||
await uploadToDropbox(credentials.trim(), db.name, filename, buffer)
|
||||
} else if (cloud_type === 'gcs') {
|
||||
await uploadToGCS(credentials, gdrive_folder_id, db.name, filename, buffer)
|
||||
} else if (cloud_type === 'gdrive') {
|
||||
await uploadToGoogleDrive(credentials, db.name, filename, buffer, gdrive_folder_id || undefined)
|
||||
await uploadToGoogleDriveOAuth(credentials, filename, buffer, gdrive_folder_id || undefined)
|
||||
} else {
|
||||
return NextResponse.json({ ok: false, error: 'Desteklenmeyen cloud türü.' })
|
||||
}
|
||||
|
||||
// 3. Logla
|
||||
await pool.query(
|
||||
`INSERT INTO backup_logs (db_id, status, message, file_size) VALUES ($1, $2, $3, $4)`,
|
||||
[db_id, 'success', `Manuel test yedek — ${cloud_type}`, buffer.length]
|
||||
[db_id, 'success', `Manuel yedek — ${cloud_type}`, buffer.length]
|
||||
)
|
||||
|
||||
const sizeStr = buffer.length > 1024 * 1024
|
||||
@@ -49,14 +42,13 @@ export async function POST(req: NextRequest) {
|
||||
|
||||
return NextResponse.json({
|
||||
ok: true,
|
||||
detail: `✓ Yedek alındı ve yüklendi — ${db.name}/${filename} (${sizeStr})`,
|
||||
detail: `✓ Yedek yüklendi — ${db.name}/${filename} (${sizeStr})`,
|
||||
})
|
||||
} catch (e: any) {
|
||||
await pool.query(
|
||||
`INSERT INTO backup_logs (db_id, status, message, file_size) VALUES ($1, $2, $3, $4)`,
|
||||
[db_id, 'error', e.message, 0]
|
||||
).catch(() => {})
|
||||
|
||||
return NextResponse.json({ ok: false, error: e.message })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user