1
1
import bcrypt from 'bcrypt' ; // пакет для хешування (працює асинхронно)
2
2
import jwt from 'jsonwebtoken' ; // пакет для створення токету
3
+ import gravatar from 'gravatar' ;
4
+ import fs from 'fs/promises' ;
5
+ import path from 'path' ;
3
6
import { User } from '../models/user.js' ;
4
7
import { HttpError } from '../helpers/index.js' ;
5
8
import { ctrlWrapper } from '../decorators/index.js' ;
6
9
7
10
const { SECRET_KEY } = process . env ; // беремо секретний ключ у змінних оточеннях
8
11
12
+
9
13
const register = async ( req , res ) => {
10
14
const { email, password } = req . body ;
11
15
const user = await User . findOne ( { email} ) ; // чи є в БД користувач з таким email (знаходить перше співпадіння і повертає дані або null)
@@ -14,7 +18,9 @@ const register = async(req, res) => {
14
18
}
15
19
const hashPassword = await bcrypt . hash ( password , 10 ) ; //перед тим як зберегти пароль в БД, хешуємо його
16
20
// 10 - сіль - набір випадкових символів - складність алгоритму генерації солі
17
- const newUser = await User . create ( { ...req . body , password : hashPassword } ) // в БД зберігаємо пароль у захешованому вигляді (post-запит)
21
+
22
+ const avatarURL = gravatar . url ( email ) ; // генеруємо посилання на тимчасову аватарку
23
+ const newUser = await User . create ( { ...req . body , password : hashPassword , avatarURL } ) // в БД зберігаємо пароль у захешованому вигляді (post-запит)
18
24
19
25
res . status ( 201 ) . json ( {
20
26
user : {
@@ -80,10 +86,36 @@ const updateSubscription = async(req, res) => {
80
86
res . json ( result ) ; // статус 200 повертається автоматично
81
87
} ;
82
88
89
+
90
+ const avatarPath = path . resolve ( "public" , "avatars" ) ; // шлях до папки з файлом
91
+
92
+ const updateAvatar = async ( req , res ) => {
93
+ const { _id } = req . user ; // new ObjectId("64c6f0e733523b6f5a4ba4b8"),
94
+
95
+ const { path : oldPath , filename } = req . file ; // path до temp; filename - нова назва файлу
96
+ const newPath = path . join ( avatarPath , filename ) ; // створюємо новий шлях з ім'ям файлу
97
+ await fs . rename ( oldPath , newPath ) ; // переміщення файла
98
+ const avatarURL = path . join ( 'avatars' , filename ) ; // записуємо шлях в body // папку 'public' не пишемо, вона вже вказана в мідлварі в app.js
99
+
100
+ await Contact . findByIdAndUpdate ( _id , { avatarURL} ) ; // знаючи id користувача, можемо перезаписати avatarURL
101
+ // {
102
+ // name: 'Zoi Doich',
103
+
104
+ // phone: '(992) 914-3792',
105
+ // favorite: false,
106
+ // owner: new ObjectId("64c6f0e733523b6f5a4ba4b8"),
107
+ // _id: new ObjectId("64c72713f9d52ec1573daf63"),
108
+ // createdAt: 2023-07-31T03:14:27.161Z,
109
+ // updatedAt: 2023-07-31T03:14:27.161Z
110
+ // }
111
+ res . status ( 201 ) . json ( { avatarURL} ) ; // успішно додали контакт на сервер
112
+ }
113
+
83
114
export default { //огортаємо все в try/catch
84
115
register : ctrlWrapper ( register ) ,
85
116
login : ctrlWrapper ( login ) ,
86
117
getCurrent : ctrlWrapper ( getCurrent ) , //тут ми не викидаємо помилку, але для універсальності
87
118
logout : ctrlWrapper ( logout ) ,
88
119
updateSubscription : ctrlWrapper ( updateSubscription ) ,
120
+ updateAvatar : ctrlWrapper ( updateAvatar ) ,
89
121
}
0 commit comments