-
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathPartnerProgramsController.php
More file actions
115 lines (97 loc) · 3.62 KB
/
PartnerProgramsController.php
File metadata and controls
115 lines (97 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
namespace Numok\Controllers;
use Numok\Database\Database;
use Numok\Middleware\PartnerMiddleware;
class PartnerProgramsController extends PartnerBaseController {
public function __construct() {
PartnerMiddleware::handle();
}
public function index(): void {
$partnerId = $_SESSION['partner_id'];
// Get all active programs that are:
// 1. Public (is_private = 0), OR
// 2. Already assigned to this partner (joined)
$programs = Database::query(
"SELECT p.*,
CASE
WHEN pp.id IS NOT NULL THEN 'joined'
ELSE 'available'
END as status,
pp.tracking_code
FROM programs p
LEFT JOIN partner_programs pp ON p.id = pp.program_id
AND pp.partner_id = ?
WHERE p.status = 'active'
AND (p.is_private = 0 OR pp.id IS NOT NULL)
ORDER BY p.name",
[$partnerId]
)->fetchAll();
$settings = $this->getSettings();
$this->view('partner/programs/index', [
'title' => 'Available Programs - ' . ($settings['custom_app_name'] ?? 'Numok'),
'programs' => $programs
]);
}
public function join(): void {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: /programs');
exit;
}
$partnerId = $_SESSION['partner_id'];
$programId = $_POST['program_id'] ?? 0;
// Validate program exists, is active, and is public (private programs can only be assigned by admin)
$program = Database::query(
"SELECT id, terms FROM programs WHERE id = ? AND status = 'active' AND is_private = 0",
[$programId]
)->fetch();
if (!$program) {
$_SESSION['error'] = 'Invalid program selected';
header('Location: /programs');
exit;
}
// Check if already joined
$existing = Database::query(
"SELECT id FROM partner_programs
WHERE partner_id = ? AND program_id = ?",
[$partnerId, $programId]
)->fetch();
if ($existing) {
$_SESSION['error'] = 'You have already joined this program';
header('Location: /programs');
exit;
}
$ipAddress = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ipAddress = trim($ips[0]);
}
if (!empty($program['terms'])) {
Database::update(
'partner_programs',
[
'terms_accepted' => date('Y-m-d H:i:s'),
'terms_accepted_ip' => $ipAddress
],
'partner_id = ? AND program_id = ?',
[$partnerId, $programId]
);
}
// Generate unique tracking code
$trackingCode = bin2hex(random_bytes(8));
try {
Database::insert('partner_programs', [
'partner_id' => $partnerId,
'program_id' => $programId,
'tracking_code' => $trackingCode,
'status' => 'active',
'terms_accepted' => date('Y-m-d H:i:s'),
'terms_accepted_ip' => $ipAddress
]);
$_SESSION['success'] = 'Successfully joined the program!';
} catch (\Exception $e) {
$_SESSION['error'] = 'Failed to join program. Please try again.';
}
header('Location: /programs');
exit;
}
}