public async Task <ActionResult <UploadData> > Post([FromForm] UploadDataRequest uploadDataRequest)
 {
     if (uploadDataRequest.File.Length > 0)
     {
         try
         {
             return(Ok(await _uploadFile.UploadFile(uploadDataRequest)));
         }
         catch (Exception ex)
         {
             ErrorEntity error = new ErrorEntity
             {
                 Type    = "Exception",
                 Message = ex.Message,
                 Code    = 500,
                 Name    = "Error-Utilitarios-Api"
             };
             return(BadRequest(error));
         }
     }
     else
     {
         ErrorEntity error = new ErrorEntity
         {
             Type    = "Exception",
             Message = "Error-Verificar el Archivo",
             Code    = 500,
             Name    = "Error-Verificar el Archivo"
         };
         return(BadRequest(error));
     }
 }
        public async Task <UploadData> UploadFile(UploadDataRequest uploadDataRequest)
        {
            UploadData Resp = new UploadData();

            //condicion para crear un contenedor
            uploadDataRequest.Contenedor = uploadDataRequest.Contenedor.ToLower();

            var cliente = new BlobContainerClient(connectionString, uploadDataRequest.Contenedor);

            try
            {
                await cliente.CreateIfNotExistsAsync();

                cliente.SetAccessPolicy(Azure.Storage.Blobs.Models.PublicAccessType.Blob);
                var extension     = Path.GetExtension(uploadDataRequest.File.FileName);
                var archivoNombre = $"{uploadDataRequest.NombreArchivo}{extension}";
                var blob          = cliente.GetBlobClient(archivoNombre);
                await blob.UploadAsync(uploadDataRequest.File.OpenReadStream());

                Resp.Url     = blob.Uri.ToString();
                Resp.Message = "Documento Cargado Correctamente";
                Resp.Status  = "Ok";
            }
            catch (Exception e)
            {
                Resp.Url     = string.Empty;
                Resp.Message = e.Message;
                Resp.Status  = "Error";
            }
            return(Resp);
        }
Exemple #3
0
        public void Setup()
        {
            _apiClientMock = new Mock <IApiClient>();

            _uploadRequests    = new List <UploadDataRequest>();
            _lastUploadRequest = null;
            _apiClientMock.Setup(x => x.UploadData(It.IsAny <UploadDataRequest>()))
            .Callback <UploadDataRequest>(x =>
            {
                _uploadDataCounter++;
                _lastUploadRequest = x;
                _uploadRequests.Add(x);
            }).ReturnsAsync(new UploadDataResponse());

            _realmFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            RealmiusSyncService.RealmiusDbPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + "sync");

            _syncServiceMock = CreateSyncService();
            _syncServiceMock.Setup(x => x.StartUploadTask()).Callback(
                () =>
            {
                _uploadTask = Task.Factory.StartNew(() =>
                {
                    _syncServiceMock.Object.Upload();
                });
            });
            _realmiusSyncService = _syncServiceMock.Object;
            _uploadDataCounter   = 0;
            _uploadTask          = null;
        }
Exemple #4
0
        /// <summary>
        /// Uploads data to the service.
        /// </summary>
        /// <param name="data">Data to upload.</param>
        /// <param name="sessionId">The identifier of the upload / training session.</param>
        public void UploadData(string data, Guid sessionId)
        {
            data.CheckArgumentNull("data");
            sessionId.CheckArgumentEmpty("sessionId");
            var request = new UploadDataRequest {
                Data      = data,
                SessionId = sessionId
            };

            Post(UploadDataMethodName, request, UploadDataTimeoutSec);
        }
Exemple #5
0
        public UploadDataResponse UploadData(UploadDataRequest request, string connectionId)
        {
            if (!Connections.ContainsKey(connectionId))
            {
                Logger.Info($"User with ConnectionId {connectionId} not found in the connections pool (not authorized?)");
                return(new UploadDataResponse());
            }

            var result = Processor.Upload(request, Connections[connectionId]);

            return(result);
        }
        public async Task <UploadDataResponse> UploadData(UploadDataRequest request)
        {
            var httpClient = GetHttpClient();
            var content    = new StringContent(JsonConvert.SerializeObject(request), System.Text.Encoding.UTF8, "application/json");
            var result     = await httpClient.PostAsync(UploadServerUri, content);

            if (!result.IsSuccessStatusCode)
            {
                return(new UploadDataResponse());
            }

            var resultString = await result.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <UploadDataResponse>(resultString));
        }
        public Task <UploadDataResponse> UploadData(UploadDataRequest request)
        {
            try
            {
                if (_connection?.State != ConnectionState.Connected)
                {
                    return(Task.FromResult(new UploadDataResponse()));
                }

                var task = SendAndReceive <UploadDataResponse>(MethodConstants.ServerUploadData, request);

                return(task);
            }
            catch (Exception e)
            {
                Logger.Exception(e);
                return(Task.FromResult(new UploadDataResponse()));
            }
        }
        public async Task <UploadDataResponse> UploadData(UploadDataRequest request)
        {
            try
            {
                if (_hubConnection?.State != ConnectionState.Connected)
                {
                    return(new UploadDataResponse());
                }

                var response = await _hubProxy?.Invoke <UploadDataResponse>("UploadData", request);

                return(response);
            }
            catch (Exception e)
            {
                Logger.Exception(e);
                return(new UploadDataResponse());
            }
        }
        private void SetupCorrectUploadResponse()
        {
            _apiClientMock.Setup(x => x.UploadData(It.IsAny <UploadDataRequest>()))
            .Returns((UploadDataRequest x) =>
            {
                _uploadDataCounter++;

                _lastUploadRequest = x;
                _uploadRequests.Add(x);

                Console.WriteLine("UploadData_1");
                var response = new UploadDataResponse
                {
                    Results = x.ChangeNotifications
                              .Select(z => new UploadDataResponseItem(z.PrimaryKey, z.Type))
                              .ToList(),
                };
                return(Task.FromResult(response));
            });
        }
        public void SyncEnabledAfterSomeObjectsWereInsertedInRealm_Modify()
        {
            _realmiusSyncService.Dispose();

            var obj = new DbSyncClientObject
            {
                Text = "123",
            };
            var realm = GetRealm();

            realm.Write(() =>
            {
                realm.Add(obj);
            });

            var syncServiceMock = CreateSyncService();
            var syncService     = syncServiceMock.Object;

            var realm2 = GetRealm();
            var obj2   = realm2.Find <DbSyncClientObject>(obj.Id);

            _lastUploadRequest = null;

            realm2.Write(() =>
            {
                obj2.Text = "456";
                realm2.Add(obj2, true);
            });

            syncService.Realm.Refresh();
            syncService.Realmius.Refresh();
            syncServiceMock.Verify(x => x.ObjectChanged(It.Is <IRealmCollection <RealmObject> >(z => z != null), It.Is <ChangeSet>(z => z != null), It.IsAny <Exception>()), Times.Once);
            _uploadTask.Wait();
            Wait(() => _lastUploadRequest != null);

            _apiClientMock.Verify(z => z.UploadData(It.IsAny <UploadDataRequest>()), Times.Once);
            string.Join(", ", _lastUploadRequest.ChangeNotifications.Select(x => x.SerializedObject))
            .Should()
            .MatchEquivalentOf("{\r\n  \"Id\": \"" + obj.Id + "\",\r\n  \"Text\": \"456\",\r\n  \"Tags\": null,\r\n  \"MobilePrimaryKey\": \"" + obj.Id + "\"\r\n}");
        }
        public void AddObject_Succeeded_Update_UploadDataIsCalled()
        {
            var realm = GetRealm();

            var obj = new DbSyncClientObject
            {
                Text = "444",
            };

            SetupCorrectUploadResponse();

            realm.Write(() =>
            {
                realm.Add(obj);
            });
            _realmiusSyncService.Realm.Refresh();
            _realmiusSyncService.Realmius.Refresh();

            _uploadTask.Wait();

            _uploadTask.Wait();
            _uploadTask        = null;
            _lastUploadRequest = null;
            Console.WriteLine("Before update");
            realm.Write(() =>
            {
                obj.Text = "555";
            });
            _realmiusSyncService.Realm.Refresh();
            _realmiusSyncService.Realmius.Refresh();

            Wait(() => _lastUploadRequest != null);

            _lastUploadRequest.Should().NotBeNull("UploadData should be called");
            string.Join(", ", _lastUploadRequest.ChangeNotifications)
            .Should().MatchEquivalentOf($"Type: DbSyncClientObject, PrimaryKey: {obj.Id}, SerializedObject: {{ \"Text\": \"555\"}}");
            _apiClientMock.Verify(x => x.UploadData(It.IsAny <UploadDataRequest>()), Times.AtLeast(2));
        }
        public void Setup()
        {
            _apiClientMock = new Mock <IApiClient>();

            _uploadRequests    = new List <UploadDataRequest>();
            _lastUploadRequest = null;
            _apiClientMock.Setup(x => x.UploadData(It.IsAny <UploadDataRequest>()))
            .Callback <UploadDataRequest>(x =>
            {
                _uploadDataCounter++;
                _lastUploadRequest = x;
                _uploadRequests.Add(x);
            }).ReturnsAsync(new UploadDataResponse());
            _apiClientMock.SetupGet(x => x.IsConnected).Returns(true);
            _realmFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            RealmiusSyncService.RealmiusDbPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + "sync");

            _syncServiceMock = CreateSyncService();

            _realmiusSyncService = _syncServiceMock.Object;
            _uploadDataCounter   = 0;
            _uploadTask          = null;
            RealmiusSyncService.DelayWhenUploadRequestFailed = 10;
        }
        public virtual async Task Upload()
        {
            //Logger.Log.Debug($"Attempt to Upload");
            if (_uploadInProgress || _disposed)
            {
                return;
            }
            if (!_apiClient.IsConnected)
            {
                return;
            }

            if (!InTests)
            {
                lock (_uploadLock)
                {
                    if (_uploadInProgress)
                    {
                        return;
                    }
                    _uploadInProgress = true;
                }
            }
            var uploadSucceeded = false;

            Dictionary <string, List <string> > changesIds;
            var changes = new UploadDataRequest();

            try
            {
                using (var realmius = CreateRealmius())
                {
                    realmius.Refresh();
                    var objects         = GetObjectsToUpload(realmius);
                    var objectsToUpload = objects.GroupBy(
                        x => new
                    {
                        x.Type,
                        x.PrimaryKey
                    }).ToDictionary(x => x.Key);

                    changesIds =
                        objectsToUpload.ToDictionary(
                            x => GetSyncStatusKey(x.Key.Type, x.Key.PrimaryKey),
                            x => x.Value.Select(z => z.Id).ToList());
                    if (objectsToUpload.Count == 0)
                    {
                        return;
                    }

                    UIUploadInProgress = true;

                    foreach (var uploadRequestItemRealm in objectsToUpload.Values)
                    {
                        //remove upload items that should not be synced anymore
                        if (!_typesToSync.ContainsKey(uploadRequestItemRealm.Key.Type))
                        {
                            realmius.Write(
                                () =>
                            {
                                foreach (var requestItemRealm in uploadRequestItemRealm)
                                {
                                    realmius.Remove(requestItemRealm);
                                }
                            });
                            continue;
                        }
                        var serializedObject   = MergeJsonStrings(uploadRequestItemRealm.Select(x => x.SerializedObject).ToList());
                        var changeNotification = new UploadRequestItem()
                        {
                            SerializedObject = serializedObject,
                            PrimaryKey       = uploadRequestItemRealm.Key.PrimaryKey,
                            Type             = uploadRequestItemRealm.Key.Type,
                            IsDeleted        = uploadRequestItemRealm.Any(x => x.IsDeleted),
                        };
                        changes.ChangeNotifications.Add(changeNotification);
                        Logger.Debug($"Up: {changeNotification.Type}.{changeNotification.PrimaryKey}: {changeNotification.SerializedObject}");
                    }
                }
                try
                {
                    var result = await _apiClient.UploadData(changes);

                    //Logger.Log.Debug($"Upload finished " + JsonConvert.SerializeObject(result));
                    using (var realmius = CreateRealmius())
                    {
                        realmius.Refresh();
                        var notSynced = changes.ChangeNotifications
                                        .Select(x => new { x.Type, x.PrimaryKey })
                                        .Except(result.Results.Where(x => x.IsSuccess)
                                                .Select(x => new { x.Type, PrimaryKey = x.MobilePrimaryKey }))
                                        .ToList();
                        if (notSynced.Count > 0)
                        {
                            var notSyncedObjects = notSynced.Select(x => $"{x.Type}: {x.PrimaryKey}");
                            Logger.Info($"Some objects were not accepted by the server: {string.Join("; ", notSyncedObjects)}");
                        }
                        using (var realm = _realmFactoryMethod())
                        {
                            foreach (var realmiusObject in result.Results)
                            {
                                if (realmiusObject.IsSuccess)
                                {
                                    var syncStateObject = FindSyncStatus(
                                        realmius,
                                        realmiusObject.Type,
                                        realmiusObject.MobilePrimaryKey);

                                    realmius.Write(
                                        () =>
                                    {
                                        try
                                        {
                                            foreach (var key in changesIds[GetSyncStatusKey(realmiusObject.Type, realmiusObject.MobilePrimaryKey)])
                                            {
                                                try
                                                {
                                                    var uploadRequestItemRealm = realmius.Find <UploadRequestItemRealm>(key);
                                                    Logger.Debug(
                                                        $"Removed UploadRequest {uploadRequestItemRealm?.Id} for {realmiusObject.Type}:{realmiusObject.MobilePrimaryKey}");

                                                    if (uploadRequestItemRealm != null)
                                                    {
                                                        realmius.Remove(uploadRequestItemRealm);
                                                    }
                                                }
                                                catch (Exception e)
                                                {
                                                    //System.Console.WriteLine(e);
                                                    throw;
                                                }
                                            }

                                            syncStateObject.SetSyncState(SyncState.Synced);
                                        }
                                        catch (Exception e)
                                        {
                                            //System.Console.WriteLine(e);
                                            throw;
                                        }
                                    });

                                    if (_typesToSync[realmiusObject.Type].ImplementsSyncState)
                                    {
                                        var obj =
                                            (IRealmiusObjectWithSyncStatusClient)
                                            realm.Find(realmiusObject.Type, realmiusObject.MobilePrimaryKey);

                                        realm.Write(
                                            () =>
                                        {
                                            obj.SyncStatus = (int)SyncState.Synced;
                                        });
                                    }
                                }
                                else
                                {
                                    realmius.Write(
                                        () =>
                                    {
                                        foreach (var key in changesIds[GetSyncStatusKey(realmiusObject.Type, realmiusObject.MobilePrimaryKey)])
                                        {
                                            var uploadRequestItemRealm =
                                                realmius.Find <UploadRequestItemRealm>(key);

                                            uploadRequestItemRealm.UploadAttempts++;
                                            if (uploadRequestItemRealm.UploadAttempts > 30)
                                            {
                                                Logger.Debug($"UploadRequest {realmiusObject.Type}.{realmiusObject.MobilePrimaryKey}, failed for attempts {uploadRequestItemRealm.UploadAttempts}, removing");

                                                realmius.Remove(uploadRequestItemRealm);
                                            }
                                            else
                                            {
                                                if (uploadRequestItemRealm.UploadAttempts >= 3)
                                                {
                                                    uploadRequestItemRealm.NextUploadAttemptDate = DateTimeOffset.Now.AddSeconds(10 * uploadRequestItemRealm.UploadAttempts);
                                                }

                                                Logger.Debug($"Delaying UploadRequest {realmiusObject.Type}.{realmiusObject.MobilePrimaryKey}, attempt {uploadRequestItemRealm.UploadAttempts}, scheduled for {uploadRequestItemRealm.NextUploadAttemptDate}");
                                            }
                                        }
                                    });
                                }
                            }
                        }
                    }
                    uploadSucceeded = result.Results.Any();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine($"{ex}");
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"{ex}");
            }
            finally
            {
                _uploadInProgress = false;
            }
#pragma warning disable 4014
            Task.Factory.StartNew(async() =>
#pragma warning restore 4014
            {
                try
                {
                    if (!InTests)
                    {
                        if (!uploadSucceeded)
                        {
                            await Task.Delay(DelayWhenUploadRequestFailed);
                        }
                        //ToDo: delays might be increased in case of consequent errors

                        Logger.Debug($"Upload requeued");
                        await Upload();
                    }
                }
                catch (Exception e)
                {
                    Logger.Exception(e, $"Error in Upload");
                }
            });
        }