index.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. const express = require("express");
  2. const bodyParser = require("body-parser");
  3. const Sequelize = require("sequelize");
  4. const jwt = require("jsonwebtoken");
  5. const { Op } = Sequelize;
  6. const { graphqlHTTP } = require("express-graphql");
  7. const { buildSchema } = require("graphql");
  8. const cors = require("cors");
  9. const expressJwt = require("express-jwt");
  10. const sha1 = require("sha1");
  11. // const mailer = require("./smtpGmail");
  12. const app = express();
  13. app.use(bodyParser.json());
  14. app.use(express.static("myproject"));
  15. // app.use(errorHandler);
  16. app.use(bodyParser.urlencoded({ extended: false }));
  17. app.use(cors());
  18. const sequelize = new Sequelize("emrada2", "root", "Emmanuil2228125%", {
  19. timezone: "+03:00",
  20. host: "localhost",
  21. dialect: "mysql",
  22. });
  23. class User extends Sequelize.Model {
  24. get messages() {
  25. return (async () => {
  26. let autorForMessage = await this.getAutor();
  27. let partnerForMessage = await this.getPartner();
  28. return [...autorForMessage, ...partnerForMessage];
  29. })();
  30. }
  31. get chat_groups() {
  32. return (async () => {
  33. let autorForChatGroup = await this.getAutor();
  34. let partnerForChatGroup = await this.getPartner();
  35. return [...autorForChatGroup, ...partnerForChatGroup];
  36. })();
  37. }
  38. }
  39. User.init(
  40. {
  41. email: Sequelize.STRING,
  42. // password: Sequelize.STRING,
  43. login: Sequelize.STRING,
  44. password: {
  45. type: Sequelize.STRING,
  46. set(value) {
  47. this.setDataValue("password", sha1(value));
  48. },
  49. },
  50. },
  51. { sequelize, modelName: "user" }
  52. );
  53. class Message extends Sequelize.Model {
  54. get user() {
  55. return this.User();
  56. }
  57. }
  58. Message.init(
  59. { message: Sequelize.STRING },
  60. {
  61. scopes: {
  62. deleted: {
  63. where: {
  64. id: 1
  65. },
  66. },
  67. },
  68. sequelize,
  69. modelName: "message",
  70. }
  71. );
  72. class ChatGroup extends Sequelize.Model {}
  73. ChatGroup.init({}, { sequelize, modelName: "chat_group" });
  74. User.hasMany(Message, { as: "autorForMessage", foreignKey: "autorId" });
  75. User.hasMany(Message, { as: "partnerForMessage", foreignKey: "partnerId" });
  76. Message.belongsTo(User, { as: "autor", sourceKey: "autorId" });
  77. Message.belongsTo(User, { as: "partner", sourceKey: "partnerId" });
  78. User.hasMany(ChatGroup, { as: "autorForChatGroup", foreignKey: "autorId" });
  79. User.hasMany(ChatGroup, { as: "partnerForChatGroup", foreignKey: "partnerId" });
  80. ChatGroup.belongsTo(User, { as: "autor", sourceKey: "autorId" });
  81. ChatGroup.belongsTo(User, { as: "partner", sourceKey: "partnerId" });
  82. const secret = `7.!BMB?Y+Bc2vZE-Hb5YuCT6QvE^FN,JWN6M?_VtFXeC5dLtB!`;
  83. const authenticate = async ({ login, password }) => {
  84. const user = await User.findOne({ where: { login, password } });
  85. if (user) {
  86. const token = jwt.sign(
  87. { sub: { id: user.id, email: user.email, login: user.login } },
  88. secret
  89. );
  90. return token;
  91. }
  92. };
  93. var schema = buildSchema(`
  94. type Query {
  95. getLogin(login: String, password: String): String
  96. getUser(email: String): User
  97. getAllUsers: [User]
  98. getMessage(id: ID!): Message
  99. getAllMessages: [Message]
  100. getAllMessagesOneUser(id: ID!): [Message]
  101. getAllChatGroups: [ChatGroup]
  102. getAllChatGroupsOneUser(id: ID!): [ChatGroup]
  103. }
  104. type Mutation {
  105. deleteUser(id: ID!): String
  106. createUser(email: String, login: String, password: String): User
  107. changePassword(email: String, password: String): User
  108. createMessage(message: String, autorId: String, partnerId: String): Message
  109. changeMessage(id: ID!, message: String): Message
  110. deleteMessage(id: ID!): String
  111. createChatGroup(autorId: String, partnerId: String): Message
  112. deleteChatGroup(id: ID!): String
  113. }
  114. type User {
  115. id: Int
  116. createdAt: String
  117. email: String
  118. login: String
  119. }
  120. type Message {
  121. id: Int
  122. createdAt: String
  123. message: String
  124. autorId: User
  125. partnerId: User
  126. }
  127. type ChatGroup {
  128. id: Int
  129. createdAt: String
  130. autorId: User
  131. partnerId: User
  132. }
  133. `);
  134. const getUser = async ({ email }) => await User.findOne({ where: { email } });
  135. const getLogin = async ({ login, password }) => {
  136. const passwordSha1 = sha1(password);
  137. const userFind = await User.findOne({
  138. where: { login, password: passwordSha1 },
  139. });
  140. return authenticate(userFind);
  141. };
  142. const createUser = async ({ email, login, password }) => {
  143. const wasUserCreated = await User.findOne({ where: { email } });
  144. if (!wasUserCreated) {
  145. const user = { email, login, password };
  146. const newUser = new User(user);
  147. await newUser.save();
  148. return await User.findOne({ where: { login } });
  149. } else console.error("error");
  150. };
  151. const deleteUser = async ({ id }) => {
  152. const userFind = await User.findByPk(id);
  153. if (userFind) {
  154. await User.destroy({ where: { id } });
  155. return "User deleted";
  156. } else return "User not find";
  157. };
  158. const changePassword = async ({ email, password }) => {
  159. var userFind = await User.findOne({ where: { email } });
  160. if (userFind) {
  161. const a = await User.update(
  162. { password, login: userFind.login },
  163. { where: { email } }
  164. );
  165. userFind.email = "The password has been change";
  166. console.log(a);
  167. return userFind;
  168. } else {
  169. userFind = { email: "Email not found" };
  170. return userFind;
  171. }
  172. };
  173. const getAllUsers = async () => await User.findAll();
  174. const getAllMessages = async () => {
  175. const foundAllMessages = await Message.findAll();
  176. for (var allMessages of foundAllMessages) {
  177. const autor = await User.findAll({ where: { id: allMessages.autorId } });
  178. const partner = await User.findAll({
  179. where: { id: allMessages.partnerId },
  180. });
  181. allMessages.autorId = autor[0];
  182. allMessages.partnerId = partner[0];
  183. }
  184. return foundAllMessages;
  185. };
  186. const getMessage = async ({ id }) => {
  187. const message = await Message.findOne({ where: { id } });
  188. const autor = await User.findOne({ where: { id: message.autorId } });
  189. const partner = await User.findOne({ where: { id: message.partnerId } });
  190. message.autorId = autor;
  191. message.partnerId = partner;
  192. return message;
  193. };
  194. const getAllMessagesOneUser = async ({ id }) => {
  195. const allMess = await Message.findAll();
  196. for (var key of allMess) {
  197. const autor = await User.findAll({ where: { id: key.autorId } });
  198. const partner = await User.findAll({ where: { id: key.partnerId } });
  199. const ma = autor[0].id === +id || partner[0].id === +id;
  200. if (ma === true) {
  201. const y = await Message.findAll({ where: { autorId: id } });
  202. const u = await Message.findAll({ where: { partnerId: id } });
  203. console.log(y);
  204. if ((y.length && u.length) !== 0) {
  205. const p = [...y, ...u];
  206. for (var key of p) {
  207. const r = await User.findAll({ where: { id: key.autorId } });
  208. const r1 = await User.findAll({ where: { id: key.partnerId } });
  209. key.autorId = r[0];
  210. key.partnerId = r1[0];
  211. }
  212. return p;
  213. } else if (y.length !== 0) {
  214. const pt = [...y];
  215. for (var key of pt) {
  216. const r = await User.findAll({ where: { id: key.partnerId } });
  217. key.autorId = autor[0];
  218. key.partnerId = r[0];
  219. }
  220. return pt;
  221. } else {
  222. const ptu = [...u];
  223. for (var key of ptu) {
  224. const r = await User.findAll({ where: { id: key.autorId } });
  225. key.autorId = r[0];
  226. key.partnerId = partner[0];
  227. }
  228. return ptu;
  229. }
  230. }
  231. }
  232. };
  233. const createMessage = async (obj) => {
  234. try {
  235. return await Message.create({ ...obj });
  236. } catch (e) {
  237. console.log(e);
  238. }
  239. };
  240. const changeMessage = async ({ id, message }) => {
  241. const putMess = await Message.findByPk(id);
  242. if (putMess) {
  243. await Message.update({ message }, { where: { id } });
  244. return await Message.findByPk(id);
  245. } else return { id: "Message not find" };
  246. };
  247. const deleteMessage = async ({ id }) => {
  248. // await Message.scope("deleted").findByPk(id);
  249. const messFind = await Message.findByPk(id);
  250. if (messFind) {
  251. await Message.destroy({ where: { id } });
  252. return "Message deleted";
  253. } else return "Message not find";
  254. };
  255. const getAllChatGroups = async () => {
  256. const foundAllChatGroups = await ChatGroup.findAll();
  257. for (var allUsers of foundAllChatGroups) {
  258. const autor = await User.findAll({ where: { id: allUsers.autorId } });
  259. const partner = await User.findAll({ where: { id: allUsers.partnerId } });
  260. allUsers.autorId = autor[0];
  261. allUsers.partnerId = partner[0];
  262. }
  263. return foundAllChatGroups;
  264. };
  265. const getAllChatGroupsOneUser = async ({ id }) => {
  266. const foundAllChatGroups = await ChatGroup.findAll();
  267. for (var allUsers of foundAllChatGroups) {
  268. const autor = await User.findAll({ where: { id: allUsers.autorId } });
  269. const partner = await User.findAll({ where: { id: allUsers.partnerId } });
  270. const ma = autor[0].id === +id || partner[0].id === +id;
  271. if (ma === true) {
  272. const y = await ChatGroup.findAll({ where: { autorId: id } });
  273. const u = await ChatGroup.findAll({ where: { partnerId: id } });
  274. if ((y.length && u.length) !== 0) {
  275. const p = [...y, ...u];
  276. for (var key of p) {
  277. const r = await User.findAll({ where: { id: key.autorId } });
  278. const r1 = await User.findAll({ where: { id: key.partnerId } });
  279. key.autorId = r[0];
  280. key.partnerId = r1[0];
  281. }
  282. return p;
  283. } else if (y.length !== 0) {
  284. const pt = [...y];
  285. for (var key of pt) {
  286. const r = await User.findAll({ where: { id: key.partnerId } });
  287. key.autorId = autor[0];
  288. key.partnerId = r[0];
  289. }
  290. return pt;
  291. } else {
  292. const ptu = [...u];
  293. for (var key of ptu) {
  294. const r = await User.findAll({ where: { id: key.autorId } });
  295. key.autorId = r[0];
  296. key.partnerId = partner[0];
  297. }
  298. return ptu;
  299. }
  300. } else console.log("bye");
  301. }
  302. };
  303. const createChatGroup = async (obj) => {
  304. try {
  305. const oneUserId = await ChatGroup.findOne({
  306. where: { autorId: obj.autorId, partnerId: obj.partnerId },
  307. });
  308. const twoUserId = await ChatGroup.findOne({
  309. where: { autorId: obj.partnerId, partnerId: obj.autorId },
  310. });
  311. if (!oneUserId && !twoUserId) {
  312. var newChatGroup = await ChatGroup.create({ ...obj });
  313. const autor = await User.findAll({ where: { id: newChatGroup.autorId } });
  314. const partner = await User.findAll({
  315. where: { id: newChatGroup.partnerId },
  316. });
  317. newChatGroup.autorId = autor[0];
  318. newChatGroup.partnerId = partner[0];
  319. return newChatGroup;
  320. }
  321. } catch (e) {
  322. return;
  323. }
  324. };
  325. const deleteChatGroup = async ({ id }) => {
  326. const messFind = await ChatGroup.findByPk(id);
  327. if (messFind) {
  328. await ChatGroup.destroy({ where: { id } });
  329. return "ChatGroup deleted";
  330. } else return "ChatGroup not find";
  331. };
  332. var root = {
  333. getUser,
  334. getLogin,
  335. createUser,
  336. deleteUser,
  337. getAllUsers,
  338. getMessage,
  339. changePassword,
  340. createMessage,
  341. changeMessage,
  342. deleteMessage,
  343. getAllMessages,
  344. getAllMessagesOneUser,
  345. getAllChatGroups,
  346. getAllChatGroupsOneUser,
  347. createChatGroup,
  348. deleteChatGroup,
  349. };
  350. app.use(
  351. "/graphql",
  352. graphqlHTTP({
  353. schema: schema,
  354. rootValue: root,
  355. graphiql: true,
  356. })
  357. );
  358. app.get("/users", async (req, res) => res.send(await User.findAll()));
  359. app.get("/message", async (req, res) => res.send(await Message.findAll()));
  360. app.get("/chat-group", async (req, res) => res.send(await ChatGroup.findAll()));
  361. // function errorHandler(err, req, res, next) {
  362. // if (typeof err === "string") {
  363. // return res.status(400).json({ message: err });
  364. // }
  365. // if (err.name === "UnauthorizedError") {
  366. // return res.status(401).json({ message: "Invalid Token" });
  367. // }
  368. // return res.status(500).json({ message: err.message });
  369. // }
  370. app.post("/users/authenticate", async (req, res, next) => {
  371. authenticate(req.body)
  372. .then((user) => {
  373. user
  374. ? res.json(user)
  375. : res
  376. .status(400)
  377. .json({ message: "Username or password is incorrect" });
  378. })
  379. .catch((err) => next(err));
  380. });
  381. // app.use(jwtWare());
  382. // (async () => {
  383. // let persone =
  384. // // await User.findOne({ where: { login: "B" } }) ||
  385. // (await User.create({ email: "ljkd@gfd.gfd", password: "1", login: "A" }))
  386. // })()
  387. // createMessage({message: "Hello 1", autorId: 1, partnerId: 2})
  388. // createChatGroup({ autorId: 1, partnerId: 2})
  389. sequelize.sync();
  390. app.listen(3330, () => console.log("The server started on port 3330"));