You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
4.6 KiB

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
require_once __DIR__ . '/../../utils/Database.php';
require_once __DIR__ . '/../../utils/Helper.php';
$db = Database::getInstance();
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
$username = isset($_GET['username']) ? trim($_GET['username']) : '';
$id = isset($_GET['id']) ? trim($_GET['id']) : '';
if ($id !== '') {
$email = $db->fetchOne("SELECT * FROM email WHERE id = ? AND is_deleted = 0", [$id]);
echo json_encode(['success' => true, 'data' => ['email' => $email]]);
exit;
}
if ($username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$perPage = isset($_GET['perPage']) ? min(100, max(1, (int)$_GET['perPage'])) : 10;
$offset = ($page - 1) * $perPage;
$totalRow = $db->fetchOne("SELECT COUNT(*) AS cnt FROM email WHERE rcpt_to = ? AND is_deleted = 0", [$username]);
$emails = $db->fetchAll("SELECT id, `from`, `to`, subject, `date`, folder, is_read, is_deleted, created_at FROM email WHERE rcpt_to = ? AND is_deleted = 0 ORDER BY `date` DESC LIMIT $perPage OFFSET $offset", [$username]);
echo json_encode(['success' => true, 'data' => ['emails' => $emails, 'total' => (int)$totalRow['cnt'], 'page' => $page, 'perPage' => $perPage, 'totalPages' => (int)ceil(((int)$totalRow['cnt']) / $perPage)]]);
exit;
}
if ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$username = trim($input['username'] ?? '');
$to = trim($input['to'] ?? '');
$subject = trim($input['subject'] ?? '');
$content = $input['content'] ?? '';
$isDraft = isset($input['isDraft']) ? (bool)$input['isDraft'] : false;
if ($username === '' || $to === '' || !Helper::validateEmail($to)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
$user = $db->fetchOne("SELECT email FROM user WHERE username = ? AND is_deleted = 0", [$username]);
$fromEmail = $user ? $user['email'] : ($username . '@test.com');
$id = Helper::generateId();
$folder = $isDraft ? 'draft' : 'sent';
$dateNow = date('Y-m-d H:i:s');
$raw = "From: {$fromEmail}\r\nTo: {$to}\r\nSubject: {$subject}\r\nDate: {$dateNow}\r\n\r\n{$content}\r\n";
$db->insert("INSERT INTO email (id, ip, helo, mail_from, rcpt_to, `from`, `to`, subject, `date`, `data`, datagram, `length`, `state`, is_read, folder, created_at, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), 0)", [$id, Helper::getClientIp(), 'frontend', $fromEmail, $username, $fromEmail, $to, $subject, $dateNow, $content, $raw, strlen($raw), 1, $isDraft ? 0 : 1, $folder]);
echo json_encode(['success' => true, 'message' => ($isDraft ? 'draft saved' : 'sent'), 'data' => ['emailId' => $id]]);
exit;
}
if ($method === 'PUT') {
$input = json_decode(file_get_contents('php://input'), true);
$id = trim($input['id'] ?? '');
$username = trim($input['username'] ?? '');
$isRead = isset($input['isRead']) ? (int)$input['isRead'] : null;
$folder = isset($input['folder']) ? trim($input['folder']) : null;
if ($id === '' || $username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
$fields = [];
$params = [];
if ($isRead !== null) { $fields[] = "is_read = ?"; $params[] = $isRead; }
if ($folder !== null) { $fields[] = "folder = ?"; $params[] = $folder; }
if (empty($fields)) { echo json_encode(['success' => true, 'message' => 'no changes']); exit; }
$params[] = $id;
$params[] = $username;
$db->update("UPDATE email SET " . implode(', ', $fields) . " WHERE id = ? AND rcpt_to = ?", $params);
echo json_encode(['success' => true, 'message' => 'updated']);
exit;
}
if ($method === 'DELETE') {
$id = isset($_GET['id']) ? trim($_GET['id']) : '';
$username = isset($_GET['username']) ? trim($_GET['username']) : '';
if ($id === '' || $username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
$db->update("UPDATE email SET is_deleted = 1, folder = 'trash' WHERE id = ? AND rcpt_to = ?", [$id, $username]);
echo json_encode(['success' => true, 'message' => 'deleted']);
exit;
}
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'method not allowed']);