From 5ce6c2539343bd32dc01f49056a58c1482be9d97 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 9 May 2025 10:42:11 +0200 Subject: [PATCH] Refactor error handling in controllers Removed try-catch blocks from various controller methods to simplify error handling and allow exceptions to propagate naturally. Streamlined error logging and response handling using the `ThenAsync` method, enhancing code readability and reducing redundancy. Adjusted conditional checks for improved clarity. --- .../Controllers/AuthController.cs | 12 +- .../Controllers/EmailTemplateController.cs | 51 ++--- .../Controllers/EnvelopeController.cs | 126 +++++------ .../Controllers/EnvelopeReceiverController.cs | 200 ++++++++---------- .../Controllers/EnvelopeTypeController.cs | 22 +- .../Controllers/ReceiverController.cs | 34 ++- 6 files changed, 176 insertions(+), 269 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index a5e8f748..23b9bfdb 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -118,16 +118,8 @@ public partial class AuthController : ControllerBase [HttpPost("logout")] public async Task Logout() { - try - { - await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - return Ok(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Unexpected error occurred.\n{ErrorMessage}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); + return Ok(); } /// diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs index 7e1efe52..41927e85 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs @@ -63,23 +63,15 @@ public class EmailTemplateController : ControllerBase [HttpGet] public async Task Get([FromQuery] ReadEmailTemplateQuery? emailTemplate = null) { - try + if (emailTemplate is null || (emailTemplate.Id is null && emailTemplate.Type is null)) { - if (emailTemplate is null || (emailTemplate.Id is null && emailTemplate.Type is null)) - { - var temps = await _repository.ReadAllAsync(); - return Ok(_mapper.Map>(temps)); - } - else - { - var temp = await _mediator.Send(emailTemplate); - return temp is null ? NotFound() : Ok(temp); - } + var temps = await _repository.ReadAllAsync(); + return Ok(_mapper.Map>(temps)); } - catch (Exception ex) + else { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); + var temp = await _mediator.Send(emailTemplate); + return temp is null ? NotFound() : Ok(temp); } } @@ -107,33 +99,20 @@ public class EmailTemplateController : ControllerBase [HttpPut] public async Task Update([FromQuery] EmailTemplateQuery? temp = null, [FromBody] UpdateEmailTemplateCommand? update = null) { - try + if (update is null) { - if (update is null) - { - await _mediator.Send(new ResetEmailTemplateCommand(temp)); - return Ok(); - } - else if(temp is null) - { - return BadRequest("No both id and type"); - } - else - { - update.EmailTemplateQuery = temp; - await _mediator.Send(update); - return Ok(); - } - + await _mediator.Send(new ResetEmailTemplateCommand(temp)); + return Ok(); } - catch(NotFoundException) + else if (temp is null) { - return BadRequest(); + return BadRequest("No both id and type"); } - catch (Exception ex) + else { - _logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message); - return new StatusCodeResult(StatusCodes.Status500InternalServerError); + update.EmailTemplateQuery = temp; + await _mediator.Send(update); + return Ok(); } } } diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 13faf709..9deca564 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -61,37 +61,29 @@ public class EnvelopeController : ControllerBase [HttpGet] public async Task GetAsync([FromQuery] ReadEnvelopeQuery envelope) { - try - { - if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId, min_status: envelope.Status, max_status: envelope.Status).ThenAsync( - Success: envelopes => - { - if(envelope.Id is int id) - envelopes = envelopes.Where(e => e.Id == id); + if (User.GetId() is int intId) + return await _envelopeService.ReadByUserAsync(intId, min_status: envelope.Status, max_status: envelope.Status).ThenAsync( + Success: envelopes => + { + if (envelope.Id is int id) + envelopes = envelopes.Where(e => e.Id == id); - if(envelope.Status is int status) - envelopes = envelopes.Where(e => e.Status == status); + if (envelope.Status is int status) + envelopes = envelopes.Where(e => e.Status == status); - if (envelope.Uuid is string uuid) - envelopes = envelopes.Where(e => e.Uuid == uuid); + if (envelope.Uuid is string uuid) + envelopes = envelopes.Where(e => e.Uuid == uuid); - return Ok(envelopes); - }, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - else - { - _logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein."); - return StatusCode(StatusCodes.Status500InternalServerError); - } - } - catch (Exception ex) + return Ok(envelopes); + }, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + else { - _logger.LogError(ex, "{Message}", ex.Message); + _logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein."); return StatusCode(StatusCodes.Status500InternalServerError); } } @@ -108,43 +100,35 @@ public class EnvelopeController : ControllerBase [HttpGet("doc-result")] public async Task GetDocResultAsync([FromQuery] int id, [FromQuery] bool view = false) { - try - { - if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId).ThenAsync( - Success: envelopes => - { - var envelope = envelopes.Where(e => e.Id == id).FirstOrDefault(); + if (User.GetId() is int intId) + return await _envelopeService.ReadByUserAsync(intId).ThenAsync( + Success: envelopes => + { + var envelope = envelopes.Where(e => e.Id == id).FirstOrDefault(); - if (envelope is null) - return NotFound("Envelope not available."); - else if (envelope?.DocResult is null) - return NotFound("The document has not been fully signed or the result has not yet been released."); - else + if (envelope is null) + return NotFound("Envelope not available."); + else if (envelope?.DocResult is null) + return NotFound("The document has not been fully signed or the result has not yet been released."); + else + { + if (view) { - if (view) - { - Response.Headers.Append("Content-Disposition", "inline; filename=\"" + envelope.Uuid + ".pdf\""); - return File(envelope.DocResult, "application/pdf"); - } - else - return File(envelope.DocResult, "application/pdf", $"{envelope.Uuid}.pdf"); + Response.Headers.Append("Content-Disposition", "inline; filename=\"" + envelope.Uuid + ".pdf\""); + return File(envelope.DocResult, "application/pdf"); } - }, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - else - { - _logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein."); - return StatusCode(StatusCodes.Status500InternalServerError); - } - } - catch (Exception ex) + else + return File(envelope.DocResult, "application/pdf", $"{envelope.Uuid}.pdf"); + } + }, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + else { - _logger.LogError(ex, "{Message}", ex.Message); + _logger.LogError("Trotz erfolgreicher Autorisierung wurde die Benutzer-ID nicht als Ganzzahl erkannt. Dies könnte auf eine fehlerhafte Erstellung der Anspruchsliste zurückzuführen sein."); return StatusCode(StatusCodes.Status500InternalServerError); } } @@ -159,23 +143,15 @@ public class EnvelopeController : ControllerBase [HttpPost] public async Task CreateAsync([FromQuery] CreateEnvelopeCommand envelope) { - try - { - envelope.UserId = User.GetId(); - var res = await _mediator.Send(envelope); - - if (res is null) - { - _logger.LogError("Failed to create envelope. Envelope details: {EnvelopeDetails}", JsonConvert.SerializeObject(envelope)); - return StatusCode(StatusCodes.Status500InternalServerError); - } - else - return Ok(res); - } - catch (Exception ex) + envelope.UserId = User.GetId(); + var res = await _mediator.Send(envelope); + + if (res is null) { - _logger.LogError(ex, "{Message}", ex.Message); + _logger.LogError("Failed to create envelope. Envelope details: {EnvelopeDetails}", JsonConvert.SerializeObject(envelope)); return StatusCode(StatusCodes.Status500InternalServerError); } + else + return Ok(res); } } diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 39fc6587..922927f1 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -84,37 +84,29 @@ public class EnvelopeReceiverController : ControllerBase [HttpGet] public async Task GetEnvelopeReceiver([FromQuery] ReadEnvelopeReceiverQuery envelopeReceiver) { - try - { - var username = User.GetUsernameOrDefault(); - - if (username is null) - { - _logger.LogError(@"Envelope Receiver dto cannot be sent because username claim is null. Potential authentication and authorization error. The value of other claims are [id: {id}], [username: {username}], [name: {name}], [prename: {prename}], [email: {email}].", - User.GetId(), User.GetUsernameOrDefault(), User.GetNameOrDefault(), User.GetPrenameOrDefault(), User.GetEmailOrDefault()); - return StatusCode(StatusCodes.Status500InternalServerError); - } + var username = User.GetUsernameOrDefault(); - return await _erService.ReadByUsernameAsync( - username: username, - min_status: envelopeReceiver.Status?.Min, - max_status:envelopeReceiver.Status?.Max, - envelopeQuery: envelopeReceiver.Envelope, - receiverQuery: envelopeReceiver.Receiver, - ignore_statuses: envelopeReceiver.Status?.Ignore ?? Array.Empty()) - .ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError, msg); - }); - } - catch (Exception ex) + if (username is null) { - _logger.LogError(ex, "An unexpected error occurred. {message}", ex.Message); - return new StatusCodeResult(StatusCodes.Status500InternalServerError); + _logger.LogError(@"Envelope Receiver dto cannot be sent because username claim is null. Potential authentication and authorization error. The value of other claims are [id: {id}], [username: {username}], [name: {name}], [prename: {prename}], [email: {email}].", + User.GetId(), User.GetUsernameOrDefault(), User.GetNameOrDefault(), User.GetPrenameOrDefault(), User.GetEmailOrDefault()); + return StatusCode(StatusCodes.Status500InternalServerError); } + + return await _erService.ReadByUsernameAsync( + username: username, + min_status: envelopeReceiver.Status?.Min, + max_status: envelopeReceiver.Status?.Max, + envelopeQuery: envelopeReceiver.Envelope, + receiverQuery: envelopeReceiver.Receiver, + ignore_statuses: envelopeReceiver.Status?.Ignore ?? Array.Empty()) + .ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError, msg); + }); } /// @@ -133,24 +125,16 @@ public class EnvelopeReceiverController : ControllerBase [HttpGet("salute")] public async Task GetReceiverName([FromQuery] ReadReceiverNameQuery receiverName) { - try - { - return await _erService.ReadLastUsedReceiverNameByMail(receiverName.EmailAddress).ThenAsync( - Success: res => res is null ? Ok(string.Empty) : Ok(res), - Fail: IActionResult (msg, ntc) => - { - if (ntc.HasFlag(Flag.NotFound)) - return NotFound(); - - _logger.LogNotice(ntc); - return StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + return await _erService.ReadLastUsedReceiverNameByMail(receiverName.EmailAddress).ThenAsync( + Success: res => res is null ? Ok(string.Empty) : Ok(res), + Fail: IActionResult (msg, ntc) => + { + if (ntc.HasFlag(Flag.NotFound)) + return NotFound(); + + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); } /// @@ -194,44 +178,42 @@ public class EnvelopeReceiverController : ControllerBase [HttpPost] public async Task CreateAsync([FromBody] CreateEnvelopeReceiverCommand request) { - try - { - CancellationToken cancel = default; - int userId = User.GetId(); + CancellationToken cancel = default; + int userId = User.GetId(); - #region Create Envelope - var envelope = await _envelopeExecutor.CreateEnvelopeAsync(userId, request.Title, request.Message, request.TFAEnabled, cancel); - #endregion + #region Create Envelope + var envelope = await _envelopeExecutor.CreateEnvelopeAsync(userId, request.Title, request.Message, request.TFAEnabled, cancel); + #endregion - #region Add receivers - List sentReceivers = new(); - List unsentReceivers = new(); + #region Add receivers + List sentReceivers = new(); + List unsentReceivers = new(); - foreach (var receiver in request.Receivers) - { - var envelopeReceiver = await _erExecutor.AddEnvelopeReceiverAsync(envelope.Uuid, receiver.EmailAddress, receiver.Salution, receiver.PhoneNumber, cancel); + foreach (var receiver in request.Receivers) + { + var envelopeReceiver = await _erExecutor.AddEnvelopeReceiverAsync(envelope.Uuid, receiver.EmailAddress, receiver.Salution, receiver.PhoneNumber, cancel); - if (envelopeReceiver is null) - unsentReceivers.Add(receiver); - else - sentReceivers.Add(envelopeReceiver); - } + if (envelopeReceiver is null) + unsentReceivers.Add(receiver); + else + sentReceivers.Add(envelopeReceiver); + } - var res = _mapper.Map(envelope); - res.UnsentReceivers = unsentReceivers; - res.SentReceiver = _mapper.Map>(sentReceivers.Select(er => er.Receiver)); - #endregion + var res = _mapper.Map(envelope); + res.UnsentReceivers = unsentReceivers; + res.SentReceiver = _mapper.Map>(sentReceivers.Select(er => er.Receiver)); + #endregion - #region Add document - var document = await _documentExecutor.CreateDocumentAsync(request.Document.DataAsBase64, envelope.Uuid, cancel); + #region Add document + var document = await _documentExecutor.CreateDocumentAsync(request.Document.DataAsBase64, envelope.Uuid, cancel); - if(document is null) - return StatusCode(StatusCodes.Status500InternalServerError, "Document creation is failed."); - #endregion + if (document is null) + return StatusCode(StatusCodes.Status500InternalServerError, "Document creation is failed."); + #endregion - #region Add document element - // @DOC_ID, @RECEIVER_ID, @POSITION_X, @POSITION_Y, @PAGE - string sql = @" + #region Add document element + // @DOC_ID, @RECEIVER_ID, @POSITION_X, @POSITION_Y, @PAGE + string sql = @" DECLARE @OUT_SUCCESS bit; EXEC [dbo].[PRSIG_API_ADD_DOC_RECEIVER_ELEM] @@ -244,30 +226,30 @@ public class EnvelopeReceiverController : ControllerBase SELECT @OUT_SUCCESS as [@OUT_SUCCESS];"; - foreach(var rcv in res.SentReceiver) - foreach(var sign in request.Receivers.Where(r => r.EmailAddress == rcv.EmailAddress).FirstOrDefault()?.Signatures ?? Array.Empty()) + foreach (var rcv in res.SentReceiver) + foreach (var sign in request.Receivers.Where(r => r.EmailAddress == rcv.EmailAddress).FirstOrDefault()?.Signatures ?? Array.Empty()) + { + using (SqlConnection conn = new(_cnnStr)) { - using (SqlConnection conn = new(_cnnStr)) - { - conn.Open(); + conn.Open(); - var formattedSQL = string.Format(sql, document.Id.ToSqlParam(), rcv.Id.ToSqlParam(), sign.X.ToSqlParam(), sign.Y.ToSqlParam(), sign.Page.ToSqlParam()); + var formattedSQL = string.Format(sql, document.Id.ToSqlParam(), rcv.Id.ToSqlParam(), sign.X.ToSqlParam(), sign.Y.ToSqlParam(), sign.Page.ToSqlParam()); - using SqlCommand cmd = new SqlCommand(formattedSQL, conn); - cmd.CommandType = CommandType.Text; + using SqlCommand cmd = new SqlCommand(formattedSQL, conn); + cmd.CommandType = CommandType.Text; - using SqlDataReader reader = cmd.ExecuteReader(); - if (reader.Read()) - { - bool outSuccess = reader.GetBoolean(0); - } + using SqlDataReader reader = cmd.ExecuteReader(); + if (reader.Read()) + { + bool outSuccess = reader.GetBoolean(0); } } - #endregion + } + #endregion - #region Create history - // ENV_UID, STATUS_ID, USER_ID, - string sql_hist = @" + #region Create history + // ENV_UID, STATUS_ID, USER_ID, + string sql_hist = @" USE [DD_ECM] DECLARE @OUT_SUCCESS bit; @@ -280,32 +262,26 @@ public class EnvelopeReceiverController : ControllerBase SELECT @OUT_SUCCESS as [@OUT_SUCCESS];"; - using (SqlConnection conn = new(_cnnStr)) + using (SqlConnection conn = new(_cnnStr)) + { + conn.Open(); + var formattedSQL_hist = string.Format(sql_hist, envelope.Uuid.ToSqlParam(), 1003.ToSqlParam(), userId.ToSqlParam()); + using (SqlCommand cmd = new SqlCommand(formattedSQL_hist, conn)) { - conn.Open(); - var formattedSQL_hist = string.Format(sql_hist, envelope.Uuid.ToSqlParam(), 1003.ToSqlParam(), userId.ToSqlParam()); - using (SqlCommand cmd = new SqlCommand(formattedSQL_hist, conn)) - { - cmd.CommandType = CommandType.Text; + cmd.CommandType = CommandType.Text; - using (SqlDataReader reader = cmd.ExecuteReader()) + using (SqlDataReader reader = cmd.ExecuteReader()) + { + if (reader.Read()) { - if (reader.Read()) - { - bool outSuccess = reader.GetBoolean(0); - } + bool outSuccess = reader.GetBoolean(0); } } } - #endregion - - return Ok(res); - } - catch (Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); } + #endregion + + return Ok(res); } /// diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs index bf2ea067..c49d9a3b 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs @@ -21,20 +21,12 @@ public class EnvelopeTypeController : ControllerBase [HttpGet] public async Task GetAllAsync() { - try - { - return await _service.ReadAllAsync().ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - _logger.LogNotice(ntc); - return ntc.HasFlag(Flag.NotFound) ? NotFound() : StatusCode(StatusCodes.Status500InternalServerError); - }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + return await _service.ReadAllAsync().ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return ntc.HasFlag(Flag.NotFound) ? NotFound() : StatusCode(StatusCodes.Status500InternalServerError); + }); } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs index 95243234..0062a43f 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs @@ -41,28 +41,20 @@ public class ReceiverController : CRUDControllerBaseWithErrorHandling - { - return NotFound(); - }); + if (receiver.Id is int id) + return await _service.ReadByIdAsync(id).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + return NotFound(); + }); - return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( - Success: Ok, - Fail: IActionResult (msg, ntc) => - { - return NotFound(); - }); - } - catch (Exception ex) - { - _logger.LogError(ex, "{Message}", ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError); - } + return await _service.ReadByAsync(emailAddress: receiver.EmailAddress, signature: receiver.Signature).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + return NotFound(); + }); } #region REMOVED ENDPOINTS