auth.controller.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. const { validation } = require('../../middleware/validation')
  2. const axios = require('../../utils/axios')
  3. const qs = require('qs')
  4. const response = require('../../utils/responseHandler')
  5. const userModel = require('../../model/user.model')
  6. const { roleDataProduction } = require('../../utils/constanta')
  7. const convertRole = require('../../utils/convertRole')
  8. const jwt = require('jsonwebtoken')
  9. const moment = require('moment')
  10. const logModel = require('../../model/log.model')
  11. const auth = require('../../middleware/verifyToken')
  12. exports.login = [
  13. validation((req) => req.body, {
  14. username: { type: 'string', empty: false },
  15. password: { type: 'string', empty: false }
  16. }),
  17. async (req, res) => {
  18. const { username, password } = req.body
  19. let userResponse
  20. try {
  21. userResponse = await axios.post(
  22. 'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
  23. qs.stringify({
  24. username,
  25. password
  26. }),
  27. {
  28. 'Content-Type': 'application/x-www-form-urlencoded'
  29. }
  30. )
  31. if (userResponse.code === 400) {
  32. return response.error(res, {
  33. code: 401,
  34. message: userResponse.message
  35. })
  36. }
  37. } catch (e) {
  38. return response.error(res, {
  39. code: 500,
  40. message: e.message
  41. })
  42. }
  43. let role = userResponse.peran.filter((e) => roleDataProduction.includes(e.peran.id))[0]
  44. role.peran.id = convertRole(role.peran.id)
  45. let user = await userModel.findOne({ user_id: userResponse.id })
  46. if (!user) {
  47. await userModel.create({
  48. user_id: userResponse.id,
  49. nama: userResponse.nama,
  50. lembaga: role.organisasi,
  51. email: userResponse.username,
  52. no_hp: userResponse.no_hp,
  53. alamat: userResponse.alamat,
  54. role: role.peran,
  55. isPublic: false,
  56. isPrivate: false
  57. })
  58. } else {
  59. await userModel.findOneAndUpdate({ user_id: userResponse.id }, {
  60. lembaga: role.organisasi,
  61. role: {
  62. id: username.toLowerCase() === 'rizqevo@outlook.com' ? 2020 : username.toLowerCase() === 'sugiyanto@gmail.com' ? 2024 : role.peran.id,
  63. nama: username.toLowerCase() === 'rizqevo@outlook.com' ? 'PTB Dikti' : username.toLowerCase() === 'sugiyanto@gmail.com' ? 'ReadOnly' : role.peran.nama,
  64. menu: role.peran.menu
  65. }
  66. })
  67. }
  68. user = await userModel.findOne({ user_id: userResponse.id })
  69. const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, {
  70. expiresIn: '1d'
  71. })
  72. res.cookie('sidali-cookie', accessToken, {
  73. httpOnly: true,
  74. expires: moment().add(1, 'day').toDate()
  75. })
  76. return response.success(res, {
  77. message: 'Berhasil Login',
  78. data: {
  79. token: `Bearer ${accessToken}`,
  80. user
  81. }
  82. })
  83. }
  84. ]
  85. exports.loginToPT = [
  86. auth,
  87. validation((req) => req.body, {
  88. lembaga_id: 'string',
  89. password: 'string'
  90. }),
  91. async (req, res) => {
  92. let user = req.user
  93. const { lembaga_id, password } = req.body
  94. try {
  95. const userResponse = await axios.post(
  96. 'https://api.kemdikbud.go.id:8243/manakses/2.0/auth',
  97. qs.stringify({
  98. username: user.email,
  99. password
  100. }),
  101. {
  102. 'Content-Type': 'application/x-www-form-urlencoded'
  103. }
  104. )
  105. if (userResponse.code === 400) {
  106. return response.error(res, {
  107. code: 401,
  108. message: userResponse.message
  109. })
  110. }
  111. } catch (e) {
  112. return response.error(res, {
  113. code: 500,
  114. message: e.message
  115. })
  116. }
  117. let dataLembaga
  118. try {
  119. dataLembaga = await axios.get(`https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/${lembaga_id}`)
  120. } catch (e) {
  121. return response.error(res, {
  122. code: e.response.status,
  123. message: e.message
  124. })
  125. }
  126. await userModel.updateOne({
  127. _id: user._id
  128. }, {
  129. lembaga: {
  130. id: dataLembaga[0].id,
  131. nama: dataLembaga[0].nama
  132. },
  133. role: {
  134. id: 2022,
  135. nama: 'PTB PT'
  136. }
  137. })
  138. user = await userModel.findOne({ _id: user._id })
  139. await logModel.create({
  140. user: user._id,
  141. aktivitas: `${user.nama} berhasil masuk ke PT ${dataLembaga[0].nama}`
  142. })
  143. const accessToken = jwt.sign({ _id: user._id }, process.env.SRU51, {
  144. expiresIn: '1d'
  145. })
  146. const data = {
  147. token: `Bearer ${accessToken}`,
  148. user
  149. }
  150. res.cookie('sidali-cookie', accessToken, {
  151. httpOnly: true,
  152. expires: moment().add(1, 'day').toDate()
  153. })
  154. response.success(res, {
  155. message: 'Berhasil Login',
  156. data
  157. })
  158. }
  159. ]
  160. exports.logout = (req, res) => {
  161. res.clearCookie('sidali-cookie')
  162. response.success(res, {
  163. message: 'Berhasil Logout'
  164. })
  165. }