gitextract_ovv508se/ ├── .gitignore ├── Changelog.md ├── Chapter 01/ │ └── .gitkeep ├── Chapter 02/ │ ├── SPM/ │ │ ├── .gitignore │ │ ├── Package.swift │ │ ├── README.md │ │ └── Sources/ │ │ └── main.swift │ └── VaporToolbox/ │ ├── .dockerignore │ ├── .gitignore │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ └── .gitkeep │ ├── README.md │ ├── Sources/ │ │ └── myProject/ │ │ ├── Controllers/ │ │ │ └── .gitkeep │ │ ├── configure.swift │ │ ├── entrypoint.swift │ │ └── routes.swift │ ├── Tests/ │ │ └── myProjectTests/ │ │ └── myProjectTests.swift │ └── docker-compose.yml ├── Chapter 03/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ └── myProject/ │ │ ├── Middlewares/ │ │ │ └── ExtendPathMiddleware.swift │ │ ├── Modules/ │ │ │ ├── Blog/ │ │ │ │ ├── BlogPost.swift │ │ │ │ ├── BlogRouter.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ └── Templates/ │ │ │ │ ├── Contexts/ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ └── Html/ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ └── BlogPostsTemplate.swift │ │ │ └── Web/ │ │ │ ├── Controllers/ │ │ │ │ └── WebFrontendController.swift │ │ │ ├── Templates/ │ │ │ │ ├── Contexts/ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ └── Html/ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ └── WebLinkTemplate.swift │ │ │ └── WebRouter.swift │ │ ├── Template/ │ │ │ ├── Request+Template.swift │ │ │ ├── TemplateRenderer.swift │ │ │ └── TemplateRepresentable.swift │ │ ├── configure.swift │ │ ├── entrypoint.swift │ │ └── routes.swift │ ├── Tests/ │ │ └── myProjectTests/ │ │ └── myProjectTests.swift │ └── docker-compose.yml ├── Chapter 04/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Framework/ │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ └── ModuleInterface.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 05/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ └── ModuleInterface.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 06/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ └── InputField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ └── LabelContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ └── LabelTemplate.swift │ │ │ │ └── ModuleInterface.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 07/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ └── InputField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ └── LabelContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ └── LabelTemplate.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 08/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ └── web.css │ │ └── js/ │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ ├── FormImageInput.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── BlogFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 09/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ ├── FormImageInput.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── AdminFrontendController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ └── AdminIndexContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ └── AdminIndexTemplate.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 10/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ └── ModelController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 11/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ └── ModelController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 12/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface.swift │ │ │ │ ├── ApiModuleInterface.swift │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── CreateController.swift │ │ │ │ │ ├── DeleteController.swift │ │ │ │ │ ├── DetailController.swift │ │ │ │ │ ├── ListController.swift │ │ │ │ │ ├── ModelController.swift │ │ │ │ │ ├── PatchController.swift │ │ │ │ │ └── UpdateController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminController.swift │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Api/ │ │ │ │ │ └── Controllers/ │ │ │ │ │ ├── ApiController.swift │ │ │ │ │ ├── ApiCreateController.swift │ │ │ │ │ ├── ApiDeleteController.swift │ │ │ │ │ ├── ApiDetailController.swift │ │ │ │ │ ├── ApiListController.swift │ │ │ │ │ ├── ApiPatchController.swift │ │ │ │ │ └── ApiUpdateController.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ └── UserSessionAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ └── UserAccountModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 13/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface.swift │ │ │ │ ├── ApiModuleInterface.swift │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── CreateController.swift │ │ │ │ │ ├── DeleteController.swift │ │ │ │ │ ├── DetailController.swift │ │ │ │ │ ├── ListController.swift │ │ │ │ │ ├── ModelController.swift │ │ │ │ │ ├── PatchController.swift │ │ │ │ │ └── UpdateController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── KeyedContentValidator+Validations.swift │ │ │ │ ├── KeyedContentValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ ├── ValidationError.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminController.swift │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Api/ │ │ │ │ │ ├── ApiModule.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── ApiController.swift │ │ │ │ │ │ ├── ApiCreateController.swift │ │ │ │ │ │ ├── ApiDeleteController.swift │ │ │ │ │ │ ├── ApiDetailController.swift │ │ │ │ │ │ ├── ApiListController.swift │ │ │ │ │ │ ├── ApiPatchController.swift │ │ │ │ │ │ └── ApiUpdateController.swift │ │ │ │ │ └── Middlewares/ │ │ │ │ │ └── ApiErrorMiddleware.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ ├── UserSessionAuthenticator.swift │ │ │ │ │ │ └── UserTokenAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── UserApiController.swift │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── UserAccountModel.swift │ │ │ │ │ │ └── UserTokenModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── User.swift │ │ │ │ │ │ ├── UserAccount.swift │ │ │ │ │ │ └── UserToken.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ └── AppTests.swift │ └── docker-compose.yml ├── Chapter 14/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface.swift │ │ │ │ ├── ApiModuleInterface.swift │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── CreateController.swift │ │ │ │ │ ├── DeleteController.swift │ │ │ │ │ ├── DetailController.swift │ │ │ │ │ ├── ListController.swift │ │ │ │ │ ├── ModelController.swift │ │ │ │ │ ├── PatchController.swift │ │ │ │ │ └── UpdateController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── KeyedContentValidator+Validations.swift │ │ │ │ ├── KeyedContentValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ ├── ValidationError.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminController.swift │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Api/ │ │ │ │ │ ├── ApiModule.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── ApiController.swift │ │ │ │ │ │ ├── ApiCreateController.swift │ │ │ │ │ │ ├── ApiDeleteController.swift │ │ │ │ │ │ ├── ApiDetailController.swift │ │ │ │ │ │ ├── ApiListController.swift │ │ │ │ │ │ ├── ApiPatchController.swift │ │ │ │ │ │ └── ApiUpdateController.swift │ │ │ │ │ └── Middlewares/ │ │ │ │ │ └── ApiErrorMiddleware.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ ├── UserSessionAuthenticator.swift │ │ │ │ │ │ └── UserTokenAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── UserApiController.swift │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── UserAccountModel.swift │ │ │ │ │ │ └── UserTokenModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── User.swift │ │ │ │ │ │ ├── UserAccount.swift │ │ │ │ │ │ └── UserToken.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ ├── AppTests.swift │ │ ├── BlogCategoryApiTests.swift │ │ ├── BlogPostApiTests.swift │ │ └── Framework/ │ │ ├── AppTestCase.swift │ │ └── XCTApplicationTester.swift │ └── docker-compose.yml ├── Chapter 15/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface.swift │ │ │ │ ├── ApiModuleInterface.swift │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── CreateController.swift │ │ │ │ │ ├── DeleteController.swift │ │ │ │ │ ├── DetailController.swift │ │ │ │ │ ├── ListController.swift │ │ │ │ │ ├── ModelController.swift │ │ │ │ │ ├── PatchController.swift │ │ │ │ │ └── UpdateController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── Hooks/ │ │ │ │ │ ├── Application+HookStorage.swift │ │ │ │ │ ├── Async/ │ │ │ │ │ │ ├── Application+AsyncHooks.swift │ │ │ │ │ │ ├── AsyncAnyHookFunction.swift │ │ │ │ │ │ ├── AsyncHookFunction.swift │ │ │ │ │ │ ├── HookStorage+AsyncHooks.swift │ │ │ │ │ │ └── Request+AsyncHooks.swift │ │ │ │ │ ├── HookArguments.swift │ │ │ │ │ ├── HookFunctionPointer.swift │ │ │ │ │ ├── HookStorage.swift │ │ │ │ │ └── Sync/ │ │ │ │ │ ├── AnyHookFunction.swift │ │ │ │ │ ├── Application+Hooks.swift │ │ │ │ │ ├── HookFunction.swift │ │ │ │ │ ├── HookStorage+Hooks.swift │ │ │ │ │ └── Request+Hooks.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── KeyedContentValidator+Validations.swift │ │ │ │ ├── KeyedContentValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ ├── ValidationError.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminController.swift │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Api/ │ │ │ │ │ ├── ApiModule.swift │ │ │ │ │ ├── ApiRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── ApiController.swift │ │ │ │ │ │ ├── ApiCreateController.swift │ │ │ │ │ │ ├── ApiDeleteController.swift │ │ │ │ │ │ ├── ApiDetailController.swift │ │ │ │ │ │ ├── ApiListController.swift │ │ │ │ │ │ ├── ApiPatchController.swift │ │ │ │ │ │ └── ApiUpdateController.swift │ │ │ │ │ └── Middlewares/ │ │ │ │ │ └── ApiErrorMiddleware.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── Blog.swift │ │ │ │ │ │ ├── BlogCategory.swift │ │ │ │ │ │ └── BlogPost.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogAdminWidgetTemplate.swift │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ ├── UserSessionAuthenticator.swift │ │ │ │ │ │ └── UserTokenAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── UserApiController.swift │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── UserAccountModel.swift │ │ │ │ │ │ └── UserTokenModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Objects/ │ │ │ │ │ │ ├── User.swift │ │ │ │ │ │ ├── UserAccount.swift │ │ │ │ │ │ └── UserToken.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ └── AppTests/ │ │ ├── AppTests.swift │ │ ├── BlogCategoryApiTests.swift │ │ ├── BlogPostApiTests.swift │ │ └── Framework/ │ │ ├── AppTestCase.swift │ │ └── XCTApplicationTester.swift │ └── docker-compose.yml ├── Chapter 16/ │ └── myProject/ │ ├── Dockerfile │ ├── Package.swift │ ├── Public/ │ │ ├── css/ │ │ │ ├── admin.css │ │ │ └── web.css │ │ └── js/ │ │ ├── admin.js │ │ └── web.js │ ├── Sources/ │ │ ├── App/ │ │ │ ├── Extensions/ │ │ │ │ └── Svg+MenuIcon.swift │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface+PathComponent.swift │ │ │ │ ├── AuthenticatedUser.swift │ │ │ │ ├── Controllers/ │ │ │ │ │ ├── CreateController.swift │ │ │ │ │ ├── DeleteController.swift │ │ │ │ │ ├── DetailController.swift │ │ │ │ │ ├── ListController.swift │ │ │ │ │ ├── ModelController.swift │ │ │ │ │ ├── PatchController.swift │ │ │ │ │ └── UpdateController.swift │ │ │ │ ├── DatabaseModelInterface.swift │ │ │ │ ├── Extensions/ │ │ │ │ │ ├── ByteBuffer+Data.swift │ │ │ │ │ └── File+ByteBuffer.swift │ │ │ │ ├── Form/ │ │ │ │ │ ├── AbstractForm.swift │ │ │ │ │ ├── AbstractFormField.swift │ │ │ │ │ ├── Fields/ │ │ │ │ │ │ ├── HiddenField.swift │ │ │ │ │ │ ├── ImageField.swift │ │ │ │ │ │ ├── InputField.swift │ │ │ │ │ │ ├── SelectField.swift │ │ │ │ │ │ └── TextareaField.swift │ │ │ │ │ ├── FormAction.swift │ │ │ │ │ ├── FormComponent.swift │ │ │ │ │ ├── FormComponentBuilder.swift │ │ │ │ │ ├── FormImageData.swift │ │ │ │ │ └── FormImageInput.swift │ │ │ │ ├── Hooks/ │ │ │ │ │ ├── Application+HookStorage.swift │ │ │ │ │ ├── Async/ │ │ │ │ │ │ ├── Application+AsyncHooks.swift │ │ │ │ │ │ ├── AsyncAnyHookFunction.swift │ │ │ │ │ │ ├── AsyncHookFunction.swift │ │ │ │ │ │ ├── HookStorage+AsyncHooks.swift │ │ │ │ │ │ └── Request+AsyncHooks.swift │ │ │ │ │ ├── HookArguments.swift │ │ │ │ │ ├── HookFunctionPointer.swift │ │ │ │ │ ├── HookStorage.swift │ │ │ │ │ └── Sync/ │ │ │ │ │ ├── AnyHookFunction.swift │ │ │ │ │ ├── Application+Hooks.swift │ │ │ │ │ ├── HookFunction.swift │ │ │ │ │ ├── HookStorage+Hooks.swift │ │ │ │ │ └── Request+Hooks.swift │ │ │ │ ├── ModelEditorInterface.swift │ │ │ │ ├── ModuleInterface.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── CellContext.swift │ │ │ │ │ │ ├── ColumnContext.swift │ │ │ │ │ │ ├── DetailContext.swift │ │ │ │ │ │ ├── FormContext.swift │ │ │ │ │ │ ├── HiddenFieldContext.swift │ │ │ │ │ │ ├── ImageFieldContext.swift │ │ │ │ │ │ ├── InputFieldContext.swift │ │ │ │ │ │ ├── LabelContext.swift │ │ │ │ │ │ ├── LinkContext.swift │ │ │ │ │ │ ├── OptionContext.swift │ │ │ │ │ │ ├── RowContext.swift │ │ │ │ │ │ ├── SelectFieldContext.swift │ │ │ │ │ │ ├── TableContext.swift │ │ │ │ │ │ └── TextareaFieldContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── CellTemplate.swift │ │ │ │ │ ├── DetailTemplate.swift │ │ │ │ │ ├── FormTemplate.swift │ │ │ │ │ ├── HiddenFieldTemplate.swift │ │ │ │ │ ├── ImageFieldTemplate.swift │ │ │ │ │ ├── InputFieldTemplate.swift │ │ │ │ │ ├── LabelTemplate.swift │ │ │ │ │ ├── LinkTemplate.swift │ │ │ │ │ ├── SelectFieldTemplate.swift │ │ │ │ │ ├── TableTemplate.swift │ │ │ │ │ └── TextareaFieldTemplate.swift │ │ │ │ └── Validation/ │ │ │ │ ├── AsyncValidator.swift │ │ │ │ ├── AsyncValidatorBuilder.swift │ │ │ │ ├── FormFieldValidator+Validations.swift │ │ │ │ ├── FormFieldValidator.swift │ │ │ │ ├── KeyedContentValidator+Validations.swift │ │ │ │ ├── KeyedContentValidator.swift │ │ │ │ ├── RequestValidator.swift │ │ │ │ ├── ValidationAbort.swift │ │ │ │ ├── ValidationError.swift │ │ │ │ └── ValidationErrorDetail.swift │ │ │ ├── Middlewares/ │ │ │ │ └── ExtendPathMiddleware.swift │ │ │ ├── Modules/ │ │ │ │ ├── Admin/ │ │ │ │ │ ├── AdminModule.swift │ │ │ │ │ ├── AdminRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── AdminController.swift │ │ │ │ │ │ ├── AdminCreateController.swift │ │ │ │ │ │ ├── AdminDeleteController.swift │ │ │ │ │ │ ├── AdminDetailController.swift │ │ │ │ │ │ ├── AdminFrontendController.swift │ │ │ │ │ │ ├── AdminListController.swift │ │ │ │ │ │ └── AdminUpdateController.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── AdminDashboardContext.swift │ │ │ │ │ │ ├── AdminDeletePageContext.swift │ │ │ │ │ │ ├── AdminDetailPageContext.swift │ │ │ │ │ │ ├── AdminEditorPageContext.swift │ │ │ │ │ │ ├── AdminIndexContext.swift │ │ │ │ │ │ └── AdminListPageContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── AdminDashboardTemplate.swift │ │ │ │ │ ├── AdminDeletePageTemplate.swift │ │ │ │ │ ├── AdminDetailPageTemplate.swift │ │ │ │ │ ├── AdminEditorPageTemplate.swift │ │ │ │ │ ├── AdminIndexTemplate.swift │ │ │ │ │ └── AdminListPageTemplate.swift │ │ │ │ ├── Api/ │ │ │ │ │ ├── ApiModule.swift │ │ │ │ │ ├── ApiRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── ApiController.swift │ │ │ │ │ │ ├── ApiCreateController.swift │ │ │ │ │ │ ├── ApiDeleteController.swift │ │ │ │ │ │ ├── ApiDetailController.swift │ │ │ │ │ │ ├── ApiListController.swift │ │ │ │ │ │ ├── ApiPatchController.swift │ │ │ │ │ │ └── ApiUpdateController.swift │ │ │ │ │ └── Middlewares/ │ │ │ │ │ └── ApiErrorMiddleware.swift │ │ │ │ ├── Blog/ │ │ │ │ │ ├── BlogModule.swift │ │ │ │ │ ├── BlogRouter.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── BlogCategoryAdminController.swift │ │ │ │ │ │ ├── BlogCategoryApiController.swift │ │ │ │ │ │ ├── BlogFrontendController.swift │ │ │ │ │ │ ├── BlogPostAdminController.swift │ │ │ │ │ │ └── BlogPostApiController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── BlogMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── BlogCategoryModel.swift │ │ │ │ │ │ └── BlogPostModel.swift │ │ │ │ │ ├── Editors/ │ │ │ │ │ │ ├── BlogCategoryEditor.swift │ │ │ │ │ │ └── BlogPostEditor.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── BlogPostEditForm.swift │ │ │ │ │ └── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── BlogPostAdminDeleteContext.swift │ │ │ │ │ │ ├── BlogPostAdminDetailContext.swift │ │ │ │ │ │ ├── BlogPostAdminEditContext.swift │ │ │ │ │ │ ├── BlogPostAdminListContext.swift │ │ │ │ │ │ ├── BlogPostContext.swift │ │ │ │ │ │ └── BlogPostsContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── BlogAdminWidgetTemplate.swift │ │ │ │ │ ├── BlogPostAdminDeleteTemplate.swift │ │ │ │ │ ├── BlogPostAdminDetailTemplate.swift │ │ │ │ │ ├── BlogPostAdminEditTemplate.swift │ │ │ │ │ ├── BlogPostAdminListTemplate.swift │ │ │ │ │ ├── BlogPostTemplate.swift │ │ │ │ │ └── BlogPostsTemplate.swift │ │ │ │ ├── User/ │ │ │ │ │ ├── Authenticators/ │ │ │ │ │ │ ├── UserCredentialsAuthenticator.swift │ │ │ │ │ │ ├── UserSessionAuthenticator.swift │ │ │ │ │ │ └── UserTokenAuthenticator.swift │ │ │ │ │ ├── Controllers/ │ │ │ │ │ │ ├── UserApiController.swift │ │ │ │ │ │ └── UserFrontendController.swift │ │ │ │ │ ├── Database/ │ │ │ │ │ │ ├── Migrations/ │ │ │ │ │ │ │ └── UserMigrations.swift │ │ │ │ │ │ └── Models/ │ │ │ │ │ │ ├── UserAccountModel.swift │ │ │ │ │ │ └── UserTokenModel.swift │ │ │ │ │ ├── Forms/ │ │ │ │ │ │ └── UserLoginForm.swift │ │ │ │ │ ├── Templates/ │ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ │ └── UserLoginContext.swift │ │ │ │ │ │ └── Html/ │ │ │ │ │ │ └── UserLoginTemplate.swift │ │ │ │ │ ├── UserModule.swift │ │ │ │ │ └── UserRouter.swift │ │ │ │ └── Web/ │ │ │ │ ├── Controllers/ │ │ │ │ │ └── WebFrontendController.swift │ │ │ │ ├── Templates/ │ │ │ │ │ ├── Contexts/ │ │ │ │ │ │ ├── WebHomeContext.swift │ │ │ │ │ │ ├── WebIndexContext.swift │ │ │ │ │ │ └── WebLinkContext.swift │ │ │ │ │ └── Html/ │ │ │ │ │ ├── WebHomeTemplate.swift │ │ │ │ │ ├── WebIndexTemplate.swift │ │ │ │ │ └── WebLinkTemplate.swift │ │ │ │ ├── WebModule.swift │ │ │ │ └── WebRouter.swift │ │ │ ├── Template/ │ │ │ │ ├── Request+Template.swift │ │ │ │ ├── TemplateRenderer.swift │ │ │ │ └── TemplateRepresentable.swift │ │ │ ├── configure.swift │ │ │ └── routes.swift │ │ ├── AppApi/ │ │ │ ├── Framework/ │ │ │ │ ├── ApiModelInterface.swift │ │ │ │ └── ApiModuleInterface.swift │ │ │ └── Modules/ │ │ │ ├── Blog/ │ │ │ │ ├── Blog.swift │ │ │ │ ├── BlogCategory.swift │ │ │ │ └── BlogPost.swift │ │ │ └── User/ │ │ │ ├── User.swift │ │ │ ├── UserAccount.swift │ │ │ └── UserToken.swift │ │ └── Run/ │ │ └── main.swift │ ├── Tests/ │ │ ├── AppApiTests/ │ │ │ └── AppApiTests.swift │ │ └── AppTests/ │ │ ├── AppTests.swift │ │ ├── BlogCategoryApiTests.swift │ │ ├── BlogPostApiTests.swift │ │ └── Framework/ │ │ ├── AppTestCase.swift │ │ └── XCTApplicationTester.swift │ └── docker-compose.yml └── README.md