Compare commits
	
		
			2 Commits
		
	
	
		
			4c44dac115
			...
			43960ddcb9
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 43960ddcb9 | |||
| 85209ff134 | 
							
								
								
									
										4
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								TODO.md
									
									
									
									
									
								
							| @@ -6,4 +6,6 @@ | ||||
| - [ ] edit user data - change password, mail... | ||||
|  | ||||
| ## Core of the app | ||||
| - [ ] think about it lol | ||||
| - [ ] Habits list | ||||
| - [ ] Habits create | ||||
| - [ ] Habits track | ||||
|   | ||||
							
								
								
									
										58
									
								
								app/controllers/HabitController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/controllers/HabitController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| <?php | ||||
|  | ||||
| class HabitController extends Controller { | ||||
|     public function index() { | ||||
|         // Display the list of habits (to be implemented later) | ||||
|     } | ||||
|  | ||||
|     public function create() { | ||||
|         if ($_SERVER['REQUEST_METHOD'] === 'POST') { | ||||
|             $name = $_POST['name'] ?? ''; | ||||
|             $frequency = $_POST['frequency'] ?? 'Daily'; | ||||
|             $customFrequency = null; | ||||
|  | ||||
|             if (empty($name)) { | ||||
|                 $this->view('habits/create', ['error' => 'Habit name is required.']); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if ($frequency === 'Custom') { | ||||
|                 var_dump($_POST); | ||||
|                 $daysOfWeek = $_POST['days_of_week'] ?? []; | ||||
|                 $daysOfMonth = $_POST['days_of_month'] ?? '*'; | ||||
|                 $months = $_POST['months'] ?? '*'; | ||||
|  | ||||
|                 // Combine into crontab-like string | ||||
|                 $customFrequency = implode(',', $daysOfWeek) . " $daysOfMonth $months"; | ||||
|                 var_dump($customFrequency); | ||||
|  | ||||
|             } | ||||
|  | ||||
|             $habit = new Habit(); | ||||
|             $result = $habit->create([ | ||||
|                 'name' => $name, | ||||
|                 'frequency' => $frequency, | ||||
|                 'custom_frequency' => $customFrequency, | ||||
|                 'reward_points' => intval($_POST['difficulty'] ?? 1), | ||||
|                 'user_id' => $_SESSION['user']['id'], | ||||
|             ]); | ||||
|  | ||||
|             if ($result) { | ||||
|                 //$this->redirect('/habits'); | ||||
|             } else { | ||||
|                 $this->view('habits/create', ['error' => 'Failed to create habit.']); | ||||
|             } | ||||
|         } else { | ||||
|             $this->view('habits/create', ['title' => 'Create Habit']); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public function edit() { | ||||
|         // Edit habit (to be implemented later) | ||||
|     } | ||||
|  | ||||
|     public function delete() { | ||||
|         // Delete habit (to be implemented later) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										32
									
								
								app/models/Habit.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/models/Habit.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| <?php | ||||
|  | ||||
| class Habit { | ||||
|     private $db; | ||||
|  | ||||
|     public function __construct() { | ||||
|         $this->db = Database::getInstance()->getConnection(); | ||||
|     } | ||||
|  | ||||
|     public function create($data) { | ||||
|         $stmt = $this->db->prepare(" | ||||
|             INSERT INTO habits (user_id, title, frequency, custom_frequency, reward_points, created_at) | ||||
|             VALUES (?, ?, ?, ?, ?, NOW()) | ||||
|         "); | ||||
|  | ||||
|         $stmt->bind_param( | ||||
|             "isssi", // Bind types: int, string, string, string, int | ||||
|             $data['user_id'], | ||||
|             $data['name'], | ||||
|             $data['frequency'], | ||||
|             $data['custom_frequency'], // Bind the custom_frequency field | ||||
|             $data['reward_points'] | ||||
|         ); | ||||
|  | ||||
|         if ($stmt->execute()) { | ||||
|             return true; | ||||
|         } else { | ||||
|             error_log("Failed to create habit: " . $stmt->error); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -42,7 +42,7 @@ class User { | ||||
|     public function login($email, $password) { | ||||
|         $hashedPassword = password_hash($password, PASSWORD_BCRYPT); | ||||
|  | ||||
|         $stmt = $this->db->prepare("SELECT username, password FROM users WHERE email = ?"); | ||||
|         $stmt = $this->db->prepare("SELECT id, username, password FROM users WHERE email = ?"); | ||||
|         $stmt->bind_param("s", $email); | ||||
|         $stmt->execute(); | ||||
|         $result = $stmt->get_result(); | ||||
| @@ -52,6 +52,7 @@ class User { | ||||
|             $user = $result->fetch_assoc(); | ||||
|             if (password_verify($password, $user['password'])) { | ||||
|                 $_SESSION['user'] = [ | ||||
|                     'id' => $user['id'], | ||||
|                     'username' => $user['username'], | ||||
|                     'email' => $email, | ||||
|                 ]; | ||||
|   | ||||
| @@ -1 +1,3 @@ | ||||
| <h1>Welcome <?= $_SESSION['user']['username']?>!</h1> | ||||
|  | ||||
| <a href="/habits/create">Create new Habit</a> | ||||
|   | ||||
| @@ -0,0 +1,47 @@ | ||||
| <section class="habit-create"> | ||||
|     <h1><?= $this->get('title', 'Create Habit') ?></h1> | ||||
|  | ||||
|     <?php if ($this->get('error')): ?> | ||||
|         <div class="error" style="color: red; margin-bottom: 1rem;"> | ||||
|             <?= htmlspecialchars($this->get('error')) ?> | ||||
|         </div> | ||||
|     <?php endif; ?> | ||||
|  | ||||
|     <form method="POST" action="/habits/create"> | ||||
|         <label for="name">Habit Name:</label> | ||||
|         <input type="text" name="name" id="name" required value="<?= htmlspecialchars($_POST['name'] ?? '') ?>"> | ||||
|  | ||||
|         <label for="frequency">Frequency:</label> | ||||
|         <select name="frequency" id="frequency" onchange="toggleCustomFrequency(this.value)"> | ||||
|             <option value="Daily">Daily</option> | ||||
|             <option value="Weekly">Weekly</option> | ||||
|             <option value="Custom">Custom</option> | ||||
|         </select> | ||||
|  | ||||
|         <div id="custom-frequency" style="display: none;"> | ||||
|             <label>Days of the Week:</label> | ||||
|             <input type="checkbox" name="days_of_week[]" value="1"> Monday | ||||
|             <input type="checkbox" name="days_of_week[]" value="2"> Tuesday | ||||
|             <input type="checkbox" name="days_of_week[]" value="3"> Wednesday | ||||
|             <input type="checkbox" name="days_of_week[]" value="4"> Thursday | ||||
|             <input type="checkbox" name="days_of_week[]" value="5"> Friday | ||||
|             <input type="checkbox" name="days_of_week[]" value="6"> Saturday | ||||
|             <input type="checkbox" name="days_of_week[]" value="7"> Sunday | ||||
|  | ||||
|             <label for="days_of_month">Days of the Month:</label> | ||||
|             <input type="text" name="days_of_month" id="days_of_month" placeholder="1,15 (comma-separated)"> | ||||
|  | ||||
|             <label for="months">Months:</label> | ||||
|             <input type="text" name="months" id="months" placeholder="1,7,12 (comma-separated)"> | ||||
|         </div> | ||||
|  | ||||
|         <button type="submit">Create Habit</button> | ||||
|     </form> | ||||
| </section> | ||||
|  | ||||
| <script> | ||||
| function toggleCustomFrequency(value) { | ||||
|     const customFrequencyDiv = document.getElementById('custom-frequency'); | ||||
|     customFrequencyDiv.style.display = value === 'Custom' ? 'block' : 'none'; | ||||
| } | ||||
| </script> | ||||
|   | ||||
| @@ -85,7 +85,22 @@ class Database { | ||||
|             die("Failed to create progress table: " . $this->connection->error); | ||||
|         } | ||||
|  | ||||
|         // Add more table creation logic as needed | ||||
|          | ||||
|         // Create habits table | ||||
|         $habitsTableQuery = "CREATE TABLE IF NOT EXISTS habits ( | ||||
|             id INT AUTO_INCREMENT PRIMARY KEY, | ||||
|             user_id INT NOT NULL, | ||||
|             title VARCHAR(100) NOT NULL, | ||||
|             frequency ENUM('Daily', 'Weekly', 'Custom') NOT NULL, | ||||
|             custom_frequency VARCHAR(255) DEFAULT NULL, -- Store crontab-like string | ||||
|             reward_points INT DEFAULT 1, | ||||
|             created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | ||||
|             FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE | ||||
|         ) ENGINE=InnoDB;"; | ||||
|  | ||||
|         if (!$this->connection->query($habitsTableQuery)) { | ||||
|             die("Failed to create habits table: " . $this->connection->error); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -3,6 +3,8 @@ | ||||
| class Router { | ||||
|     private $routes = []; | ||||
|     private $middlewares = []; | ||||
|     private $groupPrefix = ''; | ||||
|     private $groupMiddlewares = []; | ||||
|  | ||||
|     /** | ||||
|      * Add a route with a specific action and optional middleware | ||||
| @@ -12,9 +14,35 @@ class Router { | ||||
|      * @param array $middlewares Optional middlewares for this route | ||||
|      */ | ||||
|     public function add($route, $action, $middlewares = []) { | ||||
|         $route = $this->groupPrefix . $route; | ||||
|         $middlewares = array_merge($this->groupMiddlewares, $middlewares); | ||||
|         $this->routes[$route] = ['action' => $action, 'middlewares' => $middlewares]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Define a group of routes with shared prefix and middlewares | ||||
|      *  | ||||
|      * @param string $prefix | ||||
|      * @param array $middlewares | ||||
|      * @param callable $callback | ||||
|      */ | ||||
|     public function group($prefix, $middlewares, $callback) { | ||||
|         // Save the current state | ||||
|         $previousPrefix = $this->groupPrefix; | ||||
|         $previousMiddlewares = $this->groupMiddlewares; | ||||
|  | ||||
|         // Set new group prefix and middlewares | ||||
|         $this->groupPrefix = $previousPrefix . $prefix; | ||||
|         $this->groupMiddlewares = array_merge($this->groupMiddlewares, $middlewares); | ||||
|  | ||||
|         // Execute the callback to define routes in the group | ||||
|         $callback($this); | ||||
|  | ||||
|         // Restore the previous state | ||||
|         $this->groupPrefix = $previousPrefix; | ||||
|         $this->groupMiddlewares = $previousMiddlewares; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Dispatch the current request to the correct route and execute middlewares | ||||
|      */ | ||||
| @@ -22,6 +50,11 @@ class Router { | ||||
|         $uri = $_SERVER['REQUEST_URI']; | ||||
|         $uri = parse_url($uri, PHP_URL_PATH); | ||||
|  | ||||
|         // Normalize the URI by removing trailing slash (except for root "/") | ||||
|         if ($uri !== '/' && substr($uri, -1) === '/') { | ||||
|             $uri = rtrim($uri, '/'); | ||||
|         } | ||||
|  | ||||
|         if (array_key_exists($uri, $this->routes)) { | ||||
|             $route = $this->routes[$uri]; | ||||
|             $middlewares = $route['middlewares']; | ||||
|   | ||||
| @@ -20,15 +20,29 @@ require_once '../core/Database.php'; | ||||
| require_once '../core/middlewares/RequireAuth.php'; | ||||
|  | ||||
| require_once models . 'User.php'; | ||||
| require_once models . 'Habit.php'; | ||||
|  | ||||
| // Initialize router | ||||
| $router = new Router(); | ||||
| $router->add('/', 'HomeController@index'); | ||||
| $router->add('/home', 'HomeController@home'); | ||||
| $router->add('/dashboard', 'HomeController@dashboard', ['RequireAuth']); | ||||
|  | ||||
| // auth routes | ||||
| $router->add('/auth/signin', 'AuthController@signin'); | ||||
| $router->add('/auth/signup', 'AuthController@signup'); | ||||
| $router->add('/auth/logout', 'AuthController@logout'); | ||||
| $router->group('/auth', [], function ($router) { | ||||
|     $router->add('/signin', 'AuthController@signin'); | ||||
|     $router->add('/signup', 'AuthController@signup'); | ||||
|     $router->add('/logout', 'AuthController@logout'); | ||||
| }); | ||||
|  | ||||
| // dashboard route | ||||
| $router->add('/dashboard', 'HomeController@dashboard', ['RequireAuth']); | ||||
|  | ||||
| // habits routes | ||||
| $router->group('/habits', ['RequireAuth'], function ($router) { | ||||
|     $router->add('', 'HabitController@index'); | ||||
|     $router->add('/create', 'HabitController@create'); | ||||
|     $router->add('/edit/{id}', 'HabitController@edit'); | ||||
|     $router->add('/delete/{id}', 'HabitController@delete'); | ||||
| }); | ||||
|  | ||||
| $router->dispatch(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user