From c93020745ade9ef4e90f9814353260f1952dde09 Mon Sep 17 00:00:00 2001 From: Maksym Sadovnychyy Date: Sun, 25 Aug 2024 04:05:09 +0200 Subject: [PATCH] (feature): init --- .gitattributes | 63 ++++++ .gitignore | 266 +++++++++++++++++++++++ src/MaksIT.Results/MaksIT.Results.csproj | 13 ++ src/MaksIT.Results/Result.ClientError.cs | 250 +++++++++++++++++++++ src/MaksIT.Results/Result.Information.cs | 75 +++++++ src/MaksIT.Results/Result.Redirection.cs | 138 ++++++++++++ src/MaksIT.Results/Result.ServerError.cs | 186 ++++++++++++++++ src/MaksIT.Results/Result.Succes.cs | 169 ++++++++++++++ src/MaksIT.Results/Result.cs | 71 ++++++ 9 files changed, 1231 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 src/MaksIT.Results/MaksIT.Results.csproj create mode 100644 src/MaksIT.Results/Result.ClientError.cs create mode 100644 src/MaksIT.Results/Result.Information.cs create mode 100644 src/MaksIT.Results/Result.Redirection.cs create mode 100644 src/MaksIT.Results/Result.ServerError.cs create mode 100644 src/MaksIT.Results/Result.Succes.cs create mode 100644 src/MaksIT.Results/Result.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f09bf8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,266 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs +.directory + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + + +**/*docker-compose/LetsEncryptServer/acme +**/*docker-compose/LetsEncryptServer/cache \ No newline at end of file diff --git a/src/MaksIT.Results/MaksIT.Results.csproj b/src/MaksIT.Results/MaksIT.Results.csproj new file mode 100644 index 0000000..766e967 --- /dev/null +++ b/src/MaksIT.Results/MaksIT.Results.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/src/MaksIT.Results/Result.ClientError.cs b/src/MaksIT.Results/Result.ClientError.cs new file mode 100644 index 0000000..7d01ae1 --- /dev/null +++ b/src/MaksIT.Results/Result.ClientError.cs @@ -0,0 +1,250 @@ +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + + /// + /// Returns a result indicating that the server could not understand the request due to invalid syntax. + /// Corresponds to HTTP status code 400 Bad Request. + /// + public static Result BadRequest(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.BadRequest); + } + + /// + /// Returns a result indicating that the client must authenticate itself to get the requested response. + /// Corresponds to HTTP status code 401 Unauthorized. + /// + public static Result Unauthorized(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.Unauthorized); + } + + /// + /// Returns a result indicating that the client does not have access rights to the content. + /// Corresponds to HTTP status code 403 Forbidden. + /// + public static Result Forbidden(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.Forbidden); + } + + /// + /// Returns a result indicating that the server can not find the requested resource. + /// Corresponds to HTTP status code 404 Not Found. + /// + public static Result NotFound(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.NotFound); + } + + /// + /// Returns a result indicating that the request could not be completed due to a conflict with the current state of the resource. + /// Corresponds to HTTP status code 409 Conflict. + /// + public static Result Conflict(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.Conflict); + } + + /// + /// Returns a result indicating that the requested resource is no longer available and will not be available again. + /// Corresponds to HTTP status code 410 Gone. + /// + public static Result Gone(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)410); // 410 Gone + } + + /// + /// Returns a result indicating that the request failed because it depended on another request and that request failed. + /// Corresponds to HTTP status code 424 Failed Dependency. + /// + public static Result FailedDependency(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)424); // 424 Failed Dependency + } + + /// + /// Returns a result indicating that the server requires the request to be conditional. + /// Corresponds to HTTP status code 428 Precondition Required. + /// + public static Result PreconditionRequired(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)428); // 428 Precondition Required + } + + /// + /// Returns a result indicating that the user has sent too many requests in a given amount of time. + /// Corresponds to HTTP status code 429 Too Many Requests. + /// + public static Result TooManyRequests(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)429); // 429 Too Many Requests + } + + /// + /// Returns a result indicating that the server is unwilling to process the request because its header fields are too large. + /// Corresponds to HTTP status code 431 Request Header Fields Too Large. + /// + public static Result RequestHeaderFieldsTooLarge(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)431); // 431 Request Header Fields Too Large + } + + /// + /// Returns a result indicating that the server cannot process the request entity because it is too large. + /// Corresponds to HTTP status code 413 Payload Too Large. + /// + public static Result PayloadTooLarge(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)413); // 413 Payload Too Large + } + + /// + /// Returns a result indicating that the server cannot process the request because the URI is too long. + /// Corresponds to HTTP status code 414 URI Too Long. + /// + public static Result UriTooLong(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)414); // 414 URI Too Long + } + + /// + /// Returns a result indicating that the server cannot process the request because the media type is unsupported. + /// Corresponds to HTTP status code 415 Unsupported Media Type. + /// + public static Result UnsupportedMediaType(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.UnsupportedMediaType); + } + + /// + /// Returns a result indicating that the server cannot process the request because it expects the request to have a defined Content-Length header. + /// Corresponds to HTTP status code 411 Length Required. + /// + public static Result LengthRequired(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)411); // 411 Length Required + } + + /// + /// Returns a result indicating that the server cannot process the request due to an illegal request entity. + /// Corresponds to HTTP status code 422 Unprocessable Entity. + /// + public static Result UnprocessableEntity(params string[] messages) { + return new Result(false, new List(messages), (HttpStatusCode)422); // 422 Unprocessable Entity + } + } + + public partial class Result : Result { + + /// + /// Returns a result indicating that the server could not understand the request due to invalid syntax. + /// Corresponds to HTTP status code 400 Bad Request. + /// + public static Result BadRequest(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.BadRequest); + } + + /// + /// Returns a result indicating that the client must authenticate itself to get the requested response. + /// Corresponds to HTTP status code 401 Unauthorized. + /// + public static Result Unauthorized(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.Unauthorized); + } + + /// + /// Returns a result indicating that the client does not have access rights to the content. + /// Corresponds to HTTP status code 403 Forbidden. + /// + public static Result Forbidden(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.Forbidden); + } + + /// + /// Returns a result indicating that the server can not find the requested resource. + /// Corresponds to HTTP status code 404 Not Found. + /// + public static Result NotFound(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.NotFound); + } + + /// + /// Returns a result indicating that the request could not be completed due to a conflict with the current state of the resource. + /// Corresponds to HTTP status code 409 Conflict. + /// + public static Result Conflict(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.Conflict); + } + + /// + /// Returns a result indicating that the requested resource is no longer available and will not be available again. + /// Corresponds to HTTP status code 410 Gone. + /// + public static Result Gone(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)410); // 410 Gone + } + + /// + /// Returns a result indicating that the request failed because it depended on another request and that request failed. + /// Corresponds to HTTP status code 424 Failed Dependency. + /// + public static Result FailedDependency(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)424); // 424 Failed Dependency + } + + /// + /// Returns a result indicating that the server requires the request to be conditional. + /// Corresponds to HTTP status code 428 Precondition Required. + /// + public static Result PreconditionRequired(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)428); // 428 Precondition Required + } + + /// + /// Returns a result indicating that the user has sent too many requests in a given amount of time. + /// Corresponds to HTTP status code 429 Too Many Requests. + /// + public static Result TooManyRequests(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)429); // 429 Too Many Requests + } + + /// + /// Returns a result indicating that the server is unwilling to process the request because its header fields are too large. + /// Corresponds to HTTP status code 431 Request Header Fields Too Large. + /// + public static Result RequestHeaderFieldsTooLarge(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)431); // 431 Request Header Fields Too Large + } + + /// + /// Returns a result indicating that the server cannot process the request entity because it is too large. + /// Corresponds to HTTP status code 413 Payload Too Large. + /// + public static Result PayloadTooLarge(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)413); // 413 Payload Too Large + } + + /// + /// Returns a result indicating that the server cannot process the request because the URI is too long. + /// Corresponds to HTTP status code 414 URI Too Long. + /// + public static Result UriTooLong(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)414); // 414 URI Too Long + } + + /// + /// Returns a result indicating that the server cannot process the request because the media type is unsupported. + /// Corresponds to HTTP status code 415 Unsupported Media Type. + /// + public static Result UnsupportedMediaType(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.UnsupportedMediaType); + } + + /// + /// Returns a result indicating that the server cannot process the request because it expects the request to have a defined Content-Length header. + /// Corresponds to HTTP status code 411 Length Required. + /// + public static Result LengthRequired(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)411); // 411 Length Required + } + + /// + /// Returns a result indicating that the server cannot process the request due to an illegal request entity. + /// Corresponds to HTTP status code 422 Unprocessable Entity. + /// + public static Result UnprocessableEntity(T? value, params string[] messages) { + return new Result(value, false, new List(messages), (HttpStatusCode)422); // 422 Unprocessable Entity + } + } +} diff --git a/src/MaksIT.Results/Result.Information.cs b/src/MaksIT.Results/Result.Information.cs new file mode 100644 index 0000000..efa2ff1 --- /dev/null +++ b/src/MaksIT.Results/Result.Information.cs @@ -0,0 +1,75 @@ +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + + /// + /// Returns a result indicating that the initial part of a request has been received and the client should continue with the request. + /// Corresponds to HTTP status code 100 Continue. + /// + public static Result Continue(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.Continue); + } + + /// + /// Returns a result indicating that the server is switching to a different protocol as requested by the client. + /// Corresponds to HTTP status code 101 Switching Protocols. + /// + public static Result SwitchingProtocols(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.SwitchingProtocols); + } + + /// + /// Returns a result indicating that the server has received and is processing the request, but no response is available yet. + /// Corresponds to HTTP status code 102 Processing. + /// + public static Result Processing(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.Processing); + } + + /// + /// Returns a result indicating that the server is sending information about early hints that may be used by the client to begin preloading resources while the server prepares a final response. + /// Corresponds to HTTP status code 103 Early Hints. + /// + public static Result EarlyHints(params string[] messages) { + return new Result(true, new List(messages), (HttpStatusCode)103); // Early Hints is not defined in HttpStatusCode enum, 103 is the official code + } + + } + + public partial class Result : Result { + + /// + /// Returns a result indicating that the initial part of a request has been received and the client should continue with the request. + /// Corresponds to HTTP status code 100 Continue. + /// + public static Result Continue(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.Continue); + } + + /// + /// Returns a result indicating that the server is switching to a different protocol as requested by the client. + /// Corresponds to HTTP status code 101 Switching Protocols. + /// + public static Result SwitchingProtocols(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.SwitchingProtocols); + } + + /// + /// Returns a result indicating that the server has received and is processing the request, but no response is available yet. + /// Corresponds to HTTP status code 102 Processing. + /// + public static Result Processing(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.Processing); + } + + /// + /// Returns a result indicating that the server is sending information about early hints that may be used by the client to begin preloading resources while the server prepares a final response. + /// Corresponds to HTTP status code 103 Early Hints. + /// + public static Result EarlyHints(T? value, params string[] messages) { + return new Result(value, true, new List(messages), (HttpStatusCode)103); // Early Hints is not defined in HttpStatusCode enum, 103 is the official code + } + } +} diff --git a/src/MaksIT.Results/Result.Redirection.cs b/src/MaksIT.Results/Result.Redirection.cs new file mode 100644 index 0000000..0252a60 --- /dev/null +++ b/src/MaksIT.Results/Result.Redirection.cs @@ -0,0 +1,138 @@ +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + + /// + /// Returns a result indicating that the request has multiple options, and the user or user-agent should select one of them. + /// Corresponds to HTTP status code 300 Multiple Choices. + /// + public static Result MultipleChoices(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.MultipleChoices); + } + + /// + /// Returns a result indicating that the requested resource has been permanently moved to a new URI. + /// Corresponds to HTTP status code 301 Moved Permanently. + /// + public static Result MovedPermanently(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.MovedPermanently); + } + + /// + /// Returns a result indicating that the requested resource resides temporarily under a different URI. + /// Corresponds to HTTP status code 302 Found. + /// + public static Result Found(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.Found); + } + + /// + /// Returns a result indicating that the response to the request can be found under another URI using the GET method. + /// Corresponds to HTTP status code 303 See Other. + /// + public static Result SeeOther(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.SeeOther); + } + + /// + /// Returns a result indicating that the requested resource has not been modified since the last request. + /// Corresponds to HTTP status code 304 Not Modified. + /// + public static Result NotModified(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.NotModified); + } + + /// + /// Returns a result indicating that the requested resource must be accessed through the proxy given by the location field. + /// Corresponds to HTTP status code 305 Use Proxy. + /// + public static Result UseProxy(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.UseProxy); + } + + /// + /// Returns a result indicating that the requested resource resides temporarily under a different URI, but future requests should still use the original URI. + /// Corresponds to HTTP status code 307 Temporary Redirect. + /// + public static Result TemporaryRedirect(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.TemporaryRedirect); + } + + /// + /// Returns a result indicating that the requested resource has been permanently moved to a new URI, and future references should use the new URI. + /// Corresponds to HTTP status code 308 Permanent Redirect. + /// + public static Result PermanentRedirect(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.PermanentRedirect); + } + } + + public partial class Result : Result { + + /// + /// Returns a result indicating that the request has multiple options, and the user or user-agent should select one of them. + /// Corresponds to HTTP status code 300 Multiple Choices. + /// + public static Result MultipleChoices(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.MultipleChoices); + } + + /// + /// Returns a result indicating that the requested resource has been permanently moved to a new URI. + /// Corresponds to HTTP status code 301 Moved Permanently. + /// + public static Result MovedPermanently(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.MovedPermanently); + } + + /// + /// Returns a result indicating that the requested resource resides temporarily under a different URI. + /// Corresponds to HTTP status code 302 Found. + /// + public static Result Found(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.Found); + } + + /// + /// Returns a result indicating that the response to the request can be found under another URI using the GET method. + /// Corresponds to HTTP status code 303 See Other. + /// + public static Result SeeOther(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.SeeOther); + } + + /// + /// Returns a result indicating that the requested resource has not been modified since the last request. + /// Corresponds to HTTP status code 304 Not Modified. + /// + public static Result NotModified(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.NotModified); + } + + /// + /// Returns a result indicating that the requested resource must be accessed through the proxy given by the location field. + /// Corresponds to HTTP status code 305 Use Proxy. + /// + public static Result UseProxy(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.UseProxy); + } + + /// + /// Returns a result indicating that the requested resource resides temporarily under a different URI, but future requests should still use the original URI. + /// Corresponds to HTTP status code 307 Temporary Redirect. + /// + public static Result TemporaryRedirect(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.TemporaryRedirect); + } + + /// + /// Returns a result indicating that the requested resource has been permanently moved to a new URI, and future references should use the new URI. + /// Corresponds to HTTP status code 308 Permanent Redirect. + /// + public static Result PermanentRedirect(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.PermanentRedirect); + } + } +} diff --git a/src/MaksIT.Results/Result.ServerError.cs b/src/MaksIT.Results/Result.ServerError.cs new file mode 100644 index 0000000..e9b60d4 --- /dev/null +++ b/src/MaksIT.Results/Result.ServerError.cs @@ -0,0 +1,186 @@ +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + + /// + /// Returns a result indicating the server encountered an unexpected condition that prevented it from fulfilling the request. + /// Corresponds to HTTP status code 500 Internal Server Error. + /// + public static Result InternalServerError(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.InternalServerError); + } + + /// + /// Returns a result indicating the server does not support the functionality required to fulfill the request. + /// Corresponds to HTTP status code 501 Not Implemented. + /// + public static Result NotImplemented(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.NotImplemented); + } + + /// + /// Returns a result indicating the server, while acting as a gateway or proxy, received an invalid response from the upstream server. + /// Corresponds to HTTP status code 502 Bad Gateway. + /// + public static Result BadGateway(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.BadGateway); + } + + /// + /// Returns a result indicating the server is currently unable to handle the request due to temporary overload or maintenance of the server. + /// Corresponds to HTTP status code 503 Service Unavailable. + /// + public static Result ServiceUnavailable(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.ServiceUnavailable); + } + + /// + /// Returns a result indicating the server, while acting as a gateway or proxy, did not receive a timely response from the upstream server. + /// Corresponds to HTTP status code 504 Gateway Timeout. + /// + public static Result GatewayTimeout(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.GatewayTimeout); + } + + /// + /// Returns a result indicating the server does not support the HTTP protocol version used in the request. + /// Corresponds to HTTP status code 505 HTTP Version Not Supported. + /// + public static Result HttpVersionNotSupported(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.HttpVersionNotSupported); + } + + /// + /// Returns a result indicating the server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process. + /// Corresponds to HTTP status code 506 Variant Also Negotiates. + /// + public static Result VariantAlsoNegotiates(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.VariantAlsoNegotiates); + } + + /// + /// Returns a result indicating the server is unable to store the representation needed to complete the request. + /// Corresponds to HTTP status code 507 Insufficient Storage. + /// + public static Result InsufficientStorage(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.InsufficientStorage); + } + + /// + /// Returns a result indicating the server detected an infinite loop while processing a request with depth: infinity. Usually encountered in WebDAV scenarios. + /// Corresponds to HTTP status code 508 Loop Detected. + /// + public static Result LoopDetected(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.LoopDetected); + } + + /// + /// Returns a result indicating further extensions to the request are required for the server to fulfill it. + /// Corresponds to HTTP status code 510 Not Extended. + /// + public static Result NotExtended(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.NotExtended); + } + + /// + /// Returns a result indicating the client needs to authenticate to gain network access. + /// Corresponds to HTTP status code 511 Network Authentication Required. + /// + public static Result NetworkAuthenticationRequired(params string[] messages) { + return new Result(false, new List(messages), HttpStatusCode.NetworkAuthenticationRequired); + } + } + + public partial class Result : Result { + + /// + /// Returns a result indicating the server encountered an unexpected condition that prevented it from fulfilling the request. + /// Corresponds to HTTP status code 500 Internal Server Error. + /// + public static Result InternalServerError(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.InternalServerError); + } + + /// + /// Returns a result indicating the server does not support the functionality required to fulfill the request. + /// Corresponds to HTTP status code 501 Not Implemented. + /// + public static Result NotImplemented(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.NotImplemented); + } + + /// + /// Returns a result indicating the server, while acting as a gateway or proxy, received an invalid response from the upstream server. + /// Corresponds to HTTP status code 502 Bad Gateway. + /// + public static Result BadGateway(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.BadGateway); + } + + /// + /// Returns a result indicating the server is currently unable to handle the request due to temporary overload or maintenance of the server. + /// Corresponds to HTTP status code 503 Service Unavailable. + /// + public static Result ServiceUnavailable(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.ServiceUnavailable); + } + + /// + /// Returns a result indicating the server, while acting as a gateway or proxy, did not receive a timely response from the upstream server. + /// Corresponds to HTTP status code 504 Gateway Timeout. + /// + public static Result GatewayTimeout(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.GatewayTimeout); + } + + /// + /// Returns a result indicating the server does not support the HTTP protocol version used in the request. + /// Corresponds to HTTP status code 505 HTTP Version Not Supported. + /// + public static Result HttpVersionNotSupported(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.HttpVersionNotSupported); + } + + /// + /// Returns a result indicating the server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process. + /// Corresponds to HTTP status code 506 Variant Also Negotiates. + /// + public static Result VariantAlsoNegotiates(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.VariantAlsoNegotiates); + } + + /// + /// Returns a result indicating the server is unable to store the representation needed to complete the request. + /// Corresponds to HTTP status code 507 Insufficient Storage. + /// + public static Result InsufficientStorage(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.InsufficientStorage); + } + + /// + /// Returns a result indicating the server detected an infinite loop while processing a request with depth: infinity. Usually encountered in WebDAV scenarios. + /// Corresponds to HTTP status code 508 Loop Detected. + /// + public static Result LoopDetected(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.LoopDetected); + } + + /// + /// Returns a result indicating further extensions to the request are required for the server to fulfill it. + /// Corresponds to HTTP status code 510 Not Extended. + /// + public static Result NotExtended(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.NotExtended); + } + + /// + /// Returns a result indicating the client needs to authenticate to gain network access. + /// Corresponds to HTTP status code 511 Network Authentication Required. + /// + public static Result NetworkAuthenticationRequired(T? value, params string[] messages) { + return new Result(value, false, new List(messages), HttpStatusCode.NetworkAuthenticationRequired); + } + } +} diff --git a/src/MaksIT.Results/Result.Succes.cs b/src/MaksIT.Results/Result.Succes.cs new file mode 100644 index 0000000..0180ba3 --- /dev/null +++ b/src/MaksIT.Results/Result.Succes.cs @@ -0,0 +1,169 @@ +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + + /// + /// Returns a result indicating the request was successful and the server returned the requested data. + /// Corresponds to HTTP status code 200 OK. + /// + public static Result Ok(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.OK); + } + + /// + /// Returns a result indicating the request was successful and a new resource was created. + /// Corresponds to HTTP status code 201 Created. + /// + public static Result Created(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.Created); + } + + /// + /// Returns a result indicating the request has been accepted for processing, but the processing is not yet complete. + /// Corresponds to HTTP status code 202 Accepted. + /// + public static Result Accepted(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.Accepted); + } + + /// + /// Returns a result indicating the request was successful but the response contains metadata from a source other than the origin server. + /// Corresponds to HTTP status code 203 Non-Authoritative Information. + /// + public static Result NonAuthoritativeInformation(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.NonAuthoritativeInformation); + } + + /// + /// Returns a result indicating the request was successful but there is no content to send in the response. + /// Corresponds to HTTP status code 204 No Content. + /// + public static Result NoContent(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.NoContent); + } + + /// + /// Returns a result indicating the request was successful, but the user-agent should reset the document view that caused the request. + /// Corresponds to HTTP status code 205 Reset Content. + /// + public static Result ResetContent(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.ResetContent); + } + + /// + /// Returns a result indicating the request was successful and the server is delivering only part of the resource due to a range header sent by the client. + /// Corresponds to HTTP status code 206 Partial Content. + /// + public static Result PartialContent(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.PartialContent); + } + + /// + /// Returns a result indicating the request was successful and the response contains multiple status codes, typically used for WebDAV. + /// Corresponds to HTTP status code 207 Multi-Status. + /// + public static Result MultiStatus(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.MultiStatus); + } + + /// + /// Returns a result indicating the request was successful and the information has already been reported in a previous response. + /// Corresponds to HTTP status code 208 Already Reported. + /// + public static Result AlreadyReported(params string[] messages) { + return new Result(true, new List(messages), HttpStatusCode.AlreadyReported); + } + + /// + /// Returns a result indicating the request was successful and the server fulfilled the request for the resource using the delta encoding method. + /// Corresponds to HTTP status code 226 IM Used. + /// + public static Result IMUsed(params string[] messages) { + return new Result(true, new List(messages), (HttpStatusCode)226); // 226 is the official status code for IM Used + } + } + public partial class Result : Result { + + /// + /// Returns a result indicating the request was successful and the server returned the requested data. + /// Corresponds to HTTP status code 200 OK. + /// + public static Result Ok(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.OK); + } + + /// + /// Returns a result indicating the request was successful and a new resource was created. + /// Corresponds to HTTP status code 201 Created. + /// + public static Result Created(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.Created); + } + + /// + /// Returns a result indicating the request has been accepted for processing, but the processing is not yet complete. + /// Corresponds to HTTP status code 202 Accepted. + /// + public static Result Accepted(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.Accepted); + } + + /// + /// Returns a result indicating the request was successful but the response contains metadata from a source other than the origin server. + /// Corresponds to HTTP status code 203 Non-Authoritative Information. + /// + public static Result NonAuthoritativeInformation(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.NonAuthoritativeInformation); + } + + /// + /// Returns a result indicating the request was successful but there is no content to send in the response. + /// Corresponds to HTTP status code 204 No Content. + /// + public static Result NoContent(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.NoContent); + } + + /// + /// Returns a result indicating the request was successful, but the user-agent should reset the document view that caused the request. + /// Corresponds to HTTP status code 205 Reset Content. + /// + public static Result ResetContent(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.ResetContent); + } + + /// + /// Returns a result indicating the request was successful and the server is delivering only part of the resource due to a range header sent by the client. + /// Corresponds to HTTP status code 206 Partial Content. + /// + public static Result PartialContent(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.PartialContent); + } + + /// + /// Returns a result indicating the request was successful and the response contains multiple status codes, typically used for WebDAV. + /// Corresponds to HTTP status code 207 Multi-Status. + /// + public static Result MultiStatus(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.MultiStatus); + } + + /// + /// Returns a result indicating the request was successful and the information has already been reported in a previous response. + /// Corresponds to HTTP status code 208 Already Reported. + /// + public static Result AlreadyReported(T? value, params string[] messages) { + return new Result(value, true, new List(messages), HttpStatusCode.AlreadyReported); + } + + /// + /// Returns a result indicating the request was successful and the server fulfilled the request for the resource using the delta encoding method. + /// Corresponds to HTTP status code 226 IM Used. + /// + public static Result IMUsed(T? value, params string[] messages) { + return new Result(value, true, new List(messages), (HttpStatusCode)226); // 226 is the official status code for IM Used + } + } +} diff --git a/src/MaksIT.Results/Result.cs b/src/MaksIT.Results/Result.cs new file mode 100644 index 0000000..9d2c788 --- /dev/null +++ b/src/MaksIT.Results/Result.cs @@ -0,0 +1,71 @@ +using Microsoft.AspNetCore.Mvc; +using System.Net; + +namespace MaksIT.Results { + + public partial class Result { + public bool IsSuccess { get; } + public List Messages { get; } + public HttpStatusCode StatusCode { get; } + + protected Result(bool isSuccess, List messages, HttpStatusCode statusCode) { + IsSuccess = isSuccess; + Messages = messages ?? new List(); + StatusCode = statusCode; + } + + /// + /// Converts the current Result to an IActionResult. + /// + /// IActionResult that represents the HTTP response. + public virtual IActionResult ToActionResult() { + if (IsSuccess) { + return new StatusCodeResult((int)StatusCode); + } + else { + var problemDetails = new ProblemDetails { + Status = (int)StatusCode, + Title = "An error occurred", + Detail = string.Join("; ", Messages), + Instance = null // You can customize the instance URI if needed + }; + return new ObjectResult(problemDetails) { StatusCode = (int)StatusCode }; + } + } + } + + public partial class Result : Result { + public T? Value { get; } + + protected Result(T? value, bool isSuccess, List messages, HttpStatusCode statusCode) + : base(isSuccess, messages, statusCode) { + Value = value; + } + + /// + /// Creates a new by applying a transformation function to the current value. + /// + /// The type of the new value. + /// A function that transforms the current value to the new value, which can be null. + /// A new object containing the transformed value, along with the original success status, messages, and status code. + public Result WithNewValue(Func newValueFunc) { + return new Result(newValueFunc(Value), IsSuccess, Messages, StatusCode); + } + + /// + /// Converts the current Result to an IActionResult. + /// + /// IActionResult that represents the HTTP response. + public override IActionResult ToActionResult() { + if (IsSuccess) { + if (Value is not null) { + return new ObjectResult(Value) { StatusCode = (int)StatusCode }; + } + return ToActionResult(); + } + else { + return ToActionResult(); + } + } + } +}