Skip to content

Commit 5a17609

Browse files
Refactor requests to use ApiResponse for standardized handling
Updated request and handler interfaces to return ApiResponse<T> instead of raw types for more structured responses. Modified controllers with streamlined result-handling logic, replacing try-catch error responses. Introduced ApiResponse utilities and custom controller base for better response encapsulation.
1 parent ad78e24 commit 5a17609

18 files changed

+156
-79
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace PaymentCoreServiceApi.Common.Extensions;
4+
5+
public abstract class ApiResponseExtensions
6+
{
7+
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace PaymentCoreServiceApi.Common.Mediator;
2+
3+
public abstract class BaseApiResponseHandler<TRequest, TResponse> : IRequestApiResponseHandler<TRequest, TResponse>
4+
where TRequest : IRequestApiResponse<TResponse>
5+
{
6+
public abstract Task<ApiResponse<TResponse>> Handle(TRequest request, CancellationToken cancellationToken);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using MediatR;
2+
3+
namespace PaymentCoreServiceApi.Common.Mediator;
4+
5+
public interface IRequestApiResponse<T> : IRequest<ApiResponse<T>>
6+
{
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using MediatR;
2+
3+
namespace PaymentCoreServiceApi.Common.Mediator;
4+
5+
public interface IRequestApiResponseHandler<TRequest, TResponse> : IRequestHandler<TRequest, ApiResponse<TResponse>>
6+
where TRequest : IRequestApiResponse<TResponse>
7+
{
8+
}

Common/Responses.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace PaymentCoreServiceApi.Common;
4+
5+
public class ApiResponse<T>
6+
{
7+
[JsonIgnore]
8+
public int HttpStatus { get; set; } = 200;
9+
10+
public int Code { get; set; } = 0;
11+
public string Message { get; set; } = "Success";
12+
13+
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
14+
public T? Data { get; set; }
15+
16+
public ApiResponse() { }
17+
18+
public ApiResponse(T data, string message = "Success", int code = 0, int httpStatus = 200)
19+
{
20+
Data = data;
21+
Message = message;
22+
Code = code;
23+
HttpStatus = httpStatus;
24+
}
25+
26+
public ApiResponse(string message, int code = 0, int httpStatus = 400)
27+
{
28+
Data = default;
29+
Message = message;
30+
Code = code;
31+
HttpStatus = httpStatus;
32+
}
33+
34+
public static ApiResponse<T> Success(T data, string message = "Success")
35+
=> new(data, message, 0, 200);
36+
37+
public static ApiResponse<T> NotFound(string message = "Not Found", int code = 40401)
38+
=> new(message, code, 404);
39+
40+
public static ApiResponse<T> BadRequest(string message = "Bad Request", int code = 40001)
41+
=> new(message, code, 400);
42+
43+
public static ApiResponse<T> Unauthorized(string message = "Unauthorized", int code = 40101)
44+
=> new(message, code, 401);
45+
46+
public static ApiResponse<T> Forbidden(string message = "Forbidden", int code = 40301)
47+
=> new(message, code, 403);
48+
49+
public static ApiResponse<T> Conflict(string message = "Conflict", int code = 40901)
50+
=> new(message, code, 409);
51+
52+
public static ApiResponse<T> InternalServerError(string message = "Internal Server Error", int code = 50001)
53+
=> new(message, code, 500);
54+
}

Controllers/AuthController.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace PaymentCoreServiceApi.Controllers;
99
[ApiController]
1010
[Route("api/[controller]")]
1111
[Authorize]
12-
public class AuthController : BaseController
12+
public class AuthController : ControllerBaseCustom
1313
{
1414
private readonly IMediator _mediator;
1515

@@ -21,14 +21,7 @@ public AuthController(IMediator mediator)
2121
[AllowAnonymous]
2222
public async Task <IActionResult> Login([FromBody] LoginCommand command)
2323
{
24-
try
25-
{
26-
var response = await _mediator.Send(command);
27-
return SuccessResponse(response);
28-
}
29-
catch (UnauthorizedAccessException)
30-
{
31-
return Unauthorized();
32-
}
24+
var response = await _mediator.Send(command);
25+
return Ok(response);
3326
}
3427
}
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Net;
12
using MediatR;
23
using Microsoft.AspNetCore.Authorization;
34
using Microsoft.AspNetCore.Mvc;
@@ -7,7 +8,7 @@ namespace PaymentCoreServiceApi.Controllers;
78
[ApiController]
89
[Route("api/[controller]")]
910
[Authorize]
10-
public class BankAccountController: BaseController
11+
public class BankAccountController: ControllerBaseCustom
1112
{
1213
private readonly IMediator _mediator;
1314

@@ -18,15 +19,8 @@ public BankAccountController(IMediator mediator)
1819
[HttpPost("create-bank-account")]
1920
public async Task<IActionResult> Create([FromBody] CreateBankAccountCommand command)
2021
{
21-
try
22-
{
23-
var bankAccount = await _mediator.Send(command);
24-
return SuccessResponse(bankAccount);
25-
}
26-
catch (Exception ex)
27-
{
28-
return ErrorResponse(ex.Message, 400);
29-
}
22+
var result = await _mediator.Send(command);
23+
return OK(result);
3024
}
3125

3226
}

Controllers/BaseController.cs

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,13 @@
1-
using System.Text.Json.Serialization;
21
using Microsoft.AspNetCore.Mvc;
2+
using PaymentCoreServiceApi.Common;
33

44
namespace PaymentCoreServiceApi.Controllers;
55

6-
public class ApiResponseModel
6+
[ApiController]
7+
public abstract class ControllerBaseCustom : ControllerBase
78
{
8-
public int Code { get; set; }
9-
public string Message { get; set; } = string.Empty;
10-
11-
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
12-
public object? Data { get; set; }
13-
}
14-
15-
public abstract class BaseController : ControllerBase
16-
{
17-
protected IActionResult ApiResponse(int code, string message, object? data = null)
18-
{
19-
var response = new ApiResponseModel
20-
{
21-
Code = code,
22-
Message = message,
23-
Data = data
24-
};
25-
26-
return Ok(response);
27-
}
28-
29-
protected IActionResult SuccessResponse(object? data = null)
30-
{
31-
return ApiResponse(200, "Success", data);
32-
}
33-
34-
protected IActionResult ErrorResponse(string message, int code = 400)
9+
protected IActionResult OK<T>(ApiResponse<T> response)
3510
{
36-
return ApiResponse(code, message);
11+
return StatusCode(response.HttpStatus, response);
3712
}
3813
}

Controllers/UsersController.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace PaymentCoreServiceApi.Controllers;
99
[ApiController]
1010
[Route("api/[controller]")]
1111
[Authorize]
12-
public class UsersController : BaseController
12+
public class UsersController : ControllerBaseCustom
1313
{
1414
private readonly IMediator _mediator;
1515

@@ -23,17 +23,14 @@ public UsersController(IMediator mediator)
2323
public async Task<IActionResult> Create([FromBody] CreateUserCommand command)
2424
{
2525
var result = await _mediator.Send(command);
26-
if (result == null)
27-
{
28-
return ErrorResponse("Username already exists");
29-
}
30-
return SuccessResponse(result);
26+
return OK(result);
27+
3128
}
3229

3330
[HttpGet("profile")]
3431
public async Task<IActionResult> GetProfile()
3532
{
3633
var profile = await _mediator.Send(new GetUserProfileQuery());
37-
return SuccessResponse(profile);
34+
return OK(profile);
3835
}
3936
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace PaymentCoreServiceApi.Core.Entities.BankAccountGenerated;
2+
3+
public class BankAccountDto
4+
{
5+
public int Id { get; set; }
6+
public int UserId { get; set; }
7+
public string AccountNumber { get; set; } = string.Empty;
8+
public decimal Balance { get; set; }
9+
public string Currency { get; set; } = string.Empty;
10+
public bool IsActive { get; set; }
11+
public string? CreatedAt { get; set; }
12+
public string? UpdatedAt { get; set; }
13+
}

0 commit comments

Comments
 (0)