Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
BookingMyHrManagement
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chanachai
BookingMyHrManagement
Commits
8cf563bc
Commit
8cf563bc
authored
Mar 11, 2025
by
Ooh-Ao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user
parent
f110dfb9
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
130 additions
and
96 deletions
+130
-96
database.js
API/src/config/database.js
+3
-1
userController.js
API/src/controllers/userController.js
+73
-86
User.js
API/src/models/User.js
+42
-2
userRoutes.js
API/src/routes/userRoutes.js
+11
-6
db.js
API/src/utils/db.js
+1
-1
No files found.
API/src/config/database.js
View file @
8cf563bc
const
{
Sequelize
}
=
require
(
'sequelize'
);
const
sequelize
=
new
Sequelize
(
'
NewDatabases
'
,
'postgres'
,
'qwer1234'
,
{
const
sequelize
=
new
Sequelize
(
'
AssetManagement
'
,
'postgres'
,
'qwer1234'
,
{
host
:
'localhost'
,
dialect
:
'postgres'
});
module
.
exports
=
sequelize
;
\ No newline at end of file
API/src/controllers/userController.js
View file @
8cf563bc
const
User
=
require
(
'../models/User'
);
const
bcrypt
=
require
(
'bcryptjs'
);
const
saltRounds
=
10
;
const
User
=
require
(
"../models/User"
);
const
bcrypt
=
require
(
"bcryptjs"
);
exports
.
getUsers
=
async
(
req
,
res
)
=>
{
// สร้างผู้ใช้ใหม่ (Create)
exports
.
createUser
=
async
(
req
,
res
)
=>
{
try
{
const
user
=
await
User
.
findAll
();
res
.
status
(
200
).
json
(
user
);
}
catch
(
err
)
{
res
.
status
(
500
).
json
({
error
:
err
.
message
});
// req.body = { first_name, last_name, email, password, role, ...}
const
newUser
=
await
User
.
create
(
req
.
body
);
// ปกติจะไม่ส่งรหัสผ่านออกไปทั้งดุ้น ให้ปิดไปหรือเฉพาะ field ที่ต้องใช้
res
.
status
(
201
).
json
({
message
:
"User created successfully"
,
user
:
{
user_id
:
newUser
.
user_id
,
first_name
:
newUser
.
first_name
,
last_name
:
newUser
.
last_name
,
email
:
newUser
.
email
,
role
:
newUser
.
role
}
});
}
catch
(
error
)
{
console
.
error
(
error
);
res
.
status
(
500
).
json
({
message
:
"Error creating user"
,
error
:
error
.
message
});
}
};
exports
.
getUsersByID
=
async
(
req
,
res
)
=>
{
// อ่านข้อมูลผู้ใช้ทั้งหมด (Read All)
exports
.
getAllUsers
=
async
(
req
,
res
)
=>
{
try
{
const
{
id
}
=
req
.
params
;
const
user
=
await
User
.
findByPk
(
id
);
if
(
user
)
{
res
.
status
(
200
).
json
({
actionStatus
:
'Success'
,
data
:
user
});
}
else
{
res
.
status
(
404
).
json
({
actionStatus
:
'Failed'
,
message
:
'Product not found'
});
}
}
catch
(
error
)
{
res
.
status
(
500
).
json
({
actionStatus
:
'Failed'
,
message
:
error
.
message
});
}
const
users
=
await
User
.
findAll
({
attributes
:
[
'user_id'
,
'first_name'
,
'last_name'
,
'email'
,
'role'
,
'created_at'
]
});
res
.
status
(
200
).
json
(
users
);
}
catch
(
error
)
{
console
.
error
(
error
);
res
.
status
(
500
).
json
({
message
:
"Error retrieving users"
,
error
:
error
.
message
});
}
};
exports
.
createUser
=
async
(
req
,
res
)
=>
{
// อ่านข้อมูลผู้ใช้รายคน (Read One)
exports
.
getUserById
=
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
params
;
try
{
const
{
user_id
,
first_name
,
last_name
,
email
,
password
,
role
,
created_at
,
updated_at
}
=
req
.
body
;
const
newUser
=
await
User
.
create
({
user_id
,
first_name
,
last_name
,
password
,
role
,
created_at
,
updated_at
,
email
});
res
.
status
(
201
).
json
({
actionStatus
:
'Success'
,
message
:
'Create Success!!'
,
statusCode
:
200
,
User
:
newUser
const
user
=
await
User
.
findByPk
(
id
,
{
attributes
:
[
'user_id'
,
'first_name'
,
'last_name'
,
'email'
,
'role'
,
'created_at'
]
});
}
catch
(
err
)
{
res
.
status
(
400
).
json
({
error
:
err
.
message
});
if
(
!
user
)
{
return
res
.
status
(
404
).
json
({
message
:
"User not found"
});
}
res
.
status
(
200
).
json
(
user
);
}
catch
(
error
)
{
console
.
error
(
error
);
res
.
status
(
500
).
json
({
message
:
"Error retrieving user"
,
error
:
error
.
message
});
}
};
// อัปเดตข้อมูลผู้ใช้ (Update)
exports
.
updateUser
=
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
params
;
try
{
const
{
id
}
=
req
.
params
;
const
{
first_name
,
last_name
,
email
,
password
,
role
,
updated_at
}
=
req
.
body
;
const
user
=
await
User
.
findByPk
(
id
);
if
(
user
)
{
user
.
first_name
=
first_name
||
user
.
first_name
;
user
.
last_name
=
last_name
||
user
.
last_name
;
user
.
password
=
password
||
user
.
password
;
user
.
role
=
role
||
user
.
role
;
user
.
updated_at
=
updated_at
||
user
.
updated_at
;
user
.
email
=
email
||
user
.
email
;
await
user
.
save
();
// ถ้าต้องการ update password จะมี hook beforeUpdate จัดการ hash ให้
const
[
rowsUpdated
]
=
await
User
.
update
(
req
.
body
,
{
where
:
{
user_id
:
id
},
returning
:
true
});
res
.
status
(
200
).
json
({
actionStatus
:
'Success'
,
message
:
'Update Success!!'
,
statusCode
:
200
,
user
:
user
});
}
else
{
res
.
status
(
404
).
json
({
error
:
'Member not found'
});
if
(
!
rowsUpdated
)
{
return
res
.
status
(
404
).
json
({
message
:
"User not found or no change"
});
}
}
catch
(
err
)
{
res
.
status
(
500
).
json
({
error
:
err
.
message
});
// returning: true จะให้ Sequelize ส่งข้อมูลที่ update แล้วกลับมา (Postgres บางเวอร์ชัน)
// ใน MySQL/MariaDB จะไม่ได้ผลแบบนี้ ต้อง findOne/findByPk อีกรอบ
const
updatedUser
=
await
User
.
findByPk
(
id
,
{
attributes
:
[
'user_id'
,
'first_name'
,
'last_name'
,
'email'
,
'role'
,
'created_at'
,
'updated_at'
]
});
res
.
status
(
200
).
json
({
message
:
"User updated successfully"
,
user
:
updatedUser
});
}
catch
(
error
)
{
console
.
error
(
error
);
res
.
status
(
500
).
json
({
message
:
"Error updating user"
,
error
:
error
.
message
});
}
};
// ลบผู้ใช้ (Delete)
exports
.
deleteUser
=
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
params
;
try
{
const
{
id
}
=
req
.
params
;
const
user
=
await
User
.
findByPk
(
id
);
if
(
user
)
{
await
user
.
destroy
();
res
.
status
(
200
).
json
({
actionStatus
:
'Success'
,
message
:
'Delete Success!!'
,
statusCode
:
200
});
}
else
{
res
.
status
(
404
).
json
({
error
:
'Member not found'
});
const
rowsDeleted
=
await
User
.
destroy
({
where
:
{
user_id
:
id
}
});
if
(
!
rowsDeleted
)
{
return
res
.
status
(
404
).
json
({
message
:
"User not found"
});
}
}
catch
(
err
)
{
res
.
status
(
500
).
json
({
error
:
err
.
message
});
res
.
status
(
200
).
json
({
message
:
"User deleted successfully"
});
}
catch
(
error
)
{
console
.
error
(
error
);
res
.
status
(
500
).
json
({
message
:
"Error deleting user"
,
error
:
error
.
message
});
}
};
API/src/models/User.js
View file @
8cf563bc
...
...
@@ -4,8 +4,9 @@ const bcrypt = require("bcryptjs");
const
User
=
sequelize
.
define
(
'User'
,
{
user_id
:
{
type
:
DataTypes
.
INTEGER
,
autoIncrement
:
true
,
// เปลี่ยนจาก INTEGER autoIncrement เป็น UUID
type
:
DataTypes
.
UUID
,
defaultValue
:
DataTypes
.
UUIDV4
,
primaryKey
:
true
,
},
first_name
:
{
...
...
@@ -45,4 +46,43 @@ const User = sequelize.define('User', {
timestamps
:
false
,
});
// ตัวอย่างการใช้ hook เพื่อเข้ารหัส password ก่อนบันทึกลง DB
User
.
beforeCreate
(
async
(
user
,
options
)
=>
{
const
hashedPassword
=
await
bcrypt
.
hash
(
user
.
password
,
10
);
user
.
password
=
hashedPassword
;
});
User
.
beforeUpdate
(
async
(
user
,
options
)
=>
{
if
(
user
.
changed
(
'password'
))
{
const
hashedPassword
=
await
bcrypt
.
hash
(
user
.
password
,
10
);
user
.
password
=
hashedPassword
;
}
});
// (async () => {
// try {
// // sync() จะสร้างตารางตาม Model ทั้งหมดที่มีในโปรเจกต์ (ถ้ายังไม่มี)
// // หากมีอยู่แล้วและต้องการ drop table เดิมให้ใช้ force: true (ไม่แนะนำบน production)
// await sequelize.sync({ force: false });
// console.log("Table(s) created successfully!");
// // ตัวอย่างการทดสอบสร้าง User ทันที (ถ้าต้องการ)
// const newUser = await User.create({
// first_name: "Jane",
// last_name: "Doe",
// email: "jane@example.com",
// password: "123456", // จะถูก hash จาก hook ใน model
// role: "employee",
// });
// console.log("New user created:", newUser.user_id);
// } catch (error) {
// console.error("Error creating table(s):", error);
// } finally {
// // ปิด connection เมื่อเสร็จสิ้นงาน (ขึ้นอยู่กับว่าเราต้องการปิดหรือไม่)
// await sequelize.close();
// }
// })();
module
.
exports
=
User
;
API/src/routes/userRoutes.js
View file @
8cf563bc
// routes/userRoutes.js
const
express
=
require
(
'express'
);
const
router
=
express
.
Router
();
const
userController
=
require
(
'../controllers/userController'
);
const
router
=
express
.
Router
();
router
.
get
(
'/'
,
userController
.
getUsers
);
router
.
get
(
'/:id'
,
userController
.
getUsersByID
);
router
.
put
(
'/:id'
,
userController
.
updateUser
);
// สร้าง (Create)
router
.
post
(
'/'
,
userController
.
createUser
);
// อ่านทั้งหมด
router
.
get
(
'/'
,
userController
.
getAllUsers
);
// อ่านรายคน
router
.
get
(
'/:id'
,
userController
.
getUserById
);
// อัปเดต
router
.
put
(
'/:id'
,
userController
.
updateUser
);
// ลบ
router
.
delete
(
'/:id'
,
userController
.
deleteUser
);
module
.
exports
=
router
;
\ No newline at end of file
module
.
exports
=
router
;
API/src/utils/db.js
View file @
8cf563bc
...
...
@@ -4,7 +4,7 @@ require('dotenv').config();
const
pool
=
new
Pool
({
user
:
"postgres"
,
host
:
"localhost"
,
database
:
"
NewDatabases
"
,
database
:
"
AssetManagement
"
,
password
:
"qwer1234"
,
port
:
5432
,
});
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment