Skip to content

Commit 0520c86

Browse files
authored
Merge pull request #13 from JawherKl/feature/14-upload-picture-profile
implement upload feature for profile picture
2 parents 430ea3c + fc98809 commit 0520c86

File tree

6 files changed

+50
-8
lines changed

6 files changed

+50
-8
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ CREATE TABLE users (
6969
name VARCHAR(100) NOT NULL,
7070
email VARCHAR(255) UNIQUE NOT NULL,
7171
password VARCHAR(255) NOT NULL,
72+
picture VARCHAR(255) NULL,
7273
role VARCHAR(20) DEFAULT 'user', -- Role-based access control
7374
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
7475
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

controllers/userController.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,17 @@ const getUserById = async (req, res, next) => {
2929
};
3030

3131
const createUser = async (req, res, next) => {
32-
const { error, value } = userSchema.validate(req.body);
33-
if (error) return res.status(400).json({ error: error.details[0].message });
34-
3532
try {
33+
const { error, value } = userSchema.validate(req.body);
34+
if (error) {
35+
return res.status(400).json({ error: error.details[0].message });
36+
}
37+
if (!req.file) {
38+
return res.status(400).json({ error: "Profile picture is required" });
39+
}
40+
value.picture = req.file.filename; // Add uploaded filename to user data
3641
const userId = await User.create(value);
37-
res.status(201).json({ message: 'User added', userId });
42+
res.status(201).json({ message: "User added", userId });
3843
} catch (error) {
3944
next(error);
4045
}

index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ app.use(cors({
4343
// Serve Swagger documentation at the /api-docs route
4444
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
4545

46+
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
47+
4648
// Routes
4749
app.use('/users', userRoutes);
4850

middleware/upload.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const multer = require('multer');
2+
const path = require('path');
3+
4+
const storage = multer.diskStorage({
5+
destination: (req, file, cb) => {
6+
cb(null, 'uploads/'); // Directory for uploaded files
7+
},
8+
filename: (req, file, cb) => {
9+
const uniqueName = `${Date.now()}-${file.originalname}`;
10+
cb(null, uniqueName);
11+
},
12+
});
13+
14+
const fileFilter = (req, file, cb) => {
15+
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
16+
if (allowedTypes.includes(file.mimetype)) {
17+
cb(null, true);
18+
} else {
19+
cb(new Error('Invalid file type. Only JPEG, PNG, and GIF are allowed.'));
20+
}
21+
};
22+
23+
const upload = multer({
24+
storage,
25+
limits: { fileSize: 2 * 1024 * 1024 }, // Limit: 2MB
26+
fileFilter,
27+
});
28+
29+
module.exports = upload;

models/user.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ class User {
2828
return result.rows[0];
2929
}
3030

31-
static async create({ name, email, password }) {
31+
static async create({ name, email, password, picture }) {
32+
if (!password) {
33+
throw new Error("Password is required");
34+
}
3235
const hashedPassword = await bcrypt.hash(password, 10);
3336
const result = await pool.query(
34-
'INSERT INTO users (name, email, password) VALUES ($1, $2, $3) RETURNING id',
35-
[name, email, hashedPassword]
37+
'INSERT INTO users (name, email, password, picture) VALUES ($1, $2, $3, $4) RETURNING id',
38+
[name, email, hashedPassword, picture]
3639
);
3740
return result.rows[0].id;
3841
}

routes/userRoutes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ const express = require('express');
22
const userController = require('../controllers/userController');
33
const authenticateToken = require('../middleware/auth');
44
const authorize = require('../middleware/authorize');
5+
const multer = require('multer');
6+
const upload = multer({ dest: 'uploads/' });
57

68
const router = express.Router();
79

@@ -118,7 +120,7 @@ router.get('/:id', authenticateToken, userController.getUserById);
118120
* 500:
119121
* description: Server error
120122
*/
121-
router.post('/', authenticateToken, userController.createUser);
123+
router.post('/', authenticateToken, upload.single('picture'), userController.createUser);
122124

123125
/**
124126
* @swagger

0 commit comments

Comments
 (0)