diff options
Diffstat (limited to '')
-rw-r--r-- | src/web/_controller/_index.php (renamed from web/_controller/_index.php) | 2 | ||||
-rw-r--r-- | src/web/_controller/_util/post.php (renamed from web/_controller/_util/post.php) | 97 | ||||
-rw-r--r-- | src/web/_controller/apps/auth.php | 56 | ||||
-rw-r--r-- | src/web/_controller/apps/error.php (renamed from web/_controller/apps/error.php) | 3 | ||||
-rw-r--r-- | src/web/_controller/apps/home.php (renamed from web/_controller/apps/home.php) | 1 | ||||
-rw-r--r-- | src/web/_controller/modal.php (renamed from web/_controller/modal.php) | 8 | ||||
-rw-r--r-- | src/web/_controller/template.php (renamed from web/_controller/template.php) | 0 | ||||
-rw-r--r-- | src/web/_model/apps/auth.php | 13 | ||||
-rw-r--r-- | src/web/_model/apps/error.php (renamed from web/_model/apps/error.php) | 16 | ||||
-rw-r--r-- | src/web/_model/apps/home.php (renamed from web/_model/apps/home.php) | 0 | ||||
-rw-r--r-- | src/web/_model/cache.php (renamed from web/_model/cache.php) | 0 | ||||
-rw-r--r-- | src/web/_model/format.php (renamed from web/_model/format.php) | 0 | ||||
-rw-r--r-- | src/web/_model/main.php (renamed from web/_model/main.php) | 2 | ||||
-rw-r--r-- | src/web/_model/request.php (renamed from web/_model/request.php) | 0 | ||||
-rw-r--r-- | src/web/_views/apps/auth/login.php | 86 | ||||
-rw-r--r-- | src/web/_views/apps/error/main.php (renamed from web/_views/apps/error/main.php) | 2 | ||||
-rw-r--r-- | src/web/_views/apps/home/main.php (renamed from web/_views/apps/home/main.php) | 2 | ||||
-rw-r--r-- | src/web/_views/footer.php (renamed from web/_views/footer.php) | 4 | ||||
-rw-r--r-- | src/web/_views/header.php (renamed from web/_views/header.php) | 32 | ||||
-rw-r--r-- | src/web/_views/header_empty.php | 23 | ||||
-rw-r--r-- | src/web/_views/modal/new_post.php (renamed from web/_views/modal/new_post.php) | 22 | ||||
-rw-r--r-- | src/web/_views/modal/register.php | 173 | ||||
-rw-r--r-- | src/web/_views/template/comment.php (renamed from web/_views/template/comment.php) | 2 | ||||
-rw-r--r-- | src/web/_views/template/error.php (renamed from web/_views/template/error.php) | 0 | ||||
-rw-r--r-- | src/web/_views/template/modal.php (renamed from web/_views/template/modal.php) | 0 | ||||
-rw-r--r-- | src/web/_views/template/pfp.php (renamed from web/_views/template/pfp.php) | 0 | ||||
-rw-r--r-- | src/web/_views/template/post.php (renamed from web/_views/template/post.php) | 31 | ||||
-rw-r--r-- | src/web/_views/template/posts.php (renamed from web/_views/template/posts.php) | 2 | ||||
-rw-r--r-- | src/web/_views/template/toast.php (renamed from web/_views/template/toast.php) | 11 | ||||
-rw-r--r-- | src/web/config/aesthetic.php (renamed from web/config/aesthetic.php) | 5 | ||||
-rw-r--r-- | src/web/config/routes.php (renamed from web/config/routes.php) | 1 | ||||
-rw-r--r-- | src/web/core/_controller.php (renamed from web/core/_controller.php) | 15 | ||||
-rw-r--r-- | src/web/core/_model.php (renamed from web/core/_model.php) | 0 | ||||
-rw-r--r-- | src/web/core/database.php (renamed from web/core/database.php) | 5 | ||||
-rw-r--r-- | src/web/core/loader.php (renamed from web/core/loader.php) | 0 | ||||
-rw-r--r-- | src/web/core/router.php (renamed from web/core/router.php) | 0 | ||||
-rw-r--r-- | src/web/helper/error.php (renamed from web/helper/error.php) | 0 | ||||
-rw-r--r-- | src/web/helper/lang.php (renamed from web/helper/lang.php) | 2 | ||||
-rw-r--r-- | src/web/index.php (renamed from web/index.php) | 1 | ||||
-rw-r--r-- | src/web/lang/en_US/api_lang.php (renamed from web/lang/en_US/api_lang.php) | 6 | ||||
-rw-r--r-- | src/web/lang/en_US/apps/auth.php | 34 | ||||
-rw-r--r-- | src/web/lang/en_US/apps/home.php (renamed from web/lang/en_US/apps/home.php) | 0 | ||||
-rw-r--r-- | src/web/lang/en_US/common_lang.php (renamed from web/lang/en_US/common_lang.php) | 0 | ||||
-rw-r--r-- | src/web/lang/en_US/error_lang.php (renamed from web/lang/en_US/error_lang.php) | 0 |
44 files changed, 582 insertions, 75 deletions
diff --git a/web/_controller/_index.php b/src/web/_controller/_index.php index fdf9440..2fd7db2 100644 --- a/web/_controller/_index.php +++ b/src/web/_controller/_index.php @@ -14,7 +14,7 @@ class _index_controller extends Controller { if ($this->main->session) { $this->redirect('/home'); } else { - $this->redirect('/login'); + $this->redirect('/auth/login'); } } diff --git a/web/_controller/_util/post.php b/src/web/_controller/_util/post.php index b128d67..b48816d 100644 --- a/web/_controller/_util/post.php +++ b/src/web/_controller/_util/post.php @@ -21,6 +21,39 @@ class Post_controller extends Controller { $this->view('template/posts'); } + public function post(): void { + $pid = $this->request_model->get_int('id', 0); + + $post = $this->db + ->select('p.*, l.id as like_id') + ->from('api.post p') + ->join('api.like l', 'p.id = l.post_id AND l.user_id') + ->eq($pid) + ->where('p.id') + ->eq($pid) + ->row(); + + if (!$post) { + return; + } + + $users = $this->cache_model->get_users([$post]); + $uid = $post['user_id']; + + if (!array_key_exists($uid, $users)) { + return; + } + + $user = $users[$uid]; + + $data = array( + 'user' => $user, + 'page_size' => $this->page_size, + 'post' => $post + ); + $this->view('template/post', $data); + } + /** * @return array<string,mixed> */ @@ -30,28 +63,23 @@ class Post_controller extends Controller { $offset = $page * $this->page_size; $user = $this->main->user(); + $uid = isset($user) ? $user['id'] : NULL; $query = $this->db; - if ($user) { - $query = $query->select('p.*, l.post_id IS NOT NULL as liked'); - } else { - $query = $query->select('p.*, FALSE as liked'); - } - - $query = $query->from('api.post p'); - - if ($user) { - $query = $query->join('admin.like l', 'p.id = l.post_id AND l.user_id') - ->eq($user['id']); - } + $query = $this->db + ->select('p.*, l.id as like_id') + ->from('api.post p') + ->join('api.like l', 'p.id = l.post_id AND l.user_id') + ->eq($uid); if ($max) { $query = $query - ->where('id')->le($max); + ->where('p.id')->le($max); } $posts = $query + ->order_by('p.id', 'DESC') ->limit($this->page_size) ->offset($offset) ->rows(); @@ -73,7 +101,6 @@ class Post_controller extends Controller { ->from('api.post p') ->row()['pc']; - return array( 'loaded' => count($posts), 'total' => $pc, @@ -82,6 +109,36 @@ class Post_controller extends Controller { ); } + public function comment(): void { + $cid = $this->request_model->get_int('id', 0); + + $comment = $this->db + ->select('*') + ->from('api.comment') + ->where('id') + ->eq($cid) + ->row(); + + if (!$comment) { + return; + } + + $users = $this->cache_model->get_users([$comment]); + $uid = $comment['user_id']; + + if (!array_key_exists($uid, $users)) { + return; + } + + $user = $users[$uid]; + + $data = array( + 'user' => $user, + 'comment' => $comment + ); + $this->view('template/comment', $data); + } + /** * @return array<string,mixed> */ @@ -105,6 +162,7 @@ class Post_controller extends Controller { } $comments = $query + ->order_by('id', 'ASC') ->limit($this->page_size) ->offset($offset) ->rows(); @@ -112,6 +170,17 @@ class Post_controller extends Controller { $users = $this->cache_model->get_users($comments); $max = 0; + // only add this hr when not logged in + // otherwise its added automatically by + // the like and comment buttons + if ( + count($comments) && + $page == 0 && + $this->main->session === NULL + ) { + echo '<hr>'; + } + foreach ($comments as $comment) { $max = max($max, $comment['id']); $data = array(); diff --git a/src/web/_controller/apps/auth.php b/src/web/_controller/apps/auth.php new file mode 100644 index 0000000..6b30cc9 --- /dev/null +++ b/src/web/_controller/apps/auth.php @@ -0,0 +1,56 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ +class Auth_controller extends Controller { + + // the home model + private $auth_model; + + // the post controller + protected $post_controller; + + function __construct($load) { + parent::__construct($load); + $this->auth_model = $this->load->model('apps/auth'); + } + + public function index(): void { + if ($this->main->session) { + $this->redirect('/home'); + } else { + $this->redirect('/auth/login'); + } + } + + public function login(): void { + if ($this->main->session) { + $this->redirect('/home'); + } + + parent::index(); + $data = $this->auth_model->get_data(); + $this->view('header_empty', $data); + $this->view('apps/auth/login', $data); + $this->view('footer', $data); + } + + public function logout(): void { + if ($this->main->session) { + $_SESSION['jwt'] = NULL; + } + $this->redirect('/auth/login'); + } + + public function update(): void { + if (!$this->is_ajax()) { + $this->error(400); + } + if (!isset($_POST['key']) || !isset($_POST['value'])) { + $this->error(400); + } + $key = $_POST['key']; + $value = $_POST['value']; + $_SESSION[$key] = $value; + } + +} + +?> diff --git a/web/_controller/apps/error.php b/src/web/_controller/apps/error.php index 5ce9ec4..03bbd8d 100644 --- a/web/_controller/apps/error.php +++ b/src/web/_controller/apps/error.php @@ -8,11 +8,12 @@ class Error_controller extends Controller { $this->error_model = $this->load->model('apps/error'); } - public function index() { + public function index(): void { parent::index(); $data = $this->error_model->get_data(); $this->view('header', $data); $this->view('apps/error/main', $data); + $this->view('footer', $data); } } diff --git a/web/_controller/apps/home.php b/src/web/_controller/apps/home.php index edf7e2b..c9a116d 100644 --- a/web/_controller/apps/home.php +++ b/src/web/_controller/apps/home.php @@ -18,6 +18,7 @@ class Home_controller extends Controller { $data = $this->home_model->get_data(); $this->view('header', $data); $this->view('apps/home/main', $data); + $this->view('footer', $data); } } diff --git a/web/_controller/modal.php b/src/web/_controller/modal.php index 9ae4ca8..03074d4 100644 --- a/web/_controller/modal.php +++ b/src/web/_controller/modal.php @@ -20,6 +20,14 @@ class Modal_controller extends Controller { public function new_post(): void { $this->modal('new_post'); } + + public function register(): void { + $this->load->app_lang( + $this->main->info['lang'], + 'auth' + ); + $this->modal('register'); + } } ?> diff --git a/web/_controller/template.php b/src/web/_controller/template.php index 7a8cdf8..7a8cdf8 100644 --- a/web/_controller/template.php +++ b/src/web/_controller/template.php diff --git a/src/web/_model/apps/auth.php b/src/web/_model/apps/auth.php new file mode 100644 index 0000000..a1802de --- /dev/null +++ b/src/web/_model/apps/auth.php @@ -0,0 +1,13 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ +class Auth_model extends Model { + + function __construct($load) { + parent::__construct($load); + } + + public function get_data(): array { + $data = parent::get_data(); + $data['title'] = lang('login'); + return $data; + } +} diff --git a/web/_model/apps/error.php b/src/web/_model/apps/error.php index ad72b28..58e3346 100644 --- a/web/_model/apps/error.php +++ b/src/web/_model/apps/error.php @@ -7,22 +7,18 @@ class Error_model extends Model { private function get_msg(&$data) { if (!array_key_exists('code', $_GET)) { + http_response_code(500); $data['msg'] = lang('error'); $data['title'] = '500'; } else { $code = $_GET['code']; + http_response_code($code); $data['title'] = $code; - switch ($code) { - case '404': - $data['msg'] = lang('error_404'); - break; - case '500': - $data['msg'] = lang('error_500'); - break; - default: - $data['msg'] = lang('error'); - break; + $msg = lang('error_' . $code, FALSE); + if (!$msg) { + $msg = lang('error'); } + $data['msg'] = $msg; } } diff --git a/web/_model/apps/home.php b/src/web/_model/apps/home.php index 82fbf26..82fbf26 100644 --- a/web/_model/apps/home.php +++ b/src/web/_model/apps/home.php diff --git a/web/_model/cache.php b/src/web/_model/cache.php index 6cf9924..6cf9924 100644 --- a/web/_model/cache.php +++ b/src/web/_model/cache.php diff --git a/web/_model/format.php b/src/web/_model/format.php index 52b51be..52b51be 100644 --- a/web/_model/format.php +++ b/src/web/_model/format.php diff --git a/web/_model/main.php b/src/web/_model/main.php index ab964fd..6d8b708 100644 --- a/web/_model/main.php +++ b/src/web/_model/main.php @@ -53,7 +53,7 @@ class Main_model { */ private function asset_stamp($path): int { $root = $GLOBALS['webroot']; - $path = $root . '/public/' . $path; + $path = $root . '/../public/' . $path; return filemtime($path); } diff --git a/web/_model/request.php b/src/web/_model/request.php index 4cce07a..4cce07a 100644 --- a/web/_model/request.php +++ b/src/web/_model/request.php diff --git a/src/web/_views/apps/auth/login.php b/src/web/_views/apps/auth/login.php new file mode 100644 index 0000000..d7f326b --- /dev/null +++ b/src/web/_views/apps/auth/login.php @@ -0,0 +1,86 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ ?> +<?php /* vi: syntax=php */ ?> +<div id="main-content"> + <div class="branding col"> + <h1>xssbook</h1> + <span><?=lang('login_branding')?></span> + </div> + <div class="form card col"> + <form id="action-login" class="col" action=""> + <div class="rel mb"> + <input + type="text" + name="username" + id="login-username" + placeholder=" " + > + <label for="username"> + <?=lang('ph_username')?> + </label> + </div> + <div class="rel mb"> + <input + type="password" + name="password" + id="login-password" + placeholder=" " + > + <label for="password"> + <?=lang('ph_password')?> + </label> + </div> + <?=ilang('action_login', + class: 'btn btn-submit btn-wide', + button: TRUE, + attrs: array('type' => 'submit') + )?> + <?=ilang('action_forgot_passwd', + class: 'btn btn-line btn-blue btn-wide mt' + )?> + </form> + <hr> + <?=ilang('action_create_account', + id: 'action-register', + class: 'btn btn-success btn-wide', + button: TRUE, + attrs: array('type' => 'submit') + )?> + </div> + <script> + + var onLogin = function(data) { + let jwt = data.token; + + $.ajax({ + url: '/auth/update', + method: 'POST', + data: JSON.stringify({ + key: 'jwt', + value: jwt + }), + success: function (_) { + window.location = '/home'; + } + }) + }; + + $('#action-login').on('submit', function(e) { + e.preventDefault(); + let username = $('#login-username').val(); + let password = $('#login-password').val(); + + $.ajax({ + url: '/api/rpc/login', + method: 'POST', + data: JSON.stringify({ username, password }), + success: onLogin + }); + }); + + $('#action-register').on('click', function() { + $.get( "/modal/register", function (data) { + $(document.body).append(data); + }); + }) + </script> +</div> diff --git a/web/_views/apps/error/main.php b/src/web/_views/apps/error/main.php index 81051bd..dde39cf 100644 --- a/web/_views/apps/error/main.php +++ b/src/web/_views/apps/error/main.php @@ -1,6 +1,6 @@ <?php /* Copyright (c) 2024 Freya Murphy */ ?> <?php /* vi: syntax=php */ ?> -<div id="error"> +<div id="main-content"> <h1><?=$title?></h1> <span><?=$msg?></span> </div> diff --git a/web/_views/apps/home/main.php b/src/web/_views/apps/home/main.php index 5cfdf8c..29bf7c3 100644 --- a/web/_views/apps/home/main.php +++ b/src/web/_views/apps/home/main.php @@ -7,7 +7,7 @@ <?php $this->view('template/pfp', array('user' => $self))?> <a id="action-new-post" - class="input btn-fake ml" + class="btn btn-alt btn-wide ml" autocomplete="off" aria-label="<?=lang('action_new_post_tip')?>" > diff --git a/web/_views/footer.php b/src/web/_views/footer.php index 1266b9a..9040c3a 100644 --- a/web/_views/footer.php +++ b/src/web/_views/footer.php @@ -1,4 +1,8 @@ <?php /* Copyright (c) 2024 Freya Murphy */ ?> <?php /* vi: syntax=php */ ?> + <footer> + Freya Murphy © 2023 | <a href="https://freya.cat">freya.cat</a> + </footer> <body> + </html> diff --git a/web/_views/header.php b/src/web/_views/header.php index 891e27e..7c60197 100644 --- a/web/_views/header.php +++ b/src/web/_views/header.php @@ -2,28 +2,8 @@ <?php /* vi: syntax=php */ ?> <?php $self = $this->main->user(); + $this->view('header_empty', $data); ?> -<!DOCTYPE html> -<html> - <head> - <script> - <?php if ($this->main->session): ?> - var jwtStr = <?=json_encode($this->main->session['jwt'])?>; - <?php else: ?> - var jwtStr = null; - <?php endif; ?> - </script> - <?php - foreach ($js_files as $js) { - echo $this->main->link_js($js); - } - foreach ($css_files as $css) { - echo $this->main->link_css($css); - } - ?> - <title><?=$title?></title> - </head> - <body> <header class="nav"> <div class="nav-left"> <span class="logo">xssbook</span> @@ -31,7 +11,7 @@ <div class="nav-center" :class="{hidden: !visible}"> <a id="action-home" - class="header-entry btn btn-hover btn-action btn-blue" + class="btn" href="/home" title="<?=lang('action_home_tip')?>" > @@ -40,7 +20,7 @@ </a> <a id="action-people" - class="header-entry btn btn-hover btn-action btn-blue" + class="btn" href="/people" title="<?=lang('action_people_tip')?>" > @@ -49,7 +29,7 @@ </a> <a id="action-chat" - class="header-entry btn btn-hover btn-action btn-blue" + class="btn" href="/chat" title="<?=lang('action_chat_tip')?>" > @@ -70,7 +50,7 @@ 'class' => 'pfp-sm ml', )); ?> <?php else: ?> - <?=ilang('action_login', class: 'btn btn-action', href: '/auth/login')?> + <?=ilang('action_login', class: 'btn', href: '/auth/login')?> <?php endif; ?> </div> <script> @@ -80,5 +60,3 @@ }); </script> </header> - <div id="toast-container"> - </div> diff --git a/src/web/_views/header_empty.php b/src/web/_views/header_empty.php new file mode 100644 index 0000000..75f6f17 --- /dev/null +++ b/src/web/_views/header_empty.php @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html> + <head> + <script> + <?php if ($this->main->session): ?> + var jwtStr = <?=json_encode($this->main->session['jwt'])?>; + <?php else: ?> + var jwtStr = null; + <?php endif; ?> + </script> + <?php + foreach ($js_files as $js) { + echo $this->main->link_js($js); + } + foreach ($css_files as $css) { + echo $this->main->link_css($css); + } + ?> + <title><?=$title?></title> + </head> + <body> + <div id="toast-container"> + </div> diff --git a/web/_views/modal/new_post.php b/src/web/_views/modal/new_post.php index 71028ad..50b9b84 100644 --- a/web/_views/modal/new_post.php +++ b/src/web/_views/modal/new_post.php @@ -22,7 +22,7 @@ <div class="modal-footer"> <?=ilang('action_submit', id: 'new-post-submit', - class: 'btn-action', + class: 'btn btn-wide btn-submit', attrs: array('type' => 'submit'), button: TRUE )?> @@ -32,14 +32,28 @@ $('#new-post-form').submit(function(e) { e.preventDefault(); let content = $('#new-post-content').val(); + let me = $(this); + + const getPost = function(data) { + if (data) { + $('#post-container').prepend(data); + } + me.closest('.modal-container').remove(); + } + + const onPost = function(data) { + let id = data[0].id; + $.get({ + url: '/_util/post/post?id=' + id, + success: getPost + }); + } $.ajax({ url: '/api/post', method: 'POST', data: JSON.stringify({ content }), - success: function(data) { - window.location.reload(); - }, + success: onPost }); }); </script> diff --git a/src/web/_views/modal/register.php b/src/web/_views/modal/register.php new file mode 100644 index 0000000..f4d364a --- /dev/null +++ b/src/web/_views/modal/register.php @@ -0,0 +1,173 @@ + +<?php /* Copyright (c) 2024 Freya Murphy */ ?> +<?php /* vi: syntax=php */ ?> +<form id="register-form"> +<div class="modal-content register-modal col"> + <label class="static"> + <?=lang('ph_basic_info')?> + </label> + <div class="row mt"> + <div class="rel btn-wide"> + <input + type="text" + name="first_name" + id="register-first-name" + placeholder=" " + > + <label for="first_name"> + <?=lang('ph_first_name')?> + </label> + </div> + <div class="rel ml btn-wide"> + <input + type="text" + name="last_name" + id="register-last-name" + placeholder=" " + > + <label for="last_name"> + <?=lang('ph_last_name')?> + </label> + </div> + </div> + <div class="rel mt"> + <input + type="text" + name="username" + id="register-username" + placeholder=" " + > + <label for="username"> + <?=lang('ph_username')?> + </label> + </div> + <div class="rel mt"> + <input + type="password" + name="password" + id="register-password" + placeholder=" " + > + <label for="password"> + <?=lang('ph_password')?> + </label> + </div> + <div class="rel mt"> + <input + type="text" + name="email" + id="register-email" + placeholder=" " + > + <label for="email"> + <?=lang('ph_email')?> + </label> + </div> + <label for="birth_date" class="mt static"> + <?=lang('ph_birth_date')?> + </label> + <input + class="mt" + type="date" + name="birth_date" + id="register-birth-date" + > + <label for="gender" class="mt static"> + <?=lang('ph_gender')?> + </label> + <div class="row mt" data-type="radio" data-name="gender-wrapper"> + <div class="rel radio mr"> + <input + type="radio" + id="register-gender-male" + name="gender" + value="male" + > + <label + for="register-gender-male" + class="static" + > + <?=lang('ph_gender_male')?> + </label> + </div> + <div class="rel radio mr"> + <input + type="radio" + id="register-gender-female" + name="gender" + value="female" + > + <label + for="register-gender-female" + class="static" + > + <?=lang('ph_gender_female')?> + </label> + </div> + <div class="rel radio"> + <input + type="radio" + id="register-gender-lettuce" + name="gender" + value="lettuce" + > + <label + for="register-gender-lettuce" + class="static" + > + <?=lang('ph_gender_lettuce')?> + </label> + </div> + </div> +</div> +<div class="modal-footer"> + <?=ilang('action_register', + id: 'register-submit', + class: 'btn btn-wide btn-success', + attrs: array('type' => 'submit'), + button: TRUE + )?> +</div> +</form> +<script> + $('#register-form').submit(function(e) { + e.preventDefault(); + + const form = event.target; + const formFields = form.elements; + + let first_name = formFields.first_name.value.trim(); + let last_name = formFields.last_name.value.trim(); + let username = formFields.username.value.trim(); + let password = formFields.password.value.trim(); + let email = formFields.email.value.trim(); + let birth_date = formFields.birth_date.value.trim(); + let gender = formFields.gender.value.trim(); + + if(birth_date === '') { + errorToast('toast_date_empty'); + return; + } + + const onSuccess = () => { + $.ajax({ + url: '/api/rpc/login', + method: 'POST', + data: JSON.stringify({ + username, password + }), + success: onLogin + }); + }; + + $.ajax({ + url: '/api/user', + method: 'POST', + data: JSON.stringify({ + first_name, last_name, username, password, + email, birth_date, gender + }), + success: onSuccess + }); + }); +</script> diff --git a/web/_views/template/comment.php b/src/web/_views/template/comment.php index 20032b2..3ff473b 100644 --- a/web/_views/template/comment.php +++ b/src/web/_views/template/comment.php @@ -8,7 +8,7 @@ <div class="ml col sub-card"> <div class="row"> <strong><?=$format_model->name($user)?></strong> - <span class="dim ml"><?=$format_model->date($comment['date'])?></span> + <span class="dim ml"><?=$format_model->date($comment['created'])?></span> </div> <?=$comment['content']?> </div> diff --git a/web/_views/template/error.php b/src/web/_views/template/error.php index 2e02cb1..2e02cb1 100644 --- a/web/_views/template/error.php +++ b/src/web/_views/template/error.php diff --git a/web/_views/template/modal.php b/src/web/_views/template/modal.php index e3ce6fe..e3ce6fe 100644 --- a/web/_views/template/modal.php +++ b/src/web/_views/template/modal.php diff --git a/web/_views/template/pfp.php b/src/web/_views/template/pfp.php index aec7318..aec7318 100644 --- a/web/_views/template/pfp.php +++ b/src/web/_views/template/pfp.php diff --git a/web/_views/template/post.php b/src/web/_views/template/post.php index 0541026..83a72bf 100644 --- a/web/_views/template/post.php +++ b/src/web/_views/template/post.php @@ -5,7 +5,7 @@ <?php $this->view('template/pfp', array('user' => $user))?> <div class="col ml"> <strong><?=$user['first_name'] . ' ' . $user['last_name']?></strong> - <span class="dim"><?=$post['date']?></span> + <span class="dim"><?=$post['created']?></span> </div> </div> <p> @@ -13,20 +13,28 @@ </p> <?php $self = $this->main->user(); + $liked = $post['like_id'] ? 'btn-blue' : ''; + $post_attrs = array( + 'postId' => $post['id'] + ); + if ($post['like_id'] !== NULL) { + $post_attrs['likeId'] = $post['like_id']; + } ?> <?php if ($self): ?> <hr> <div class="row"> - <?=ilang('action_like', class: 'grow btn btn-hover btn-action')?> - <?=ilang('action_comment', class: 'grow btn btn-hover btn-action action-comment', - click: '$(\'#new-comment-' . $post['id'] . '\').focus()' + <?=ilang('action_like', + class: 'btn btn-wide action-like ' . $liked, + attrs: $post_attrs + )?> + <?=ilang('action_comment', class: 'btn btn-wide action-comment', + click: '$(\'#action-new-comment-' . $post['id'] . '\').focus()' )?> </div> <hr> -<?php else: ?> - <hr> <?php endif; ?> - <div class="col comments"> + <div class="col comments pb"> <?php $_GET = array('id' => $post['id']); $cdata = $this->comments(); @@ -52,16 +60,17 @@ ?> </div> <?php if ($self): ?> - <div class="row grow mt"> + <div class="row pb"> <?php $this->view('template/pfp', array('user' => $user))?> - <form class="ml action-new-comment-form"> + <form class="ml action-new-comment-form row"> <input type="hidden" name="id" value="<?=$post['id']?>" > <input - class="action-new-comment input" + id="action-new-comment-<?=$post['id']?>" + class="action-new-comment btn btn-wide btn-alt" postId="<?=$post['id']?>" autocomplete="off" type="text" @@ -73,3 +82,5 @@ </div> <?php endif; ?> </div> + + diff --git a/web/_views/template/posts.php b/src/web/_views/template/posts.php index f57a25f..5e9156c 100644 --- a/web/_views/template/posts.php +++ b/src/web/_views/template/posts.php @@ -10,7 +10,7 @@ if ($loaded >= $page_size && $page_size < $total) { ilang('action_load_posts', id: 'action-load-posts', - class: 'btn btn-line mb', + class: 'btn btn-line btn-wide mb', attrs: array( 'loaded' => $loaded, 'pageSize' => $page_size, diff --git a/web/_views/template/toast.php b/src/web/_views/template/toast.php index 1f74602..ae2e7d8 100644 --- a/web/_views/template/toast.php +++ b/src/web/_views/template/toast.php @@ -11,9 +11,16 @@ array_push($params, $hint); } - $msg = lang($msg, sub: $params); + $lang_msg = lang($msg, FALSE, sub: $params); + + if(!$lang_msg) { + $lang_msg = $msg; + } else { + $lang_msg = ucfirst($lang_msg); + } + ?> <div class="toast error"> - <?=ucfirst($msg)?> + <?=$lang_msg?> <?=ilang('action_close', class: 'action-close-toast')?> </div> diff --git a/web/config/aesthetic.php b/src/web/config/aesthetic.php index a2e4194..304baec 100644 --- a/web/config/aesthetic.php +++ b/src/web/config/aesthetic.php @@ -30,6 +30,11 @@ class Aesthetic { 'css/post.css' ], ), + 'auth' => array( + 'css' => [ + 'css/auth.css' + ], + ), ); } /** diff --git a/web/config/routes.php b/src/web/config/routes.php index 78df332..33c871b 100644 --- a/web/config/routes.php +++ b/src/web/config/routes.php @@ -3,5 +3,6 @@ $routes = array(); $routes['home'] = 'apps/home'; $routes['error'] = 'apps/error'; +$routes['auth'] = 'apps/auth'; $routes[''] = '_index'; diff --git a/web/core/_controller.php b/src/web/core/_controller.php index a357ccc..4a788d3 100644 --- a/web/core/_controller.php +++ b/src/web/core/_controller.php @@ -45,5 +45,20 @@ abstract class Controller { } } + protected function is_ajax(): bool { + $_POST = json_decode( + file_get_contents("php://input"), true + ); + return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'; + } + + protected function error($code): void { + $_GET['code'] = $code; + $this->main->info['app'] = 'error'; + $error_controller = $this->load->controller('apps/error'); + $error_controller->index(); + die(); + } + } ?> diff --git a/web/core/_model.php b/src/web/core/_model.php index 936fab4..936fab4 100644 --- a/web/core/_model.php +++ b/src/web/core/_model.php diff --git a/web/core/database.php b/src/web/core/database.php index 079b0de..81352a9 100644 --- a/web/core/database.php +++ b/src/web/core/database.php @@ -122,6 +122,11 @@ class DatabaseQuery { return $this; } + public function order_by($column, $order = 'ASC') { + $this->query .= "ORDER BY " . $column . ' ' . $order . ' '; + return $this; + } + public function rows() { $stmt = $this->conn->prepare($this->query); try { diff --git a/web/core/loader.php b/src/web/core/loader.php index 2091533..2091533 100644 --- a/web/core/loader.php +++ b/src/web/core/loader.php diff --git a/web/core/router.php b/src/web/core/router.php index 72c7674..72c7674 100644 --- a/web/core/router.php +++ b/src/web/core/router.php diff --git a/web/helper/error.php b/src/web/helper/error.php index 6fcaddd..6fcaddd 100644 --- a/web/helper/error.php +++ b/src/web/helper/error.php diff --git a/web/helper/lang.php b/src/web/helper/lang.php index 96944da..48acba9 100644 --- a/web/helper/lang.php +++ b/src/web/helper/lang.php @@ -69,7 +69,7 @@ function ilang($key, } echo '>' . $text . '</span>'; } - if ($click) { + if ($click || $button) { echo '</button>'; } else { echo '</a>'; diff --git a/web/index.php b/src/web/index.php index 9c2d239..688383f 100644 --- a/web/index.php +++ b/src/web/index.php @@ -1,5 +1,6 @@ <?php /* Copyright (c) 2024 Freya Murphy */ +session_save_path('/var/lib/php/session'); session_start(); $webroot = dirname(__FILE__); diff --git a/web/lang/en_US/api_lang.php b/src/web/lang/en_US/api_lang.php index 129147c..3afc4f6 100644 --- a/web/lang/en_US/api_lang.php +++ b/src/web/lang/en_US/api_lang.php @@ -6,6 +6,7 @@ $lang['api_column_first_name'] = 'first name'; $lang['api_column_last_name'] = 'last name'; $lang['api_column_middle_name'] = 'middle name'; $lang['api_column_email'] = 'email'; +$lang['api_column_password'] = 'password'; $lang['api_column_gender'] = 'gender'; $lang['api_column_join_date'] = 'join date'; $lang['api_column_birth_date'] = 'birth date'; @@ -22,5 +23,10 @@ $lang['api_null_value'] = '%s cannot be empty'; $lang['api_unique_value'] = '%s is not available (not unique)'; $lang['api_min_value'] = '%s length cannot be less than %s'; $lang['api_max_value'] = '%s length cannot exceed %s'; +$lang['api_invalid_login'] = 'Invalid username or password'; +$lang['api_unknown'] = 'An unknown error as occurred'; + +// toast messages +$lang['toast_date_empty'] = 'Birthday cannot be empty'; ?> diff --git a/src/web/lang/en_US/apps/auth.php b/src/web/lang/en_US/apps/auth.php new file mode 100644 index 0000000..fb9d758 --- /dev/null +++ b/src/web/lang/en_US/apps/auth.php @@ -0,0 +1,34 @@ +<?php + +$lang['login'] = 'Login'; +$lang['login_branding'] = 'Connect with javascript and the world around you on XSSBook.'; + +$lang['ph_username'] = 'Username'; +$lang['ph_password'] = 'Password'; +$lang['ph_first_name'] = 'First Name'; +$lang['ph_last_name'] = 'Last Name'; +$lang['ph_middle_name'] = 'Middle Name'; +$lang['ph_username'] = 'Username'; +$lang['ph_email'] = 'Email'; +$lang['ph_password'] = 'Password'; +$lang['ph_birth_date'] = 'Birthday'; +$lang['ph_gender'] = 'Gender'; +$lang['ph_gender_male'] = 'Male'; +$lang['ph_gender_female'] = 'Female'; +$lang['ph_gender_lettuce'] = 'Lettuce'; +$lang['ph_basic_info'] = 'General Information'; + +$lang['action_login_tip'] = 'Login'; +$lang['action_login_text'] = 'Login'; +$lang['action_register_tip'] = 'Register'; +$lang['action_register_text'] = 'Register'; +$lang['action_create_account_tip'] = 'Create a new account'; +$lang['action_create_account_text'] = 'Create new account'; +$lang['action_forgot_passwd_tip'] = 'Reset your password'; +$lang['action_forgot_passwd_text'] = 'Forgot password?'; + +$lang['register_modal_title'] = 'Create New Account'; +$lang['action_register_text'] = 'Register'; +$lang['action_register_tip'] = 'Register'; + +?> diff --git a/web/lang/en_US/apps/home.php b/src/web/lang/en_US/apps/home.php index a30eb88..a30eb88 100644 --- a/web/lang/en_US/apps/home.php +++ b/src/web/lang/en_US/apps/home.php diff --git a/web/lang/en_US/common_lang.php b/src/web/lang/en_US/common_lang.php index 7e214b5..7e214b5 100644 --- a/web/lang/en_US/common_lang.php +++ b/src/web/lang/en_US/common_lang.php diff --git a/web/lang/en_US/error_lang.php b/src/web/lang/en_US/error_lang.php index afecaa1..afecaa1 100644 --- a/web/lang/en_US/error_lang.php +++ b/src/web/lang/en_US/error_lang.php |