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 @@
Blog
+
+ Newsletter
+
@@ -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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ | Email |
+ Subscribed 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This email will be sent to all subscribers via BCC.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file