diff --git a/README.md b/README.md index 6e882bd1b67778927f26bf69a1c7af05b758fcc4..d686cfbeb6d1fdcaa7d77b762d9b4a64dd9ff2b7 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,11 @@ Aplikasi Kuchenk Guide adalah sebuah aplikasi web yang dibangun menggunakan PHP 1. Install PHP dari file situs resmi https://www.php.net/downloads.php 2. Download MySQL dan setup config yang tepat di config.php +# Jika menggunakan docker +1. Pastikan docker sudah terpasang pada perangkat anda +2. Buka terminal dan arahkan pada direktori utama proyek ini +3. Jalankan perintah `docker compose up -d` +4. Buka browser dan arahkan ke address `localhost:8081` # Cara menjalankan server 1. Ganti file config.php dengan konfigurasi tepat anda. @@ -37,6 +42,8 @@ Cats: 13521123 Sightings: 13521105 Users: 13521123 +setup docker: 13521105 + # Bonus: Light house ## Page Home (/) diff --git a/migrations/migrate.sql b/migrations/migrate.sql index 1658a3baf073b22149c82ecc7e77f7726e0e0d14..f1820ecfb504d3d9f5b4f21fc4c9c822422dd7dc 100644 --- a/migrations/migrate.sql +++ b/migrations/migrate.sql @@ -5,12 +5,12 @@ CREATE TABLE users ( nama VARCHAR(255), username VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, - email VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL, isAdmin tinyint(1) NOT NULL DEFAULT '0', registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO users (user_id, nama, username, password, email, isAdmin) VALUES -(1,'ujang','unjanx','p','p',1); +(1,'ujang','unjanx','p','p@gmail.com',1); drop table if exists cats; diff --git a/public/css/login.css b/public/css/login.css index 6bf0a0c65c75ca226ae9004123b0437f787c2bd0..8fc86cc108f8e82a2fc629d183223bbddcc720b9 100644 --- a/public/css/login.css +++ b/public/css/login.css @@ -8,13 +8,14 @@ margin: 0; } - .login-container { + .login-container, .register-container { background-color: #fff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 5px; padding: 70px; margin: 20px; width: 350px; + text-align: center; } .login-logo { @@ -26,23 +27,23 @@ max-width: 150px; } - .login-title { + .login-title, .register-title { text-align: center; font-size: 24px; margin-bottom: 20px; } - .login-form { + .login-form, .register-form { text-align: center; } - .login-label { + .login-label, .register-label { font-size: 16px; display: block; margin-bottom: 5px; } - .login-input { + .login-input, .register-input { width: 100%; height: 40px; border: 1px solid #ccc; @@ -50,7 +51,7 @@ font-size: 16px; } - .login-button { + .login-button, .register-button { background-color: #007bff; color: #fff; padding: 10px 20px; @@ -61,6 +62,6 @@ transition: background-color 0.3s; } - .login-button:hover { + .login-button:hover, .register-button:hover { background-color: #0056b3; - } + } \ No newline at end of file diff --git a/public/js/register.js b/public/js/register.js index b2f8ffa490883e3c016314dc44c9daca831702b8..c0cf69255fe4ac5e3b9249bdab096f40fff7582c 100644 --- a/public/js/register.js +++ b/public/js/register.js @@ -3,15 +3,54 @@ const register = async function (e) { try { const username = document.getElementById("username").value; + const name = document.getElementById("name").value; const email = document.getElementById("email").value; const password = document.getElementById("password").value; - const profilePicture = document.getElementById("profilePicture").files[0]; + const confPW = document.getElementById("confirm-password").value; + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + + let isError = false; + + if (username===""){ + document.getElementById("usernameError").textContent= "Invalid username"; + isError=true; + } else { + document.getElementById("usernameError").textContent= ""; + } + if (name===""){ + document.getElementById("nameError").textContent= "Invalid name"; + isError=true; + } else { + document.getElementById("usernameError").textContent= ""; + } + if (!emailRegex.test(email)){ + document.getElementById("emailError").textContent= "Invalid email"; + isError=true; + } else { + document.getElementById("usernameError").textContent= ""; + } + if (password===""){ + document.getElementById("passwordError").textContent= "Invalid password"; + isError=true; + } else { + document.getElementById("usernameError").textContent= ""; + } + if (password!==confPW){ + document.getElementById("confPassError").textContent= "confirm your password"; + isError=true; + } else { + document.getElementById("usernameError").textContent= ""; + } + if (isError){ + return; + } const formData = new FormData(); formData.append("username", username); + formData.append("name", name); formData.append("email", email); formData.append("password", password); - formData.append("profilePicture", profilePicture); + formData.append("confirm-password", confPW); const response = await fetch("/register", { method: "POST", @@ -24,11 +63,16 @@ const register = async function (e) { if (result.success === true) { alert("Registration success"); - window.location.href = "/login.html"; // Redirect to the login page + window.location.href = "/login"; // Redirect to the login page } else { alert("Registration failed"); } } else { + const result = await response.json(); + if (result["message"]==="Email already taken!"){ + console.log(result["message"]); + } + window.alert(result["message"]) console.log("Request failed"); } } catch (error) { @@ -37,4 +81,4 @@ const register = async function (e) { }; // Menggunakan event submit pada form untuk menjalankan fungsi register -document.getElementById("registerForm").addEventListener("submit", register); +// document.getElementById("registerForm").addEventListener("submit", register); diff --git a/public/view/login.php b/public/view/login.php index 734fa5d570296b33d8892f77ee45a65af296eb87..caafa53fa28924ef1fc0dc3ed77ab32446478c29 100644 --- a/public/view/login.php +++ b/public/view/login.php @@ -22,6 +22,8 @@ <input type="password" id="password" class="login-input" required><br><br> <button type="submit" class="login-button">Login</button> </form> + <p>Don't have an account?</p> + <a href="/register" class="link">register</a> </div> </body> diff --git a/public/view/register.php b/public/view/register.php index 77364e9ee074f5f6a86dae5789aea20ffc504b10..850ff1d88d26586c870e5f800465ca551d1f9b35 100644 --- a/public/view/register.php +++ b/public/view/register.php @@ -6,27 +6,43 @@ <title>Register</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link rel="stylesheet" href="public/css/styles.css"> + <link rel="stylesheet" href="public/css/login.css"> + <script src="./public/js/register.js"></script> </head> <body> - <?php require_once(PROJECT_ROOT_PATH . '/public/components/Navbar.php'); ?> - <h1 id="registerTitle">Register</h1> - <form id="registerForm" enctype="multipart/form-data" method="POST" action="register.php"> - <label for="username" id="usernameLabel">Username:</label> - <input type="text" id="username" name="username" required /><br /><br /> +<!-- --><?php //require_once(PROJECT_ROOT_PATH . '/public/components/Navbar.php'); ?> + <div class="register-container"> + <div class="login-logo"> + <img src="public/images/logo.jpeg" alt="Your Logo"> + </div> + <h1 id="registerTitle" class="register-title">Register</h1> + <form id="registerForm" class="register-form"> + <label for="username" id="usernameLabel" class="register-label">Username:</label> + <input type="text" id="username" name="username" class="register-input" required /><br /><br /> + <span id="usernameError" class="error-message"></span><br><br> - <label for="email" id="emailLabel">Email:</label> - <input type="email" id="email" name="email" required /><br /><br /> + <label for="name" id="nameLabel" class="register-label">Name:</label> + <input type="text" id="name" name="name" class="register-input" required /><br /><br /> + <span id="nameError" class="error-message"></span><br><br> - <label for="password" id="passwordLabel">Password:</label> - <input type="password" id="password" name="password" required /><br /><br /> + <label for="email" id="emailLabel" class="register-label">Email:</label> + <input type="email" id="email" name="email" class="register-input" required /><br /><br /> + <span id="emailError" class="error-message"></span><br><br> - <label for="profilePicture" id="profilePictureLabel">Profile Picture:</label> - <input type="file" id="profilePicture" name="profilePicture" accept="image/*" required /><br /><br /> + <label for="password" id="passwordLabel" class="register-label">Password:</label> + <input type="password" id="password" name="password" class="register-input" required /><br /><br /> + <span id="passwordError" class="error-message"></span><br><br> - <button type="submit" id="registerButton">Register</button> - </form> + <label for="confirm-password" id="confirm-passwordLabel" class="register-label">Confirm Password:</label> + <input type="password" id="confirm-password" name="confirm-password" class="register-input" required /><br /><br /> + <span id="confPassError" class="error-message"></span><br><br> + + <button type="submit" id="registerButton" class="register-button" onclick="register(event)">Register</button> + </form> + <p>Already have an account?</p> + <a href="/login" class="link">log in</a> + </div> </body> </html> \ No newline at end of file diff --git a/src/controllers/auth/RegisterController.php b/src/controllers/auth/RegisterController.php index 1929e7b022aab53e06efbc0de9cb09ea3809bbfd..c05211749292644cf07c99c6dbd690eca7d86c58 100644 --- a/src/controllers/auth/RegisterController.php +++ b/src/controllers/auth/RegisterController.php @@ -22,6 +22,17 @@ class RegisterController extends BaseController return self::$instance; } + public function get($urParams){ + $phpFile = PROJECT_ROOT_PATH . "/public/view/register.php"; + + if (file_exists($phpFile)){ + require $phpFile; + exit(); + } else{ + require PROJECT_ROOT_PATH . "/public/view/404.php"; + } + } + public function post($urlParams) { $name = $_POST["name"]; diff --git a/src/services/UserSrv.php b/src/services/UserSrv.php index 8df1f819f2db90fe4717265f082c8819053239e7..5055c73704bd4a2889571352af1f10a8631f8979 100644 --- a/src/services/UserSrv.php +++ b/src/services/UserSrv.php @@ -44,6 +44,13 @@ class UserSrv extends BaseSrv if ($password !== $confirm_password) { throw new Exception("Password and confirm password do not match"); } +// echo ("<script>console.log(".$username.")</script>"); + $u=$this->getByUsername($username); +// echo is_null($u); + if (!is_null($u->get('username'))){ +// echo $username; + throw new Exception("Username already taken!"); + } $user = (new UserModel())->set('nama', $nama)->set('username', $username)->set('email', $email)->set('password', password_hash($password, PASSWORD_DEFAULT)); @@ -123,6 +130,15 @@ class UserSrv extends BaseSrv return $user; } + public function getByUsername($username){ + $user = new UserModel(); + $sqlRes = $this->repository->getByUsername($username); + if ($sqlRes) { + $user->constructFromArray($sqlRes); + } + return $user; + } + public function updateUser($userId, $userData) { $existingUser = $this->getUserById($userId);