user.controller.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * @file Provides the model and operation for users.
  3. * @author Inigo Valentin
  4. * @since 4.0.0
  5. */
  6. const sha1 = require('sha1');
  7. const jwt = require('jsonwebtoken');
  8. const db = require("../models");
  9. const User = db.users;
  10. const Op = db.Sequelize.Op;
  11. /**
  12. * Retrieve all users from the database.
  13. *
  14. * @param req The received request by the server.
  15. * @param res The request to be sent by the server.
  16. */
  17. exports.findAll = (req, res) => {
  18. User.findAll()
  19. .then(async data => {
  20. data = await localeService.localizeUsers(data, req);
  21. res.send(data);
  22. })
  23. .catch(err => {res.status(500).send({message: err.message || "Some error occurred while retrieving users."});});
  24. };
  25. /**
  26. * Find a single user by it's ID.
  27. *
  28. * @param req The received request by the server.
  29. * @param res The request to be sent by the server.
  30. */
  31. exports.findOne = (req, res) => {
  32. const id = req.params.id;
  33. User.findByPk(id)
  34. .then(async data => {
  35. if (data) {
  36. data = await localeService.localizeUser(data, req);
  37. res.send(data);
  38. }
  39. else res.status(404).send({message: `Cannot find user with id=${id}.`})
  40. })
  41. .catch(err => {res.status(500).send({message: "Error retrieving user with id=" + id});});
  42. };
  43. /**
  44. * Find a single user by it's username or email.
  45. *
  46. * @param req The received request by the server.
  47. * @param res The request to be sent by the server.
  48. */
  49. exports.findByUsernameOrEmail = (req, res) => {
  50. const username = req.method === 'POST' ? req.body.username : req.params.username;
  51. const email = req.method === 'POST' ? req.body.email : req.params.email;
  52. if (!email && !username) res.status(400).send("Username or email required");
  53. User.findOne({where: {[Op.or]: {username: username, email: email}}})
  54. .then(async data => {
  55. if (data) {
  56. data = await localeService.localizeUser(data, req);
  57. res.send(data);
  58. }
  59. else res.status(404).send({message: `Cannot find user with username ${username} or email ${email}.`})
  60. })
  61. .catch(err => {res.status(500).send({message: "Error retrieving user."});});
  62. };
  63. /**
  64. * Update a single license by it's ID.
  65. *
  66. * @param req The received request by the server.
  67. * @param res The request to be sent by the server.
  68. */
  69. exports.update = (req, res) => {
  70. const id = req.params.id;
  71. License.update(req.body, {where: {id: id}})
  72. .then(num => {
  73. if (num == 1) res.send({message: "License was updated successfully."});
  74. else res.send({message: `Cannot update License with id=${id}. Maybe License was not found or req.body is empty!`});
  75. })
  76. .catch(err => {res.status(500).send({message: "Error updating License with id=" + id});});
  77. };
  78. /**
  79. * Delete a single license by it's ID.
  80. *
  81. * @param req The received request by the server.
  82. * @param res The request to be sent by the server.
  83. */
  84. exports.delete = (req, res) => {
  85. const id = req.params.id;
  86. License.destroy({where: {id: id}})
  87. .then(num => {
  88. if (num == 1) res.send({message: "License was deleted successfully!"});
  89. else res.send({message: `Cannot delete License with id=${id}. Maybe License was not found!`});
  90. })
  91. .catch(err => {res.status(500).send({message: "Could not delete License with id=" + id});});
  92. };
  93. /**
  94. * Delete all licenses.
  95. *
  96. * @param req The received request by the server.
  97. * @param res The request to be sent by the server.
  98. */
  99. exports.deleteAll = (req, res) => {
  100. License.destroy({
  101. where: {},
  102. truncate: false
  103. })
  104. .then(nums => {res.send({ message: `${nums} Licenses were deleted successfully!` });})
  105. .catch(err => {res.status(500).send({message: err.message || "Some error occurred while removing all Licenses."});});
  106. };
  107. /**
  108. * Create and save a new user.
  109. *
  110. * @param req The received request by the server.
  111. * @param res The request to be sent by the server.
  112. */
  113. exports.create = async (req, res) => {
  114. return res.status(405).send("User creation is disabled.");
  115. try {
  116. // Get user input
  117. const {username, firstName, lastName, email, password} = req.body;
  118. // Validate user input
  119. if (!(email && password && username)) {res.status(400).send("Credentials required.");}
  120. // check if user already exist
  121. // Validate if user exist in our database
  122. let existing = await User.findByUsernameOrEmail({username}, {email});
  123. if (existing) {return res.status(409).send("User already exists. Please login.");}
  124. existing = await User.findByEmail({email});
  125. if (existing) {return res.status(409).send("User already exists. Please login.");}
  126. //Encrypt user password
  127. encryptedUserPassword = await bcrypt.hash(password, 10);
  128. // Create user in our database
  129. const user = await User.create({
  130. first_name: firstName,
  131. last_name: lastName,
  132. email: email.toLowerCase(),
  133. password: encryptedUserPassword,
  134. });
  135. // Create token
  136. const token = jwt.sign({user_id: user.id}, 'process.env.TOKEN_KEY', {expiresIn: "5h"});
  137. // save user token
  138. user.token = token;
  139. User.update({token: token}, {where: {id: user.id }})
  140. return res.status(200).json({token: token});
  141. }
  142. catch (err) {
  143. console.log("Error registering user:" + err);
  144. }
  145. };
  146. /**
  147. * Log a user in.
  148. *
  149. * @param req The received request by the server.
  150. * @param res The request to be sent by the server.
  151. */
  152. exports.login = async (req, res) => {
  153. try {
  154. // Get user input
  155. const email = req.body.email ? req.body.email : "";
  156. const username = req.body.username ? req.body.username : "";
  157. const password = req.body.password;
  158. // Validate user input
  159. if (!(password && (email || username))) res.status(400).send("Credentials required");
  160. // Validate if user exist in our database
  161. const user = await User.findOne({where: {[Op.or]: {username: username, email: email}}});
  162. //encryptedUserPassword = await bcrypt.hash(password, salt);
  163. //dbUserPassword = await bcrypt.hash(user.password, salt);
  164. //if (user && (await bcrypt.compare(password, user.password))) {
  165. //if (user && (await bcrypt.hash(user.password, salt) == await bcrypt.hash(password, salt))) {
  166. if (user && user.password == sha1(user.hash + password)){
  167. // Create token
  168. const token = jwt.sign({user_id: user.id}, 'process.env.TOKEN_KEY', {expiresIn: "5h"});
  169. // Save user token
  170. user.token = token;
  171. User.update({token: token}, {where: {id: user.id }})
  172. return res.status(200).json({token: token});
  173. }
  174. return res.status(400).send("Invalid Credentials");
  175. }
  176. catch (err) {
  177. console.log("Error logging in: " + err);
  178. }
  179. };