From 58b5ddb660ba2df056475a0a6ad258429ae06c86 Mon Sep 17 00:00:00 2001 From: ilkaya Date: Sun, 21 Dec 2025 01:49:30 +0300 Subject: [PATCH] First prototypes --- Eksikler.md | 19 ++++++++ controllers/auth.js | 16 ++++++- controllers/catalog.js | 2 +- controllers/students.js | 48 ++++++++++++++++++- database/catalog.js | 1 + database/student.js | 39 +++++++++++++++ public/assets/js/script.js | 11 +++-- views/panel/catalogs.ejs | 13 +++-- views/panel/panel.ejs | 90 +++++++++++++++++++++++++++++++++-- views/panel/studentevents.ejs | 14 +++--- views/panel/students.ejs | 4 +- views/partials/sidebar.ejs | 2 +- 12 files changed, 233 insertions(+), 26 deletions(-) create mode 100644 Eksikler.md diff --git a/Eksikler.md b/Eksikler.md new file mode 100644 index 0000000..e8f7b8f --- /dev/null +++ b/Eksikler.md @@ -0,0 +1,19 @@ ++ Login ++ Register ++ Logout +- Profile edit + ++ Add catalog (validation eksik) ++ List catalog ++ Update catalog ++ Delete catalog + ++ Add student (validation eksik) ++ List student ++ Update student ++ Delete student + ++ Add event ++ List event +- Update event Yapılmadı ++ Delete event \ No newline at end of file diff --git a/controllers/auth.js b/controllers/auth.js index fc5f0f7..59f02f1 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -11,6 +11,7 @@ Application.get("/register", RegisterPage); Application.post("/login", PostDataProcess(), Login); Application.post("/register", PostDataProcess(), Register); +Application.get("/logout", MiddlewareAuth, Logout); /** * @param {import("express").Request} request @@ -184,4 +185,17 @@ function MiddlewareAuth(request, response, next) } } -exports.MiddlewareAuth = MiddlewareAuth; \ No newline at end of file +exports.MiddlewareAuth = MiddlewareAuth; + +/** + * @param {import("express").Request} request + * @param {import("express").Response} response + */ +function Logout(request, response) +{ + request.session.authendicated = false; + request.session.user_id = null; + request.session.user = null; + request.session.save(); + response.redirect(307,"/login"); +} \ No newline at end of file diff --git a/controllers/catalog.js b/controllers/catalog.js index 8322db8..724f0cd 100644 --- a/controllers/catalog.js +++ b/controllers/catalog.js @@ -115,7 +115,7 @@ function catalogStoreValidation(body) const schema = Joi.object({ id: Joi.number().min(1), name: Joi.string().min(3).max(200).required().error(new Error('Adı en az 3 karakter ve zorunludur')), - score: Joi.number().min(1).allow('', null).error(new Error('Soyadı formatı hatalı')), + score: Joi.number().allow('', null).error(new Error('Puan formatı hatalı')), description: Joi.string().allow('', null) }); const {error} = schema.validate(body); diff --git a/controllers/students.js b/controllers/students.js index 5275621..7430b3c 100644 --- a/controllers/students.js +++ b/controllers/students.js @@ -3,7 +3,7 @@ const Joi = require("joi"); const { PostDataProcess } = require("../core/postdata"); const User = require("../database/user"); const { MiddlewareAuth } = require("./auth"); -const { createStudent, getStudents, countStudents, updateStudent, deleteStudent, createEvent, getEvents, countEvents } = require("../database/student"); +const { createStudent, getStudents, countStudents, updateStudent, deleteStudent, createEvent, getEvents, countEvents, deleteEvent, getStudentScores } = require("../database/student"); const express = require("express"); @@ -248,4 +248,50 @@ async function EventsList(request, response) "recordsFiltered" : count, "data": data }); +} + +Application.post("/events/destroy", MiddlewareAuth, express.urlencoded({extended: true}), EventDestroy); +/** + * @param {import("express").Request} request + * @param {import("express").Response} response + */ +async function EventDestroy(request, response) +{ + try{ + await deleteEvent( + request.session.user_id, + request.body.id ?? -1 + ); + return response.status(200).json({ + status: "success" + }); + }catch(err){ + console.log(err) + return response.status(500).json({ + status: "fail" + }); + } +} + + + +Application.post("/events/students", MiddlewareAuth, express.urlencoded({extended: true}), EventsStudents); +/** + * @param {import("express").Request} request + * @param {import("express").Response} response + */ +async function EventsStudents(request, response) +{ + let start = request.body.start ?? 0; + let length = request.body.length ?? 100; + let term = request.body.search?.value ?? null; + + let data = await getStudentScores(request.session.user_id,start,length, term); + + response.json({ + "draw": request.body.draw | 0, + "recordsTotal": data.length, + "recordsFiltered" : data.length, + "data": data + }); } \ No newline at end of file diff --git a/database/catalog.js b/database/catalog.js index 4d751c7..5b5397e 100644 --- a/database/catalog.js +++ b/database/catalog.js @@ -54,6 +54,7 @@ async function getCatalogs( .where("owner_id",owner_id) .whereNull("deleted_at") .where("name","like",`%${searchTerm ?? ""}%`) + .orderBy("score","desc") .limit(limit) .offset(offset); } diff --git a/database/student.js b/database/student.js index e6409d8..b1751d6 100644 --- a/database/student.js +++ b/database/student.js @@ -11,6 +11,8 @@ exports.deleteStudent = deleteStudent; exports.createEvent = createEvent; exports.countEvents = countEvents; exports.getEvents = getEvents; +exports.deleteEvent = deleteEvent; +exports.getStudentScores = getStudentScores; @@ -79,6 +81,7 @@ async function getStudents( .where("owner_id",owner_id) .whereNull("deleted_at") .where("name","like",`%${searchTerm ?? ""}%`) + .orderBy("created_at","desc") .limit(limit) .offset(offset); } @@ -133,6 +136,7 @@ async function getEvents(owner_id,start,length,searchTerm) { return await DB .select([ + "student_events.id as id", "students.name as studentname", "students.surname as studentsurname", "student_events.score", @@ -148,6 +152,41 @@ async function getEvents(owner_id,start,length,searchTerm) q.orWhere("events.name","like",`%${searchTerm ?? ""}%`) }) .orderBy("student_events.created_at","desc") + .whereNull("student_events.deleted_at") + .whereNull("students.deleted_at") + .whereNull("events.deleted_at") .limit(length) .offset(start); +} + +async function getStudentScores(owner_id, start, length, searchTerm) +{ + const students = await DB('students') + .select([ + 'id', + 'name', + 'surname', + DB('student_events') + .sum('score') + .whereRaw('?? = ??', ['student_events.student_id', 'students.id']) + .where('owner_id', owner_id) + .whereNull('deleted_at') + .as('total_score') + ]) + .where("name","like",`%${searchTerm ?? ""}%`) + .whereNull('deleted_at') + .orderBy('total_score', 'desc') + .limit(length) + .offset(start); + return students; +} + +async function deleteEvent(owner_id, id) +{ + await DB.table("student_events") + .where("owner_id",owner_id) + .where("id",id) + .update({ + deleted_at: DB.fn.now() + }); } \ No newline at end of file diff --git a/public/assets/js/script.js b/public/assets/js/script.js index 35a3e3e..ae987f9 100644 --- a/public/assets/js/script.js +++ b/public/assets/js/script.js @@ -49,7 +49,7 @@ function setUpHorizontalHeader() { } $(document).on('click', '.menu-previous', function (e) { - let layoutOption = getLocalStorageItem("layout-option","ltr"); + let layoutOption = localStorage["layout-option"] ?? "ltr"; let attribute = (layoutOption == 'ltr' || layoutOption == 'box-layout') ? 'marginLeft' : 'marginRight'; let currentPosition = parseInt(navBar.css(attribute)); if (currentPosition < 0) { @@ -63,7 +63,7 @@ $(document).on('click', '.menu-previous', function (e) { }) $(document).on('click', '.menu-next', function (e) { - let layoutOption = getLocalStorageItem("layout-option","ltr"); + let layoutOption = localStorage["layout-option"] ?? "ltr"; let attribute = (layoutOption == 'ltr' || layoutOption == 'box-layout') ? 'marginLeft' : 'marginRight'; let currentPosition = parseInt(navBar.css(attribute)); if (currentPosition >= maxNavbarLimit) { @@ -78,9 +78,10 @@ $(document).on('click', '.menu-next', function (e) { $(function () { setUpHorizontalHeader(); - let themeMode = getLocalStorageItem('theme-mode', 'light') - setTimeout(() => { + let themeMode = localStorage["theme-mode"] ?? "light"; $('body').addClass(`${themeMode}`) + setTimeout(() => { + $('body').addClass(`${themeMode}`) }, 1500); }); @@ -265,7 +266,7 @@ if (themeToggle) { const isDark = document.body.classList.contains("dark"); document.body.classList.toggle("dark", !isDark); document.body.classList.toggle("light", isDark); - setLocalStorageItem('theme-mode', isDark ? 'light' : 'dark'); + localStorage['theme-mode'] = isDark ? 'light' : 'dark'; }); } function appendHtml() { diff --git a/views/panel/catalogs.ejs b/views/panel/catalogs.ejs index deb5737..6dbc87e 100644 --- a/views/panel/catalogs.ejs +++ b/views/panel/catalogs.ejs @@ -52,11 +52,11 @@
- +
- +
@@ -71,7 +71,7 @@