UserSeeder.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. import axios from 'axios';
  2. import qs from 'qs';
  3. import bcrypt from 'bcrypt';
  4. import prisma from '../../src/prisma/PrismaClient';
  5. import {
  6. KEYCLOAK_TOKEN_URL,
  7. KEYCLOAK_ADMIN_URL,
  8. KEYCLOAK_REALM,
  9. CLIENT_ID,
  10. CLIENT_SECRET,
  11. } from '../../config/keycloak';
  12. // Tipe untuk data user lokal
  13. interface SeedUser {
  14. username: string;
  15. email: string;
  16. password: string;
  17. firstname: string;
  18. lastname: string;
  19. role: string;
  20. }
  21. // Ambil token admin dari Keycloak
  22. const getAdminToken = async (): Promise<string> => {
  23. const tokenParams = qs.stringify({
  24. grant_type: 'client_credentials',
  25. client_id: CLIENT_ID,
  26. client_secret: CLIENT_SECRET,
  27. });
  28. const { data } = await axios.post(KEYCLOAK_TOKEN_URL, tokenParams, {
  29. headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  30. });
  31. return data.access_token;
  32. };
  33. // Membuat user di Keycloak
  34. const createUserInKeycloak = async (user: SeedUser, token: string): Promise<string> => {
  35. const checkUser = await axios.get(
  36. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  37. { headers: { Authorization: `Bearer ${token}` } }
  38. );
  39. if (checkUser.data.length > 0) {
  40. console.log(`⚠️ User ${user.username} already exists in Keycloak`);
  41. return checkUser.data[0].id;
  42. }
  43. await axios.post(
  44. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users`,
  45. {
  46. username: user.username,
  47. email: user.email,
  48. firstName: user.firstname,
  49. lastName: user.lastname,
  50. enabled: true,
  51. credentials: [
  52. {
  53. type: 'password',
  54. value: user.password,
  55. temporary: false,
  56. },
  57. ],
  58. },
  59. {
  60. headers: { Authorization: `Bearer ${token}` },
  61. }
  62. );
  63. const { data } = await axios.get(
  64. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  65. {
  66. headers: { Authorization: `Bearer ${token}` },
  67. }
  68. );
  69. return data[0].id;
  70. };
  71. // Assign role ke user
  72. const assignRole = async (userId: string, roleName: string, token: string): Promise<void> => {
  73. const { data: roles } = await axios.get(
  74. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/roles`,
  75. {
  76. headers: { Authorization: `Bearer ${token}` },
  77. }
  78. );
  79. const role = roles.find((r: any) => r.name === roleName);
  80. if (!role) throw new Error(`Role "${roleName}" not found in Keycloak`);
  81. await axios.post(
  82. `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users/${userId}/role-mappings/realm`,
  83. [role],
  84. {
  85. headers: { Authorization: `Bearer ${token}` },
  86. }
  87. );
  88. };
  89. // Data user yang ingin di-seed
  90. const users: SeedUser[] = [
  91. {
  92. username: 'admin1',
  93. email: 'admin1@gmail.com',
  94. password: 'password123',
  95. firstname: 'Admin',
  96. lastname: 'Satu',
  97. role: 'admin',
  98. },
  99. {
  100. username: 'sales1',
  101. email: 'sales1@gmail.com',
  102. password: 'password123',
  103. firstname: 'Sales',
  104. lastname: 'Satu',
  105. role: 'sales',
  106. },
  107. {
  108. username: 'sales2',
  109. email: 'sales2@gmail.com',
  110. password: 'password123',
  111. firstname: 'Sales',
  112. lastname: 'Dua',
  113. role: 'sales',
  114. },
  115. ];
  116. // Fungsi utama untuk seeding user
  117. export const seedUsers = async (): Promise<void> => {
  118. const token = await getAdminToken();
  119. for (const user of users) {
  120. const userId = await createUserInKeycloak(user, token);
  121. await assignRole(userId, user.role, token);
  122. const hashedPassword = await bcrypt.hash(user.password, 10);
  123. await prisma.user.upsert({
  124. where: { id: userId },
  125. update: {},
  126. create: {
  127. id: userId,
  128. username: user.username,
  129. email: user.email,
  130. firstname: user.firstname,
  131. lastname: user.lastname,
  132. password: hashedPassword,
  133. role: user.role,
  134. },
  135. });
  136. console.log(`✅ Success seed user ${user.role}: ${user.username}`);
  137. }
  138. };
  139. // const axios = require('axios');
  140. // const qs = require('qs');
  141. // const bcrypt = require('bcrypt');
  142. // const prisma = require('../../src/prisma/PrismaClient.js');
  143. // const {
  144. // KEYCLOAK_TOKEN_URL,
  145. // KEYCLOAK_ADMIN_URL,
  146. // KEYCLOAK_REALM,
  147. // CLIENT_ID,
  148. // CLIENT_SECRET,
  149. // } = require('../../config/keycloak.js');
  150. // // Ambil token admin Keycloak
  151. // const getAdminToken = async () => {
  152. // const tokenParams = qs.stringify({
  153. // grant_type: 'client_credentials',
  154. // client_id: CLIENT_ID,
  155. // client_secret: CLIENT_SECRET,
  156. // });
  157. // const { data } = await axios.post(KEYCLOAK_TOKEN_URL, tokenParams, {
  158. // headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  159. // });
  160. // return data.access_token;
  161. // };
  162. // // Buat user di Keycloak
  163. // const createUserInKeycloak = async (user, token) => {
  164. // const checkUser = await axios.get(
  165. // `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  166. // { headers: { Authorization: `Bearer ${token}` } }
  167. // );
  168. // if (checkUser.data.length > 0) {
  169. // console.log(`⚠️ User ${user.username} found in Keycloak`);
  170. // return checkUser.data[0].id;
  171. // }
  172. // await axios.post(
  173. // `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users`,
  174. // {
  175. // username: user.username,
  176. // email: user.email,
  177. // firstName: user.firstname,
  178. // lastName: user.lastname,
  179. // enabled: true,
  180. // credentials: [
  181. // {
  182. // type: 'password',
  183. // value: user.password,
  184. // temporary: false,
  185. // },
  186. // ],
  187. // },
  188. // {
  189. // headers: { Authorization: `Bearer ${token}` },
  190. // }
  191. // );
  192. // const { data } = await axios.get(
  193. // `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=${user.username}`,
  194. // {
  195. // headers: { Authorization: `Bearer ${token}` },
  196. // }
  197. // );
  198. // return data[0].id;
  199. // };
  200. // // Assign role ke user di Keycloak
  201. // const assignRole = async (userId, roleName, token) => {
  202. // const { data: roles } = await axios.get(
  203. // `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/roles`,
  204. // {
  205. // headers: { Authorization: `Bearer ${token}` },
  206. // }
  207. // );
  208. // const role = roles.find((r) => r.name === roleName);
  209. // if (!role) throw new Error(`Role "${roleName}" not found in Keycloak`);
  210. // await axios.post(
  211. // `${KEYCLOAK_ADMIN_URL}/admin/realms/${KEYCLOAK_REALM}/users/${userId}/role-mappings/realm`,
  212. // [role],
  213. // {
  214. // headers: { Authorization: `Bearer ${token}` },
  215. // }
  216. // );
  217. // };
  218. // // Data user yang ingin dibuat
  219. // const users = [
  220. // {
  221. // username: 'admin1',
  222. // email: 'admin1@gmail.com',
  223. // password: 'password123',
  224. // firstname: 'Admin',
  225. // lastname: 'Satu',
  226. // role: 'admin',
  227. // },
  228. // {
  229. // username: 'sales1',
  230. // email: 'sales1@gmail.com',
  231. // password: 'password123',
  232. // firstname: 'Sales',
  233. // lastname: 'Satu',
  234. // role: 'sales',
  235. // },
  236. // {
  237. // username: 'sales2',
  238. // email: 'sales2@gmail.com',
  239. // password: 'password123',
  240. // firstname: 'Sales',
  241. // lastname: 'Dua',
  242. // role: 'sales',
  243. // },
  244. // ];
  245. // // Fungsi utama yang bisa dipanggil dari seeder utama
  246. // const seedUsers = async () => {
  247. // const token = await getAdminToken();
  248. // for (const user of users) {
  249. // const userId = await createUserInKeycloak(user, token);
  250. // await assignRole(userId, user.role, token);
  251. // const hashedPassword = await bcrypt.hash(user.password, 10);
  252. // await prisma.user.upsert({
  253. // where: { id: userId },
  254. // update: {},
  255. // create: {
  256. // id: userId,
  257. // username: user.username,
  258. // email: user.email,
  259. // firstname: user.firstname,
  260. // lastname: user.lastname,
  261. // password: hashedPassword,
  262. // role: user.role,
  263. // },
  264. // });
  265. // console.log(`✅ Success seed user ${user.role}: ${user.username}`);
  266. // }
  267. // };
  268. // module.exports = { seedUsers };