func-authing-org-sync.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. const { ManagementClient } = require('authing-node-sdk')
  2. const managementClient = new ManagementClient({
  3. accessKeyId: '6686bffb373d06911e24a969',
  4. accessKeySecret: "4e978331675938d1bc81fb109e67d59a",
  5. host: 'https://textbook.u2-dev.hep.com.cn', // 应用的认证地址
  6. })
  7. // const pgp = require('pg-promise')();
  8. // const pgClient = () => {return pgp("postgresql://textbook:Edu2024textbask@oss-cn-beijing-internal.aliyuncs.com:5432/textbook");}
  9. import { pgClient } from '../../db/pg-instance'
  10. export function defineAuthingDepartSync(){
  11. // function defineAuthingLogin(){
  12. Parse.Cloud.define("authingDepartSync", async (request) => {
  13. let result = await syncOrganizationsFromAuthing(token)
  14. return result
  15. },{
  16. fields : {
  17. token:{
  18. required:true
  19. }
  20. }
  21. });
  22. }
  23. /**
  24. * 同步全部组织架构 From Authing
  25. * @desc
  26. * https://docs.authing.cn/v3/reference/sdk/node/management/管理组织机构/list-organizations.html
  27. * @param {*} token
  28. * @returns
  29. */
  30. async function syncOrganizationsFromAuthing(){
  31. // 通过用户的 id_token 初始化之后获取用户信息
  32. console.log("syncOrganizationsFromAuthing 2")
  33. console.log("managementClient")
  34. let orgList = []
  35. try{
  36. let result = await managementClient.listOrganizations({
  37. page: 1,
  38. limit: 50,
  39. withPost: true,
  40. withCustomData: true
  41. });
  42. if(result?.data?.list?.length){
  43. orgList = orgList.concat(result?.data?.list)
  44. let departList = await getAllChildDepartments(orgList[0])
  45. console.log(departList)
  46. console.log(departList?.length)
  47. let insertRes = await InsertAllDepartment(departList)
  48. console.log(insertRes)
  49. return {code:200,count:departList?.length,message:`成功导入${departList?.length}条`}
  50. }
  51. }catch(err){
  52. console.error(err)
  53. }
  54. return
  55. // console.log(user)
  56. }
  57. module.exports.syncOrganizationsFromAuthing = syncOrganizationsFromAuthing
  58. async function InsertAllDepartment(departList){
  59. // {
  60. // departmentId: '66868df17adf199d1c77875d',
  61. // organizationCode: '1000000',
  62. // name: '河北人民出版社有限责任公司',
  63. // description: '',
  64. // code: '30000095',
  65. // hasChildren: false,
  66. // isVirtualNode: false,
  67. // i18n: { name: [Object] },
  68. // customData: {},
  69. // status: true
  70. // createdAt: '2024-07-04T11:56:33.813Z',
  71. // updatedAt: '2024-07-04T11:56:33.813Z',
  72. // },
  73. let rowData = []
  74. departList.forEach(depart=>{
  75. rowData.push([depart?.departmentId,depart?.organizationCode,depart?.name,depart?.description,depart?.branch,depart?.parent?.departmentId,depart?.code,depart?.status,depart?.createdAt,depart?.updatedAt])
  76. })
  77. let flattenedParams = rowData.flat();
  78. let syncDepartSQL = `
  79. INSERT INTO "_Session" ("objectId", "organizationCode", "name", "description","branch","parent","code", "status","createdAt","updatedAt")
  80. VALUES
  81. ${rowData.map((_, i) => `($${i * 5 + 1}, $${i * 5 + 2}, $${i * 5 + 3}, $${i * 5 + 4}, $${i * 5 + 5}, $${i * 5 + 6}, $${i * 5 + 7}, $${i * 5 + 8}, $${i * 5 + 9}, $${i * 5 + 10})`).join(',\n')}
  82. ON CONFLICT ("objectId") DO UPDATE
  83. SET
  84. "organizationCode" = EXCLUDED."organizationCode",
  85. "name" = EXCLUDED."name",
  86. "description" = EXCLUDED."description",
  87. "branch" = EXCLUDED."branch",
  88. "parent" = EXCLUDED."parent",
  89. "code" = EXCLUDED."code",
  90. "status" = EXCLUDED."status",
  91. "createdAt" = EXCLUDED."createdAt",
  92. "updatedAt" = EXCLUDED."updatedAt";
  93. `
  94. let result = await pgClient().any(syncDepartSQL,flattenedParams);
  95. return result
  96. }
  97. async function getAllChildDepartments(depart){
  98. if(!depart?.hasChildren) return []
  99. let departmentList = []
  100. let childDepartList = await getDepartmentOfOrg(depart?.organizationCode,depart?.departmentId)
  101. departmentList = departmentList.concat(childDepartList)
  102. // console.log("childDepartList",childDepartList)
  103. let pList = childDepartList.map(item=>getAllChildDepartments(item))
  104. let resList = await Promise.all(pList);
  105. resList.forEach((list,index)=>{
  106. list = list.map(item=>{item.parent = childDepartList[index];return item})
  107. departmentList = departmentList.concat(list)
  108. })
  109. return departmentList
  110. }
  111. async function getDepartmentOfOrg(organizationCode,departmentId){
  112. let result = await managementClient.listChildrenDepartments({
  113. // 替换组织 Code 和部门 ID
  114. organizationCode: organizationCode,
  115. departmentId: departmentId,
  116. departmentIdType: 'department_id',
  117. withCustomData: true
  118. });
  119. if(result?.data?.list?.length) return result?.data?.list
  120. return []
  121. }
  122. // const crypto = require('crypto');
  123. // function generateObjectId(inputString) {
  124. // const hash = crypto.createHash('sha256').update(inputString).digest('hex');
  125. // const objectId = hash;
  126. // return objectId;
  127. // }