193 lines
5.7 KiB
PHP
Executable File
193 lines
5.7 KiB
PHP
Executable File
<?php
|
|
|
|
class ReminderController
|
|
{
|
|
// Zeigt das Formular zum Anlegen einer Erinnerung
|
|
public function create(): void
|
|
{
|
|
require_login();
|
|
|
|
$habit = Habit::findForUser($this->queryId('habit_id'), current_user_id());
|
|
|
|
if (!$habit) {
|
|
flash('error', 'Der Habit fuer die Erinnerung wurde nicht gefunden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
View::render('reminders/form', [
|
|
'habit' => $habit,
|
|
'reminder' => ['habit_id' => $habit['id'], 'is_active' => 1],
|
|
'errors' => [],
|
|
]);
|
|
}
|
|
|
|
// Speichert eine neue Erinnerung
|
|
public function store(): void
|
|
{
|
|
require_login();
|
|
verify_csrf_token();
|
|
|
|
$habit = Habit::findForUser($this->postId('habit_id'), current_user_id());
|
|
|
|
if (!$habit) {
|
|
flash('error', 'Der Habit fuer die Erinnerung wurde nicht gefunden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
$data = $this->validatedData();
|
|
|
|
if (!empty($data['errors'])) {
|
|
View::render('reminders/form', [
|
|
'habit' => $habit,
|
|
'reminder' => array_merge($_POST, $data),
|
|
'errors' => $data['errors'],
|
|
]);
|
|
return;
|
|
}
|
|
|
|
if (!Reminder::createForHabit((int) $habit['id'], current_user_id(), $data)) {
|
|
flash('error', 'Die Erinnerung konnte nicht gespeichert werden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
flash('success', 'Erinnerung wurde erstellt.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
// Zeigt das Formular zum Bearbeiten
|
|
public function edit(): void
|
|
{
|
|
require_login();
|
|
|
|
$reminder = Reminder::findForUser($this->queryId('id'), current_user_id());
|
|
|
|
if (!$reminder) {
|
|
flash('error', 'Erinnerung wurde nicht gefunden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
$habit = Habit::findForUser((int) $reminder['habit_id'], current_user_id());
|
|
|
|
View::render('reminders/form', [
|
|
'habit' => $habit,
|
|
'reminder' => $reminder,
|
|
'errors' => [],
|
|
]);
|
|
}
|
|
|
|
public function update(): void
|
|
{
|
|
require_login();
|
|
verify_csrf_token();
|
|
|
|
$reminder = Reminder::findForUser($this->postId('id'), current_user_id());
|
|
|
|
if (!$reminder) {
|
|
flash('error', 'Erinnerung wurde nicht gefunden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
$habit = Habit::findForUser((int) $reminder['habit_id'], current_user_id());
|
|
$data = $this->validatedData();
|
|
|
|
if (!empty($data['errors'])) {
|
|
View::render('reminders/form', [
|
|
'habit' => $habit,
|
|
'reminder' => array_merge($reminder, $data),
|
|
'errors' => $data['errors'],
|
|
]);
|
|
return;
|
|
}
|
|
|
|
if (!Reminder::update((int) $reminder['id'], current_user_id(), $data)) {
|
|
flash('error', 'Die Erinnerung konnte nicht gespeichert werden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
flash('success', 'Erinnerung wurde gespeichert.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
// Loescht eine Erinnerung
|
|
public function delete(): void
|
|
{
|
|
require_login();
|
|
verify_csrf_token();
|
|
|
|
$reminder = Reminder::findForUser($this->postId('id'), current_user_id());
|
|
|
|
if (!$reminder || !Reminder::delete((int) $reminder['id'], current_user_id())) {
|
|
flash('error', 'Die Erinnerung konnte nicht geloescht werden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
flash('success', 'Erinnerung wurde geloescht.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
public function toggle(): void
|
|
{
|
|
require_login();
|
|
verify_csrf_token();
|
|
|
|
$reminder = Reminder::findForUser($this->postId('id'), current_user_id());
|
|
|
|
if (!$reminder || !Reminder::toggle((int) $reminder['id'], current_user_id())) {
|
|
flash('error', 'Der Status der Erinnerung konnte nicht geaendert werden.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
flash('success', $reminder['is_active'] ? 'Erinnerung pausiert.' : 'Erinnerung aktiviert.');
|
|
redirect('dashboard');
|
|
}
|
|
|
|
private function validatedData(): array
|
|
{
|
|
$time = $this->postString('reminder_time');
|
|
$weekdayValue = $this->postString('weekday');
|
|
$activeValue = $this->postString('is_active');
|
|
$errors = [];
|
|
|
|
// Uhrzeit muss dem Format HH:MM zwischen 00:00 und 23:59
|
|
if (!preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d$/', $time)) {
|
|
$errors['reminder_time'] = 'Bitte gib eine Uhrzeit im Format HH:MM ein.';
|
|
}
|
|
|
|
// Leerer Wochentag ist erlaubt und bedeutet taeglich
|
|
if ($weekdayValue !== '' && !preg_match('/^[1-7]$/', $weekdayValue)) {
|
|
$errors['weekday'] = 'Bitte waehle einen gueltigen Wochentag aus.';
|
|
}
|
|
|
|
if (!in_array($activeValue, ['0', '1'], true)) {
|
|
$errors['is_active'] = 'Bitte waehle einen gueltigen Status aus.';
|
|
}
|
|
|
|
return [
|
|
'reminder_time' => $time,
|
|
'weekday' => $weekdayValue === '' ? null : (int) $weekdayValue,
|
|
'is_active' => $activeValue === '0' ? 0 : 1,
|
|
'errors' => $errors,
|
|
];
|
|
}
|
|
|
|
private function queryId(string $key): int
|
|
{
|
|
$value = $_GET[$key] ?? '';
|
|
|
|
return is_string($value) && preg_match('/^[1-9]\d*$/', $value) ? (int) $value : 0;
|
|
}
|
|
|
|
private function postId(string $key): int
|
|
{
|
|
$value = $_POST[$key] ?? '';
|
|
|
|
return is_string($value) && preg_match('/^[1-9]\d*$/', $value) ? (int) $value : 0;
|
|
}
|
|
|
|
private function postString(string $key): string
|
|
{
|
|
$value = $_POST[$key] ?? '';
|
|
|
|
return is_string($value) ? trim($value) : '';
|
|
}
|
|
} |