UserSeeder.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. const axios = require('axios');
  2. const qs = require('qs');
  3. const bcrypt = require('bcrypt');
  4. const prisma = require('../../src/prisma/PrismaClient.js');
  5. const {
  6. KEYCLOAK_TOKEN_URL,
  7. KEYCLOAK_ADMIN_URL,
  8. KEYCLOAK_REALM,
  9. CLIENT_ID,
  10. CLIENT_SECRET,
  11. } = require('../../config/keycloak.js');
  12. // Ambil token admin Keycloak
  13. const getAdminToken = async () => {
  14. const tokenParams = qs.stringify({
  15. grant_type: 'client_credentials',
  16. client_id: CLIENT_ID,
  17. client_secret: CLIENT_SECRET,
  18. });
  19. const { data } = await axios.post(KEYCLOAK_TOKEN_URL, tokenParams, {
  20. headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  21. });
  22. return data.access_token;
  23. };
  24. // Buat user di Keycloak
  25. const createUserInKeycloak = async (user, token) => {
  26. const checkUser = await axios.get(
  27. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  28. { headers: { Authorization: `Bearer ${token}` } }
  29. );
  30. if (checkUser.data.length > 0) {
  31. console.log(`⚠️ User ${user.username} found in Keycloak`);
  32. return checkUser.data[0].id;
  33. }
  34. await axios.post(
  35. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users`,
  36. {
  37. username: user.username,
  38. email: user.email,
  39. firstName: user.firstname,
  40. lastName: user.lastname,
  41. enabled: true,
  42. credentials: [
  43. {
  44. type: 'password',
  45. value: user.password,
  46. temporary: false,
  47. },
  48. ],
  49. },
  50. {
  51. headers: { Authorization: `Bearer ${token}` },
  52. }
  53. );
  54. const { data } = await axios.get(
  55. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  56. {
  57. headers: { Authorization: `Bearer ${token}` },
  58. }
  59. );
  60. return data[0].id;
  61. };
  62. // Assign role ke user di Keycloak
  63. const assignRole = async (userId, roleName, token) => {
  64. const { data: roles } = await axios.get(
  65. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/roles`,
  66. {
  67. headers: { Authorization: `Bearer ${token}` },
  68. }
  69. );
  70. const role = roles.find((r) => r.name === roleName);
  71. if (!role) throw new Error(`Role "${roleName}" not found in Keycloak`);
  72. await axios.post(
  73. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users/${userId}/role-mappings/realm`,
  74. [role],
  75. {
  76. headers: { Authorization: `Bearer ${token}` },
  77. }
  78. );
  79. };
  80. // Data user yang ingin dibuat
  81. const users = [
  82. {
  83. username: 'admin1',
  84. email: 'admin1@gmail.com',
  85. password: 'password123',
  86. firstname: 'Admin',
  87. lastname: 'Satu',
  88. role: 'admin',
  89. },
  90. {
  91. username: 'sales1',
  92. email: 'sales1@gmail.com',
  93. password: 'password123',
  94. firstname: 'Sales',
  95. lastname: 'Satu',
  96. role: 'sales',
  97. },
  98. {
  99. username: 'sales2',
  100. email: 'sales2@gmail.com',
  101. password: 'password123',
  102. firstname: 'Sales',
  103. lastname: 'Dua',
  104. role: 'sales',
  105. },
  106. ];
  107. // Fungsi utama yang bisa dipanggil dari seeder utama
  108. const seedUsers = async () => {
  109. const token = await getAdminToken();
  110. for (const user of users) {
  111. const userId = await createUserInKeycloak(user, token);
  112. await assignRole(userId, user.role, token);
  113. const hashedPassword = await bcrypt.hash(user.password, 10);
  114. await prisma.user.upsert({
  115. where: { id: userId },
  116. update: {},
  117. create: {
  118. id: userId,
  119. username: user.username,
  120. email: user.email,
  121. firstname: user.firstname,
  122. lastname: user.lastname,
  123. password: hashedPassword,
  124. role: user.role,
  125. },
  126. });
  127. console.log(`✅ Success seed user ${user.role}: ${user.username}`);
  128. }
  129. };
  130. module.exports = { seedUsers };