Skip to content

struct Athena::Framework::Controller::ValueResolvers::RequestBody
inherits Struct #

Attempts to resolve the value of any parameter with the ATHR::RequestBody::Extract 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(
    @[ATHR::RequestBody::Extract]
    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)#

View source

Methods#

#resolve(request : ATH::Request, parameter : ATH::Controller::ParameterMetadata(T)) : T | Nil forall T#

:inherit:

View source