public async Task<HttpResponseMessage> RegisterJiveInstance(JiveAddonRegistrationDto jiveRegistration)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    _response = await Request.Content.ReadAsStringAsync();

                    //Convert our Jive Addon registration from the Data Transfer Object into an internal object
                    //Example of an add-on registration request
                    //{
                    //    "tenantId": "b22e3911-28ef-480c-ae3b-ca791ba86952",
                    //    "jiveSignatureURL": "https://market.apps.jivesoftware.com/appsmarket/services/rest/jive/instance/validation/8ce5c231-fab8-46b1-b8b2-fc65ascesb5d",
                    //    "timestamp": "2014-02-17T14:07:09.135+0000",
                    //    "jiveUrl": "https://sandbox.jiveon.com",
                    //    "jiveSignature": "r3gMujBUIWLUyvAp81TK9YasdAdDaRtlsQ6x+Ig=",
                    //    "clientSecret": "bmdoprg381uypaffd7xrl123c9znb5fjsb.s",
                    //    "clientId": "mrymd1f8oziyamo0yxdasdw9yovigd9t.i"
                    //}

                    Mapper.CreateMap<JiveAddonRegistrationDto, JiveAddonRegistration>();
                    JiveAddonRegistration myJiveRegistration = Mapper.Map<JiveAddonRegistrationDto, JiveAddonRegistration>(jiveRegistration);

                    db.JiveRegistrations.Add(myJiveRegistration);
                    db.SaveChanges();

                    if (Convert.ToBoolean(jiveRegistration.uninstalled) != true)
                    {
                        //check if this is a valid Jive environment

                        StringBuilder validationPayload = new StringBuilder();
                        validationPayload.Append("clientId:");
                        validationPayload.Append(myJiveRegistration.ClientId + "\n");
                        validationPayload.Append("clientSecret:");

                        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                        byte[] secret = encoding.GetBytes(myJiveRegistration.ClientSecret);
                        HMACSHA256 hmacsha256 = new HMACSHA256();
                        hmacsha256.ComputeHash(secret);




                        foreach (byte b in hmacsha256.Hash)
                        {
                            validationPayload.AppendFormat("{0:x2}", b);
                        }
                        validationPayload.Append("\n" + "jiveSignatureURL:");
                        validationPayload.Append(myJiveRegistration.JiveSignatureURL + "\n");
                        validationPayload.Append("jiveUrl:");
                        validationPayload.Append(myJiveRegistration.JiveUrl + "\n");
                        validationPayload.Append("tenantId:");
                        validationPayload.Append(myJiveRegistration.TenantId + "\n");
                        validationPayload.Append("timestamp:");
                        validationPayload.Append(myJiveRegistration.Timestamp + "\n");
                        string validationPayloadString = validationPayload.ToString();
                        byte[] binaryPayload = encoding.GetBytes(validationPayloadString);

                        //Validate with the Jive webservice that the request orininated from JIve
                        //Alternatively validate with your local environment in some form
                        //This method is not fully implemented in this example
                        using (WebClient wc = new WebClient())
                        {
                            wc.Headers.Set("X-Jive-MAC", myJiveRegistration.JiveSignature);
                            try
                            {
                                byte[] postResult = wc.UploadData(myJiveRegistration.JiveSignatureURL, binaryPayload);
                            }
                            catch (System.Net.WebException webEx)
                            {
                                Trace.WriteLine(webEx, "Error");
                            }
                        }
                    }
                    //Check if the Jive instance already exists, otherwise create it

                    JiveInstance myJiveInstance = db.JiveInstances.Find(myJiveRegistration.TenantId);



                    if (myJiveInstance == null)
                    {
                        //Jive instance not created yet. Let's build it

                        myJiveInstance = new JiveInstance();
                        myJiveInstance.DateCreated = DateTime.Now;
                        myJiveInstance.IsComplete = false;
                        myJiveInstance.JiveInstanceId = myJiveRegistration.TenantId;
                        myJiveInstance.LastUpdated = DateTime.Now;
                        myJiveInstance.Url = myJiveRegistration.JiveUrl;
                        myJiveInstance.IsComplete = false;
                        myJiveInstance.IsLicensed = true;
                        myJiveInstance.IsInstalledViaAddon = true;
                        db.JiveInstances.Add(myJiveInstance);

                        db.SaveChanges();

                        User newAdmin = new User();
                        newAdmin.DateCreated = DateTime.Now;


                    }
                    JiveAddon myJiveAddon;
                    if (Convert.ToBoolean(myJiveRegistration.Uninstalled) == true)
                    {
                        //Addon uninstalled
                        myJiveAddon = db.JiveAddons
                            .Include("JiveInstance")
                            .Where(a => a.JiveInstance.JiveInstanceId.Equals(myJiveRegistration.TenantId)).First();
                        myJiveAddon.Uninstalled = true;
                        db.SaveChanges();

                    }
                    else
                    {
                        //Addon is being installed
                        //Create a new add-on
                        var _jiveAddons = db.JiveAddons
                            .Include("JiveInstance")
                            .Where(a => a.JiveInstance.JiveInstanceId.Equals(myJiveRegistration.TenantId));


                        if (_jiveAddons.Count() == 0)
                        {
                            myJiveAddon = new JiveAddon();
                            myJiveAddon.AddonType = "My wonderful app";
                            myJiveAddon.ClientId = myJiveRegistration.ClientId;
                            string clientSecret = myJiveRegistration.ClientSecret;
                            if (clientSecret.EndsWith(".s"))
                            {
                                clientSecret = clientSecret.TrimEnd('s');
                                clientSecret = clientSecret.TrimEnd('.');

                            }
                            myJiveAddon.ClientSecret = clientSecret;
                            myJiveAddon.DateCreated = DateTime.Now;
                            myJiveAddon.JiveInstance = myJiveInstance;
                            myJiveAddon.Code = myJiveRegistration.Code;
                            myJiveAddon.Scope = myJiveRegistration.Scope;
                            myJiveRegistration.Timestamp = myJiveRegistration.Timestamp;
                            myJiveAddon.Uninstalled = false;
                            db.JiveAddons.Add(myJiveAddon);
                            db.SaveChanges();
                        }
                        else
                        {
                            //Update existing addon

                            myJiveAddon = _jiveAddons.First();
                            myJiveAddon.ClientId = myJiveRegistration.ClientId;

                            string clientSecret = myJiveRegistration.ClientSecret;
                            if (clientSecret.EndsWith(".s"))
                            {
                                clientSecret = clientSecret.TrimEnd('s');
                                clientSecret = clientSecret.TrimEnd('.');

                            }
                            myJiveAddon.ClientSecret = clientSecret;
                            myJiveAddon.Code = myJiveRegistration.Code;
                            myJiveAddon.Scope = myJiveRegistration.Scope;
                            myJiveRegistration.Timestamp = myJiveRegistration.Timestamp;
                            myJiveAddon.Uninstalled = false;
                            db.SaveChanges();

                        }



                    }


                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, jiveRegistration);
                    return response;
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex, "Error");
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.InternalServerError);
                    return response;
                }


            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }
        public void SetAccess(string userId)
        {
            using (JiveSdkContext db = new JiveSdkContext())
            {
                try
                {


                    //Retrieve the current user from the database
                    //Not recommended for production where it would be more efficient
                    //to user a caching mechanism to minimize sql queries
                    var _myUser = db.Users
                                          .Include("JiveInstance")
                                          .Where(u => u.UserId == userId);
                    User myUser = null;

                    if (_myUser.Count() > 0)
                    {
                        myUser = _myUser.First();

                        if (myUser.DisplayName != null)
                        {
                            ViewBag.ownerName = myUser.DisplayName;
                        }
                        else
                        {
                            ViewBag.ownerName = "Display name not set in DB";

                        }

                        ViewBag.ownerId = userId;
                        ViewBag.jiveUrl = myUser.JiveInstance.Url;
                        string culture = Thread.CurrentThread.CurrentCulture.ToString();
 

                    }
                    else
                    {
                        //This user is not registered in the database yet

                        string[] jiveInstanceTemp = userId.Split('@');
                        String userJiveInstance = jiveInstanceTemp[1];



                        // Find the instance ID for the user
                        var _jiveInstanceForUser = db.JiveInstances
                            .Include("Users")
                            .Include("JiveInstanceSettings")
                            .Where(j => j.JiveInstanceId.Equals(userJiveInstance));

                        if (_jiveInstanceForUser.Count() == 0)
                        {
                            //The JiveInstance does not exist yet. This is a legacy setting for apps delivered via the Jive Apps market
                            isNewJiveInstance = true;
                            jiveInstanceForUser = null;
                        }
                        else
                        {
                            isNewJiveInstance = false;
                            jiveInstanceForUser = _jiveInstanceForUser.First();
                            if (jiveInstanceForUser.Users.Count() == 0)
                            {
                                jiveInstanceForUser.Users = new List<User>();

                            }
                        }



                        //Create a new JiveInstance if no one has installed the app on this system yet
                        //This is a legacy setting for apps delivered via the Jive Apps market
                        if (isNewJiveInstance == true)
                        {

                            JiveInstance jiveInstance = new JiveInstance();
                            jiveInstance.JiveInstanceId = jiveInstanceTemp[1];
                            jiveInstance.DateCreated = DateTime.Now;
                            jiveInstance.LastUpdated = DateTime.Now;
                            jiveInstance.IsComplete = false;
                            jiveInstance.Users = new List<User>();
                            jiveInstance.IsLicensed = true;
                            jiveInstance.IsInstalledViaAddon = true;
                            db.JiveInstances.Add(jiveInstance);
                            db.SaveChanges();
                            jiveInstanceForUser = jiveInstance;

                        }



                        User user = new User();
                        user.UserId = userId;
                        user.JiveInstance = jiveInstanceForUser;
                        user.DateCreated = DateTime.Now;
                        user.LastUpdated = DateTime.Now;
                        user.HasInstalledApp = true;
                        
                        db.Users.Add(user);
                        db.SaveChanges();
                        jiveInstanceForUser.Users.Add(user);
                        db.SaveChanges();

                        ViewBag.jiveUrl = user.JiveInstance.Url;
                        ViewBag.ownerName = "Display name not set in DB";
                        ViewBag.ownerId = user.UserId;

                    }


                    //Setting some helper data into the viewbag, so we can efficiently build a page

                    //The baseUrl is the system on which our addon is hosted. We need this to set the base_href for our html pages correctly
                    string baseUrl = System.Configuration.ConfigurationManager.AppSettings["baseUrl"];
                    ViewBag.baseUrl = baseUrl;

                    //The appPath is the path of our application, e.g. https://myjiveaddon.azurewebsites.net/apps/app_path
                    //We might need this to build deep links to our application
                    string appPath = System.Configuration.ConfigurationManager.AppSettings["appPath"];
                    ViewBag.appPath = appPath;

                    //Version information for app and included resources. Due to the caching mechanisms in Jive
                    //we recommend to update this when you roll out new versions
                    string jsVersion = System.Configuration.ConfigurationManager.AppSettings["jsVersion"];
                    ViewBag.jsVersion = jsVersion;
                    string appJsVersion = System.Configuration.ConfigurationManager.AppSettings["appJsVersion"];
                    ViewBag.appJsVersion = appJsVersion;


                    ViewBag.jiveUrl = myUser.JiveInstance.Url;

                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex.Message);
                  
                }
            }
        }