Keystonejs Tutorials #3/Seeding data

次ページ https://qiita.com/bontensuzuki/items/7cd598a7075f6c970f14

#Seeding data
Keystonejsのtutorialsから学んでいきます。（ほとんど機械翻訳です）
https://www.keystonejs.com/tutorials/initial-data


このガイドでは、createItemsメソッドを使用してユーザーリストを作成し、それに初期データを追加する方法を示します。このプロセスはSeedingとも呼ばれます。


>注：前の章では、コードは個別のファイルに分割されましたが、実際のコードベースではこれが推奨されますが、この部分では、明確にするためにすべてが1つのファイルに入れられています。


##リスト設定
###パッケージをインストールする
この章では、前の章とは異なるユーザースキーマを使用し、Todoリストの代わりに投稿リストを使用します。新しいプロジェクトから始めて、空のデータベースから始める（前の章のデータを削除する）のが最善です。また、次のパッケージがすべてインストールされていることを確認してください。

```javascript

mkdir new-project3
cd new-project3
yarn init

yarn add @keystonejs/keystone
yarn add @keystonejs/adapter-mongoose
yarn add @keystonejs/app-graphql
yarn add @keystonejs/fields
yarn add @keystonejs/app-admin-ui
yarn add @keystonejs/auth-password

```

###準備
まず、ユーザーリストを作成し、PasswordAuthStrategyを追加します。
index.jsのコード：

```javascript

const { Keystone } = require('@keystonejs/keystone');
const { PasswordAuthStrategy } = require('@keystonejs/auth-password');
const { Text, Checkbox, Password } = require('@keystonejs/fields');
const { GraphQLApp } = require('@keystonejs/app-graphql');
const { AdminUIApp } = require('@keystonejs/app-admin-ui');
const { MongooseAdapter } = require('@keystonejs/adapter-mongoose');

const keystone = new Keystone({
  name: 'example-project',
  adapter: new MongooseAdapter(),
});

keystone.createList('User', {
  fields: {
    name: { type: Text },
    email: {
      type: Text,
      isUnique: true,
    },
    isAdmin: { type: Checkbox },
    password: {
      type: Password,
    },
  },
});

const authStrategy = keystone.createAuthStrategy({
  type: PasswordAuthStrategy,
  list: 'User',
});

module.exports = {
  keystone,
  apps: [new GraphQLApp(), new AdminUIApp({ enableDefaultRoute: true, authStrategy })],
};
```

>
ヒント：Keystone CLIを実行してkeystone-appを作成し、「スターター（ユーザー+認証）」を選択すると、同様の設定を行うことができます。このスタータープロジェクトには、ユーザーリスト、PasswordAuthStrategy、および構成済みのデータベースのシードがあります。とりあえず、手動で進めます。

###メンバー登録
http://localhost:3000/admin/api

```javascript

mutation {
  createUser(data: { name: "Mike" ,email:"test@test.test", password:"test1234",isAdmin:true}) {
    name
  }
}

```

メンバーを登録できたか確認してみましょう

```javascript

query {
  allUsers {
    id,name
  }
}
```
出力

```javascript

{
  "data": {
    "allUsers": [
      {
        "id": "5eae81ad78af33930bac2700",
        "name": "Mike"
      }
    ]
  }
}
```
adminUIで確認
 Keystone Admin UI:	http://localhost:3000/admin

![スクリーンショット 2020-05-03 17.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30363/9c70afac-d288-ebe8-5aef-50030ac54832.png)


![スクリーンショット 2020-05-03 17.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30363/3eab7e85-e850-a6a5-56be-9554a49e5f58.png)

登録が確認できました



###アイテムを作成する
createItemsメソッドには、キーがリストキーであり、値が挿入するアイテムの配列であるオブジェクトが必要です。例えば：

```javascript

keystone.createItems({
  User: [
    { name: 'John Duck', email: 'john@duck.com', password: 'dolphins' },
    { name: 'Barry', email: 'bartduisters@bartduisters.com', password: 'dolphins' },
  ],
});
```

>
注：データの形式は、keystone.createList（）への呼び出しでのスキーマ設定と一致する必要があります。スキーマの例として、電子メールフィールドにはisUnique：trueが含まれているため、上記のコードでは、生成する必要がある各ユーザーに対して同じ電子メールを使用することはできません。

データベース接続時にデータをシードする方法の例：

```javascript

const keystone = new Keystone({
  name: 'New Project',
  adapter: new MongooseAdapter(),
  onConnect: async keystone => {
    await keystone.createItems({
      User: [
        { name: 'John Duck', email: 'john@duck.com', password: 'dolphins' },
        { name: 'Barry', email: 'bartduisters@bartduisters.com', password: 'dolphins' },
      ],
    });
  },
});

```

アプリケーションを起動し、管理UIにアクセスします。起動時に2人のユーザーが利用できます。

>
注：この例では、スタートアップごとに同じ2人のユーザーが生成されます。メールは一意である必要があるため、重複したエラーが表示されます。これを回避するには、Keystoneを開始する前にデータベースをクリアします。

次ページ https://qiita.com/bontensuzuki/items/7cd598a7075f6c970f14