Swift Vapor 新規プロジェクト作成 -nオプション無しの例

新規プロジェクト作成で-nオプションなし時は、FluentとLeafの使用有無を確認される。

Fluent
ドキュメントページより。
https://docs.vapor.codes/ja/fluent/overview/

FluentはSwiftのためのORMフレームワークです。
Swift の強力な型システムを利用して、データベースのための使いやすいインターフェイスを提供します。
Fluentを使うことの中心は、データベースのデータ構造を表すモデル型を作成することです。
これらのモデルは、生のクエリを書く代わりに、作成、読み込み、更新、削除操作を実行するために使用されます。

Leaf
ドキュメントページより。
https://docs.vapor.codes/ja/leaf/getting-started/

Leaf は Swift にインスパイアされた構文を持つ強力なテンプレート言語です。
これを使用して、フロントエンドのWebサイトの動的なHTMLページを生成したり、APIから送信するリッチなメールを生成したりできます。

実行例

~/vapor$vapor new example
Cloning template...
name: example
Would you like to use Fluent (ORM)? (--fluent/--no-fluent)
y/n> y
fluent: Yes
Which database would you like to use? (--fluent.db)
1: Postgres (Recommended)
2: MySQL
3: SQLite
4: Mongo
> 1
db: Postgres (Recommended)
Would you like to use Leaf (templating)? (--leaf/--no-leaf)
y/n> > y
leaf: Yes
Generating project files
+ Package.swift
+ entrypoint.swift
+ configure.swift
+ routes.swift
+ Todo.swift
+ CreateTodo.swift
+ .gitkeep
+ TodoController.swift
+ AppTests.swift
+ index.leaf
+ .gitkeep
+ Dockerfile
+ docker-compose.yml
+ .gitignore
+ .dockerignore
Creating git repository
Adding first commit

                                                           **
                                                         **~~**
                                                       **~~~~~~**
                                                     **~~~~~~~~~~**
                                                   **~~~~~~~~~~~~~~**
                                                 **~~~~~~~~~~~~~~~~~~**
                                               **~~~~~~~~~~~~~~~~~~~~~~**
                                              **~~~~~~~~~~~~~~~~~~~~~~~~**
                                             **~~~~~~~~~~~~~~~~~~~~~~~~~~**
                                            **~~~~~~~~~~~~~~~~~~~~~~~~~~~~**
                                            **~~~~~~~~~~~~~~~~~~~~~~~~~~~~**
                                            **~~~~~~~~~~~~~~~~~~~~~++++~~~**
                                             **~~~~~~~~~~~~~~~~~~~++++~~~**
                                              ***~~~~~~~~~~~~~~~++++~~~***
                                                ****~~~~~~~~~~++++~~****
                                                   *****~~~~~~~~~*****
                                                      *************

                                             _       __    ___   ___   ___
                                            \ \  /  / /\  | |_) / / \ | |_)
                                             \_\/  /_/--\ |_|   \_\_/ |_| \
                                               a web framework for Swift

                                           Project example has been created!

                                    Use cd 'example' to enter the project directory
          Then open your project, for example if using Xcode type open Package.swift or code . if using VSCode
~/vapor$

作成されるファイル

example/
├── Dockerfile
├── Package.swift
├── Public
├── Resources
│   └── Views
│       └── index.leaf
├── Sources
│   └── App
│       ├── Controllers
│       │   └── TodoController.swift
│       ├── Migrations
│       │   └── CreateTodo.swift
│       ├── Models
│       │   └── Todo.swift
│       ├── configure.swift
│       ├── entrypoint.swift
│       └── routes.swift
├── Tests
│   └── AppTests
│       └── AppTests.swift
└── docker-compose.yml

DB関連の設定

configure.swiftを直接変更、または内容に従い環境変数を設定する。

import NIOSSL
import Fluent
import FluentPostgresDriver
import Leaf
import Vapor

// configures your application
public func configure(_ app: Application) async throws {
    // uncomment to serve files from /Public folder
    // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))

    app.databases.use(DatabaseConfigurationFactory.postgres(configuration: .init(
        hostname: Environment.get("DATABASE_HOST") ?? "localhost",
        port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? SQLPostgresConfiguration.ianaPortNumber,
        username: Environment.get("DATABASE_USERNAME") ?? "vapor_username",
        password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password",
        database: Environment.get("DATABASE_NAME") ?? "vapor_database",
        tls: .prefer(try .init(configuration: .clientDefault)))
    ), as: .psql)

    app.migrations.add(CreateTodo())

    app.views.use(.leaf)



    // register routes
    try routes(app)
}

作成されるモデルに必要なテーブルスキーマー(PostgreSQLの場合)

                    Table "public.todos"
 Column |       Type        | Collation | Nullable | Default
--------+-------------------+-----------+----------+---------
 id     | uuid              |           | not null |
 title  | character varying |           | not null |
Indexes:
    "todos_pkey" PRIMARY KEY, btree (id)

初期生成時に含まれるTodos情報

ルート情報、処理はTodoController.swiftにある。

Todo作成リクエスト
POST
http://127.0.0.1:8080/todos

{
    "title" : "example"
}

SwiftSwift,Vapor

Posted by shi-n