Example #1
0
        public void TestDefaultQuery()
        {
            var query       = new ApprenticeshipSearchQuery();
            var queryString = _sut.GetQueryString(query);

            queryString.Should().Be("?PageNumber=1&PageSize=25");
        }
Example #2
0
		public async Task<IResponseResult<IPaginationCollection<T>>> GetAsync(
			TokenBase token, 
			int? skip = null, 
			int? limit = null, 
			bool? withCount = null, 
			string orderBy = null, 
			SortDirection? sortDirection = null,
			string searchKeyword = null)
		{
			if (string.IsNullOrEmpty(searchKeyword) || string.IsNullOrEmpty(searchKeyword.Trim()))
			{
				return await this.ExecuteRequestAsync<PaginationCollection<T>>(
					HttpMethod.Get, 
					$"{this.BaseUrl}/memberships/{this.MembershipId}/{this.Slug}", 
					QueryStringHelper.GetQueryString(skip, limit, withCount, orderBy, sortDirection), 
					HeaderCollection.Add("Authorization", token.ToString()));
			}
			else
			{
				return await this.ExecuteRequestAsync<PaginationCollection<T>>(
					HttpMethod.Get, 
					$"{this.BaseUrl}/memberships/{this.MembershipId}/{this.Slug}/search", 
					QueryStringHelper.GetQueryString(skip, limit, withCount, orderBy, sortDirection).Add("keyword", searchKeyword), 
					HeaderCollection.Add("Authorization", token.ToString()));
			}
		}
        private void BrowserNavigating(object sender, NavigatingEventArgs e)
        {
            //QQ 空间授权成功后直接返回token,不需要用code换取token
            if (currentType == SocialType.QZone && e.Uri.AbsoluteUri.Contains("access_token"))
            {
                //http://qzs.qq.com/open/mobile/login/proxy.html?&t=1363316329#&openid=&appid=100394029&access_token=D1600ED336D42D024DFB5A0618A56B8C&key=270e66a425575f5130efe0d416252469&serial=&token_key=&browser=0&browser_error=0&status_os=&sdkv=&status_machine=
                AccessToken token = new AccessToken();
                token.Token  = QueryStringHelper.GetQueryString(e.Uri, "access_token");
                token.OpenId = QueryStringHelper.GetQueryString(e.Uri, "openid");
                action(token);
                return;
            }

            if (!e.Uri.AbsoluteUri.Contains("code=") && !e.Uri.AbsoluteUri.Contains("code ="))
            {
                return;
            }
            var    arguments = e.Uri.AbsoluteUri.Split('?');
            string code      = arguments[1];

            if (currentType == SocialType.Tencent)
            {
                var sp = arguments[1].Split('&');
                code = sp[0];

                //open id
                client.Tag = sp[1].Split('=')[1];
            }

            SocialKit.GetToken(currentType, client, code, (p) =>
            {
                action(p);
            });
        }
Example #4
0
        static async Task CallLogin(HttpClient client, JsonResponseConvert jsonResponseConvert)
        {
            string queryLoginServlet = "http://membersim.bseindia.com/stocks/LoginServlet?USBackOfficeId=&USLOGINID=SER_CT2-T9072&USPassword=ser.123456&USTransactionPassword=&version=1.3044&SecuritiesMaxSequenceId=1&NSEContractsMaxSequenceId=82&NcdexContractsMaxSequenceId=60&MCXContractsMaxSequenceId=139&BSEContractsMaxSequenceId=1&BSECurrencyContractsMaxSequenceId=1&NSECurrencyContractsMaxSequenceId=2125&enable2FA=Y&VenderCode=8_SER&SessionKey=&Thick Client=Y";
            string query1            = QueryStringHelper.GetQueryString(new LoginServletModel());

            Console.Write(query1);
            Console.WriteLine();
            Console.WriteLine();
            var construct = ConstructorHelper.GetConstructorData(new LoginServletModel());

            Console.Write(construct);
            //  query1 = "http://membersim.bseindia.com/stocks/LoginServlet?" + query1;
            bool equal = query1.Equals(queryLoginServlet);
            //CheckIdentity(queryLoginServlet, query1);
            var len   = query1.Length;
            var other = query1.Substring(66);

            /* string loginServletResponse = await CallApi(client, queryLoginServlet);
             * LoginServletResponse deserializedLoginServletResponse = (LoginServletResponse)jsonResponseConvert.Deserialize(typeof(LoginServletResponse), loginServletResponse);
             *
             * string queryAuthenticationMode = "http://membersim.bseindia.com/stocks/AuthenticationMode?verificationMode=1&USLOGINID=SER_CT2-T9072&SessionKey=&Thick Client=Y";
             * string authenticationModeResponse = await CallApi(client, queryAuthenticationMode);
             * AuthenticationModeResponse deserializedAuthenticationModeResponse = (AuthenticationModeResponse)jsonResponseConvert.Deserialize(typeof(AuthenticationModeResponse), authenticationModeResponse, '|');
             */
        }
Example #5
0
        public async Task <IActionResult> GetContentInfo(int desaId, string contentType, string contentSubtype = null)
        {
            var auth = GetAuth(desaId);

            if (auth == null)
            {
                return(StatusCode((int)HttpStatusCode.Forbidden, new Dictionary <string, string>()
                {
                    { "message", "Invalid or no token" }
                }));
            }

            var changeId       = QueryStringHelper.GetQueryString <int>(Request.Query, "changeId", 0);
            var clientChangeId = 0;

            if (changeId > 0)
            {
                clientChangeId = changeId;
            }

            var contentQuery = dbContext.SidekaContent
                               .Where(sc => sc.DesaId == desaId)
                               .Where(sc => sc.Type == contentType)
                               .Where(sc => sc.ChangeId == clientChangeId);

            if (!string.IsNullOrWhiteSpace(contentSubtype))
            {
                contentQuery = contentQuery.Where(sc => sc.Subtype == contentSubtype);
            }

            var content = await contentQuery.Select(c => new
            {
                OpendataPushError  = c.OpendataPushError,
                OpendataDatePushed = c.OpendataDatePushed
            }).FirstOrDefaultAsync();

            if (content == null)
            {
                return(StatusCode((int)HttpStatusCode.NotFound, new Dictionary <string, string>()));
            }

            var result = new Dictionary <string, object>()
            {
            };

            result["opendata_date_pushed"] = content.OpendataDatePushed;
            result["opendata_push_error"]  = content.OpendataPushError;

            return(Ok(result));
        }
Example #6
0
		public async Task<IResponseResult<IPaginationCollection<T>>> QueryAsync(
			TokenBase token,
			string query,
			int? skip = null,
			int? limit = null,
			bool? withCount = null,
			string orderBy = null,
			SortDirection? sortDirection = null)
		{
			return await this.ExecuteRequestAsync<PaginationCollection<T>>(
				HttpMethod.Post, 
				$"{this.BaseUrl}/memberships/{this.MembershipId}/{this.Slug}/_query", 
				QueryStringHelper.GetQueryString(skip, limit, withCount, orderBy, sortDirection), 
				HeaderCollection.Add("Authorization", token.ToString()),
				new JsonRequestBody(Newtonsoft.Json.JsonConvert.DeserializeObject(query)));
		}
Example #7
0
        public async Task <IResponseResult <IPaginationCollection <RevokedToken> > > GetRevokedTokensAsync(
            string userId,
            TokenBase token,
            int?skip       = null,
            int?limit      = null,
            bool?withCount = null,
            string orderBy = null,
            SortDirection?sortDirection = null)
        {
            var query = "{ 'where': { 'user_id': '" + userId + "', 'membership_id': '" + this.MembershipId + "', 'token_type': 'bearer_token' } }";

            return(await this.ExecuteRequestAsync <PaginationCollection <RevokedToken> >(
                       HttpMethod.Post,
                       $"{this.BaseUrl}/memberships/{this.MembershipId}/revoked-tokens/_query",
                       QueryStringHelper.GetQueryString(skip, limit, withCount, orderBy, sortDirection),
                       HeaderCollection.Add("Authorization", token.ToString()),
                       new JsonRequestBody(Newtonsoft.Json.JsonConvert.DeserializeObject(query))));
        }
		/// <summary>
		/// Removes a parameter from the specified URL.
		/// </summary>
		/// <param name="request">The request containing the URL to manage.</param>
		/// <param name="parameterName">Parameter to be removed.</param>
		/// <returns>The updated URL.</returns>
		public static string RemoveParameterFromUrl(HttpRequest request, string parameterName)
		{
			try
			{
				var qsh = new QueryStringHelper(request.Url.Query);
				qsh.RemoveByName(parameterName);

				var returnUri = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port)
					{
						Path = request.Url.AbsolutePath,
						Query = qsh.GetQueryString()
					};

				return returnUri.ToString();
			}
			catch
			{
				return string.Empty;
			}
		}
		/// <summary>
		/// Adds a Querystring parameter to the current Request's URL.
		/// </summary>
		/// <param name="request">The request containing the URL to manage.</param>
		/// <param name="parameterName">The key for the Querystring entry.</param>
		/// <param name="parameterValue">The value for the Querystring entry.</param>
		/// <returns>A URL concatenated with the new querystring parameter.</returns>
		public static string AddParameterToUrl(HttpRequest request, string parameterName, string parameterValue)
		{
			try
			{
				var qsh = new QueryStringHelper(request.Url.Query);
				qsh.AddOrReplace(parameterName, parameterValue);

				var returnUri = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port)
				{
					Path = request.Url.AbsolutePath,
					Query = qsh.GetQueryString()
				};

				return returnUri.ToString();
			}
			catch
			{
				return string.Empty;
			}
		}
Example #10
0
        public async Task <IActionResult> GetContent(int desaId, string contentType, string contentSubtype = null)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            var auth = GetAuth(desaId);

            if (auth == null)
            {
                return(StatusCode((int)HttpStatusCode.Forbidden, new Dictionary <string, string>()));
            }

            var timestamp = QueryStringHelper.GetQueryString <int>(Request.Query, "timestamp", 0);

            var contentQuery = dbContext.SidekaContent
                               .Where(sc => sc.DesaId == desaId)
                               .Where(sc => sc.Timestamp > timestamp)
                               .Where(sc => sc.Type == contentType)
                               .Where(sc => sc.ApiVersion == "1.0");

            if (!string.IsNullOrWhiteSpace(contentSubtype))
            {
                contentQuery = contentQuery.Where(sc => sc.Subtype == contentSubtype);
            }

            var content = await contentQuery
                          .OrderByDescending(sc => sc.Timestamp)
                          .Select(sc => sc.Content)
                          .FirstOrDefaultAsync();

            if (string.IsNullOrWhiteSpace(content))
            {
                return(StatusCode((int)HttpStatusCode.NotFound, new Dictionary <string, string>()));
            }

            sw.Stop();
            await Logs((int)auth["user_id"], desaId, "", "get_content", contentType, contentSubtype, sw.Elapsed.Milliseconds);

            return(Ok(content));
        }
		/// <summary>
		/// Creates a fully formatted url for use with building page links.
		/// </summary>
		/// <param name="page">The page number.</param>
		/// <returns>The fully formatted url.</returns>
		private string CreateUrl(int page)
		{
			var request = HttpContext.Current.Request;

			var helper = new QueryStringHelper(request.Url.Query);
			helper.AddOrReplace("page", page.ToString(CultureInfo.InvariantCulture));

			var returnUri = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port)
			{
				Path = request.Url.AbsolutePath,
				Query = helper.GetQueryString()
			};

			return returnUri.ToString();
		}
Example #12
0
        public async Task <IActionResult> PostContentV2([FromBody] JObject contentJObject, int desaId, string contentType, string contentSubtype = null)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            string lockName  = desaId + "_" + contentType + "_" + contentSubtype;
            object writeLock = writeLocks.GetOrAdd(lockName, new object());

            lock (writeLock){
                var auth = GetAuth(desaId);
                if (auth == null)
                {
                    return(StatusCode((int)HttpStatusCode.Forbidden, new Dictionary <string, string>()
                    {
                        { "message", "Invalid or no token" }
                    }));
                }

                var permission = contentType;
                if (new string[] { "perencanaan", "penganggaran", "spp", "penerimaan" }.Contains(contentType))
                {
                    permission = "keuangan";
                }
                var roles = (List <string>)auth["roles"];
                if (!roles.Contains("administrator") && !roles.Contains(permission))
                {
                    return(StatusCode((int)HttpStatusCode.Forbidden, new Dictionary <string, string>()
                    {
                        { "message", "Your account doesn't have the permission" }
                    }));
                }

                var content = new SidekaContentViewModel(contentJObject);

                // Validate
                foreach (var column in content.Columns)
                {
                    if (content.Diffs != null && content.Diffs.ContainsKey(column.Key))
                    {
                        var index = 0;
                        foreach (var diff in content.Diffs[column.Key])
                        {
                            var location = string.Format("Diff {0} ({1}) tab {2}", index, "added", column.Key);
                            var invalid  = Validate(column.Value, diff.Added, location);
                            if (invalid != null)
                            {
                                return(invalid);
                            }

                            location = string.Format("Diff {0} ({1}) tab {2}", index, "modified", column.Key);
                            invalid  = Validate(column.Value, diff.Modified, location);
                            if (invalid != null)
                            {
                                return(invalid);
                            }

                            location = string.Format("Diff {0} ({1}) tab {2}", index, "deleted", column.Key);
                            invalid  = Validate(column.Value, diff.Deleted, location, false);
                            if (invalid != null)
                            {
                                return(invalid);
                            }
                        }
                    }

                    if (content.Data != null && content.Data.ContainsKey(column.Key))
                    {
                        var location = string.Format("Data tab {0}", column.Key);
                        var invalid  = Validate(column.Value, content.Data[column.Key], location);
                        if (invalid != null)
                        {
                            return(invalid);
                        }
                    }
                }

                var clientChangeId = 0;
                var changeId       = QueryStringHelper.GetQueryString <int>(Request.Query, "changeId", 0);
                if (changeId > 0)
                {
                    clientChangeId = changeId;
                }

                // Find max change id
                var maxChangeIdQuery = dbContext.SidekaContent
                                       .Where(sc => sc.DesaId == desaId)
                                       .Where(sc => sc.Type == contentType);

                if (!string.IsNullOrWhiteSpace(contentSubtype))
                {
                    maxChangeIdQuery = maxChangeIdQuery.Where(sc => sc.Subtype == contentSubtype);
                }

                var maxChangeId = maxChangeIdQuery.Select(sc => sc.ChangeId).DefaultIfEmpty(0).Max();

                // TODO: This is risky!! Consider changing change_id column to serial or autoincrement
                var newContent = new SidekaContentViewModel();

                // Initialize new content to be saved
                foreach (var column in content.Columns)
                {
                    newContent.Data[column.Key]    = new List <object>().ToArray();
                    newContent.Columns[column.Key] = column.Value;
                    if (content.Diffs != null && content.Diffs.ContainsKey(column.Key))
                    {
                        newContent.Diffs[column.Key] = content.Diffs[column.Key];
                    }
                    else
                    {
                        newContent.Diffs[column.Key] = new List <SidekaDiff>().ToArray();
                    }
                }

                var latestContentQuery = dbContext.SidekaContent
                                         .Where(sc => sc.DesaId == desaId)
                                         .Where(sc => sc.Type == contentType);

                if (!string.IsNullOrWhiteSpace(contentSubtype))
                {
                    latestContentQuery = latestContentQuery.Where(sc => sc.Subtype == contentSubtype);
                }

                var latestContentString = latestContentQuery
                                          .OrderByDescending(sc => sc.ChangeId)
                                          .Select(sc => sc.Content)
                                          .FirstOrDefault();

                JObject latestContentJObject = null;
                if (string.IsNullOrWhiteSpace(latestContentString))
                {
                    latestContentJObject = new JObject
                    {
                        { "data", new JObject() },
                        { "columns", contentJObject["columns"] }
                    };
                }
                else
                {
                    latestContentJObject = JsonConvert.DeserializeObject <JObject>(latestContentString);
                }

                var diffs = GetDiffsNewerThanClient(desaId, contentType, contentSubtype, clientChangeId, (JObject)contentJObject["columns"]);

                if (latestContentJObject["data"] is JArray && contentType == "penduduk")
                {
                    newContent.Data["penduduk"] = MergeDiffs(newContent.Columns["penduduk"], newContent.Diffs["penduduk"], new List <object>().ToArray());
                }
                else
                {
                    var latestContent = new SidekaContentViewModel(latestContentJObject);
                    foreach (var column in content.Columns)
                    {
                        // Initialize so the latest content have the same tab with the posted content
                        if (!latestContent.Columns.ContainsKey(column.Key))
                        {
                            latestContent.Columns[column.Key] = column.Value;
                        }
                        if (!latestContent.Data.ContainsKey(column.Key))
                        {
                            latestContent.Data[column.Key] = new List <object>().ToArray();
                        }

                        if (content.Data != null && content.Data[column.Key] != null &&
                            new string[] { "perencanaan", "penganggaran", "penerimaan", "spp" }.Contains(contentType))
                        {
                            var invalid = ValidateDuplicatesData(column.Key, column.Value, content.Data[column.Key]);
                            if (invalid != null)
                            {
                                return(invalid);
                            }

                            // Special case for client who posted data instead of diffs
                            newContent.Data[column.Key] = content.Data[column.Key];

                            // Add new diffs to show that the content is rewritten
                            var sidekaDiff = new SidekaDiff
                            {
                                Added     = new List <object>().ToArray(),
                                Modified  = new List <object>().ToArray(),
                                Deleted   = new List <object>().ToArray(),
                                Total     = 0,
                                Rewritten = true
                            };

                            newContent.Diffs[column.Key].Append(sidekaDiff);
                        }
                        else if (newContent.Diffs[column.Key].Length > 0)
                        {
                            // There's diffs in the posted content for this tab, apply them to latest data
                            var latestColumns         = latestContent.Columns[column.Key];
                            var transformedLatestData = TransformData(
                                latestContentJObject["columns"][column.Key],
                                contentJObject["columns"][column.Key],
                                latestContent.Data[column.Key]);

                            var invalid = ValidateDuplicatesDiffs(column.Key, column.Value, content.Diffs[column.Key], transformedLatestData);
                            if (invalid != null)
                            {
                                return(invalid);
                            }

                            var mergedData = MergeDiffs(column.Value, content.Diffs[column.Key], transformedLatestData);
                            newContent.Data[column.Key]    = mergedData;
                            newContent.Columns[column.Key] = column.Value;
                        }
                        else
                        {
                            // There's no diffs in the posted content for this tab, use the old data
                            newContent.Data[column.Key] = latestContent.Data[column.Key];
                        }
                    }
                }

                var contentSize = ASCIIEncoding.Unicode.GetByteCount(JsonConvert.SerializeObject(newContent.Data));
                var diffSize    = ASCIIEncoding.Unicode.GetByteCount(JsonConvert.SerializeObject(newContent.Diffs));

                int newChangeId = GetNextChangeId(desaId, contentType, contentSubtype);

                var sidekaContent = new SidekaContent
                {
                    DesaId      = desaId,
                    Type        = contentType,
                    Subtype     = contentSubtype,
                    Content     = JsonConvert.SerializeObject(newContent),
                    DateCreated = DateTime.Now,
                    CreatedBy   = (int)auth["user_id"],
                    ChangeId    = newChangeId,
                    ApiVersion  = configuration.GetValue <string>("ApiVersion"),
                    ContentSize = contentSize,
                    DiffSize    = diffSize
                };

                dbContext.Add(sidekaContent);
                dbContext.SaveChanges();

                var result = new Dictionary <string, object>()
                {
                    { "success", true },
                    { "changeId", newChangeId },
                    { "change_id", newChangeId },
                    { "diffs", diffs },
                    { "columns", content.Columns },
                };

                sw.Stop();
                Logs((int)auth["user_id"], desaId, "", "save_content", contentType, contentSubtype, sw.Elapsed.Milliseconds);

                return(Ok(result));
            }
        }
Example #13
0
        public async Task <IActionResult> UpdateSizes(int desaId, string contentType, string contentSubtype = null)
        {
            var clientChangeId = 0;
            var changeId       = QueryStringHelper.GetQueryString <int>(Request.Query, "changeId", 0);

            if (changeId > 0)
            {
                clientChangeId = changeId;
            }

            var contentQuery = dbContext.SidekaContent
                               .Where(sc => sc.DesaId == desaId)
                               .Where(sc => sc.Type == contentType)
                               .Where(sc => sc.Subtype == contentSubtype)
                               .Where(sc => sc.ChangeId >= clientChangeId);

            var sidekaContents = await contentQuery.OrderByDescending(sc => sc.ChangeId).ToListAsync();

            var sizes  = new List <Dictionary <string, int> >();
            var result = new Dictionary <string, object>()
            {
                { "success", true },
                { "content", sizes }
            };

            foreach (var sidekaContent in sidekaContents)
            {
                var sidekaContentJObject = JsonConvert.DeserializeObject <JObject>(sidekaContent.Content);
                var sizeItem             = new Dictionary <string, int>();

                try
                {
                    var content     = new SidekaContentViewModel(sidekaContentJObject);
                    var contentSize = ASCIIEncoding.Unicode.GetByteCount(JsonConvert.SerializeObject(content.Data));
                    var diffSize    = ASCIIEncoding.Unicode.GetByteCount(JsonConvert.SerializeObject(content.Diffs));

                    sizeItem.Add("contentSize", contentSize);

                    if (content.Diffs == null)
                    {
                        sizeItem.Add("diffSize", 0);
                    }
                    else
                    {
                        sizeItem.Add("diffSize", diffSize);
                    }

                    sidekaContent.ContentSize = contentSize;
                    sidekaContent.DiffSize    = diffSize;

                    dbContext.Update(sidekaContent);
                    await dbContext.SaveChangesAsync();

                    sizes.Add(sizeItem);
                }

                catch (Exception ex) { }
            }

            return(Ok(result));
        }
Example #14
0
        public async Task <IActionResult> GetContentV2(int desaId, string contentType, string contentSubtype = null)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();

            var auth = GetAuth(desaId);

            if (auth == null)
            {
                return(StatusCode((int)HttpStatusCode.Forbidden, new Dictionary <string, string>()
                {
                    { "message", "Invalid or no token" }
                }));
            }

            var clientChangeId = 0;

            var changeId = QueryStringHelper.GetQueryString <int>(Request.Query, "changeId", 0);

            if (changeId > 0)
            {
                clientChangeId = changeId;
            }

            var sizeComparison = await GetSizeComparison(desaId, contentType, contentSubtype, clientChangeId);

            Log.Information("After comparing sizes {0}", sw.Elapsed);

            var contentQuery = dbContext.SidekaContent
                               .Where(sc => sc.DesaId == desaId)
                               .Where(sc => sc.Type == contentType)
                               .Where(sc => sc.ChangeId >= clientChangeId);

            if (!string.IsNullOrWhiteSpace(contentSubtype))
            {
                contentQuery = contentQuery.Where(sc => sc.Subtype == contentSubtype);
            }

            var contentId = await contentQuery.OrderByDescending(sc => sc.ChangeId).Select(sc => sc.Id).FirstOrDefaultAsync();

            if (contentId == 0)
            {
                return(StatusCode((int)HttpStatusCode.NotFound, new Dictionary <string, string>()));
            }

            var sidekaContent = await dbContext.SidekaContent.FindAsync(contentId);

            Log.Information("After querying sd contents {0}", sw.Elapsed);

            dynamic content = JsonConvert.DeserializeObject <JObject>(sidekaContent.Content);

            Log.Information("After deserialized {0}", sw.Elapsed);

            if (sidekaContent.ApiVersion == "1.0")
            {
                content["columns"] = JArray.FromObject(new string[] { "nik", "nama_penduduk", "tempat_lahir", "tanggal_lahir", "jenis_kelamin", "pendidikan", "agama", "status_kawin", "pekerjaan", "pekerjaan_ped", "kewarganegaraan", "kompetensi", "no_telepon", "email", "no_kitas", "no_paspor", "golongan_darah", "status_penduduk", "status_tinggal", "kontrasepsi", "difabilitas", "no_kk", "nama_ayah", "nama_ibu", "hubungan_keluarga", "nama_dusun", "rw", "rt", "alamat_jalan" });
            }

            var returnData = new Dictionary <string, object>()
            {
                { "success", true },
                { "changeId", sidekaContent.ChangeId },
                { "apiVersion", sidekaContent.ApiVersion },
                { "columns", content["columns"] },
                // TODO: remove this later
                { "change_id", sidekaContent.ChangeId },
            };

            Dictionary <string, object> diffs = null;

            if (sidekaContent.ChangeId == clientChangeId)
            {
                returnData.Add("diffs", new List <object>());
            }
            else if (clientChangeId == 0 || sizeComparison["contentSize"] < sizeComparison["diffSize"])
            {
                returnData.Add("data", content["data"]);
            }
            else
            {
                diffs = GetDiffsNewerThanClient(desaId, contentType, contentSubtype,
                                                clientChangeId, (JObject)content["columns"]);
                Log.Information("After get diff {0}", sw.Elapsed);
                returnData.Add("diffs", diffs);
            }

            Log.Information("After preparing return data {0}", sw.Elapsed);

            sw.Stop();
            await Logs((int)auth["user_id"], desaId, "", "get_content", contentType, contentSubtype, sw.Elapsed.Milliseconds);

            Log.Information("After inserting logs {0}", sw.Elapsed);
            return(Ok(returnData));
        }