-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathabandon_course.php
More file actions
203 lines (183 loc) · 9.23 KB
/
Copy pathabandon_course.php
File metadata and controls
203 lines (183 loc) · 9.23 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<?php
/**
* Stimma - Lär dig i små steg
* Copyright (C) 2025 Christian Alfredsson
*
* This program is free software; licensed under GPL v2.
* See LICENSE and LICENSE-AND-TRADEMARK.md for details.
*
* The name "Stimma" is a trademark and subject to restrictions.
*
* Sida för att avsluta/överge en påbörjad kurs.
*/
require_once 'include/config.php';
require_once 'include/database.php';
require_once 'include/functions.php';
require_once 'include/auth.php';
$systemName = trim(getenv('SYSTEM_NAME'), '"\'') ?: 'Stimma';
$error = '';
$success = '';
$courseId = isset($_GET['course_id']) ? (int)$_GET['course_id'] : 0;
$token = $_GET['token'] ?? '';
// Hämta kursinformation
$course = null;
$user = null;
if ($courseId > 0) {
$course = queryOne("SELECT * FROM " . DB_DATABASE . ".courses WHERE id = ?", [$courseId]);
}
// Kontrollera om användaren är inloggad
$isLoggedIn = isLoggedIn();
if ($isLoggedIn) {
$user = queryOne("SELECT * FROM " . DB_DATABASE . ".users WHERE id = ?", [$_SESSION['user_id']]);
// Publika deltagare ska använda leave_public_course.php (hård radering)
// istället för soft-abandon här.
if ($user && $courseId > 0 && hasPublicCourseAccess((int)$user['id'], $courseId)) {
redirect('leave_public_course.php?course_id=' . $courseId);
exit;
}
}
// Validera token för icke-inloggade användare
$tokenValid = false;
if (!$isLoggedIn && !empty($token) && $user) {
// Token valideras mot user_id + course_id + månad
$expectedToken = hash('sha256', $user['id'] . $courseId . date('Y-m'));
$tokenValid = hash_equals($expectedToken, $token);
}
// Hantera formulär för att avsluta kurs
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $course) {
// Validera CSRF-token om inloggad
if ($isLoggedIn) {
if (!isset($_POST['csrf_token']) || !validateCsrfToken($_POST['csrf_token'])) {
$error = 'Ogiltig förfrågan. Vänligen försök igen.';
} else {
$userId = $_SESSION['user_id'];
$reason = trim($_POST['reason'] ?? '');
// Kontrollera om det redan finns en enrollment-rad
$enrollment = queryOne("SELECT * FROM " . DB_DATABASE . ".course_enrollments
WHERE user_id = ? AND course_id = ?",
[$userId, $courseId]);
if ($enrollment) {
// Uppdatera befintlig rad
execute("UPDATE " . DB_DATABASE . ".course_enrollments
SET status = 'abandoned',
abandoned_at = NOW(),
abandon_reason = ?,
opt_out_reminders = 1
WHERE user_id = ? AND course_id = ?",
[$reason, $userId, $courseId]);
} else {
// Skapa ny rad
execute("INSERT INTO " . DB_DATABASE . ".course_enrollments
(user_id, course_id, status, abandoned_at, abandon_reason, opt_out_reminders)
VALUES (?, ?, 'abandoned', NOW(), ?, 1)",
[$userId, $courseId, $reason]);
}
logActivity($_SESSION['user_email'], "Avslutade kurs", [
'action' => 'course_abandoned',
'course_id' => $courseId,
'course_title' => $course['title'],
'reason' => $reason
]);
$success = 'Du har avbrutit kursen "' . htmlspecialchars($course['title']) . '". Du kommer inte längre få påminnelser om denna kurs. Du kan återuppta den senare om du ändrar dig.';
}
} else {
$error = 'Du måste vara inloggad för att avsluta en kurs.';
}
}
// Sätt sidtitel
$page_title = 'Avbryt kurs - ' . $systemName;
require_once 'include/header.php';
?>
<div class="container-sm min-vh-100 d-flex align-items-center px-3">
<div class="row justify-content-center w-100">
<div class="col-12 col-md-6 col-lg-5">
<div class="card shadow-sm">
<div class="card-body p-4">
<h1 class="h4 mb-4 text-center">
<i class="bi bi-x-circle text-warning me-2"></i>
Avbryt kurs
</h1>
<?php if ($success): ?>
<div class="alert alert-success">
<i class="bi bi-check-circle-fill me-2"></i>
<?= $success ?>
</div>
<div class="text-center mt-4">
<a href="index.php" class="btn btn-primary">
<i class="bi bi-house me-1"></i>Tillbaka till startsidan
</a>
</div>
<?php elseif ($error): ?>
<div class="alert alert-danger">
<i class="bi bi-exclamation-triangle-fill me-2"></i>
<?= $error ?>
</div>
<div class="text-center mt-4">
<a href="index.php" class="btn btn-primary">
<i class="bi bi-house me-1"></i>Tillbaka till startsidan
</a>
</div>
<?php elseif (!$course): ?>
<div class="alert alert-warning">
<i class="bi bi-exclamation-triangle-fill me-2"></i>
Kursen kunde inte hittas.
</div>
<div class="text-center mt-4">
<a href="index.php" class="btn btn-primary">
<i class="bi bi-house me-1"></i>Tillbaka till startsidan
</a>
</div>
<?php elseif (!$isLoggedIn): ?>
<div class="alert alert-info">
<i class="bi bi-info-circle-fill me-2"></i>
Du måste logga in för att avbryta kursen "<?= htmlspecialchars($course['title']) ?>".
</div>
<div class="text-center mt-4">
<a href="index.php" class="btn btn-primary">
<i class="bi bi-box-arrow-in-right me-1"></i>Logga in
</a>
</div>
<?php else: ?>
<div class="mb-4">
<p class="text-muted">
Vill du verkligen <strong>avbryta</strong> kursen <strong>"<?= htmlspecialchars($course['title']) ?>"</strong>?
</p>
<p class="text-muted small">
<strong>OBS:</strong> "Avbryt" betyder att du slutar läsa kursen — inte att du markerar
den som slutförd. Om du vill markera kursen som klar, gå till sista lektionen och slutför den.
</p>
<p class="text-muted small">
Om du avbryter kursen slutar du få påminnelser. Ditt framsteg sparas och du kan
återuppta kursen senare om du ändrar dig.
</p>
</div>
<form method="POST" action="abandon_course.php?course_id=<?= $courseId ?>">
<input type="hidden" name="csrf_token" value="<?= generateCsrfToken() ?>">
<div class="mb-3">
<label for="reason" class="form-label">Varför vill du avbryta kursen? (valfritt)</label>
<select class="form-select" id="reason" name="reason">
<option value="">Välj en anledning...</option>
<option value="Startade kursen av misstag">Startade kursen av misstag</option>
<option value="Kursen är inte relevant för mig">Kursen är inte relevant för mig</option>
<option value="Har inte tid just nu">Har inte tid just nu</option>
<option value="Kursen var för svår">Kursen var för svår</option>
<option value="Kursen var för enkel">Kursen var för enkel</option>
<option value="Annat">Annat</option>
</select>
</div>
<div class="d-grid gap-2">
<button type="submit" class="btn btn-danger">
<i class="bi bi-x-circle me-1"></i>Ja, avbryt kursen
</button>
<a href="index.php" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>Nej, gå tillbaka
</a>
</div>
</form>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
<?php require_once 'include/footer.php'; ?>