private void EnsureDataChunksCacheLoaded(string userId)
        {
            if (_dataChunksCache.ContainsKey(userId) && _dataChunksCache[userId] != null)
            {
                return;
            }

            EnsureChunksDirectoryExists(userId);

            List <LocalDataChunkInfo> result = new List <LocalDataChunkInfo>();

            var info      = new DirectoryInfo(GetChunksDirectory(userId));
            var filesInfo = info.GetFiles();

            foreach (var file in filesInfo)
            {
                var requestId   = file.Name;
                var json        = File.ReadAllText(file.FullName);
                var baseRequest = RData.LitJson.JsonMapper.ToObject <JsonRpc.JsonRpcBaseRequest>(json);

                var chunkInfo = new LocalDataChunkInfo()
                {
                    requestCreatedAt = baseRequest.CreatedAt, requestId = requestId, requestJson = json
                };
                result.Add(chunkInfo);
            }

            _dataChunksCache[userId] = result
                                       .OrderBy(chunkInfo => chunkInfo.requestCreatedAt)                        // Order by creation time
                                       .ToDictionary(chunkInfo => chunkInfo.requestId, chunkInfo => chunkInfo); // Convert into the dictionary
        }
        public void SaveDataChunk(string userId, BulkRequest dataChunk)
        {
            // First, load the cache
            EnsureDataChunksCacheLoaded(userId);

            // Save on the disk
            EnsureChunksDirectoryExists(userId);
            var json = RData.LitJson.JsonMapper.ToJson(dataChunk);
            var path = GetChunkFilePath(userId, dataChunk);

            File.WriteAllText(path, json);

            // Save into the cache
            var chunkInfo = new LocalDataChunkInfo()
            {
                requestCreatedAt = dataChunk.CreatedAt, requestId = dataChunk.Id, requestJson = json
            };

            _dataChunksCache[userId].Add(dataChunk.Id, chunkInfo);
        }