예제 #1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            NetDimensionsOrganization organization = new NetDimensionsOrganization();
            StringBuilder             sb           = new StringBuilder();
            dynamic organizationObject             = serializer.Deserialize(reader);

            organization.Id          = organizationObject["id"].ToString();
            organization.Description = organizationObject["description"].ToString();

            sb.Insert(0, organizationObject["code"].ToString());
            dynamic parentOrg = organizationObject["parent"];

            while (parentOrg != null)
            {
                string parentCode = parentOrg["code"].ToString();
                if (!parentCode.ToUpper().Equals("ROOT", StringComparison.InvariantCultureIgnoreCase))
                {
                    sb.Insert(0, parentCode + ",");
                }
                parentOrg = parentOrg["parent"];
            }

            organization.Code = sb.ToString();
            return(organization);
        }
        /// <summary>
        /// Gets the IDs users of the users in an organization.
        /// </summary>
        /// <param name="organizationHierarchyCode">The organization's code in a  comma-delimited hierarchy list of organizations (not counting ROOT). e.g.: "PSC,AutoGen"</param>
        /// <param name="stat">Optional: The state of users to get (e.g. only active users).</param>
        /// <returns>IDs users of the users in the specified organization</returns>
        public string[] GetUsersInOrganization(string organizationHierarchyCode, string stat = "")
        {
            List <string>             users = new List <string>();
            NetDimensionsOrganization org   = this.GetOrganization(organizationHierarchyCode);

            if (org != null)
            {
                string serviceApiUrl = string.Format(NetDimensionsConstants.ApiGetUserInOrganization, this.LmsUrl);
                using (WebClient apiWebClient = new WebClient())
                {
                    apiWebClient.Headers[HttpRequestHeader.ContentType] = "application/xml";
                    apiWebClient.Credentials = new NetworkCredential(this.UserAuthUser, this.SysAuthKey);
                    apiWebClient.QueryString.Add("organizationId", org.Id);

                    if (!string.IsNullOrWhiteSpace(stat))
                    {
                        apiWebClient.QueryString.Add("status", stat);
                    }

                    string retVal = apiWebClient.UploadString(serviceApiUrl, "GET");

                    XmlDocument         doc = new XmlDocument();
                    XmlNamespaceManager ns  = new XmlNamespaceManager(doc.NameTable);
                    doc.LoadXml(retVal);
                    ns.AddNamespace(doc.DocumentElement.Prefix, doc.DocumentElement.NamespaceURI);
                    XmlNodeList userNodes = doc.DocumentElement.SelectNodes(string.Format("//{0}:user/{0}:id", doc.DocumentElement.Prefix), ns);
                    foreach (XmlNode xn in userNodes)
                    {
                        users.Add(xn.InnerText);
                    }
                }
            }

            return(users.ToArray());
        }
        /// <summary>
        /// Gets details of an organization.
        /// </summary>
        /// <param name="organizationHierarchyCode">The organization's code in a  comma-delimited hierarchy list of organizations (not counting ROOT). e.g.: "PSC,AutoGen"</param>
        /// <returns>Details of the organization.</returns>
        public NetDimensionsOrganization GetOrganization(string organizationHierarchyCode)
        {
            if (string.IsNullOrWhiteSpace(organizationHierarchyCode))
            {
                return(null);
            }

            string serviceApiUrl = string.Format(NetDimensionsConstants.ApiGetOrganization, this.LmsUrl);
            NetDimensionsOrganization currentOrganization = null;
            string currentLevelOrganizationsJs            = string.Empty;

            using (WebClient apiWebClient = new WebClient())
            {
                apiWebClient.Headers[HttpRequestHeader.ContentType] = "application/xml";
                apiWebClient.Credentials = new NetworkCredential(this.UserAuthUser, this.UserAuthPass);
                apiWebClient.QueryString.Add("id", "*ROOT*");
                apiWebClient.QueryString.Add("recursive", "false");
                apiWebClient.QueryString.Add("format", "json");
                try
                {
                    currentLevelOrganizationsJs = apiWebClient.UploadString(serviceApiUrl, "GET");
                }
                catch (WebException)
                {
                    //Not found or not authorised
                    return(null);
                }
                currentOrganization = JsonConvert.DeserializeObject <NetDimensionsOrganization>(currentLevelOrganizationsJs);

                string[] organizationsHierarchy = organizationHierarchyCode.Split(',');
                foreach (string org in organizationsHierarchy)
                {
                    currentOrganization = currentOrganization.Children.FirstOrDefault(o => o.Code.Trim().Equals(org.Trim(), StringComparison.InvariantCultureIgnoreCase));
                    if (currentOrganization != null)
                    {
                        apiWebClient.QueryString["id"] = currentOrganization.Id;
                        try
                        {
                            currentLevelOrganizationsJs = apiWebClient.UploadString(serviceApiUrl, "GET");
                        }
                        catch (WebException)
                        {
                            //Not found or not authorised
                            return(null);
                        }
                        currentOrganization = JsonConvert.DeserializeObject <NetDimensionsOrganization>(currentLevelOrganizationsJs);
                    }
                }
            }
            return(currentOrganization);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            NetDimensionsOrganization organization = new NetDimensionsOrganization();
            StringBuilder sb = new StringBuilder();
            dynamic organizationObject = serializer.Deserialize(reader);
            organization.Id = organizationObject["id"].ToString();
            organization.Description = organizationObject["description"].ToString();

            sb.Insert(0, organizationObject["code"].ToString());
            dynamic parentOrg = organizationObject["parent"];

            while (parentOrg != null)
            {
                string parentCode = parentOrg["code"].ToString();
                if (!parentCode.ToUpper().Equals("ROOT", StringComparison.InvariantCultureIgnoreCase))
                    sb.Insert(0, parentCode + ",");
                parentOrg = parentOrg["parent"];
            }

            organization.Code = sb.ToString();
            return organization;
        }
        /// <summary>
        /// Creates users in the LMS. Also adds their related organizations if needed, and assigns the users to them.
        /// </summary>
        /// <param name="users">The users to create.</param>
        /// <returns>The results of the users creation. Including any errors and warnings from the LMS.</returns>
        public UserActionResults CreateUsers(NetDimensionsUser[] users)
        {
            if (users.Length == 0)
            {
                return(null);
            }
            if ((users.Any(u => string.IsNullOrWhiteSpace(u.UserID))) ||
                (users.Any(u => string.IsNullOrWhiteSpace(u.LastName)) ||
                 (users.Any(u => string.IsNullOrWhiteSpace(u.FirstName))) ||
                 (users.Any(u => string.IsNullOrWhiteSpace(u.Password))) ||
                 (users.Any(u => string.IsNullOrWhiteSpace(u.Email)))))
            {
                throw new ArgumentException("To create a user, the following fields are mandatory: UserID, LastName, FirstName, Password, Email");
            }

            UserActionResults result = null;

            string serviceApiUrl = string.Format(NetDimensionsConstants.ApiUsersCsv, this.LmsUrl);
            string usersCsv      = NetDimensionsUser.GetCsv(NetDimensionsConstants.UserActions.AddOrUpdate, users);

            using (WebClient apiWebClient = new WebClient())
            {
                apiWebClient.Headers[HttpRequestHeader.ContentType] = "text/plain";
                apiWebClient.Credentials = new NetworkCredential(this.UserAuthUser, this.SysAuthKey);

                string csvResponse = Encoding.UTF8.GetString(apiWebClient.UploadData(
                                                                 serviceApiUrl,
                                                                 "POST",
                                                                 Encoding.ASCII.GetBytes(usersCsv)));

                result = new UserActionResults(csvResponse);
            }

            Dictionary <NetDimensionsOrganization, List <string> > organizationUsers = new Dictionary <NetDimensionsOrganization, List <string> >();

            foreach (NetDimensionsUser user in users)
            {
                if (user.Organization != null)
                {
                    NetDimensionsOrganization organizationInList = organizationUsers.Keys.FirstOrDefault(o => o.Code == user.Organization.Code);
                    if (organizationInList == null)
                    {
                        organizationUsers.Add(user.Organization, new List <string>());
                    }
                    organizationInList = organizationUsers.Keys.FirstOrDefault(o => o.Code == user.Organization.Code);
                    if (string.IsNullOrWhiteSpace(organizationInList.Description))
                    {
                        organizationInList.Description = user.Organization.Description;
                    }

                    if (!organizationUsers[organizationInList].Contains(user.UserID))
                    {
                        organizationUsers[organizationInList].Add(user.UserID);
                    }
                }
            }
            foreach (KeyValuePair <NetDimensionsOrganization, List <string> > organization in organizationUsers)
            {
                this.CreateOrganization(organization.Key.Code, organization.Key.Description);
                this.AddUsersToOrganization(organization.Value.ToArray(), organization.Key.Code);
            }
            return(result);
        }