From 903ed31cb5f8d7da791ff174c6404f0479825a03 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:42:12 +0200 Subject: [PATCH 01/11] chore(readme): update code example --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5866439..46a20f6 100644 --- a/README.md +++ b/README.md @@ -96,8 +96,8 @@ This library uses a Source Generator to generate extension methods for your own 3. Use the generated extension method: ```csharp app.MapGet("/users/{id}", (string id) => { - return userRepository.find(id) //Result - .ToHttpResult(); + return userRepository.Find(id) //Result + .ToHttpResult(); //returns 200 with User as payload or 404 with ProblemDetails object defined above }); ``` From 4c09529e19412f4c81af8615f079751474eb2154 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:48:37 +0200 Subject: [PATCH 02/11] refactor!: rename ToHttpResult method to ToStatusCodeHttpResult --- ...ttpResult.cs => ToStatusCodeHttpResult.cs} | 26 +++++++++---------- ...ttpResult.cs => ToStatusCodeHttpResult.cs} | 6 ++--- README.md | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) rename CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/{ToHttpResult.cs => ToStatusCodeHttpResult.cs} (70%) rename CSharpFunctionalExtensions.HttpResults/ResultExtensions/{ToHttpResult.cs => ToStatusCodeHttpResult.cs} (81%) diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResult.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResult.cs similarity index 70% rename from CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResult.cs rename to CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResult.cs index 2cd5a35..81fcb23 100644 --- a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResult.cs +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResult.cs @@ -4,22 +4,22 @@ namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; -public class ToHttpResult +public class ToStatusCodeHttpResult { [Fact] - public void Result_Success_can_be_mapped_to_HttpResult() + public void Result_Success_can_be_mapped_to_StatusCodeHttpResult() { var result = Result.Success() - .ToHttpResult().Result as StatusCodeHttpResult; + .ToStatusCodeHttpResult().Result as StatusCodeHttpResult; result!.StatusCode.Should().Be(204); } [Fact] - public async Task Result_Success_can_be_mapped_to_HttpResult_Async() + public async Task Result_Success_can_be_mapped_to_StatusCodeHttpResult_Async() { var result = (await Task.FromResult(Result.Success()) - .ToHttpResult()).Result as StatusCodeHttpResult; + .ToStatusCodeHttpResult()).Result as StatusCodeHttpResult; result!.StatusCode.Should().Be(204); } @@ -30,7 +30,7 @@ public void Result_Success_StatusCode_can_be_changed() var statusCode = 210; var result = Result.Success() - .ToHttpResult(statusCode).Result as StatusCodeHttpResult; + .ToStatusCodeHttpResult(statusCode).Result as StatusCodeHttpResult; result!.StatusCode.Should().Be(statusCode); } @@ -41,18 +41,18 @@ public async Task Result_Success_StatusCode_can_be_changed_Async() var statusCode = 210; var result = (await Task.FromResult(Result.Success()) - .ToHttpResult(statusCode)).Result as StatusCodeHttpResult; + .ToStatusCodeHttpResult(statusCode)).Result as StatusCodeHttpResult; result!.StatusCode.Should().Be(statusCode); } [Fact] - public void Result_Failure_can_be_mapped_to_HttpResult() + public void Result_Failure_can_be_mapped_to_StatusCodeHttpResult() { var error = "Error"; var result = Result.Failure(error) - .ToHttpResult().Result as ProblemHttpResult; + .ToStatusCodeHttpResult().Result as ProblemHttpResult; result!.StatusCode.Should().Be(400); result!.ProblemDetails.Status.Should().Be(400); @@ -60,12 +60,12 @@ public void Result_Failure_can_be_mapped_to_HttpResult() } [Fact] - public async Task Result_Failure_can_be_mapped_to_HttpResult_Async() + public async Task Result_Failure_can_be_mapped_to_StatusCodeHttpResult_Async() { var error = "Error"; var result = (await Task.FromResult(Result.Failure(error)) - .ToHttpResult()).Result as ProblemHttpResult; + .ToStatusCodeHttpResult()).Result as ProblemHttpResult; result!.StatusCode.Should().Be(400); result!.ProblemDetails.Status.Should().Be(400); @@ -79,7 +79,7 @@ public void Result_Failure_StatusCode_can_be_changed() var error = "Error"; var result = Result.Failure(error) - .ToHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; + .ToStatusCodeHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; result!.StatusCode.Should().Be(statusCode); result!.ProblemDetails.Status.Should().Be(statusCode); @@ -93,7 +93,7 @@ public async Task Result_Failure_StatusCode_can_be_changed_Async() var error = "Error"; var result = (await Task.FromResult(Result.Failure(error)) - .ToHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; + .ToStatusCodeHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; result!.StatusCode.Should().Be(statusCode); result!.ProblemDetails.Status.Should().Be(statusCode); diff --git a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResult.cs b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResult.cs similarity index 81% rename from CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResult.cs rename to CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResult.cs index 1bbe13e..86a9211 100644 --- a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResult.cs +++ b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResult.cs @@ -12,7 +12,7 @@ public static partial class ResultExtensions /// /// Returns a in case of success result. Returns in case of failure. You can override the success and error status code. /// - public static Results ToHttpResult(this Result result, int successStatusCode = 204, int failureStatusCode = 400) + public static Results ToStatusCodeHttpResult(this Result result, int successStatusCode = 204, int failureStatusCode = 400) { if (result.IsSuccess) return TypedResults.StatusCode(successStatusCode); @@ -31,8 +31,8 @@ public static Results ToHttpResult(this /// /// Returns a in case of success result. Returns in case of failure. You can override the success and error status code. /// - public static async Task> ToHttpResult(this Task result, int successStatusCode = 204, int failureStatusCode = 400) + public static async Task> ToStatusCodeHttpResult(this Task result, int successStatusCode = 204, int failureStatusCode = 400) { - return (await result).ToHttpResult(successStatusCode, failureStatusCode); + return (await result).ToStatusCodeHttpResult(successStatusCode, failureStatusCode); } } \ No newline at end of file diff --git a/README.md b/README.md index 46a20f6..a31b8ed 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ These methods are available: | Method | Short Description | |---------------------------------------|-----------------------------------------------------------------------------------------------| -| `.ToHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | From 2ddd1428dde86275cd2e1399aa98710370997a84 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:55:40 +0200 Subject: [PATCH 03/11] feat: add ToStatusCodeHttpResult method --- .../ToStatusCodeHttpResultT.cs | 108 ++++++++++++++++++ .../ToStatusCodeHttpResultT.cs | 38 ++++++ README.md | 1 + 3 files changed, 147 insertions(+) create mode 100644 CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultT.cs create mode 100644 CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResultT.cs diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultT.cs new file mode 100644 index 0000000..fe3da75 --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultT.cs @@ -0,0 +1,108 @@ +using CSharpFunctionalExtensions.HttpResults.ResultExtensions; +using FluentAssertions; +using Microsoft.AspNetCore.Http.HttpResults; + +namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; + +public class ToStatusCodeHttpResultT +{ + [Fact] + public void ResultT_Success_can_be_mapped_to_StatusCodeHttpResult() + { + var value = "foo"; + + var result = Result.Success(value) + .ToStatusCodeHttpResult().Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(204); + } + + [Fact] + public async Task ResultT_Success_can_be_mapped_to_StatusCodeHttpResult_Async() + { + var value = "foo"; + + var result = (await Task.FromResult(Result.Success(value)) + .ToStatusCodeHttpResult()).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(204); + } + + [Fact] + public void ResultT_Success_StatusCode_can_be_changed() + { + var statusCode = 210; + var value = "foo"; + + var result = Result.Success(value) + .ToStatusCodeHttpResult(statusCode).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(statusCode); + } + + [Fact] + public async Task ResultT_Success_StatusCode_can_be_changed_Async() + { + var statusCode = 210; + var value = "foo"; + + var result = (await Task.FromResult(Result.Success(value)) + .ToStatusCodeHttpResult(statusCode)).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(statusCode); + } + + [Fact] + public void ResultT_Failure_can_be_mapped_to_HttpResult() + { + var error = "Error"; + + var result = Result.Failure(error) + .ToStatusCodeHttpResult().Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(400); + result!.ProblemDetails.Status.Should().Be(400); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public async Task ResultT_Failure_can_be_mapped_to_StatusCodeHttpResult_Async() + { + var error = "Error"; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToStatusCodeHttpResult()).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(400); + result!.ProblemDetails.Status.Should().Be(400); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public void ResultT_Failure_StatusCode_can_be_changed() + { + var statusCode = 418; + var error = "Error"; + + var result = Result.Failure(error) + .ToStatusCodeHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(statusCode); + result!.ProblemDetails.Status.Should().Be(statusCode); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public async Task ResultT_Failure_StatusCode_can_be_changed_Async() + { + var statusCode = 418; + var error = "Error"; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToStatusCodeHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(statusCode); + result!.ProblemDetails.Status.Should().Be(statusCode); + result!.ProblemDetails.Detail.Should().Be(error); + } +} \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResultT.cs new file mode 100644 index 0000000..8d4010a --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToStatusCodeHttpResultT.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; + +namespace CSharpFunctionalExtensions.HttpResults.ResultExtensions; + +/// +/// Extension methods for +/// +public static partial class ResultExtensions +{ + /// + /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the success and error status code. + /// + public static Results ToStatusCodeHttpResult(this Result result, int successStatusCode = 204, int failureStatusCode = 400) + { + if (result.IsSuccess) return TypedResults.StatusCode(successStatusCode); + + var problemDetailsInfo = ProblemDetailsMap.Find(failureStatusCode); + var problemDetails = new ProblemDetails + { + Status = failureStatusCode, + Title = problemDetailsInfo.Title, + Type = problemDetailsInfo.Type, + Detail = result.Error + }; + + return TypedResults.Problem(problemDetails); + } + + /// + /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the success and error status code. + /// + public static async Task> ToStatusCodeHttpResult(this Task> result, int successStatusCode = 204, int failureStatusCode = 400) + { + return (await result).ToStatusCodeHttpResult(successStatusCode, failureStatusCode); + } +} \ No newline at end of file diff --git a/README.md b/README.md index a31b8ed..de59648 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ These methods are available: | Method | Short Description | |---------------------------------------|-----------------------------------------------------------------------------------------------| | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | From 9df5264e6ea84171a0e0ca2d95940dcdabe63d5e Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:56:26 +0200 Subject: [PATCH 04/11] feat: add ToStatusCodeHttpResult method --- .../Builders/ResultExtensionsClassBuilder.cs | 3 +- .../ToStatusCodeHttpResultTE.cs | 27 ++++++ .../ToStatusCodeHttpResultTE.cs | 84 +++++++++++++++++++ README.md | 1 + 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToStatusCodeHttpResultTE.cs create mode 100644 CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultTE.cs diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs index 4c2ffb2..fedb64a 100644 --- a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs +++ b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs @@ -22,6 +22,7 @@ public class ResultExtensionsClassBuilder(List requiredNamespaces, List< new ToFileHttpResultByteArrayE(), new ToFileStreamHttpResultStreamE(), new ToHttpResultTE(), - new ToNoContentHttpResultTE() + new ToNoContentHttpResultTE(), + new ToStatusCodeHttpResultTE() ]; } \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToStatusCodeHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToStatusCodeHttpResultTE.cs new file mode 100644 index 0000000..52b617f --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToStatusCodeHttpResultTE.cs @@ -0,0 +1,27 @@ +namespace CSharpFunctionalExtensions.HttpResults.Generators.ResultExtensions; + +internal class ToStatusCodeHttpResultTE: IGenerateMethods +{ + public string Generate(string mapperClassName, string resultErrorType, string httpResultType) + { + return $$""" + /// + /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. + /// + public static Results ToStatusCodeHttpResult(this Result result, int successStatusCode = 204) + { + if (result.IsSuccess) return TypedResults.StatusCode(successStatusCode); + + return new {{mapperClassName}}().Map(result.Error); + } + + /// + /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. + /// + public static async Task> ToStatusCodeHttpResult(this Task> result, int successStatusCode = 204) + { + return (await result).ToStatusCodeHttpResult(successStatusCode); + } + """; + } +} \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultTE.cs new file mode 100644 index 0000000..33e3e2a --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToStatusCodeHttpResultTE.cs @@ -0,0 +1,84 @@ +using CSharpFunctionalExtensions.HttpResults.Tests.Shared; +using FluentAssertions; +using Microsoft.AspNetCore.Http.HttpResults; + +namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; + +public class ToStatusCodeHttpResultTE +{ + [Fact] + public void ResultTE_Success_can_be_mapped_to_StatusCodeHttpResult() + { + var value = "foo"; + + var result = Result.Success(value) + .ToStatusCodeHttpResult().Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(204); + } + + [Fact] + public async Task ResultTE_Success_can_be_mapped_to_StatusCodeHttpResult_Async() + { + var value = "foo"; + + var result = (await Task.FromResult(Result.Success(value)) + .ToStatusCodeHttpResult()).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(204); + } + + [Fact] + public void ResultTE_Success_StatusCode_can_be_changed() + { + var statusCode = 210; + var value = "foo"; + + var result = Result.Success(value) + .ToStatusCodeHttpResult(statusCode).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(statusCode); + } + + [Fact] + public async Task ResultTE_Success_StatusCode_can_be_changed_Async() + { + var statusCode = 210; + var value = "foo"; + + var result = (await Task.FromResult(Result.Success(value)) + .ToStatusCodeHttpResult(statusCode)).Result as StatusCodeHttpResult; + + result!.StatusCode.Should().Be(statusCode); + } + + [Fact] + public void ResultTE_Failure_can_be_mapped_to_HttpResult() + { + var error = new DocumentMissingError + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = Result.Failure(error) + .ToStatusCodeHttpResult().Result as NotFound; + + result!.StatusCode.Should().Be(404); + result!.Value.Should().Be(error.DocumentId); + } + + [Fact] + public async Task ResultTE_Failure_can_be_mapped_to_StatusCodeHttpResult_Async() + { + var error = new DocumentMissingError + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToStatusCodeHttpResult()).Result as NotFound; + + result!.StatusCode.Should().Be(404); + result!.Value.Should().Be(error.DocumentId); + } +} \ No newline at end of file diff --git a/README.md b/README.md index de59648..04bc1c6 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ These methods are available: |---------------------------------------|-----------------------------------------------------------------------------------------------| | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | | `.ToHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | From f2b84f5bc6fb55402ba4d1c354c3a64cb19abeef Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 12:16:31 +0200 Subject: [PATCH 05/11] refactor!: rename ToHttpResult to ToJsonHttpResult --- ...{ToHttpResultT.cs => ToJsonHttpResultT.cs} | 26 +++++++++---------- ...{ToHttpResultT.cs => ToJsonHttpResultT.cs} | 6 ++--- README.md | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) rename CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/{ToHttpResultT.cs => ToJsonHttpResultT.cs} (74%) rename CSharpFunctionalExtensions.HttpResults/ResultExtensions/{ToHttpResultT.cs => ToJsonHttpResultT.cs} (82%) diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultT.cs similarity index 74% rename from CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultT.cs rename to CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultT.cs index 7c3e1e4..a78f510 100644 --- a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultT.cs +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultT.cs @@ -4,27 +4,27 @@ namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; -public class ToHttpResultT +public class ToJsonHttpResultT { [Fact] - public void ResultT_Success_can_be_mapped_to_HttpResult() + public void ResultT_Success_can_be_mapped_to_JsonHttpResult() { var value = "foo"; var result = Result.Success(value) - .ToHttpResult().Result as JsonHttpResult; + .ToJsonHttpResult().Result as JsonHttpResult; result!.StatusCode.Should().Be(200); result!.Value.Should().Be(value); } [Fact] - public async Task ResultT_Success_can_be_mapped_to_HttpResult_Async() + public async Task ResultT_Success_can_be_mapped_to_JsonHttpResult_Async() { var value = "foo"; var result = (await Task.FromResult(Result.Success(value)) - .ToHttpResult()).Result as JsonHttpResult; + .ToJsonHttpResult()).Result as JsonHttpResult; result!.StatusCode.Should().Be(200); result!.Value.Should().Be(value); @@ -37,7 +37,7 @@ public void ResultT_Success_StatusCode_can_be_changed() var value = "foo"; var result = Result.Success(value) - .ToHttpResult(statusCode).Result as JsonHttpResult; + .ToJsonHttpResult(statusCode).Result as JsonHttpResult; result!.StatusCode.Should().Be(statusCode); result!.Value.Should().Be(value); @@ -50,19 +50,19 @@ public async Task ResultT_Success_StatusCode_can_be_changed_Async() var value = "foo"; var result = (await Task.FromResult(Result.Success(value)) - .ToHttpResult(statusCode)).Result as JsonHttpResult; + .ToJsonHttpResult(statusCode)).Result as JsonHttpResult; result!.StatusCode.Should().Be(statusCode); result!.Value.Should().Be(value); } [Fact] - public void ResultT_Failure_can_be_mapped_to_HttpResult() + public void ResultT_Failure_can_be_mapped_to_JsonHttpResult() { var error = "Error"; var result = Result.Failure(error) - .ToHttpResult().Result as ProblemHttpResult; + .ToJsonHttpResult().Result as ProblemHttpResult; result!.StatusCode.Should().Be(400); result!.ProblemDetails.Status.Should().Be(400); @@ -70,12 +70,12 @@ public void ResultT_Failure_can_be_mapped_to_HttpResult() } [Fact] - public async Task ResultT_Failure_can_be_mapped_to_HttpResult_Async() + public async Task ResultT_Failure_can_be_mapped_to_JsonHttpResult_Async() { var error = "Error"; var result = (await Task.FromResult(Result.Failure(error)) - .ToHttpResult()).Result as ProblemHttpResult; + .ToJsonHttpResult()).Result as ProblemHttpResult; result!.StatusCode.Should().Be(400); result!.ProblemDetails.Status.Should().Be(400); @@ -89,7 +89,7 @@ public void ResultT_Failure_StatusCode_can_be_changed() var error = "Error"; var result = Result.Failure(error) - .ToHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; + .ToJsonHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; result!.StatusCode.Should().Be(statusCode); result!.ProblemDetails.Status.Should().Be(statusCode); @@ -103,7 +103,7 @@ public async Task ResultT_Failure_StatusCode_can_be_changed_Async() var error = "Error"; var result = (await Task.FromResult(Result.Failure(error)) - .ToHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; + .ToJsonHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; result!.StatusCode.Should().Be(statusCode); result!.ProblemDetails.Status.Should().Be(statusCode); diff --git a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToJsonHttpResultT.cs similarity index 82% rename from CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResultT.cs rename to CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToJsonHttpResultT.cs index 7e06108..47f4241 100644 --- a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToHttpResultT.cs +++ b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToJsonHttpResultT.cs @@ -12,7 +12,7 @@ public static partial class ResultExtensions /// /// Returns a in case of success result. Returns in case of failure. You can override the success and error status code. /// - public static Results, ProblemHttpResult> ToHttpResult(this Result result, int successStatusCode = 200, int failureStatusCode = 400) + public static Results, ProblemHttpResult> ToJsonHttpResult(this Result result, int successStatusCode = 200, int failureStatusCode = 400) { if (result.IsSuccess) return TypedResults.Json(result.Value, statusCode: successStatusCode); @@ -31,8 +31,8 @@ public static Results, ProblemHttpResult> ToHttpResult(this /// /// Returns a in case of success result. Returns in case of failure. You can override the success and error status code. /// - public static async Task, ProblemHttpResult>> ToHttpResult(this Task> result, int successStatusCode = 200, int failureStatusCode = 400) + public static async Task, ProblemHttpResult>> ToJsonHttpResult(this Task> result, int successStatusCode = 200, int failureStatusCode = 400) { - return (await result).ToHttpResult(successStatusCode, failureStatusCode); + return (await result).ToJsonHttpResult(successStatusCode, failureStatusCode); } } \ No newline at end of file diff --git a/README.md b/README.md index 04bc1c6..ead61fc 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ These methods are available: | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | -| `.ToHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or custom error | From 80e6c636f683f9ed28b98ed9e98e098708586043 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 12:17:49 +0200 Subject: [PATCH 06/11] refactor!: rename ToHttpResult to ToJsonHttpResult --- .../Builders/ResultExtensionsClassBuilder.cs | 2 +- ...oHttpResultTE.cs => ToJsonHttpResultTE.cs} | 8 +++---- ...oHttpResultTE.cs => ToJsonHttpResultTE.cs} | 22 +++++++++---------- README.md | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) rename CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/{ToHttpResultTE.cs => ToJsonHttpResultTE.cs} (76%) rename CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/{ToHttpResultTE.cs => ToJsonHttpResultTE.cs} (76%) diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs index fedb64a..eb20ed0 100644 --- a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs +++ b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs @@ -21,7 +21,7 @@ public class ResultExtensionsClassBuilder(List requiredNamespaces, List< new ToCreatedHttpResultTE(), new ToFileHttpResultByteArrayE(), new ToFileStreamHttpResultStreamE(), - new ToHttpResultTE(), + new ToJsonHttpResultTE(), new ToNoContentHttpResultTE(), new ToStatusCodeHttpResultTE() ]; diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToJsonHttpResultTE.cs similarity index 76% rename from CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToHttpResultTE.cs rename to CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToJsonHttpResultTE.cs index 81fa64a..995a1a8 100644 --- a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToHttpResultTE.cs +++ b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToJsonHttpResultTE.cs @@ -1,6 +1,6 @@ namespace CSharpFunctionalExtensions.HttpResults.Generators.ResultExtensions; -internal class ToHttpResultTE: IGenerateMethods +internal class ToJsonHttpResultTE: IGenerateMethods { public string Generate(string mapperClassName, string resultErrorType, string httpResultType) { @@ -8,7 +8,7 @@ public string Generate(string mapperClassName, string resultErrorType, string ht /// /// Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. /// - public static Results, {{httpResultType}}> ToHttpResult(this Result result, int successStatusCode = 200) + public static Results, {{httpResultType}}> ToJsonHttpResult(this Result result, int successStatusCode = 200) { if (result.IsSuccess) return TypedResults.Json(result.Value, statusCode: successStatusCode); @@ -18,9 +18,9 @@ public string Generate(string mapperClassName, string resultErrorType, string ht /// /// Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. /// - public static async Task, {{httpResultType}}>> ToHttpResult(this Task> result, int successStatusCode = 200) + public static async Task, {{httpResultType}}>> ToJsonHttpResult(this Task> result, int successStatusCode = 200) { - return (await result).ToHttpResult(successStatusCode); + return (await result).ToJsonHttpResult(successStatusCode); } """; } diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultTE.cs similarity index 76% rename from CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultTE.cs rename to CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultTE.cs index 22707fa..054a9ad 100644 --- a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToHttpResultTE.cs +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToJsonHttpResultTE.cs @@ -4,10 +4,10 @@ namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; -public class ToHttpResultTE +public class ToJsonHttpResultTE { [Fact] - public void ResultTE_Success_can_be_mapped_to_HttpResult() + public void ResultTE_Success_can_be_mapped_to_JsonHttpResult() { var document = new Document { @@ -15,14 +15,14 @@ public void ResultTE_Success_can_be_mapped_to_HttpResult() }; var result = Result.Success(document) - .ToHttpResult().Result as JsonHttpResult; + .ToJsonHttpResult().Result as JsonHttpResult; result!.StatusCode.Should().Be(200); result!.Value!.DocumentId.Should().Be(document.DocumentId); } [Fact] - public async Task ResultTE_Success_can_be_mapped_to_HttpResult_Async() + public async Task ResultTE_Success_can_be_mapped_to_JsonHttpResult_Async() { var document = new Document { @@ -30,7 +30,7 @@ public async Task ResultTE_Success_can_be_mapped_to_HttpResult_Async() }; var result = (await Task.FromResult(Result.Success(document)) - .ToHttpResult()).Result as JsonHttpResult; + .ToJsonHttpResult()).Result as JsonHttpResult; result!.StatusCode.Should().Be(200); result!.Value!.DocumentId.Should().Be(document.DocumentId); @@ -46,7 +46,7 @@ public void ResultTE_Success_StatusCode_can_be_changed() }; var result = Result.Success(document) - .ToHttpResult(statusCode).Result as JsonHttpResult; + .ToJsonHttpResult(statusCode).Result as JsonHttpResult; result!.StatusCode.Should().Be(statusCode); } @@ -61,13 +61,13 @@ public async Task ResultTE_Success_StatusCode_can_be_changed_Async() }; var result = (await Task.FromResult(Result.Success(document)) - .ToHttpResult(statusCode)).Result as JsonHttpResult; + .ToJsonHttpResult(statusCode)).Result as JsonHttpResult; result!.StatusCode.Should().Be(statusCode); } [Fact] - public void ResultTE_Failure_can_be_mapped_to_HttpResult() + public void ResultTE_Failure_can_be_mapped_to_JsonHttpResult() { var error = new DocumentMissingError { @@ -75,14 +75,14 @@ public void ResultTE_Failure_can_be_mapped_to_HttpResult() }; var result = Result.Failure(error) - .ToHttpResult().Result as NotFound; + .ToJsonHttpResult().Result as NotFound; result!.StatusCode.Should().Be(404); result!.Value.Should().Be(error.DocumentId); } [Fact] - public async Task ResultTE_Failure_can_be_mapped_to_HttpResult_Async() + public async Task ResultTE_Failure_can_be_mapped_to_JsonHttpResult_Async() { var error = new DocumentMissingError { @@ -90,7 +90,7 @@ public async Task ResultTE_Failure_can_be_mapped_to_HttpResult_Async() }; var result = (await Task.FromResult(Result.Failure(error)) - .ToHttpResult()).Result as NotFound; + .ToJsonHttpResult()).Result as NotFound; result!.StatusCode.Should().Be(404); result!.Value.Should().Be(error.DocumentId); diff --git a/README.md b/README.md index ead61fc..70a78ae 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ These methods are available: | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | | `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | -| `.ToHttpResult()` | Returns `JsonHttpResult` or custom error | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or custom error | | `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | From 5190ca5ffae1c1bc884de76714d6cce54fcde9bc Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:27:00 +0200 Subject: [PATCH 07/11] refactor!: ToNoContentHttpResult returns NoContent instead of StatusCodeHttpResult --- .../ToNoContentHttpResultT.cs | 28 +------------ .../ToNoContentHttpResultT.cs | 12 +++--- README.md | 42 +++++++++---------- 3 files changed, 29 insertions(+), 53 deletions(-) diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultT.cs index 793f138..c5034aa 100644 --- a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultT.cs +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultT.cs @@ -12,7 +12,7 @@ public void ResultT_Success_can_be_mapped_to_NoContentHttpResult() var value = "foo"; var result = Result.Success(value) - .ToNoContentHttpResult().Result as StatusCodeHttpResult; + .ToNoContentHttpResult().Result as NoContent; result!.StatusCode.Should().Be(204); } @@ -23,35 +23,11 @@ public async Task ResultT_Success_can_be_mapped_to_NoContentHttpResult_Async() var value = "foo"; var result = (await Task.FromResult(Result.Success(value)) - .ToNoContentHttpResult()).Result as StatusCodeHttpResult; + .ToNoContentHttpResult()).Result as NoContent; result!.StatusCode.Should().Be(204); } - [Fact] - public void ResultT_Success_StatusCode_can_be_changed() - { - var statusCode = 210; - var value = "foo"; - - var result = Result.Success(value) - .ToNoContentHttpResult(statusCode).Result as StatusCodeHttpResult; - - result!.StatusCode.Should().Be(statusCode); - } - - [Fact] - public async Task ResultT_Success_StatusCode_can_be_changed_Async() - { - var statusCode = 210; - var value = "foo"; - - var result = (await Task.FromResult(Result.Success(value)) - .ToNoContentHttpResult(statusCode)).Result as StatusCodeHttpResult; - - result!.StatusCode.Should().Be(statusCode); - } - [Fact] public void ResultT_Failure_can_be_mapped_to_HttpResult() { diff --git a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToNoContentHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToNoContentHttpResultT.cs index d56f199..6342635 100644 --- a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToNoContentHttpResultT.cs +++ b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToNoContentHttpResultT.cs @@ -10,11 +10,11 @@ namespace CSharpFunctionalExtensions.HttpResults.ResultExtensions; public static partial class ResultExtensions { /// - /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the success and error status code. + /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the error status code. /// - public static Results ToNoContentHttpResult(this Result result, int successStatusCode = 204, int failureStatusCode = 400) + public static Results ToNoContentHttpResult(this Result result, int failureStatusCode = 400) { - if (result.IsSuccess) return TypedResults.StatusCode(successStatusCode); + if (result.IsSuccess) return TypedResults.NoContent(); var problemDetailsInfo = ProblemDetailsMap.Find(failureStatusCode); var problemDetails = new ProblemDetails @@ -29,10 +29,10 @@ public static Results ToNoContentHttpRe } /// - /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the success and error status code. + /// Discards the value of and Returns a in case of success result. Returns in case of failure. You can override the error status code. /// - public static async Task> ToNoContentHttpResult(this Task> result, int successStatusCode = 204, int failureStatusCode = 400) + public static async Task> ToNoContentHttpResult(this Task> result, int failureStatusCode = 400) { - return (await result).ToNoContentHttpResult(successStatusCode, failureStatusCode); + return (await result).ToNoContentHttpResult(failureStatusCode); } } \ No newline at end of file diff --git a/README.md b/README.md index 70a78ae..f1cb3dc 100644 --- a/README.md +++ b/README.md @@ -33,27 +33,27 @@ This library provides you extension methods to map the following types to `HttpR These methods are available: -| Method | Short Description | -|---------------------------------------|-----------------------------------------------------------------------------------------------| -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | -| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | -| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | -| `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or `ProblemHttpResult` | -| `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or custom error | -| `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | -| `.ToCreatedHttpResult()` | Returns `Created` or custom error | -| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or `ProblemHttpResult` | -| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or custom error | -| `.ToAcceptedHttpResult()` | Returns `Accepted` or `ProblemHttpResult` | -| `.ToAcceptedHttpResult()` | Returns `Accepted` or custom error | -| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or `ProblemHttpResult` | -| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or custom error | -| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or `ProblemHttpResult` | -| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or custom error | -| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or `ProblemHttpResult` | -| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or custom error | +| Method | Short Description | +|---------------------------------------|----------------------------------------------------------------------------------------| +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | +| `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or `ProblemHttpResult` | +| `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or custom error | +| `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | +| `.ToCreatedHttpResult()` | Returns `Created` or custom error | +| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or `ProblemHttpResult` | +| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or custom error | +| `.ToAcceptedHttpResult()` | Returns `Accepted` or `ProblemHttpResult` | +| `.ToAcceptedHttpResult()` | Returns `Accepted` or custom error | +| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or `ProblemHttpResult` | +| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or custom error | +| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or `ProblemHttpResult` | +| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or custom error | +| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or `ProblemHttpResult` | +| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or custom error | For almost every method you can override the default status codes for Success/Failure. From 2ad9e8b2566455de8840f7c17ab19d7cb2eddf74 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:28:13 +0200 Subject: [PATCH 08/11] refactor!: ToNoContentHttpResult returns NoContent instead of StatusCodeHttpResult --- .../ToNoContentHttpResultTE.cs | 12 +++--- .../ToNoContentHttpResultTE.cs | 28 +------------ README.md | 42 +++++++++---------- 3 files changed, 29 insertions(+), 53 deletions(-) diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToNoContentHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToNoContentHttpResultTE.cs index 81476d3..7ba4be1 100644 --- a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToNoContentHttpResultTE.cs +++ b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToNoContentHttpResultTE.cs @@ -6,21 +6,21 @@ public string Generate(string mapperClassName, string resultErrorType, string ht { return $$""" /// - /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. + /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. /// - public static Results ToNoContentHttpResult(this Result result, int successStatusCode = 204) + public static Results ToNoContentHttpResult(this Result result) { - if (result.IsSuccess) return TypedResults.StatusCode(successStatusCode); + if (result.IsSuccess) return TypedResults.NoContent(); return new {{mapperClassName}}().Map(result.Error); } /// - /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. You can override the success status code. + /// Discards the value of and Returns a in case of success result. Returns custom mapping in case of failure. /// - public static async Task> ToNoContentHttpResult(this Task> result, int successStatusCode = 204) + public static async Task> ToNoContentHttpResult(this Task> result) { - return (await result).ToNoContentHttpResult(successStatusCode); + return (await result).ToNoContentHttpResult(); } """; } diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultTE.cs index c08884b..0fa866b 100644 --- a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultTE.cs +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToNoContentHttpResultTE.cs @@ -13,7 +13,7 @@ public void ResultTE_Success_can_be_mapped_to_NoContentHttpResult() var value = "foo"; var result = Result.Success(value) - .ToNoContentHttpResult().Result as StatusCodeHttpResult; + .ToNoContentHttpResult().Result as NoContent; result!.StatusCode.Should().Be(204); } @@ -24,35 +24,11 @@ public async Task ResultTE_Success_can_be_mapped_to_NoContentHttpResult_Async() var value = "foo"; var result = (await Task.FromResult(Result.Success(value)) - .ToNoContentHttpResult()).Result as StatusCodeHttpResult; + .ToNoContentHttpResult()).Result as NoContent; result!.StatusCode.Should().Be(204); } - [Fact] - public void ResultTE_Success_StatusCode_can_be_changed() - { - var statusCode = 210; - var value = "foo"; - - var result = Result.Success(value) - .ToNoContentHttpResult(statusCode).Result as StatusCodeHttpResult; - - result!.StatusCode.Should().Be(statusCode); - } - - [Fact] - public async Task ResultTE_Success_StatusCode_can_be_changed_Async() - { - var statusCode = 210; - var value = "foo"; - - var result = (await Task.FromResult(Result.Success(value)) - .ToNoContentHttpResult(statusCode)).Result as StatusCodeHttpResult; - - result!.StatusCode.Should().Be(statusCode); - } - [Fact] public void ResultTE_Failure_can_be_mapped_to_HttpResult() { diff --git a/README.md b/README.md index f1cb3dc..69aa64d 100644 --- a/README.md +++ b/README.md @@ -33,27 +33,27 @@ This library provides you extension methods to map the following types to `HttpR These methods are available: -| Method | Short Description | -|---------------------------------------|----------------------------------------------------------------------------------------| -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | -| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | -| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | -| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | -| `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or `ProblemHttpResult` | -| `.ToNoContentHttpResult()` | Discards value of `Result` and returns empty `StatusCodeHttpResult` or custom error | -| `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | -| `.ToCreatedHttpResult()` | Returns `Created` or custom error | -| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or `ProblemHttpResult` | -| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or custom error | -| `.ToAcceptedHttpResult()` | Returns `Accepted` or `ProblemHttpResult` | -| `.ToAcceptedHttpResult()` | Returns `Accepted` or custom error | -| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or `ProblemHttpResult` | -| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or custom error | -| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or `ProblemHttpResult` | -| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or custom error | -| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or `ProblemHttpResult` | -| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or custom error | +| Method | Short Description | +|---------------------------------------|------------------------------------------------------------------------------| +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or `ProblemHttpResult` | +| `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | +| `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | +| `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or `ProblemHttpResult` | +| `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or custom error | +| `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | +| `.ToCreatedHttpResult()` | Returns `Created` or custom error | +| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or `ProblemHttpResult` | +| `.ToCreatedAtRouteHttpResult()` | Returns `CreatedAtRoute` or custom error | +| `.ToAcceptedHttpResult()` | Returns `Accepted` or `ProblemHttpResult` | +| `.ToAcceptedHttpResult()` | Returns `Accepted` or custom error | +| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or `ProblemHttpResult` | +| `.ToAcceptedAtRouteHttpResult()` | Returns `AcceptedAtRoute` or custom error | +| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or `ProblemHttpResult` | +| `.ToFileHttpResult()` | Returns `FileContentHttpResult` or custom error | +| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or `ProblemHttpResult` | +| `.ToFileStreamHttpResult()` | Returns `FileStreamHttpResult` or custom error | For almost every method you can override the default status codes for Success/Failure. From e27eb10af12934c4c2c03308c23d8e1c4097b61e Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:35:07 +0200 Subject: [PATCH 09/11] feat: add ToOkHttpResult method --- .../ResultExtensions/ToOkHttpResultT.cs | 86 +++++++++++++++++++ .../ResultExtensions/ToOkHttpResultT.cs | 38 ++++++++ README.md | 1 + 3 files changed, 125 insertions(+) create mode 100644 CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultT.cs create mode 100644 CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToOkHttpResultT.cs diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultT.cs new file mode 100644 index 0000000..38ec519 --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultT.cs @@ -0,0 +1,86 @@ +using CSharpFunctionalExtensions.HttpResults.ResultExtensions; +using FluentAssertions; +using Microsoft.AspNetCore.Http.HttpResults; + +namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; + +public class ToOkHttpResultT +{ + [Fact] + public void ResultT_Success_can_be_mapped_to_OkHttpResult() + { + var value = "foo"; + + var result = Result.Success(value) + .ToOkHttpResult().Result as Ok; + + result!.StatusCode.Should().Be(200); + result!.Value.Should().Be(value); + } + + [Fact] + public async Task ResultT_Success_can_be_mapped_to_OkHttpResult_Async() + { + var value = "foo"; + + var result = (await Task.FromResult(Result.Success(value)) + .ToOkHttpResult()).Result as Ok; + + result!.StatusCode.Should().Be(200); + result!.Value.Should().Be(value); + } + + [Fact] + public void ResultT_Failure_can_be_mapped_to_OkHttpResult() + { + var error = "Error"; + + var result = Result.Failure(error) + .ToOkHttpResult().Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(400); + result!.ProblemDetails.Status.Should().Be(400); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public async Task ResultT_Failure_can_be_mapped_to_OkHttpResult_Async() + { + var error = "Error"; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToOkHttpResult()).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(400); + result!.ProblemDetails.Status.Should().Be(400); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public void ResultT_Failure_StatusCode_can_be_changed() + { + var statusCode = 418; + var error = "Error"; + + var result = Result.Failure(error) + .ToOkHttpResult(failureStatusCode: statusCode).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(statusCode); + result!.ProblemDetails.Status.Should().Be(statusCode); + result!.ProblemDetails.Detail.Should().Be(error); + } + + [Fact] + public async Task ResultT_Failure_StatusCode_can_be_changed_Async() + { + var statusCode = 418; + var error = "Error"; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToOkHttpResult(failureStatusCode: statusCode)).Result as ProblemHttpResult; + + result!.StatusCode.Should().Be(statusCode); + result!.ProblemDetails.Status.Should().Be(statusCode); + result!.ProblemDetails.Detail.Should().Be(error); + } +} \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToOkHttpResultT.cs b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToOkHttpResultT.cs new file mode 100644 index 0000000..94ac012 --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults/ResultExtensions/ToOkHttpResultT.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; + +namespace CSharpFunctionalExtensions.HttpResults.ResultExtensions; + +/// +/// Extension methods for +/// +public static partial class ResultExtensions +{ + /// + /// Returns a in case of success result. Returns in case of failure. You can override the error status code. + /// + public static Results, ProblemHttpResult> ToOkHttpResult(this Result result, int failureStatusCode = 400) + { + if (result.IsSuccess) return TypedResults.Ok(result.Value); + + var problemDetailsInfo = ProblemDetailsMap.Find(failureStatusCode); + var problemDetails = new ProblemDetails + { + Status = failureStatusCode, + Title = problemDetailsInfo.Title, + Type = problemDetailsInfo.Type, + Detail = result.Error + }; + + return TypedResults.Problem(problemDetails); + } + + /// + /// Returns a in case of success result. Returns in case of failure. You can override the error status code. + /// + public static async Task, ProblemHttpResult>> ToOkHttpResult(this Task> result, int failureStatusCode = 400) + { + return (await result).ToOkHttpResult(failureStatusCode); + } +} \ No newline at end of file diff --git a/README.md b/README.md index 69aa64d..f0d4648 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ These methods are available: | `.ToStatusCodeHttpResult()` | Returns `StatusCodeHttpResult` or custom error | | `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | +| `.ToOkHttpResult()` | Returns `Ok` or `ProblemHttpResult` | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or `ProblemHttpResult` | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or custom error | | `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | From 3caf657d5766cf76990489868e96d79c26f7a790 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:40:22 +0200 Subject: [PATCH 10/11] feat: add ToOkHttpResult method --- .../Builders/ResultExtensionsClassBuilder.cs | 3 +- .../ResultExtensions/ToOkHttpResultTE.cs | 27 ++++++++ .../ResultExtensions/ToOkHttpResultTE.cs | 68 +++++++++++++++++++ README.md | 1 + 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToOkHttpResultTE.cs create mode 100644 CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultTE.cs diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs index eb20ed0..bccb99c 100644 --- a/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs +++ b/CSharpFunctionalExtensions.HttpResults.Generators/Builders/ResultExtensionsClassBuilder.cs @@ -23,6 +23,7 @@ public class ResultExtensionsClassBuilder(List requiredNamespaces, List< new ToFileStreamHttpResultStreamE(), new ToJsonHttpResultTE(), new ToNoContentHttpResultTE(), - new ToStatusCodeHttpResultTE() + new ToStatusCodeHttpResultTE(), + new ToOkHttpResultTE() ]; } \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToOkHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToOkHttpResultTE.cs new file mode 100644 index 0000000..b216c2e --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Generators/ResultExtensions/ToOkHttpResultTE.cs @@ -0,0 +1,27 @@ +namespace CSharpFunctionalExtensions.HttpResults.Generators.ResultExtensions; + +internal class ToOkHttpResultTE: IGenerateMethods +{ + public string Generate(string mapperClassName, string resultErrorType, string httpResultType) + { + return $$""" + /// + /// Returns a in case of success result. Returns custom mapping in case of failure. + /// + public static Results, {{httpResultType}}> ToOkHttpResult(this Result result) + { + if (result.IsSuccess) return TypedResults.Ok(result.Value); + + return new {{mapperClassName}}().Map(result.Error); + } + + /// + /// Returns a in case of success result. Returns custom mapping in case of failure. + /// + public static async Task, {{httpResultType}}>> ToOkHttpResult(this Task> result) + { + return (await result).ToOkHttpResult(); + } + """; + } +} \ No newline at end of file diff --git a/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultTE.cs b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultTE.cs new file mode 100644 index 0000000..584407b --- /dev/null +++ b/CSharpFunctionalExtensions.HttpResults.Tests/ResultExtensions/ToOkHttpResultTE.cs @@ -0,0 +1,68 @@ +using CSharpFunctionalExtensions.HttpResults.Tests.Shared; +using FluentAssertions; +using Microsoft.AspNetCore.Http.HttpResults; + +namespace CSharpFunctionalExtensions.HttpResults.Tests.ResultExtensions; + +public class ToOkHttpResultTE +{ + [Fact] + public void ResultTE_Success_can_be_mapped_to_OkHttpResult() + { + var document = new Document + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = Result.Success(document) + .ToOkHttpResult().Result as Ok; + + result!.StatusCode.Should().Be(200); + result!.Value!.DocumentId.Should().Be(document.DocumentId); + } + + [Fact] + public async Task ResultTE_Success_can_be_mapped_to_OkHttpResult_Async() + { + var document = new Document + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = (await Task.FromResult(Result.Success(document)) + .ToOkHttpResult()).Result as Ok; + + result!.StatusCode.Should().Be(200); + result!.Value!.DocumentId.Should().Be(document.DocumentId); + } + + [Fact] + public void ResultTE_Failure_can_be_mapped_to_OkHttpResult() + { + var error = new DocumentMissingError + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = Result.Failure(error) + .ToOkHttpResult().Result as NotFound; + + result!.StatusCode.Should().Be(404); + result!.Value.Should().Be(error.DocumentId); + } + + [Fact] + public async Task ResultTE_Failure_can_be_mapped_to_OkHttpResult_Async() + { + var error = new DocumentMissingError + { + DocumentId = Guid.NewGuid().ToString() + }; + + var result = (await Task.FromResult(Result.Failure(error)) + .ToOkHttpResult()).Result as NotFound; + + result!.StatusCode.Should().Be(404); + result!.Value.Should().Be(error.DocumentId); + } +} \ No newline at end of file diff --git a/README.md b/README.md index f0d4648..42f9924 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ These methods are available: | `.ToJsonHttpResult()` | Returns `JsonHttpResult` or `ProblemHttpResult` | | `.ToJsonHttpResult()` | Returns `JsonHttpResult` or custom error | | `.ToOkHttpResult()` | Returns `Ok` or `ProblemHttpResult` | +| `.ToOkHttpResult()` | Returns `Ok` or custom error | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or `ProblemHttpResult` | | `.ToNoContentHttpResult()` | Discards value of `Result` and returns `NoContent` or custom error | | `.ToCreatedHttpResult()` | Returns `Created` or `ProblemHttpResult` | From 933a2aaec25eb5b7baaa09f83fac5ad5c9fb6393 Mon Sep 17 00:00:00 2001 From: Tim Schneider <43130816+DerStimmler@users.noreply.github.com> Date: Thu, 18 Jul 2024 13:54:07 +0200 Subject: [PATCH 11/11] fix(readme): code example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42f9924..60a22aa 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ This library uses a Source Generator to generate extension methods for your own ```csharp app.MapGet("/users/{id}", (string id) => { return userRepository.Find(id) //Result - .ToHttpResult(); //returns 200 with User as payload or 404 with ProblemDetails object defined above + .ToOkHttpResult(); //returns 200 with User as payload or 404 with ProblemDetails object defined above }); ```