/// <summary> /// Handle the submission of the modal. /// </summary> /// <param name="user"></param> /// <returns></returns> public async Task <IActionResult> ProcessModalDataAsync(SlackUser user) { if (user is null) { return(BadRequest()); } var payload = Serializer.Deserialize <SlackViewSubmission>(HttpContext.Request.Form["payload"]); var payloadStart = payload?.View?.State?.Values?.Starttime?.StartTime?.Value; var payloadEnd = payload?.View?.State?.Values?.Endtime?.EndTime?.Value; var payloadDate = payload?.View?.State?.Values?.Date?.Date?.Day; var payloadUserId = payload?.User?.Id; var payloadDescription = payload?.View?.State?.Values?.Description?.Description?.Value; var payloadProjectName = payload?.View?.State?.Values?.Project?.Project?.SelectedOption?.Value; if (payloadEnd is null || payloadStart is null || payloadDate is null || payloadUserId is null || payloadDescription is null || payloadProjectName is null) { return(BadRequest()); } // // Generate the error response (if there are any) // string errorMessage = "{ \"response_action\": \"errors\", \"errors\": {"; if (!TimeSpan.TryParseExact(payloadStart, "h\\:mm", CultureInfo.InvariantCulture, out TimeSpan startTime)) { errorMessage += "\"starttime\": \"Please use a valid time format! (eg. '08:00')\","; } if (!TimeSpan.TryParseExact(payloadEnd, "h\\:mm", CultureInfo.InvariantCulture, out TimeSpan endTime)) { errorMessage += "\"endtime\": \"Please use a valid time format! (eg. '18:00')\","; } if (payload?.View?.State?.Values?.Project == null) { errorMessage += "\"project\": \"Please select a project!\","; } else if (endTime.CompareTo(startTime) != 1) { errorMessage += "\"endtime\": \"End Time has to be after Start Time!\","; } // // Check if there was an error and return it // if (errorMessage.EndsWith(",", StringComparison.CurrentCulture)) { errorMessage = errorMessage.Remove(errorMessage.Length - 1) + "}}"; return(Content(errorMessage, "application/json", Encoding.UTF8)); } // // Request the access token // var accessToken = await _tokenManager.GetAccessTokenAsync(payloadUserId); if (accessToken == null) { return(BadRequest()); } // // Set and save the values // user.IsWorking = false; user.Worktime = new Duration(payloadDate + startTime, payloadDate + endTime); // // Send the request // // Get the project var project = await _tcDataManager.GetProjectAsync(accessToken, payloadProjectName); if (project == null) { return(BadRequest()); } // Get the user details var userDetail = await _tcDataManager.GetCurrentUserDetailsAsync(accessToken); if (userDetail == null) { return(BadRequest()); } // Send each session foreach (var session in user.GetWorkSessions()) { var timesheet = new Timesheet { BeginTime = session.Start.GetValueOrDefault(), EndTime = session.End.GetValueOrDefault(), UserDetailUuid = userDetail.UserDetailUuid, ProjectUuid = project.ProjectUuid, Description = payloadDescription }; await _tcDataManager.CreateObjectAsync(accessToken, timesheet); } // // Reset the data // user.ResetWorktime(); user.Breaks?.Clear(); await _cosmosManager.ReplaceDocumentAsync(Collection.Users, user, user.UserId); // // Send the reply // //var channel = await CommandController.GetIMChannelFromUserAsync(_httpClient, payloadUserId); //if (channel is null) //{ // return BadRequest(); //} var replyData = new Dictionary <string, string> { ["user"] = payloadUserId, ["channel"] = await GetIMChannelFromUserAsync(_httpClient, user.UserId, payload?.Team.Id), ["text"] = "Your time has been saved" }; using var replyForm = new FormUrlEncodedContent(replyData); // _ = await _httpClient.PostAsync(new Uri(_httpClient.BaseAddress, "chat.postEphemeral"), replyForm); await SendReplyAsync(payload.Team.Id, replyData, true); return(Ok()); }