} // End of AddAttendanceBLL /// <summary> /// Business Logic for modifying Attendances table records /// </summary> /// <param name="attendance">AttendanceModDTO object with properties to modify</param> /// <param name="userClaims">ClaimsPrincipal object containing User Identity</param> /// <returns>object Exception or AttendanceModDTO</returns> internal object ModifyAttendanceBLL(AttendanceModDTO attendance, ClaimsPrincipal userClaims) { // Create a new APIException object to store possible exceptions as checks are performed. APIException exceptionList = new APIException(); // Due to the number of checks, this approach is more appropriate Dictionary<string, bool> exceptionTests = new Dictionary<string, bool>() { { "Specified RecordID does not exist", !_context.AttendanceRecords.Any(x => x.RecordID == attendance.RecordID) }, { "Specified AttendanceStateID does not exist", !_context.AttendanceStates.Any(x => x.StateID == attendance.AttendanceStateID) } }; foreach (KeyValuePair<string, bool> kvp in exceptionTests) { if (kvp.Value) exceptionList.AddExMessage(kvp.Key); } if (!exceptionList.HasExceptions) { return attendance; } else { return exceptionList; } } // End of ModifyAttendanceBLL
public async Task <ActionResult> ModifyAttendance([FromBody] AttendanceModDTO attendance) { if (AttendanceExists(attendance.RecordID)) { // Call BLL method to run validation object BLLResponse = new AttendanceBLL(_context).ModifyAttendanceBLL(attendance: attendance, userClaims: User); if (BLLResponse.GetType().BaseType == typeof(Exception)) { // Create log entries for Debug log ((APIException)BLLResponse).Exceptions.ForEach(ex => Logger.Msg <AttendancesController>((Exception)ex, Serilog.Events.LogEventLevel.Debug)); // Return response from API return(BadRequest(new { errors = ((APIException)BLLResponse).Exceptions.Select(x => x.Message).ToArray() })); } else { try { // Cast the response to the correct type AttendanceModDTO modAttendanceRecord = (AttendanceModDTO)BLLResponse; // Modify the Attendance Record Attendance attendanceRecord = _context.AttendanceRecords.Where(x => x.RecordID == modAttendanceRecord.RecordID).First(); attendanceRecord.AttendanceStateID = attendance.AttendanceStateID; attendanceRecord.Comment = attendance.Comment; // Save changes await _context.SaveChangesAsync(); Logger.Msg <AttendancesController>($"[{User.FindFirstValue("email")}] [MODIFY] attendance RecordID '{attendanceRecord.RecordID}' updated", Serilog.Events.LogEventLevel.Information); AttendanceDTO response = new AttendanceDTO(attendanceRecord); return(Ok(response)); } catch (Exception ex) { // Local log entry. Database reconciliation issues are more serious so reported as Error Logger.Msg <AttendancesController>($"[MODIFY] Database sync error {ex.Message}", Serilog.Events.LogEventLevel.Error); // Return response to client return(StatusCode(500, new { errors = "Database update failed. Contact the administrator to resolve this issue." })); } } } else { return(NotFound()); } } // End of ModifyAttendance