Advertisement
Guest User

Untitled

a guest
Mar 14th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.08 KB | None | 0 0
  1. /* jslint node: true */
  2. 'use strict'
  3.  
  4. const sequelizeInit = require('./sequelize.js')
  5. const sequelize = sequelizeInit.initSequelize()
  6. const bcrypt = require('bcrypt')
  7.  
  8. const User = require('./models/userModel.js')
  9. const Role = require('./models/roleModel.js')
  10. const Course = require('./models/courseModel.js')
  11. const Queue = require('./models/queueModel.js')
  12.  
  13. var Users
  14. var Roles
  15. var StudentStatistics
  16. var CourseStatistics
  17. var Courses
  18. var Queues
  19.  
  20. const courses = []
  21. const users = []
  22. const roles = []
  23. const queues = []
  24.  
  25. // creating sequelize models
  26. exports.initDatabase = () => {
  27. // sequelizeInit.autoSequelize()
  28. initConstants()
  29. }
  30. function initConstants () {
  31. Users = sequelize.import('./seq_models/users1.js')
  32. Roles = sequelize.import('./seq_models/roles1.js')
  33. StudentStatistics = sequelize.import('./seq_models/studentStatistics1.js')
  34. CourseStatistics = sequelize.import('./seq_models/courseStatistics1.js')
  35. Courses = sequelize.import('./seq_models/courses1.js')
  36. Queues = sequelize.import('./seq_models/queues1.js')
  37.  
  38. linkModels()
  39. fillCache()
  40. }
  41.  
  42. function linkModels () {
  43. Queues.belongsTo(Users, { foreignKey: 'student' })
  44. Queues.belongsTo(Courses, { foreignKey: 'courseID' })
  45. Roles.belongsTo(Users, { foreignKey: 'ID' })
  46. Roles.belongsTo(Courses, { foreignKey: 'courseID' })
  47. console.log('linked')
  48. }
  49.  
  50. function fillCache () {
  51. fillUsers()
  52. fillRoles()
  53. fillCourses()
  54. fillQueues()
  55. }
  56.  
  57. // fill User fillCache
  58. function fillUsers () {
  59. Users.findAll().then(res => {
  60. for (let user of res) {
  61. users.push(new User({
  62. ID: user.ID,
  63. name: user.name,
  64. email: user.email,
  65. password: user.password
  66. })
  67. )
  68. }
  69. })
  70. }
  71.  
  72. // fill roles cache
  73. function fillRoles () {
  74. Roles.findAll({
  75. include: Users
  76. }).then(res => {
  77. for (let role of res) {
  78. roles.push(new Role(
  79. {
  80. ID: role.ID,
  81. courseID: role.courseID,
  82. role: role.role
  83.  
  84. })
  85. )
  86. }
  87. })
  88. }
  89.  
  90. function fillCourses () {
  91. Courses.findAll().then(res => {
  92. for (let course of res) {
  93. courses.push(new Course({
  94. ID: course.ID,
  95. name: course.name,
  96. open: course.dataValues.open === 1
  97. }))
  98.  
  99. queues.push(new Queue({
  100. ID: course.ID,
  101. name: course.name,
  102. queue: [],
  103. open: false
  104. }))
  105. }
  106. })
  107. }
  108.  
  109. function fillQueues () {
  110. Queues.findAll({
  111. include: [
  112. { model: Users },
  113. { model: Courses }
  114. ]
  115.  
  116. }).then(res => {
  117. for (let queue of res) {
  118. // adds students in queue to given course
  119. var queueItem = {
  120. studentID: queue.student,
  121. studentName: queue.users1.name,
  122. task: queue.task,
  123. location: queue.location,
  124. comment: queue.comment,
  125. queueNo: queue.queueNo,
  126. enterTime: new Date(queue.enterTime), // ändrad
  127. receivingHelp: false
  128. }
  129.  
  130. appendToQueue(queue.courses1.ID, queueItem)
  131. }
  132. }).catch(error => {
  133. console.error(error)
  134. })
  135. }
  136.  
  137. function appendToQueue (ID, queueItem) {
  138. for (let i = 0; i < queues.length; i++) {
  139. if (queues[i].ID === ID) {
  140. queues[i].queue.push(queueItem)
  141. }
  142. }
  143. }
  144.  
  145. exports.queueLockSwitch = (ID) => {
  146. let open = this.getCourse(ID).open
  147.  
  148. if (open === false) {
  149. open = 1
  150. } else {
  151. open = 0
  152. }
  153.  
  154. this.getCourse(ID).open = !this.getCourse(ID).open
  155.  
  156. Courses.update(
  157. { open: open },
  158. { where: { ID: ID } }
  159. ).catch(err => console.error(err))
  160.  
  161. return this.getCourse(ID).open
  162. }
  163.  
  164. exports.deleteCourse = (ID) => {
  165. courses.splice(this.getCourseIndex(ID), 1)
  166.  
  167. Courses.destroy({
  168. where: {
  169. ID: ID
  170. }
  171. }).catch(err => { console.error(err) })
  172. }
  173.  
  174. exports.getCourseIndex = (ID) => {
  175. for (var i = 0; i < courses.length; i++) {
  176. if (courses[i].ID === ID) {
  177. return i
  178. }
  179. }
  180. return null
  181. }
  182.  
  183. exports.getCourse = (ID) => {
  184. for (let course of courses) {
  185. if (course.ID === ID) {
  186. return course
  187. }
  188. }
  189. return null
  190. }
  191.  
  192. exports.getCoursesBelongingTo = (email) => {
  193. console.log('In Model: getcoursesbelonging to: ', email)
  194. let myCourses = []
  195. let userID = this.findIDfromEmail(email)
  196.  
  197. for (let r of roles) {
  198. if (userID === r.ID) {
  199. if (myCourses.some(e => e.courseID === r.courseID)) {
  200.  
  201. } else {
  202. let currentCourse = this.getCourse(r.courseID)
  203. console.log('currentCourse in model is ', this.getCourse(r.courseID))
  204.  
  205. if (currentCourse != null) {
  206. myCourses.push({
  207. CourseID: currentCourse.ID,
  208. key: currentCourse.name,
  209. open: currentCourse.open,
  210. role: r.role
  211. })
  212. }
  213. }
  214. }
  215. }
  216.  
  217. return myCourses
  218. }
  219.  
  220. exports.getQueueByCourseID = (ID) => {
  221. for (let q of queues) {
  222. if (q.ID === ID) {
  223. return q
  224. }
  225. }
  226. return null
  227. }
  228.  
  229. exports.getQueue = (courseID) => {
  230. return this.getQueueByCourseID(courseID)
  231. }
  232.  
  233. exports.getCourses = () => {
  234. return courses
  235. }
  236.  
  237. exports.check = (req, emit) => {
  238. console.log('checking from model', req.username)
  239.  
  240. for (let user of users) {
  241. if (user.email === req.username) {
  242. console.log('User found')
  243.  
  244. let userID = this.findIDfromEmail(req.username)
  245.  
  246. if (this.getHighestRole(userID) < req.role) {
  247. console.log('Too low authority')
  248. return null
  249. } else {
  250. verifyPassword(req.password, user.password, emit)
  251. }
  252. }
  253. }
  254. }
  255.  
  256. exports.findIDfromEmail = (email) => {
  257. console.log(email)
  258. for (let user of users) {
  259. if (user.email === email) {
  260. return user.ID
  261. }
  262. }
  263. }
  264.  
  265. exports.getHighestRole = (userID) => {
  266. let highest = 0
  267. for (let role of roles) {
  268. if (role.ID === userID && role.role > highest) {
  269. highest = role.role
  270. if (highest === 2) {
  271. return highest
  272. }
  273. }
  274. }
  275.  
  276. return highest
  277. }
  278.  
  279. exports.updateQueueItem = (courseID, queueItemID) => {
  280. console.log('in model updateQueueItem: ', courseID, queueItemID)
  281. for (let queue of queues) {
  282. if (queue.ID === courseID) {
  283. for (let student of queue.queue) {
  284. if (student.queueNo === queueItemID) {
  285. student.receivingHelp = !student.receivingHelp
  286. incrementTimesHelped(student.studentID)
  287. break
  288. }
  289. }
  290. }
  291. }
  292. }
  293.  
  294. exports.removeQueueItem = (courseID, queueItemID, studentID, callback) => {
  295. for (let i = 0; i < queues.length; i++) {
  296. if (queues[i].ID === courseID) {
  297. for (let j = 0; j < queues[i].queue.length; j++) {
  298. if (queues[i].queue[j].queueNo === queueItemID) {
  299. incrementTimeSpentInQueues(queues[i].queue[j].studentID, queues[i].ID, queues[i].queue[j].enterTime)
  300. queues[i].queue.splice(j, 1)
  301.  
  302. Queues.destroy({
  303. where: { courseID: courseID, student: studentID }
  304. }).catch(err => { console.error(err) })
  305. break
  306. }
  307. }
  308. }
  309. }
  310. callback(true)
  311. }
  312.  
  313. exports.createNewCourse = (courseObject, callback) => {
  314. let errorMessage = ''
  315. let success = true
  316. let managers = courseObject.managers.split(',')
  317. for (let i = 0; i < managers.length; i++) {
  318. managers[i] = managers[i].trim()
  319. }
  320.  
  321. let assistants = courseObject.assistants.split(',')
  322. for (let i = 0; i < assistants.length; i++) {
  323. assistants[i] = assistants[i].trim()
  324. }
  325.  
  326. if (assistants.length === 1 && assistants[0] === '') {
  327. assistants = []
  328. console.log('Assistants is empty.')
  329. }
  330. let confirmedAssistants = []
  331. let confirmedManagers = []
  332.  
  333. for (let i = 0; i < users.length; i++) {
  334. let managerIndex = managers.indexOf(users[i].name)
  335. let assistantIndex = assistants.indexOf(users[i].name)
  336.  
  337. console.log('usersName:', users[i].name)
  338. if (managerIndex !== -1) {
  339. confirmedManagers.push(users[i].name)
  340. managers.splice(managerIndex, 1)
  341. }
  342. if (assistantIndex !== -1) {
  343. confirmedAssistants.push(users[i].name)
  344. assistants.splice(assistantIndex)
  345. }
  346. }
  347.  
  348. for (let i = 0; i < courses.length; i++) {
  349. if (courses[i].name === courseObject.courseName) {
  350. errorMessage += '\nCourse with name ' + courseObject.courseName + ' already exists.'
  351. success = false
  352. }
  353. if (courses[i].ID === courseObject.courseID) {
  354. errorMessage += '\nCourse with ID ' + courseObject.courseID + ' already exists.'
  355. success = false
  356. }
  357. }
  358.  
  359. if (assistants.length > 0) {
  360. success = false
  361. errorMessage += '\nThe following assistants were not found: ' + assistants
  362. }
  363.  
  364. if (managers.length > 0) {
  365. success = false
  366. errorMessage += '\nThe following managers were not found: ' + managers
  367. }
  368. console.log(errorMessage)
  369. console.log('Success? ', success)
  370.  
  371. if (success) {
  372. courses.push(
  373. {
  374. name: courseObject.courseName,
  375. ID: courseObject.courseID,
  376. open: false
  377. }
  378. )
  379.  
  380. Courses.create({
  381. ID: courseObject.courseID,
  382. name: courseObject.courseName,
  383. open: 0
  384. }).then(res => {
  385. CourseStatistics.create({
  386. courseID: res.ID,
  387. totTimeSpentInQueue: new Date('1000-01-01T00:00:00Z')
  388. })
  389. }).catch(err => { console.error(err) })
  390. .catch(err => { console.error(err) })
  391.  
  392. for (let asse of confirmedAssistants) {
  393. let ID = findIDofUser(asse)
  394.  
  395. roles.push({
  396. ID: ID,
  397. courseID: courseObject.courseID,
  398. role: 1
  399. })
  400.  
  401. Roles.create({
  402. ID: ID,
  403. courseID: courseObject.courseID,
  404. role: 1 }).catch(err => { console.error(err) })
  405. }
  406.  
  407. for (let manager of confirmedManagers) {
  408. let ID = findIDofUser(manager)
  409. roles.push({
  410. ID: ID,
  411. courseID: courseObject.courseID,
  412. role: 1
  413. })
  414.  
  415. Roles.create({
  416. ID: ID,
  417. courseID: courseObject.courseID,
  418. role: 2
  419. }).catch(err => { console.error(err) })
  420. }
  421. }
  422.  
  423. callback({ success: success, err: errorMessage })
  424. }
  425.  
  426. exports.sortQueueByTime = (courseID) => {
  427. let q = this.getQueueByCourseID(courseID)
  428. let sortedQueue = q.queue
  429. let result = q.queue.sort(function (a, b) {
  430. new Date(a.time) - new Date(b.time)
  431. })
  432. }
  433.  
  434. function findIDofUser (name) {
  435. for (let i = 0; i < users.length; i++) {
  436. if (name === users[i].name) {
  437. return users[i].ID
  438. }
  439. }
  440. return -1
  441. }
  442.  
  443. exports.addQueueItem = (req, callback) => {
  444. console.log('in model, addQueueItem, received ', req)
  445.  
  446. // find right queue
  447. for (let queue of queues) {
  448. if (queue.ID === req.CourseID) {
  449. let time = new Date()
  450.  
  451. let studentID = req.queueObject.studentID
  452. console.log(studentID)
  453.  
  454. Queues.create({
  455. courseID: req.CourseID,
  456. student: studentID,
  457. task: req.queueObject.request,
  458. location: req.queueObject.location,
  459. comment: req.queueObject.comment,
  460. queueNo: null,
  461. enterTime: time
  462. }).then(res => {
  463. let queueItem = {
  464. studentID: studentID,
  465. studentName: req.queueObject.name,
  466. task: res.task,
  467. location: res.location,
  468. comment: res.comment,
  469. queueNo: res.queueNo,
  470. enterTime: res.enterTime,
  471. receivingHelp: false
  472. }
  473. appendToQueue(queue.ID, queueItem)
  474. callback({ success: true, queueObject: queueItem })
  475. incrementTimesQueued(res.student, res.courseID)
  476. }).catch(err => console.error(err))
  477. break
  478. }
  479. }
  480. }
  481.  
  482. exports.registerNewUser = (userObject, emit) => {
  483. checkAccounts(userObject.username, (success) => {
  484. if (success) {
  485. createPasswordHash(userObject.password, userObject.username.length, (hashPassword) => {
  486. Users.create({
  487.  
  488. ID: NaN,
  489. name: userObject.username,
  490. email: userObject.email,
  491. password: hashPassword
  492.  
  493. }).then(res => {
  494. users.push(new User({
  495.  
  496. ID: res.ID,
  497. name: res.name,
  498. email: res.users1.email,
  499. password: res.password
  500.  
  501. })
  502. )
  503. StudentStatistics.create({
  504. ID: res.ID,
  505. totTimeSpentInQueue: new Date('1000-01-01T00:00:00Z')
  506. })
  507. })
  508.  
  509. console.log('Registered new user', users)
  510. emit('Your account is successfully registered')
  511. })
  512. } else {
  513. emit('Failure to register user: Username already taken')
  514. }
  515. })
  516. }
  517.  
  518. function checkAccounts (username, cb) {
  519. let success = true
  520.  
  521. for (let account of users) {
  522. if (account != null) {
  523. if (account.name === username) {
  524. console.log('username already exists')
  525. success = false
  526. }
  527. }
  528. }
  529. console.log('username available')
  530. cb(success)
  531. }
  532.  
  533. function createPasswordHash (plain, saltRound, store) {
  534. bcrypt.genSalt(saltRound).then(salt => {
  535. return bcrypt.hash(plain, salt)
  536. }).then(hash => {
  537. store(hash)
  538. }).catch(err => { console.error(err) })
  539. }
  540.  
  541. function verifyPassword (test, hash, callback) {
  542. bcrypt.compare(test, hash).then(res => {
  543. console.log('verified:', res)
  544. callback(res)
  545. }).catch(err => { console.error(err) })
  546. }
  547.  
  548. exports.editCourse = (request, callback) => {
  549. let errorMessage = ''
  550. let success = true
  551.  
  552. let courseID = request.CourseID
  553.  
  554. if (this.getCourse(courseID) === null) {
  555. success = false
  556. errorMessage = 'Course with id ' + courseID + ' does not exist.'
  557. }
  558.  
  559. let assistants = request.assistants.split(',')
  560. let managers = request.managers.split(',')
  561. for (let i = 0; i < managers.length; i++) {
  562. managers[i] = managers[i].trim()
  563. }
  564. for (let i = 0; i < assistants.length; i++) {
  565. assistants[i] = assistants[i].trim()
  566. }
  567.  
  568. if (managers.length === 1 && managers[0] === '') {
  569. managers = []
  570. success = false
  571. errorMessage += '\nTried removing all managers. Each course needs a manager.'
  572. }
  573. if (assistants.length === 1 && assistants[0] === '') {
  574. assistants = []
  575. }
  576.  
  577. console.log('received managers: ', managers)
  578. console.log('received assistants: ', assistants)
  579.  
  580. if (assistants.length === 1 && assistants[0] === '') {
  581. assistants = []
  582. console.log('Assistants is empty.')
  583. }
  584. let confirmedAssistants = []
  585. let confirmedManagers = []
  586.  
  587. for (let i = 0; i < users.length; i++) {
  588. let managerIndex = managers.indexOf(users[i].email)
  589. let assistantIndex = assistants.indexOf(users[i].email)
  590.  
  591. console.log('userEmail:', users[i].email)
  592. if (managerIndex !== -1) {
  593. confirmedManagers.push(users[i].email)
  594. managers.splice(managerIndex, 1)
  595. }
  596. if (assistantIndex !== -1) {
  597. console.log('lägger till asse')
  598. confirmedAssistants.push(users[i].email)
  599. assistants.splice(assistantIndex, 1)
  600. }
  601. }
  602.  
  603. if (assistants.length > 0) {
  604. success = false
  605. errorMessage += '\nThe following assistants were not found: ' + assistants
  606. }
  607.  
  608. if (managers.length > 0) {
  609. success = false
  610. errorMessage += '\nThe following managers were not found: ' + managers
  611. }
  612. console.log(confirmedManagers, confirmedAssistants)
  613.  
  614. console.log(errorMessage)
  615. console.log('Success? ', success)
  616. let resultObject = {
  617. success: success,
  618. err: errorMessage
  619. }
  620. callback(resultObject)
  621.  
  622. if (success) {
  623. let rolesToCreate = []
  624. for (let asse of confirmedAssistants) {
  625. rolesToCreate.push({
  626. ID: this.findIDfromEmail(asse),
  627. role: 1
  628. })
  629. }
  630.  
  631. for (let mngr of confirmedManagers) {
  632. rolesToCreate.push({
  633. ID: this.findIDfromEmail(mngr),
  634. role: 2
  635. })
  636. }
  637. console.log(rolesToCreate)
  638.  
  639. Roles.destroy({ where: { courseID: request.CourseID } }).then(() => {
  640. for (let role of rolesToCreate) {
  641. Roles.create({
  642. ID: role.ID,
  643. courseID: request.CourseID,
  644. role: role.role
  645. }).catch(err => { console.error(err) })
  646. }
  647. }).catch(err => { console.error(err) })
  648. }
  649. }
  650.  
  651. exports.getUserInfoByEmail = (email, callback) => {
  652. for (let user of users) {
  653. if (email.trim() === user.email) {
  654. console.log('found user!', user)
  655. let userObject = {
  656. ID: user.ID,
  657. name: user.name,
  658. email: user.email
  659. }
  660. callback(userObject)
  661. }
  662. }
  663. }
  664.  
  665. exports.checkIfUserInQueue = (courseID, studentID) => {
  666. console.log('check if user in queue in model: ', courseID, studentID)
  667. // let queue = this.getQueueByCourseID(courseID).queue
  668. let queue = this.getQueueByCourseID(courseID).queue
  669. console.log('Checking still: ', queue)
  670. for (let qItem of queue) {
  671. console.log(qItem.studentID, studentID)
  672.  
  673. if (qItem.studentID === studentID) {
  674. console.log('in model checkIfUserInQueue: returning true')
  675. return true
  676. }
  677. }
  678. console.log('in model checkIfUserInQueue: returning false')
  679. return false
  680. }
  681.  
  682. function incrementTimesQueued (studentID, courseID) {
  683. console.log('-----incrementTimesQueued')
  684. StudentStatistics.findOne(
  685. { where: { ID: studentID } }
  686.  
  687. ).then(res => {
  688. StudentStatistics.update(
  689. { noTimesQueued: res.noTimesQueued + 1 },
  690. { where: { ID: studentID } }
  691. ).catch(err => { console.error(err) })
  692. })
  693.  
  694. CourseStatistics.findOne(
  695. { where: { courseID: courseID },
  696. attributes: ['courseID', 'totalQueued']
  697. }
  698.  
  699. ).then(res => {
  700. CourseStatistics.update(
  701. { totalQueued: res.totalQueued + 1 },
  702. { where: { courseID: courseID } }
  703. ).catch(err => { console.error(err) })
  704. })
  705. }
  706.  
  707. function incrementTimesHelped (studentID) {
  708. StudentStatistics.findOne(
  709. { where: { ID: studentID } }
  710.  
  711. ).then(res => {
  712. StudentStatistics.update(
  713. { noTimesHelpRecieved: res.noTimesHelpRecieved + 1 },
  714. { where: { ID: studentID } }
  715. ).catch(err => { console.error(err) })
  716. })
  717. }
  718.  
  719. function incrementTimeSpentInQueues (studentID, courseID, enterTime) {
  720. console.log('----in timeIncrement')
  721. let now = new Date()
  722.  
  723. StudentStatistics.findOne(
  724. { where: { ID: studentID } }
  725.  
  726. ).then(res => {
  727. console.log('STUDENT old time in queue', res.totTimeSpentInQueue)
  728. res.totTimeSpentInQueue.setMilliseconds((now - enterTime))
  729. console.log('STUDENT new time in queue', res.totTimeSpentInQueue)
  730.  
  731. StudentStatistics.update(
  732. { totTimeSpentInQueue: res.totTimeSpentInQueue },
  733. { where: { ID: studentID } }
  734. ).catch(err => { console.error(err) })
  735. }).catch(err => { console.error(err) })
  736.  
  737. CourseStatistics.findOne(
  738. {
  739. where: { courseID: courseID },
  740. attributes: ['TotalQueueTime']
  741. }
  742. ).then(res => {
  743. res.TotalQueueTime.setMilliseconds((now - enterTime))
  744.  
  745. CourseStatistics.update(
  746. { TotalQueueTime: res.TotalQueueTime },
  747. { where: { courseID: courseID } }
  748. )
  749. })
  750. }
  751. exports.addStudentToStatistics = (i) => {
  752. StudentStatistics.create({
  753. ID: i
  754. })
  755. }
  756.  
  757. exports.addRecievedHelp = (studentID) => {
  758. StudentStatistics.findOne({
  759. where: { ID: studentID }
  760. }).then(res => {
  761. StudentStatistics.update(
  762. { noTimesHelpRecieved: res.noTimesHelpRecieved + 1 }
  763. )
  764. })
  765. }
  766. exports.getStudentStatistics = (studentID) => {
  767. StudentStatistics.findOne({
  768. where: { ID: studentID }
  769. }).then(res => {
  770. let avgTime = convertTime(((res.totTimeSpentInQueue.getTime() - (new Date('1000-01-01T00:00:00Z')).getTime()) / (res.noTimesQueued)))
  771.  
  772. let stats = new Map()
  773. stats.set('totQueued', res.noTimesQueued)
  774. stats.set('noTimesHelpRecieved', res.noTimesHelpRecieved)
  775. stats.set('avgTime', avgTime)
  776.  
  777. return stats
  778. })
  779. }
  780.  
  781. exports.getCourseStatistics = (courseID) => {
  782. CourseStatistics.findOne({
  783. where: { courseID: courseID }
  784. }).then(res => {
  785. let avgTime = convertTime(((res.TotalQueueTime.getTime() - (new Date('1000-01-01T00:00:00Z')).getTime()) / (res.totalQueued)))
  786.  
  787. let stats = new Map()
  788. stats.set('totQueued', res.totalQueued)
  789. stats.set('avgTime', avgTime)
  790.  
  791. return stats
  792. })
  793. }
  794.  
  795. function convertTime (milliseconds) {
  796. var h, m, s
  797. s = Math.floor(milliseconds / 1000)
  798. m = Math.floor(s / 60)
  799. s = s % 60
  800. h = Math.floor(m / 60)
  801. m = m % 60
  802.  
  803. console.log('STUDENT AVGTIME', [h, m, s])
  804. return [h, m, s]
  805. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement