С другой стороны, это означает, что нам нужно будет определить, как мы хотим организовать код нашего приложения. Для целей этой главы мы собираемся использовать простую группировку папок, например, все контроллеры находятся в одной папке, все шаблоны HTML — в другой и так далее. Для более крупных приложений может иметь смысл иметь папки для каждой функции приложения в
Поскольку наше приложение основано на создании статей в блоге, давайте начнем с возможности создания новой статьи. После этого мы могли бы выполнить итерацию, чтобы сохранить ее в базе данных, обновить статью, удалить статью и получить все или определенные статьи. Однако прежде чем мы сможем создать конечную точку, нам нужно определить, что на самом деле представляет собой статья.
Сущность статьи
Следуя нашей организационной стратегии, давайте создадим новую папку и файл, скажем,
class Blog::Entities::Article include JSON::Serializable
def initialize(@title : String, @body : String); end
getter! id : Int64
property title : String
property body : String
getter! updated_at : Time
getter! created_at : Time
getter deleted_at : Time?
end
Этот объект определяет некоторые основные точки данных, связанные со статьей, такие как ее идентификатор, заголовок и текст. Он также имеет некоторые метаданные, например, когда он был создан, обновлен и удален.
Мы используем версию макроса getter
для обработки идентификатора и создания/обновления свойств. Этот макрос создает переменную экземпляра, допускающую значение nilable
, и два метода, которыми в случае нашего свойства ID будут #id
и #id?
. Первый повышается, если значение равно nil
. Это хорошо работает для столбцов, которые на практике будут иметь значения большую часть времени, но не будут иметь их, пока они не будут сохранены в базе данных.
Поскольку наше приложение будет в первую очередь служить API, мы также включаем JSON::Serializable
для обработки (де)сериализации. Компонент сериализатора Athena имеет аналогичный модуль ASR::Serializable
, который работает таким же образом, но с дополнительными функциями. На данный момент нам особо не нужны никакие дополнительные возможности. Мы всегда можем вернуться к нему, если возникнет необходимость. См. https://athenaframework.org/Serializer/ для получения дополнительной информации.
Возврат статьи
Теперь, когда у нас есть смоделированная сущность статьи, мы можем перейти к созданию конечной точки, которая будет обрабатывать ее создание на основе тела запроса. Как и в случае с типом статьи, давайте создадим наш контроллер в специальной папке, например
Athena — это платформа Model View Controller (MVC), в которой контроллер — это класс, который содержит один или несколько методов, которым сопоставлены маршруты. Например, добавьте следующий код в наш файл контроллера:
class Blog::Controllers::ArticleController < ATH::Controller
@[ARTA::Post("/article")]
def create_article : ATH::Response
ATH::Response.new(
Blog::Entities::Article.new("Title", "Body").to_json,
headers: HTTP::Headers{"content-type" =>
"application/ json"}
)
end
end