123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- const { ManagementClient } = require('authing-node-sdk')
- const managementClient = new ManagementClient({
- accessKeyId: '6686bffb373d06911e24a969',
- accessKeySecret: "4e978331675938d1bc81fb109e67d59a",
- host: 'https://textbook.u2-dev.hep.com.cn',
- })
- export function defineUserBeforeSave(){
- Parse.Cloud.beforeSave("_User", async (request) => {
- request.object = appendUserACL(request.object)
- let user = request.object;
-
- let password = user?.get("password");
- if(password){
- let mobile = user?.get("mobile");
- let email = user?.get("email");
- let username = user?.get("username");
- let externalId = user?.id;
- let authingUserExists = await findUserByMobileEmailUserName(user)
- if(authingUserExists?.statusCode==404){
- let newuser = {
- status:"Activated",
- }
- if(mobile){newuser.phone = mobile}
- if(email){newuser.email = email}
- if(username){newuser.username = username}
- if(externalId){newuser.externalId = externalId}
- result = await managementClient.createUser(newuser)
- }
- if(authingUserExists?.statusCode==200){
- let existsUser = authingUserExists?.data;
- try{
- let updateRes = await managementClient.updateUser({
- userId:existsUser?.userId,
- password:password,
- })
-
- }catch(err){console.log(err)}
- }
- }
- });
- }
- function appendUserACL(user){
- let acl = user?.getACL();
- if(!acl) acl = new Parse.ACL();
-
- acl.setRoleWriteAccess("superadmin", true);
- acl.setRoleReadAccess("superadmin", true);
-
- acl.setRoleWriteAccess("admin", true);
- acl.setRoleReadAccess("admin", true);
-
- acl.setRoleWriteAccess("manager", true);
- acl.setRoleReadAccess("manager", true);
-
-
- acl.setPublicReadAccess(true);
- user.setACL(acl);
- return user
- }
- export function defineUserBeforeDelete(){
- Parse.Cloud.beforeDelete("_User", async (request) => {
- let user = request.object;
-
-
- try{
- let authingUserExists = await findUserByMobileEmailUserName(user)
- if(authingUserExists?.statusCode==200){
- let existsUser = authingUserExists?.data;
- let deleteRes = await managementClient.deleteUsersBatch({
-
- userIds: [existsUser.userId],
- options: {
- userIdType: "user_id"
- }
- });
- }
- }catch(deleteErr){}
- });
- }
- export function defineUserAfterSave(){
- Parse.Cloud.afterSave("_User", async (request) => {
-
- let query = new Parse.Query("Profile");
- query.equalTo("user",request?.object?.id)
- let profile = await query.first();
- syncUserProfileToAuthing(request?.object,profile)
- });
- Parse.Cloud.afterSave("Profile", async (request) => {
-
- let query = new Parse.Query("Profile");
- let userPointer = request?.object?.get("user")
- query.include("user");
- console.log(userPointer)
- profile = await query.get(request?.object?.id,{useMasterKey:true});
- syncUserProfileToAuthing(profile.get("user"),profile)
- appandUserToRole(profile.get("user")?.toPointer() || userPointer,profile?.get("identity"))
- });
- }
- async function appandUserToRole(user,roleName) {
- console.log(user,roleName)
- let id = user?.id || user?.objectId
- if(!id || !roleName) return
- let userObj = new Parse.User();
- userObj.id = id;
- let query = new Parse.Query(Parse.Role);
- query.equalTo("name", roleName);
- try{
- let role = await query.first({ useMasterKey: true });
- console.log(role?.toJSON())
- if (role?.toJSON()?.name) {
- let usersRelation = role.relation("users");
- usersRelation.add(userObj);
- await role.save(null, { useMasterKey: true });
- let users = await usersRelation.query().find({ useMasterKey: true });
- console.log('Users in role after addition:', users.map(u => u.toJSON()));
- }
- }catch(err){
- console.error(err)
- }
- }
- async function findUserByMobileEmailUserName(user){
- let mobile = user?.get("mobile");
- let email = user?.get("email");
- let username = user?.get("username");
- let externalId = user?.id;
- let result;
- if(email){
- try{
- result = await managementClient.getUser({userIdType:`email`,userId:email})
-
- }catch(err){}
- }
- if(mobile&&(!result || result?.statusCode==404)){
- try{
- result = await managementClient.getUser({userIdType:`phone`,userId:mobile})
-
- }catch(err){}
- }
- if(username&&(!result || result?.statusCode==404)){
- try{
- result = await managementClient.getUser({userIdType:`username`,userId:username})
-
- }catch(err){}
- }
- if(externalId&&(!result || result?.statusCode==404)){
- try{
- result = await managementClient.getUser({userIdType:`external_id`,userId:externalId})
-
- }catch(err){}
- }
- return result
- }
- async function syncUserProfileToAuthing(user,profile){
- if(!user?.id) return
- let userInfo = user.toJSON();
- userInfo = fixJsonFileds(userInfo)
- if(profile?.id){
- let pjson = profile.toJSON();
- delete pjson.objectId;
- pjson= fixJsonFileds(pjson)
- Object.keys(pjson).forEach(key=>{
- userInfo[key] = pjson[key]
- })
- }
-
- userInfo.company = userInfo.companyName
- delete userInfo.companyName
- userInfo.userType = userInfo.identity
- delete userInfo.identity
- userInfo.userId = userInfo.objectId
- let authingUserExists = await findUserByMobileEmailUserName(user)
- if(authingUserExists?.statusCode==200){
- let existsUser = authingUserExists?.data;
- userInfo.userId = existsUser.userId
- }
- delete userInfo.objectId
- userInfo.identifyStatus = userInfo.accountState
-
- userInfo.customData = JSON.parse(JSON.stringify(userInfo))
-
-
-
-
-
- let result
- try{
- result = await managementClient.updateUser(userInfo)
-
- }catch(err){console.log(err)}
- }
- function fixJsonFileds(json){
-
- delete json.ACL
- delete json.className
- delete json.sessionToken
- delete json.company
- delete json.user
- delete json.createdAt
- delete json.updatedAt
-
- delete json?.loginsCount
- delete json?.lastIP
- delete json?.lastLogin
- return json
- }
|