Go言語、buffaloのログイン処理を作成してみる

この記事は [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) の 9 日目の記事です。

8日目の記事は[こちら](https://qiita.com/KanikoroRerere/items/e2dcc44e625849526015)

## go buffaloとは

https://gobuffalo.io/en

go言語で作られたrailsっぽいフレームワークです。
早くて軽くて開発環境も最初からホットリロード付きで非常に快適に開発を進めることができます。
テストも簡単に書けますよ。

インストール方法などは[こちら](https://qiita.com/k-kurikuri/items/f46356b70fe3e7e8da7d)の記事を参照ください。

## ログイン機能を作りたい
さっそくログイン機能を作っていきましょう。

まずはプラグインのインストールです。

```shell
buffalo plugins install github.com/gobuffalo/buffalo-auth
```

初期設定を行います。

```shell

## 作成されるファイルを確認
buffalo-auth auth -d

## userモデルとテンプレートを作成
buffalo-auth auth
 
## soda CLIを利用するのでコマンドをインストール
go get github.com/gobuffalo/pop/...
go install github.com/gobuffalo/pop/soda

go get -u -v github.com/gobuffalo/buffalo-pop

## migrationを実行
soda migrate

## 開発環境の立ち上げ
buffalo dev
```

生成されるファイルは以下の通り

```shell
create  models/user.go
create  models/user_test.go
    run  goimports -w actions/actions_test.go actions/app.go actions/home.go actions/home_test.go actions/render.go grifts/db.go grifts/init.go main.go models/models.go models/models_test.go models/user.go models/user_test.go
create  migrations/20180910062057_create_users.up.fizz
create  migrations/20180910062057_create_users.down.fizz
create  actions/auth.go
create  actions/auth_test.go
create  actions/users.go
create  actions/users_test.go
create  models/user_test.go
create  actions/home_test.go
create  templates/auth/new.html
create  templates/index.html
create  templates/users/new.html
```

ここまでで開発環境(buffalo devを実行)で以下のようにページが見れるはずです。

![FireShot Capture 002 - Buffalo - Auth Example - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123028/24ad1f07-0688-db32-d9bc-ad0c20d558f8.png)

registerを押下

![FireShot Capture 003 - Buffalo - Auth Example - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123028/6e507acd-8b09-6dc4-ca77-4122378f9e7a.png)


ここでhomehandlerによって呼び出される`templates/index.plush.html`に変更が入って以下のようになります。

```html
<div class="auth-center">
  <%= if (current_user) { %>
    <h1><%= current_user.Email %></h1>
    <a href="/signout" data-method="DELETE">Sign Out</a>
  <% } else { %>
    <a href="/signin" class="btn btn-primary">Sign In</a>
    <a href="/users/new" class="btn btn-success">Register</a>
  <% } %>
</div>
```

railsと同じように `currente_user` で条件分岐していることがわかりますね。

## 管理者フラグを追加してみる

せっかくなので管理者フラグを付けてみましょう。
まずはマイグレーションファイルを生成します

```shell
soda g fizz  add_admin_flag_to_users
```

出来上がったファイルを以下のように編集します。

down.fizzファイルの中身

```
drop_column("users", "admin_flag")
```

up.fizzファイルの中身

```
add_column("users", "admin_flag", "boolean",  {"null": true})
```

`soda migrate`を実行してDBに反映させます

### テンプレートファイルの修正

`templates/users/new.plush.html`のフォームの中に以下を追加します。

```html
<%= f.SelectTag("AdminFlag", {options: {"Normal User": 0, "AdminUser": 1}, value: 0}) %>
```

### モデルファイルの修正

`models/user.go`を以下のように修正します。

```go
type User struct {
	ID           uuid.UUID  `json:"id" db:"id"`
	CreatedAt    time.Time  `json:"created_at" db:"created_at"`
	UpdatedAt    time.Time  `json:"updated_at" db:"updated_at"`
	Email        string     `json:"email" db:"email"`
	PasswordHash string     `json:"password_hash" db:"password_hash"`
	AdminFlag    nulls.Bool `json:"admin_flag" db:"admin_flag"`

	Password             string `json:"-" db:"-"`
	PasswordConfirmation string `json:"-" db:"-"`
}

```

ここまでやればフォームが下のようになり、ユーザの作成時に権限を選択することができます。

<img width="290" alt="コメント 2019-12-08 193920.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123028/1cff2bd2-572d-bac6-2bef-656aa4d3be4d.png">

あとはこんな風に書いてあげれば良いだけですね。

```html
  <%= if (current_user.AdminFlag) { %>
      管理者の処理
  <% }%>
```

試しにユーザを作成するとちゃんとフラグにboolの値が入っていますね。
<img width="893" alt="コメント 2019-12-08 193958.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123028/4e2c929b-6216-224d-2dc5-38c53fd01737.png">

ではでは、go buffaloでログインするまででした。
明日は[syumai](https://qiita.com/syumai)さんの記事にになります。