Conversation
Update DONE
График из настоящих данных
server/app.js
Outdated
| console.log('There is no such user, adding now'); | ||
| pool.query(`INSERT INTO Users SET | ||
| id = '${profile.id}', login = '${profile.displayName}', email = '${email}', photo='${photo}', createdAt = NOW(), balance = 10000 | ||
| ON DUPLICATE KEY UPDATE login = '${profile.displayName}', email = '${email}', photo='${photo}' |
There was a problem hiding this comment.
в каком случае выполнится здесь ON DUPLICATE KEY UPDATE ... ?
There was a problem hiding this comment.
При новой авторизации пользователя сравнивается id, если идентичны, проверяется login, если он изменился, тогда срабатывает функция update
There was a problem hiding this comment.
но вверху pool.query(SELECT * from Users where id=${profile.id}, (err, rows) => { который не даст попасть в ON DUPLICATE KEY UPDATE
server/app.js
Outdated
| console.log('There is no balance User in Transaction, adding now'); | ||
| pool.query(`INSERT INTO Transactions SET | ||
| id = '${profile.id}', login = '${profile.displayName}' | ||
| ON DUPLICATE KEY UPDATE login = '${profile.displayName}' |
There was a problem hiding this comment.
для чего вообще INSERT INTO Transactions SET здесь делать?
There was a problem hiding this comment.
Иначе баланс не будет отображаться при регистрации пользователя. Как только он проходит авторизацию, идет запись в транзакцию с id и балансом
server/app.js
Outdated
| /*pool.query(`SELECT * from Users where id=${req.user.id}`, (err, rows) => { | ||
| res.end(JSON.stringify({ user: req.user, finance: { balance: rows && rows[0] && rows[0].balance }})); | ||
| })*/ | ||
| pool.query(`SELECT * from Transactions where id=${req.user.id}`, (err, rows) => { |
There was a problem hiding this comment.
расскажи как Transactions и баланс соотносятся?
| const sql = `SELECT balance FROM Transactions WHERE id='${req.user.id}' AND balance>=${req.params.price}`; | ||
| const transaction = `UPDATE Transactions Set balance = balance - ${req.params.price} WHERE id='${req.user.id}'` | ||
|
|
||
| pool.getConnection(function (err, connection) { |
There was a problem hiding this comment.
для чего здесь getConnection ? почему здесь есть, а выше нет?
There was a problem hiding this comment.
Если правильно понимаю, данная функция обертка помогает уйти от проблем с асинхронностью приложения и без нее не работает полный пул соединения, все падает
| connection.beginTransaction(function (err) { | ||
| if (err) { //Transaction Error (Rollback and release connection) | ||
| connection.rollback(function () { | ||
| connection.release(); |
There was a problem hiding this comment.
зачем обрывать соединение?
There was a problem hiding this comment.
Для безопасности транзакции
There was a problem hiding this comment.
Это был 1 из примеров, где парень описывал, что данная транзакция будет более безопасной. Смысл был защиты от хакерских атак, в данную функцию не успевают подставить левые данные и постоянно метяется хеш т.к. новое соединение. На скорость подключения это не особо влияет, но могу убрать
server/app.js
Outdated
| pool.query(`UPDATE Users SET balance = balance - '${req.params.price}' WHERE id = '${req.user.id}'`); | ||
| return res.end(JSON.stringify({})); | ||
| const sql = `SELECT balance FROM Transactions WHERE id='${req.user.id}' AND balance>=${req.params.price}`; | ||
| const transaction = `UPDATE Transactions Set balance = balance - ${req.params.price} WHERE id='${req.user.id}'` |
There was a problem hiding this comment.
я ожидал, что в транзакциях будут все сделки находится, а здесь по сути тоже самое, что и было, только в другую таблицу переместилось.
| if (err) { //Query Error (Rollback and release connection) | ||
| connection.rollback(function () { | ||
| connection.release(); | ||
| console.log('no money'); |
There was a problem hiding this comment.
очень много повторений, почему это не вынести в отдельный метод?
There was a problem hiding this comment.
Подразумевается импорт функции и вызов через new?
server/app.js
Outdated
| console.log('There is no balance User in Transaction, adding now'); | ||
| pool.query(`INSERT INTO Transactions SET | ||
| id = '${profile.id}', login = '${profile.displayName}' | ||
| ON DUPLICATE KEY UPDATE login = '${profile.displayName}' |
There was a problem hiding this comment.
для чего в Transactions login, если есть id ?
There was a problem hiding this comment.
Дополнительная проверка
There was a problem hiding this comment.
это лишняя информация, так можно всю инфу из таблицы в таблицу таскать
server/app.js
Outdated
| pool.query(`UPDATE Users SET balance = balance - '${req.params.price}' WHERE id = '${req.user.id}'`); | ||
| return res.end(JSON.stringify({})); | ||
| const sql = `SELECT balance FROM Transactions WHERE id='${req.user.id}' AND balance>=${req.params.price}`; | ||
| const transaction = `UPDATE Transactions Set stock='SBER',commission=0, price=${req.params.price}+commission, balance = balance - price WHERE id='${req.user.id}'` |
There was a problem hiding this comment.
чёт некрасиво написано, где-то пробелов нет, где-то три пробела. прайс зависит от commission, баланс от price. в UPDATE всё заглавными, в Set только первая буква ...
Тут явно можно улучшить
There was a problem hiding this comment.
Насчет красоты согласен, из phpmyadmin копировал и получился такой формат- не заметил. На счет функций, у нас баланс и так будет зависеть от цены в любом случае. Если мы разделяли таблицу на price, commission, тогда я думаю что и есть необходимость использования строк. Если мы будем знать комиссию биржи, тогда возможно будет переписать, как то иначе. Но как по мне, данная функция, при правильной передачи данных, является максимально профитной. никаких ошибок не будет, так как привязка идет к переменным
server/app.js
Outdated
| return res.end(JSON.stringify({})); | ||
| const sql = `SELECT balance FROM Transactions WHERE id='${req.user.id}' AND balance>=${req.params.price}`; | ||
| const transaction = `UPDATE Transactions Set stock='SBER',commission=0, price=${req.params.price}+commission, balance = balance - price WHERE id='${req.user.id}'` | ||
| const logs = `INSERT INTO Transactions_logs SET id=(SELECT id FROM Transactions WHERE id='${req.user.id}'), balance=(SELECT balance FROM Transactions WHERE id='${req.user.id}'), price=(SELECT price FROM Transactions WHERE id='${req.user.id}'), commission=(SELECT commission FROM Transactions WHERE id='${req.user.id}'), stock=(SELECT stock FROM Transactions WHERE id='${req.user.id}')` |
There was a problem hiding this comment.
миллион селектов, хотя можно один раз всё достать
There was a problem hiding this comment.
Попробую переписать
There was a problem hiding this comment.
INSERT INTO Transactions_logs(id,balance,price,commission,stock) SELECT id,balance,price,commission,stock FROM Transactions WHERE id='${req.user.id}')
Понял свою ошибку
server/app.js
Outdated
| return res.end(JSON.stringify({})); | ||
| const sql = `SELECT balance FROM Transactions WHERE id='${req.user.id}' AND balance>=${req.params.price}`; | ||
| const transaction = `UPDATE Transactions Set stock='SBER',commission=0, price=${req.params.price}+commission, balance = balance + price WHERE id='${req.user.id}'` | ||
| const logs = `INSERT INTO Transactions_logs SET id=(SELECT id FROM Transactions WHERE id='${req.user.id}'), balance=(SELECT balance FROM Transactions WHERE id='${req.user.id}'), price=(SELECT price FROM Transactions WHERE id='${req.user.id}'), commission=(SELECT commission FROM Transactions WHERE id='${req.user.id}'), stock=(SELECT stock FROM Transactions WHERE id='${req.user.id}')` |
There was a problem hiding this comment.
выше нечто похожее видел уже. Это ж дублирование получается, оно здесь точно надо?
There was a problem hiding this comment.
Как вариант можно вынести константу за пределы функции этих 2 функций и брать из вне. Но константа transaction изменена, ее все равно необходимо оставить внутри функции.
There was a problem hiding this comment.
И тогда придется искать новую переменную вместо user.id так как она находится в теле функции
No description provided.