Strapiを試す

完成したのものは以下

- https://github.com/hbsnow-sandbox/strapi-example

## Install その1 SQLite

以下のクイックスタートを見ながらすすめる。

- https://strapi.io/documentation/3.0.0-beta.x/getting-started/quick-start.html

URLからもわかるように、現時点では3.0.0はbetaのようです。

```
yarn create strapi-app strapi-example --quickstart
```

インストールが終わると

![Screenshot from 2019-12-15 13-03-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/c3a1bbe8-c051-9241-ce19-f47ac4a85104.png)

上記のような画面が開くので必要項目を入力すれば設定は終わり。日本語にも対応しているようです。

ただ、このクイックスタート、どうやらSQLiteを使用するので、そのままではちょっと使いにくい。

## Install その2 MySQL

ここではDBをMySQLを使っていきます。さきほどのプロジェクトを削除してもう一度作り直します。今度は `--quickstart` はつけません。

```
rm -rf strapi-example
mkdir strapi-example
```

ドキュメントが間に合ってないのか、[MongoDBについてのチュートリアルしかありませんでした](https://strapi.io/documentation/3.0.0-beta.x/guides/databases.html#mongodb-installation)が、ほぼ同手順でMySQLのインストールも問題なくできるかと思います。

MySQLのDockerの設定は以前自分の作成した以下の設定をほぼそのまま使用しています。

- https://github.com/hbsnow-sandbox/mysql-sandbox

ただしそのまま使用すると、

```
⛔️ Connection test failed: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```

のようなエラーが発生する。"Node.js" "MySQL 8.0" あたりのキーワードで検索すると解決策がでてくるはず。ここではMysqlのバージョンを下げて対応した。文字コードなどの設定も必要なので、わからない場合には完成したリポジトリを参考にしてください、文字コードを変えずに使用すると日本語のPOSTで400が返されます（一度このミスをしてしまった……）。

MySQLの設定が終わったら、`docker-compose up` したあと、DBを作成してそのまま接続可能な状態で

```
cd strapi-app
yarn create strapi-app backend
```

![Screenshot from 2019-12-15 16-25-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/fa9878ad-2537-3a7e-618f-31aefe8cacc6.png)

```
cd backend
yarn develop
```

以上でインストールして管理画面を開くまでの作業は終了です。自分のときにはなぜか `yarn develop` が2回失敗したんだけど、3回目叩いてみたらうまくいった。理由はちょっとよくわからないんだけど、発生してたエラーは以下

```
yarn develop
yarn run v1.21.1
$ strapi develop
[2019-12-15T07:30:26.689Z] debug ⛔️ Server wasn't able to start properly.
[2019-12-15T07:30:26.690Z] error (hook: bookshelf) is taking too long to load.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

`backend/config/hook.json` のtimeoutを多少長めに変更しておくとよさそうな気がする。

## 記事用のAPIを作る

- https://strapi.io/documentation/3.0.0-beta.x/concepts/models.html

上記を参考に post を作成する。`created_at` と `updated_at` を定義しようとしてもできなくて、おかしいなーとおもったらどうやらデフォルトですでに定義されているようで、これは `/backend/api/post/models/Post.settings.json` で確認することができる。

![Screenshot from 2019-12-15 18-15-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/0e952f35-d554-0c4f-49bb-704ec0da9378.png)

コンテンツ管理で詳細な設定が変更できる

![Screenshot from 2019-12-15 18-17-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/d24958fd-f74f-301c-7f2b-4bf7470ee81d.png)

それっぽい感じに変更しておいた。

## 管理画面を変更する

- https://strapi.io/documentation/3.0.0-beta.x/admin-panel/customization.html

管理画面はセキュリティ上、そのパスを変更できるそうなので、ここではドキュメントと同様に `/dashboard` に変更する。

```json
{
  "host": "localhost",
  "port": 1337,
  "proxy": {
    "enabled": false
  },
  "cron": {
    "enabled": false
  },
  "admin": {
    "autoOpen": false,
    "path": "/dashboard"
  }
}
```

`yarn build` で再構築すると設定が反映される。


## Admin UserとEnd User

strapiでは管理画面のユーザはAdmin User、そうでないフロントエンド側の権限を制御するユーザをEnd Userとしているらしい。

- [Why we split the management of Admin Users and End Users](https://strapi.io/blog/why-we-split-the-management-of-the-admin-users-and-end-users)

strapiから記事の投稿はできるので今回はAdmin Userで記事の作成をしていくのですが、これが問題になる場合には管理者ページをまた別に作るか、stradminの管理者ページをカスタマイズする必要がありそう。Admin Userはロールによる管理ができないので、前者のほうが筋が良さそうに思えるけれど、管理画面をつくる工数が与えられることが前提なのでWordPressの置き換えの選択肢として考えるのであればちょっとつらそう。

## Postを投稿する

strapiの投稿画面から投稿するだけ

![Screenshot from 2019-12-15 21-40-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17669/b227ab3e-5bc7-cd54-c6ab-4a9a9243d8c0.png)

draft、いわゆるプレビュー画面の実装についてなども[ドキュメントに書いてあります](https://strapi.io/documentation/3.0.0-beta.x/guides/draft.html)。

レスポンスを確認してみると

```terminal
curl --silent "http://localhost:1337/posts" | jq
[
  {
    "id": 1,
    "name": "テスト投稿",
    "content": "これはテスト投稿です",
    "created_at": "2019-12-15T12:40:22.000Z",
    "updated_at": "2019-12-15T12:40:22.000Z"
  }
]
```

いい感じになっている。

## 感想

strapiのAdmin Userで完結するのであればいいんだけど、もし管理画面をそれとは別に作らないといけないのであれば、WordPressを置き換えるものかと言われるとちょっと微妙な感じがする。

strapi自体はとてもよくて、ちょっとした個人のものであれば今後これを使うことがありそう