diff --git a/app/Controllers/AdminController.php b/app/Controllers/AdminController.php index de176de..eadb807 100644 --- a/app/Controllers/AdminController.php +++ b/app/Controllers/AdminController.php @@ -418,6 +418,75 @@ private function getReferralStats() { $this->redirect('/admin/apks'); } + // Newsletter Management + public function newsletter() { + $this->checkAuth(); + $db = db_pdo(); + $subscribers = $db->query("SELECT * FROM newsletter_subscribers ORDER BY created_at DESC")->fetchAll(); + $this->view('admin/newsletter/index', ['subscribers' => $subscribers]); + } + + public function deleteSubscriber($params) { + $this->checkAuth(); + $db = db_pdo(); + $stmt = $db->prepare("DELETE FROM newsletter_subscribers WHERE id = ?"); + $stmt->execute([$params['id']]); + $this->redirect('/admin/newsletter'); + } + + public function exportSubscribers() { + $this->checkAuth(); + $db = db_pdo(); + $subscribers = $db->query("SELECT email, created_at FROM newsletter_subscribers ORDER BY created_at DESC")->fetchAll(\PDO::FETCH_ASSOC); + + header('Content-Type: text/csv; charset=utf-8'); + header('Content-Disposition: attachment; filename=subscribers_' . date('Y-m-d') . '.csv'); + $output = fopen('php://output', 'w'); + fputcsv($output, ['Email', 'Subscribed At']); + foreach ($subscribers as $row) { + fputcsv($output, $row); + } + fclose($output); + exit; + } + + public function sendNewsletterForm() { + $this->checkAuth(); + $db = db_pdo(); + $total_subscribers = $db->query("SELECT COUNT(*) FROM newsletter_subscribers")->fetchColumn(); + $this->view('admin/newsletter/send', ['total_subscribers' => $total_subscribers]); + } + + public function sendNewsletter() { + $this->checkAuth(); + $subject = $_POST['subject'] ?? ''; + $message = $_POST['message'] ?? ''; + + if (empty($subject) || empty($message)) { + $this->view('admin/newsletter/send', ['error' => 'Subject and message are required.']); + return; + } + + $db = db_pdo(); + $subscribers = $db->query("SELECT email FROM newsletter_subscribers")->fetchAll(\PDO::FETCH_COLUMN); + + if (empty($subscribers)) { + $this->view('admin/newsletter/send', ['error' => 'No subscribers found.']); + return; + } + + require_once __DIR__ . '/../../mail/MailService.php'; + + // We use BCC to prevent subscribers from seeing each other's emails + $results = \MailService::sendMail(null, $subject, $message, null, ['bcc' => $subscribers]); + + if ($results['success']) { + $this->view('admin/newsletter/send', ['success' => 'Email sent to ' . count($subscribers) . ' subscribers.']); + } else { + $this->view('admin/newsletter/send', ['error' => 'Failed to send email: ' . $results['error']]); + } + } + private function slugify($text) { $text = preg_replace('~[^\pL\d]+~u', '-', $text); $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); diff --git a/index.php b/index.php index 16a30a3..b8cf1b6 100644 --- a/index.php +++ b/index.php @@ -1,74 +1,32 @@ post('/api/newsletter/subscribe', 'NewsletterController@subscribe'); -$router->post('/api/report', 'ContactController@ajaxReport'); -$router->post('/api/ai/chat', 'AIController@chat'); -// Sitemap -$router->get('/sitemap.xml', 'SitemapController@index'); - -// Language Switch -$router->get('/lang/:code', function($params) { - $code = $params['code']; - \App\Services\LanguageService::setLang($code); - header('Location: ' . ($_SERVER['HTTP_REFERER'] ?? '/')); - exit; -}); - -// Home & APKs +// Routes $router->get('/', 'HomeController@index'); -$router->get('/apk/:slug', 'HomeController@apkDetail'); -$router->get('/download/:slug', 'HomeController@download'); - -// Blog -$router->get('/blog', 'BlogController@index'); -$router->get('/blog/:slug', 'BlogController@detail'); - -// Static Pages -$router->get('/contact', 'ContactController@index'); -$router->post('/contact', 'ContactController@submit'); -$router->get('/help-center', 'HomeController@helpCenter'); -$router->get('/privacy-policy', 'HomeController@privacyPolicy'); -$router->get('/terms-of-service', 'HomeController@termsOfService'); +$router->get('/apk/:slug', 'ApkController@detail'); +$router->get('/download/:slug', 'ApkController@download'); // Auth $router->get('/login', 'AuthController@loginForm'); @@ -77,36 +35,40 @@ $router->get('/register', 'AuthController@registerForm'); $router->post('/register', 'AuthController@register'); $router->get('/logout', 'AuthController@logout'); $router->get('/profile', 'AuthController@profile'); -$router->post('/withdraw', 'AuthController@requestWithdrawal'); +$router->post('/profile', 'AuthController@updateProfile'); -// Admin Auth +// Admin Routes +$router->get('/admin', 'AdminController@dashboard'); $router->get('/admin/login', 'AdminController@loginForm'); $router->post('/admin/login', 'AdminController@login'); $router->get('/admin/logout', 'AdminController@logout'); -// Admin Dashboard -$router->get('/admin/dashboard', 'AdminController@dashboard'); - -// Admin Settings -$router->get('/admin/settings', 'AdminController@settingsForm'); -$router->post('/admin/settings', 'AdminController@saveSettings'); - -// Admin Users -$router->get('/admin/users', 'AdminController@users'); -$router->post('/admin/users/toggle-ban/:id', 'AdminController@toggleBan'); - // Admin APKs $router->get('/admin/apks', 'AdminController@apks'); -$router->get('/admin/apks/mass-upload', 'AdminController@massUploadForm'); -$router->post('/admin/apks/mass-upload', 'AdminController@massUpload'); $router->get('/admin/apks/add', 'AdminController@addApkForm'); $router->post('/admin/apks/add', 'AdminController@addApk'); $router->get('/admin/apks/edit/:id', 'AdminController@editApkForm'); $router->post('/admin/apks/edit/:id', 'AdminController@editApk'); $router->get('/admin/apks/delete/:id', 'AdminController@deleteApk'); -$router->post('/admin/apks/reorder', 'AdminController@updateOrder'); -// Admin Posts (Blog) +// Admin Categories +$router->get('/admin/categories', 'AdminController@categories'); +$router->post('/admin/categories/add', 'AdminController@addCategory'); +$router->get('/admin/categories/delete/:id', 'AdminController@deleteCategory'); + +// Admin Users +$router->get('/admin/users', 'AdminController@users'); +$router->get('/admin/users/delete/:id', 'AdminController@deleteUser'); + +// Admin Settings +$router->get('/admin/settings', 'AdminController@settingsForm'); +$router->post('/admin/settings', 'AdminController@saveSettings'); + +// Blog +$router->get('/blog', 'BlogController@index'); +$router->get('/blog/:slug', 'BlogController@detail'); + +// Admin Blog $router->get('/admin/posts', 'AdminController@posts'); $router->get('/admin/posts/add', 'AdminController@addPostForm'); $router->post('/admin/posts/add', 'AdminController@addPost'); @@ -114,14 +76,19 @@ $router->get('/admin/posts/edit/:id', 'AdminController@editPostForm'); $router->post('/admin/posts/edit/:id', 'AdminController@editPost'); $router->get('/admin/posts/delete/:id', 'AdminController@deletePost'); -// Admin Categories -$router->get('/admin/categories', 'AdminController@categories'); -$router->post('/admin/categories/add', 'AdminController@addCategory'); -$router->get('/admin/categories/delete/:id', 'AdminController@deleteCategory'); +// Newsletter +$router->post('/newsletter/subscribe', 'NewsletterController@subscribe'); +$router->get('/admin/newsletter', 'AdminController@newsletter'); +$router->get('/admin/newsletter/delete/:id', 'AdminController@deleteSubscriber'); +$router->get('/admin/newsletter/export', 'AdminController@exportSubscribers'); +$router->get('/admin/newsletter/send', 'AdminController@sendNewsletterForm'); +$router->post('/admin/newsletter/send', 'AdminController@sendNewsletter'); -// Admin Withdrawals -$router->get('/admin/withdrawals', 'AdminController@withdrawals'); -$router->get('/admin/withdrawals/approve/:id', 'AdminController@approveWithdrawal'); -$router->get('/admin/withdrawals/reject/:id', 'AdminController@rejectWithdrawal'); +// Contact +$router->get('/contact', 'ContactController@index'); +$router->post('/contact', 'ContactController@send'); + +// Sitemap +$router->get('/sitemap.xml', 'SitemapController@index'); $router->dispatch(); \ No newline at end of file diff --git a/views/admin/header.php b/views/admin/header.php index a530bf6..03eb8a9 100644 --- a/views/admin/header.php +++ b/views/admin/header.php @@ -194,6 +194,9 @@ + @@ -254,4 +257,4 @@ -
+
\ No newline at end of file diff --git a/views/admin/newsletter/index.php b/views/admin/newsletter/index.php new file mode 100644 index 0000000..74357b7 --- /dev/null +++ b/views/admin/newsletter/index.php @@ -0,0 +1,66 @@ + + +
+
+
+
+
+
Newsletter Subscribers
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
EmailSubscribed At
+
+
+
+
+
+
+

+
+ + Delete + +
+

No subscribers found.

+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/views/admin/newsletter/send.php b/views/admin/newsletter/send.php new file mode 100644 index 0000000..763ce29 --- /dev/null +++ b/views/admin/newsletter/send.php @@ -0,0 +1,52 @@ + + +
+
+
+
+
+
Send Newsletter
+ Back to List +
+
+ +
+ +
+ + + +
+ +
+ + +
+ + This email will be sent to all subscribers via BCC. +
+ +
+
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+
+
+
+ + \ No newline at end of file