Forum Discussion

corbin_mccumber_donaldson_com's avatar
5 months ago
Solved

Batch Delete Identity Memberships

Hello, We have used the batchloader utility to create new memberships in Innovator. It appears that removals are a bit more difficult due to safeguards in place for the system. What is an easy path ...
  • MaksymArchybasov's avatar
    5 months ago

    Hi Corbin, 

    I've recently had a task to synchronize identitiy assignments between two environments. Unfortunately I haven't found the easier way than to write a simple script (basically it was a .net console app).  Here is the classes I've written.

    using Aras.IOM;
    namespace PLM_Utilities.Identities
    {
        public class Identity
        {
            public string Id { get; private set; }
            public string KeyedName { get; private set; }
            public List<Member> Members { get; private set; } = new List<Member>();
    
            // Constructor that builds Identity object from AML item
            public Identity(Item identityItem, Innovator inn)
            {
                Id = identityItem.getID();
                KeyedName = identityItem.getProperty("keyed_name");
                LoadMembers(identityItem);
            }
    
            private void LoadMembers(Item identityItem)
            {
                var members = identityItem.getRelationships();
                for (int j = 0; j < members.getItemCount(); j++)
                {
                    var memRelItem = members.getItemByIndex(j);
                    var memberItem = memRelItem.getRelatedItem();
                    var member = new Member
                    {
                        RelationID = memRelItem.getID(),
                        Id = memberItem.getID(),
    
                        KeyedName = memberItem.getProperty("keyed_name")
                    };
                    Members.Add(member);
                }
            }
            public bool SyncMemberWithOtherIdentity(Innovator inn, Identity identity)
            {
    
                foreach (var member in Members)
                {
                    RemoveMember(inn, member.RelationID);
                }
                foreach (var member in identity.Members)
                {
                    AddMember(inn, Id, member.KeyedName);
                }
                return true;
            }
            private void RemoveMember(Innovator inn, string memberId)
            {
                var aml = $@"<AML><Item type='Member' id='{memberId}' action='delete'/></AML>";
                inn.applyAML(aml);
            }
            private void AddMember(Innovator inn, string identityId, string memberName)
            {
                Console.WriteLine(memberName);
                var aml = $@"<AML><Item type='Member' action='add'>
                            <source_id>{identityId}</source_id>
                            <related_id>
                                <Item type='Identity' action='get'>
                                    <keyed_name>{System.Security.SecurityElement.Escape(memberName)}</keyed_name>
                                </Item>
                            </related_id>
                         </Item></AML>";
                inn.applyAML(aml);
            }
        }
        public class Member
        {
            public string Id { get; set; }
            public string RelationID { get; set; }
            public string KeyedName { get; set; }
        }
    }

    Hopefully it will help you to get the idea 

     

    Best regards, Maksym Archybasov