public async Task <SendMessageResult> ApplyLeaveAsync(CreateLeaveContract leave) { // todo: why it's not clear from CreateLeaveContract // that we need to use DateTimeZoneHandling.Utc? var idToken = await authHelper.GetIdTokenAsync(); var leaveJson = JsonConvert.SerializeObject(leave, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc }); return(await backchannel.PostAsync("leaves/", x => x .WithBearerToken(idToken) .WithJsonContent(leaveJson) )); }
public async Task <IActionResult> Create(DateTime start, DateTime end) { var leave = new CreateLeaveContract { Start = ConvertToUtc(start), End = ConvertToUtc(end) }; var applyLeaveResult = await apiClient.ApplyLeaveAsync(leave); if (applyLeaveResult.Response.StatusCode != System.Net.HttpStatusCode.OK) { return(BadRequest()); } return(RedirectToAction(nameof(Index))); }
public async Task <IActionResult> Create([FromForm] CreateLeaveContract leave) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } leave.Start = ConvertToUtc(leave.Start); leave.End = ConvertToUtc(leave.End); var apiResult = await apiClient.ApplyLeaveAsync(leave); if (apiResult.Response.StatusCode == HttpStatusCode.Forbidden) { var returnUrl = Url.Action( action: nameof(Create), values: new { start = leave.Start.ToString("O"), end = leave.End.ToString("O") } ); var redirectUrl = Url.Action(nameof(AcceptAccessCode), null, null, Request.Scheme); var authResult = await HttpContext.AuthenticateAsync(); if (!authResult.Succeeded) { return(BadRequest("Failed to apply a leave")); } var authProps = authResult.Properties; authProps.Items.Add("returnUrl", returnUrl); var state = authHelper.ProtectState(authProps); var challengeUrl = googleOAuthHelper.BuildChallengeUrl(redirectUrl, state); return(Redirect(challengeUrl)); } return(RedirectToAction(nameof(Index))); }