struct Athena::Framework::Controller::ValueResolvers::RequestBody
inherits Struct
#
Attempts to resolve the value of any parameter with the ATHA::MapRequestBody
annotation by
deserializing the request body into an object of the type of the related parameter.
Also handles running any validations defined on it, if it is AVD::Validatable
.
Requires the type of the related parameter to include either ASR::Serializable
or JSON::Serializable
.
require "athena"
# A type representing the structure of the request body.
struct UserCreate
# Include some modules to tell Athena this type can be deserialized and validated
include AVD::Validatable
include JSON::Serializable
# Assert the user's name is not blank.
@[Assert::NotBlank]
getter first_name : String
# Assert the user's name is not blank.
@[Assert::NotBlank]
getter last_name : String
# Assert the user's email is not blank and is a valid HTMl5 email.
@[Assert::NotBlank]
@[Assert::Email(:html5)]
getter email : String
end
class UserController < ATH::Controller
@[ARTA::Post("/user")]
@[ATHA::View(status: :created)]
def new_user(
@[ATHA::MapRequestBody]
user_create : UserCreate,
) : UserCreate
# Use the provided UserCreate instance to create an actual User DB record.
# For purposes of this example, just return the instance.
user_create
end
end
ATH.run
Making a request to the /user
endpoint with the following payload:
{
"first_name": "George",
"last_name": "",
"email": "athenaframework.org"
}
Would return the response:
{
"code": 422,
"message": "Validation failed",
"errors": [
{
"property": "last_name",
"message": "This value should not be blank.",
"code": "0d0c3254-3642-4cb0-9882-46ee5918e6e3"
},
{
"property": "email",
"message": "This value is not a valid email address.",
"code": "ad9d877d-9ad1-4dd7-b77b-e419934e5910"
}
]
}
While a valid request would return this response body, with a 201 status code:
{
"first_name": "George",
"last_name": "Dietrich",
"email": "[email protected]"
}
Included modules
Athena::Framework::Controller::ValueResolvers::Interface::Typed
Constructors#
.new(serializer : ASR::SerializerInterface, validator : AVD::Validator::ValidatorInterface)
#
Methods#
#resolve(request : ATH::Request, parameter : ATH::Controller::ParameterMetadata)
#
Returns a value resolved from the provided request and parameter if possible, otherwise returns nil
if no parameter could be resolved.