From f2f4cbfba51ba83f258cb5e15e90277abdfa506e Mon Sep 17 00:00:00 2001 From: 65160019 <65160019@go.buu.ac.th> Date: Mon, 24 Mar 2025 20:36:18 +0700 Subject: [PATCH] greate note project v10 --- Controllers/AuthController.js | 197 ---------------------------- Controllers/CategoryController.js | 129 ------------------- Controllers/NoteController.js | 206 ------------------------------ Routes/web.js | 24 ++-- index.js | 8 +- package.json | 8 +- 6 files changed, 18 insertions(+), 554 deletions(-) delete mode 100644 Controllers/AuthController.js delete mode 100644 Controllers/CategoryController.js delete mode 100644 Controllers/NoteController.js diff --git a/Controllers/AuthController.js b/Controllers/AuthController.js deleted file mode 100644 index 6b003af..0000000 --- a/Controllers/AuthController.js +++ /dev/null @@ -1,197 +0,0 @@ -const User = require('../Models/User'); -const jwt = require('jsonwebtoken'); -const path = require('path'); - -class AuthController { - // Show the login page - static showLoginPage(req, res) { - res.render('login', { error: null }); - } - - // Show the registration page - static showRegisterPage(req, res) { - res.render('register', { error: null }); - } - - // Register a new user - static signup(req, res) { - const { name, email, password, confirm_password } = req.body; - - // Validate input - if (!name || !email || !password || !confirm_password) { - return res.render('register', { error: 'All fields are required' }); - } - - if (password !== confirm_password) { - return res.render('register', { error: 'Passwords do not match' }); - } - - // Check if email already exists - User.getByEmail(email, (err, user) => { - if (err) { - console.log(err); - return res.render('register', { error: 'Database error' }); - } - - if (user) { - return res.render('register', { error: 'Email already in use' }); - } - - // Create new user - User.create({ name, email, password }, (err, result) => { - if (err) { - console.log(err); - return res.render('register', { error: 'Failed to create user' }); - } - - // Redirect to login page - return res.render('login', { error: null, success: 'Registration successful. Please login.' }); - }); - }); - } - - // API signup - static apiSignup(req, res) { - const { name, email, password } = req.body; - - // Validate input - if (!name || !email || !password) { - return res.status(400).json({ error: 'All fields are required' }); - } - - // Check if email already exists - User.getByEmail(email, (err, user) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Database error' }); - } - - if (user) { - return res.status(400).json({ error: 'Email already in use' }); - } - - // Create new user - User.create({ name, email, password }, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Failed to create user' }); - } - - res.status(201).json({ - message: 'User created successfully', - userId: result.insertId - }); - }); - }); - } - - // Login a user - static login(req, res) { - const { email, password } = req.body; - - // Validate input - if (!email || !password) { - return res.render('login', { error: 'Email and password are required' }); - } - - // Find user by email - User.getByEmail(email, (err, user) => { - if (err) { - console.log(err); - return res.render('login', { error: 'Database error' }); - } - - if (!user) { - return res.render('login', { error: 'Invalid email or password' }); - } - - // Verify password - User.verifyPassword(password, user.password, (err, isMatch) => { - if (err) { - console.log(err); - return res.render('login', { error: 'Authentication error' }); - } - - if (!isMatch) { - return res.render('login', { error: 'Invalid email or password' }); - } - - // Create token - const token = jwt.sign( - { id: user.id, name: user.name, email: user.email }, - process.env.TOKEN_SECRET, - { expiresIn: '24h' } - ); - - // Set token in cookie - res.cookie('auth-token', token, { - httpOnly: true, - maxAge: 24 * 60 * 60 * 1000 // 24 hours - }); - - // Redirect to dashboard - res.redirect('/dashboard'); - }); - }); - } - - // API login - static apiLogin(req, res) { - const { email, password } = req.body; - - // Validate input - if (!email || !password) { - return res.status(400).json({ error: 'Email and password are required' }); - } - - // Find user by email - User.getByEmail(email, (err, user) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Database error' }); - } - - if (!user) { - return res.status(400).json({ error: 'Invalid email or password' }); - } - - // Verify password - User.verifyPassword(password, user.password, (err, isMatch) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Authentication error' }); - } - - if (!isMatch) { - return res.status(400).json({ error: 'Invalid email or password' }); - } - - // Create token - const token = jwt.sign( - { id: user.id, name: user.name, email: user.email }, - process.env.TOKEN_SECRET, - { expiresIn: '24h' } - ); - - // Send response with token - res.status(200).json({ - message: 'Login successful', - token: token, - user: { - id: user.id, - name: user.name, - email: user.email - } - }); - }); - }); - } - - // Logout a user - static logout(req, res) { - res.clearCookie('auth-token'); - res.redirect('/'); - } -} - -module.exports = AuthController; \ No newline at end of file diff --git a/Controllers/CategoryController.js b/Controllers/CategoryController.js deleted file mode 100644 index 0e7202e..0000000 --- a/Controllers/CategoryController.js +++ /dev/null @@ -1,129 +0,0 @@ -const Category = require('../Models/Category'); - -class CategoryController { - // Display all categories (web) - static index(req, res) { - Category.getByUserId(req.user.id, (err, categories) => { - if (err) { - console.log(err); - return res.status(500).send('Error loading categories'); - } - res.render('categories', { - categories: categories, - user: req.user - }); - }); - } - - // Get all categories (API) - static apiIndex(req, res) { - Category.getByUserId(req.user.id, (err, categories) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Database error' }); - } - res.json(categories); - }); - } - - // Create a new category (web) - static create(req, res) { - const categoryData = { - name: req.body.name, - description: req.body.description, - userId: req.user.id - }; - - Category.create(categoryData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error creating category'); - } - res.redirect('/categories'); - }); - } - - // Create a new category (API) - static apiCreate(req, res) { - const categoryData = { - name: req.body.name, - description: req.body.description, - userId: req.user.id - }; - - Category.create(categoryData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error creating category' }); - } - res.status(201).json({ - message: 'Category created successfully', - categoryId: result.insertId - }); - }); - } - - // Update a category (web) - static update(req, res) { - const categoryId = req.body.category_id; - const categoryData = { - name: req.body.name, - description: req.body.description, - userId: req.user.id - }; - - Category.update(categoryId, categoryData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error updating category'); - } - res.redirect('/categories'); - }); - } - - // Update a category (API) - static apiUpdate(req, res) { - const categoryId = req.params.id; - const categoryData = { - name: req.body.name, - description: req.body.description, - userId: req.user.id - }; - - Category.update(categoryId, categoryData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error updating category' }); - } - res.json({ message: 'Category updated successfully' }); - }); - } - - // Delete a category (web) - static delete(req, res) { - const categoryId = req.params.id; - - Category.delete(categoryId, req.user.id, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error deleting category'); - } - res.redirect('/categories'); - }); - } - - // Delete a category (API) - static apiDelete(req, res) { - const categoryId = req.params.id; - - Category.delete(categoryId, req.user.id, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error deleting category' }); - } - res.json({ message: 'Category deleted successfully' }); - }); - } -} - -module.exports = CategoryController; \ No newline at end of file diff --git a/Controllers/NoteController.js b/Controllers/NoteController.js deleted file mode 100644 index acd4f0e..0000000 --- a/Controllers/NoteController.js +++ /dev/null @@ -1,206 +0,0 @@ -const Note = require('../Models/Note'); -const Category = require('../Models/Category'); -const jwt = require('jsonwebtoken'); - -// NoteController - จัดการ Logic การทำงานของโน้ต -class NoteController { - // แสดงหน้าแรกที่มีโน้ตทั้งหมด - static async index(req, res) { - // ดึงข้อมูลโน้ตทั้งหมด - Note.getAll(req.user.id, (err, notes) => { - if (err) { - console.log(err); - return res.status(500).send('Error loading notes'); - } - - // ดึงข้อมูล categories สำหรับ dropdown (เฉพาะของ user นี้) - Category.getByUserId(req.user.id, (err, categories) => { - if (err) { - console.log(err); - return res.status(500).send('Error loading categories'); - } - - // ส่งข้อมูลไปแสดงที่หน้า dashboard - res.render('dashboard', { - data: notes, - categories: categories, - user: req.user - }); - }); - }); - } - - // Get all notes (API) - static apiIndex(req, res) { - Note.getAll(req.user.id, (err, notes) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Database error' }); - } - res.json(notes); - }); - } - - // สร้างโน้ตใหม่ - static create(req, res) { - const noteData = { - title: req.body.title, - content: req.body.content, - userId: req.user.id, - categoryId: req.body.category_id || null - }; - - Note.create(noteData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error creating note'); - } - res.redirect('/dashboard'); - }); - } - - // Create a new note (API) - static apiCreate(req, res) { - const noteData = { - title: req.body.title, - content: req.body.content, - userId: req.user.id, - categoryId: req.body.category_id || null - }; - - Note.create(noteData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error creating note' }); - } - res.status(201).json({ - message: 'Note created successfully', - noteId: result.insertId - }); - }); - } - - // อัพเดทโน้ต - static update(req, res) { - const noteId = req.body.note_id; - const noteData = { - title: req.body.title, - content: req.body.content, - categoryId: req.body.category_id || null, - userId: req.user.id - }; - - Note.update(noteId, noteData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error updating note'); - } - res.redirect('/dashboard'); - }); - } - - // Update a note (API) - static apiUpdate(req, res) { - const noteId = req.params.id; - const noteData = { - title: req.body.title, - content: req.body.content, - categoryId: req.body.category_id || null, - userId: req.user.id - }; - - Note.update(noteId, noteData, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error updating note' }); - } - res.json({ message: 'Note updated successfully' }); - }); - } - - // ลบโน้ต - static delete(req, res) { - const noteId = req.params.id; - - Note.delete(noteId, req.user.id, (err, result) => { - if (err) { - console.log(err); - return res.status(500).send('Error deleting note'); - } - res.redirect('/dashboard'); - }); - } - - // Delete a note (API) - static apiDelete(req, res) { - const noteId = req.params.id; - - Note.delete(noteId, req.user.id, (err, result) => { - if (err) { - console.log(err); - return res.status(500).json({ error: 'Error deleting note' }); - } - res.json({ message: 'Note deleted successfully' }); - }); - } - - // Search notes by title or content (web) - static search(req, res) { - const searchTerm = req.query.searchTerm; - - if (!searchTerm) { - return res.redirect('/dashboard'); - } - - Note.search(searchTerm, req.user.id, (err, notes) => { - if (err) { - console.log(err); - return res.status(500).send('Database error'); - } - - Category.getByUserId(req.user.id, (err, categories) => { - if (err) { - console.log(err); - return res.status(500).send('Database error'); - } - - res.render('dashboard', { - data: notes, - categories: categories, - searchTerm: searchTerm, - user: req.user - }); - }); - }); - } - - // แสดงโน้ตของผู้ใช้ที่ล็อกอินอยู่ - static myNotes(req, res) { - const userId = req.user.id; - - // ดึงโน้ตของผู้ใช้ - Note.getByUserId(userId, (err, notes) => { - if (err) { - console.log(err); - return res.status(500).send('Error loading notes'); - } - - // ดึง categories สำหรับ dropdown (เฉพาะของ user นี้) - Category.getByUserId(userId, (err, categories) => { - if (err) { - console.log(err); - return res.status(500).send('Error loading categories'); - } - - res.render('dashboard', { - data: notes, - categories: categories, - myNotes: true, - user: req.user - }); - }); - }); - } -} - -module.exports = NoteController; \ No newline at end of file diff --git a/Routes/web.js b/Routes/web.js index 2275ecb..7171e18 100644 --- a/Routes/web.js +++ b/Routes/web.js @@ -1,11 +1,8 @@ const express = require('express'); const router = express.Router(); -const webAuth = require('../middleware/webauth'); - -// Import Controllers -const AuthController = require('../controllers/authcontroller'); -const NoteController = require('../controllers/notecontroller'); -const CategoryController = require('../controllers/categorycontroller'); +const AuthController = require('../Controllers/AuthController'); +const NoteController = require('../Controllers/NoteController'); +const CategoryController = require('../Controllers/CategoryController'); const jwt = require('jsonwebtoken'); // Middleware ตรวจสอบการเข้าสู่ระบบแบบง่าย @@ -27,8 +24,7 @@ const webAuth = (req, res, next) => { // Routes สำหรับหน้าเว็บ router.get('/', AuthController.showLoginPage); router.get('/register', AuthController.showRegisterPage); -router.post('/register', AuthController.register); -router.get('/login', AuthController.showLoginPage); +router.post('/register', AuthController.signup); router.post('/login', AuthController.login); router.post('/logout', AuthController.logout); @@ -36,14 +32,14 @@ router.post('/logout', AuthController.logout); router.get('/dashboard', webAuth, NoteController.index); router.get('/dashboard/my-notes', webAuth, NoteController.myNotes); router.get('/dashboard/search', webAuth, NoteController.search); -router.post('/notes', webAuth, NoteController.store); -router.put('/notes/:id', webAuth, NoteController.update); -router.delete('/notes/:id', webAuth, NoteController.destroy); +router.post('/dashboard/create', webAuth, NoteController.create); +router.post('/dashboard/update', webAuth, NoteController.update); +router.get('/dashboard/:id/delete', webAuth, NoteController.delete); // Routes สำหรับจัดการหมวดหมู่ router.get('/categories', webAuth, CategoryController.index); -router.post('/categories', webAuth, CategoryController.store); -router.put('/categories/:id', webAuth, CategoryController.update); -router.delete('/categories/:id', webAuth, CategoryController.destroy); +router.post('/categories/create', webAuth, CategoryController.create); +router.post('/categories/update', webAuth, CategoryController.update); +router.get('/categories/:id/delete', webAuth, CategoryController.delete); module.exports = router; \ No newline at end of file diff --git a/index.js b/index.js index 2e18c7c..0d83c4d 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,10 @@ const express = require('express'); const dotenv = require('dotenv'); const cookieParser = require('cookie-parser'); -const path = require('path'); // Import routes -const webRoutes = require('./routes/web'); -const apiRoute = require('./routes/apiroute'); +const webRoutes = require('./Routes/web'); +const apiRoute = require('./Routes/apiRoute'); // Load env variables dotenv.config(); @@ -19,8 +18,7 @@ app.use(express.urlencoded({ extended: true })); app.use(express.static('public')); app.use(cookieParser()); -// Set view engine and views directory -app.set('views', path.join(__dirname, 'views')); +// Set view engine app.set('view engine', 'ejs'); // Routes diff --git a/package.json b/package.json index 631cb28..e026be5 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,16 @@ "license": "ISC", "dependencies": { "bcrypt": "^5.1.1", + "bcryptjs": "^2.4.3", + "body-parser": "^1.19.0", "cookie-parser": "^1.4.7", + "cors": "^2.8.5", "dotenv": "^8.2.0", "ejs": "^3.1.3", "express": "^4.17.1", + "express-session": "^1.17.1", "jsonwebtoken": "^8.5.1", - "mysql": "^2.18.1" - }, - "devDependencies": { + "mysql": "^2.18.1", "nodemon": "^2.0.4" } } -- GitLab