11const express = require ( 'express' )
2+ const bcrypt = require ( 'bcryptjs' )
23const { getDbConnection } = require ( './database' )
34
45const router = express . Router ( )
56
7+ function requireAuth ( req , res , next ) {
8+ if ( ! req . session . user ) {
9+ return res . redirect ( '/login' )
10+ }
11+ return next ( )
12+ }
13+
614router . get ( '/' , ( req , res ) => {
715 res . render ( 'home' , { title : 'Recipe App' } )
816} )
@@ -20,6 +28,66 @@ router.get('/recipes/:id', async (req, res) => {
2028 res . render ( 'recipe' , { recipe } )
2129} )
2230
31+ router . get ( '/register' , ( req , res ) => {
32+ res . render ( 'register' )
33+ } )
34+
35+ router . post ( '/register' , async ( req , res ) => {
36+ const db = await getDbConnection ( )
37+ const { username, password } = req . body
38+
39+ if ( ! username || ! password ) {
40+ return res . render ( 'register' , { error : 'Username and password are required.' } )
41+ }
42+
43+ const existingUser = await db . get ( 'SELECT * FROM users WHERE username = ?' , [ username ] )
44+ if ( existingUser ) {
45+ return res . render ( 'register' , { error : 'Username already exists.' } )
46+ }
47+
48+ const passwordHash = await bcrypt . hash ( password , 10 )
49+ await db . run ( 'INSERT INTO users (username, password_hash) VALUES (?, ?)' , [ username , passwordHash ] )
50+ const createdUser = await db . get ( 'SELECT id, username FROM users WHERE username = ?' , [ username ] )
51+ req . session . user = { id : createdUser . id , username : createdUser . username }
52+ return res . redirect ( '/profile' )
53+ } )
54+
55+ router . get ( '/login' , ( req , res ) => {
56+ res . render ( 'login' )
57+ } )
58+
59+ router . post ( '/login' , async ( req , res ) => {
60+ const db = await getDbConnection ( )
61+ const { username, password } = req . body
62+
63+ if ( ! username || ! password ) {
64+ return res . render ( 'login' , { error : 'Username and password are required.' } )
65+ }
66+
67+ const user = await db . get ( 'SELECT * FROM users WHERE username = ?' , [ username ] )
68+ if ( ! user ) {
69+ return res . render ( 'login' , { error : 'Invalid username or password.' } )
70+ }
71+
72+ const passwordMatches = await bcrypt . compare ( password , user . password_hash )
73+ if ( ! passwordMatches ) {
74+ return res . render ( 'login' , { error : 'Invalid username or password.' } )
75+ }
76+
77+ req . session . user = { id : user . id , username : user . username }
78+ return res . redirect ( '/profile' )
79+ } )
80+
81+ router . post ( '/logout' , ( req , res ) => {
82+ req . session . destroy ( ( ) => {
83+ res . redirect ( '/' )
84+ } )
85+ } )
86+
87+ router . get ( '/profile' , requireAuth , async ( req , res ) => {
88+ res . render ( 'profile' , { user : req . session . user } )
89+ } )
90+
2391router . post ( '/recipes' , async ( req , res ) => {
2492 const db = await getDbConnection ( )
2593 const { title, ingredients, method } = req . body
0 commit comments