public static async Task <SignUpAccountResponse> SignUpAccountAsync(SignUpAccountRequest model) { int IterationsToRetry = 5; int TimeToSleepForRetry = 3000; SignUpAccountResponse result = new SignUpAccountResponse(); if (Helpers.ConnectivyHelper.CheckConnectivity() != Enums.ConnectivtyResultEnum.HasConnectivity) { result.Status = Enums.ResponseStatus.CommunicationError; result.Message = "El dispositivo no pudo comunicarse con el servidor, comprueba que tengas conexión a internet"; return(result); } model.token = GetToken(); for (int i = 0; i <= IterationsToRetry; i++) { try { using (var client = new HttpClient()) { var service = $"{Settings.FunctionURL}/api/SignUpAccount/"; byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model)); using (var content = new ByteArrayContent(byteData)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var httpResponse = await client.PostAsync(service, content); result = JsonConvert.DeserializeObject <SignUpAccountResponse>(await httpResponse.Content.ReadAsStringAsync()); if (httpResponse.StatusCode == HttpStatusCode.OK) { result.Status = Enums.ResponseStatus.Ok; } else { result.Status = Enums.ResponseStatus.Error; } return(result); } } } catch (Exception) { result.Status = Enums.ResponseStatus.CommunicationError; result.Message = "Ocurrió un error durante el proceso, por favor intenta de nuevo o espera unos minutos antes de vovler a intentar"; Thread.Sleep(TimeToSleepForRetry); continue; } } return(result); }
async Task InitializeViewModel() { ContinueCommand = new Command(() => Continue()); ContinueGoBackCommand = new Command(() => ContinueGoBack()); IsBusy = true; IsContinueEnabled = false; IsContinueGoBackEnabled = false; MessageTitle = "Por favor aguarda, estamos creando tu cuenta..."; try { //clean any previous session SignOutPage.CleanCurrentSession(); //launch task SignUpAccountResponse response = await RestHelper.SignUpAccountAsync(model); if (response.Status == ResponseStatus.Ok) { Settings.Profile_Username = model.username.ToLower(); Settings.Profile_Picture = $"{Settings.ImageStorageUrl}/{Settings.AccountImageStorageUrl}/{response.Image}"; IsBusy = false; IsContinueEnabled = true; IsContinueGoBackEnabled = false; MessageTitle = $"¡Gracias {Settings.Profile_Username}!"; MessageSubTitle = "Tu cuenta ha sido creada satisfactoriamente."; } else { IsBusy = false; IsContinueEnabled = false; IsContinueGoBackEnabled = true; MessageTitle = "El proceso de registro no fue satisfactorio."; MessageSubTitle = response.Message; } } catch (Exception ex) { Microsoft.AppCenter.Crashes.Crashes.TrackError(ex); IsBusy = false; IsContinueEnabled = false; IsContinueGoBackEnabled = true; MessageTitle = "El proceso de registro no fue satisfactorio."; MessageSubTitle = "Ocurrió un error inesperado"; } }
public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, TraceWriter log, ExecutionContext context) { TelemetryClient telemetryClient = new TelemetryClient { InstrumentationKey = Settings.APPINSIGHTS_INSTRUMENTATIONKEY }; telemetryClient.TrackTrace("Starting function: SignUpAccount"); SignUpAccountResponse result = new SignUpAccountResponse { IsSucceded = true, ResultId = (int)SignUpAccountResultEnum.Success }; try { string requestBody = new StreamReader(req.Body).ReadToEnd(); dynamic data = JsonConvert.DeserializeObject(requestBody); string token = data?.token; string username = data?.username; string password = data?.password; Dictionary <ParameterTypeEnum, object> parameters = new Dictionary <ParameterTypeEnum, object> { { ParameterTypeEnum.Username, username }, { ParameterTypeEnum.Password, password }, { ParameterTypeEnum.AccountImagesContainer, Settings.CONTAINER_NAME_ACCOUNTIMAGES }, { ParameterTypeEnum.FunctionDirectory, context.FunctionDirectory } }; telemetryClient.TrackTrace("Validating token"); //validate token if (!string.IsNullOrEmpty(token)) { var decrypted_token = SecurityHelper.Decrypt(token, Settings.SECURITY_SEED); byte[] token_bytes = Convert.FromBase64String(decrypted_token); DateTime when = DateTime.FromBinary(BitConverter.ToInt64(token_bytes, 0)); if (when < DateTime.UtcNow.AddMinutes(-5)) { result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.InvalidToken; } else { telemetryClient.TrackTrace("Calling helper"); SignUpAccountHelper helper = new SignUpAccountHelper(telemetryClient, Settings.STORAGE_ACCOUNT, Settings.RPC_CLIENT, Configurations.GetMongoDbConnectionInfo()); result = await helper.SignUpAccountAsync(parameters); } } else { result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.MissingToken; } } catch (AggregateException ex) { foreach (var innerException in ex.Flatten().InnerExceptions) { telemetryClient.TrackException(innerException); } result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.Failed; } catch (Exception ex) { telemetryClient.TrackException(ex); result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.Failed; } //get message for result id string message = EnumDescription.GetEnumDescription((SignUpAccountResultEnum)result.ResultId); //build json result object dynamic jsonresult = new JObject(); jsonresult.message = message; jsonresult.image = result.Image; telemetryClient.TrackTrace("Finishing function: SignUpAccount"); //send ok result or bad request return((result.IsSucceded) ? (ActionResult) new OkObjectResult(jsonresult) : (ActionResult) new BadRequestObjectResult(jsonresult)); }
public async Task <SignUpAccountResponse> SignUpAccountAsync(Dictionary <ParameterTypeEnum, object> parameters) { telemetryClient.TrackTrace("Starting helper"); SignUpAccountResponse result = new SignUpAccountResponse { IsSucceded = true, ResultId = (int)SignUpAccountResultEnum.Success }; try { telemetryClient.TrackTrace("Getting parameters"); parameters.TryGetValue(ParameterTypeEnum.Username, out global::System.Object ousername); string username = ousername.ToString().ToLower(); parameters.TryGetValue(ParameterTypeEnum.Password, out global::System.Object opassword); string password = opassword.ToString(); parameters.TryGetValue(ParameterTypeEnum.AccountImagesContainer, out global::System.Object oaccountImagesContainer); string accountImagesContainer = oaccountImagesContainer.ToString(); parameters.TryGetValue(ParameterTypeEnum.FunctionDirectory, out global::System.Object ofunctionDirectory); string functionDirectory = ofunctionDirectory.ToString(); //database helpers DBUserAccountHelper dbUserAccountHelper = new DBUserAccountHelper(DBCONNECTION_INFO); telemetryClient.TrackTrace("Validating username length"); //validate username length if (!RegexValidation.IsValidUsername(username)) { result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.InvalidUsernameLength; return(result); } telemetryClient.TrackTrace("Validating username existance"); //validate if account exists UserAccount userAccount = dbUserAccountHelper.GetUser(username); if (userAccount != null) { result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.AlreadyExists; return(result); } telemetryClient.TrackTrace("Adding account to database"); //save username and account in mongodb userAccount = new UserAccount() { username = username, password = MD5Hash.CalculateMD5Hash(password), createdDate = Timezone.GetCustomTimeZone() }; //perform insert in mongodb await dbUserAccountHelper.CreateUserAccount(userAccount); telemetryClient.TrackTrace("Adding account image to storage"); //create unique icon, upload and delete it var imageName = $"{username}.png"; try { var directory = Path.Combine(functionDirectory, "images"); var filePath = Path.Combine(directory, imageName); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } Identicon.FromValue(username, size: 160).SaveAsPng(filePath); await UploadAccountImageAsync(accountImagesContainer, imageName, filePath); File.Delete(filePath); } catch { //it doesn't matter if for some reason the icon generation fails, then ignore it and proceed as success } result.Image = imageName; } catch (AggregateException ex) { foreach (var innerException in ex.Flatten().InnerExceptions) { telemetryClient.TrackException(innerException); } result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.Failed; } catch (Exception ex) { telemetryClient.TrackException(ex); result.IsSucceded = false; result.ResultId = (int)SignUpAccountResultEnum.Failed; } telemetryClient.TrackTrace("Finishing helper"); return(result); }