兵庫県のCOVID19感染者状況のGraphQL APIを公開してみた。(その2)

# 宣伝
兵庫県のコロナウイルス特設サイトが公開中
https://stop-covid19-hyogo.org/
僕の公開しているGraphQL APIとは今のところ別働で動いていますが
かなり参考にさせて頂いておりますのでご紹介しておきます。

# hyogo.covid19-api
[GraphQLプレイグラウンド](https://hyogo.covid19-api.ga/playground)

**api内訳**

- [readInfectedPeoples](https://qiita.com/Inadati/items/24437af1435245eafa4f#readinfectedpeoples)
- [readExamOverviews](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamoverviews)
- [readExamDetails](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamdetails)
- [readPCROverviews](https://qiita.com/Inadati/items/24437af1435245eafa4f#readpcroverviews)(2020/3/23 追加)

# readInfectedPeoples
感染者情報一覧取得クエリ
https://web.pref.hyogo.lg.jp/kk03/corona_kanjyajyokyo.html
上記のページに掲載されている感染者情報のエクセルファイルを30分おきに
コンテナ内にダウンロード。
そのファイルを読み込みPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

**GraphQLのフィールドとエクセルファイルとの関連**
エクセルの「認定こども園」以降のデータは`cluster_places`というサブコレクションクエリで読み込めます。

| 番号 | 確認日 | 年代 | 性別 | 管轄 | 居住地 | 職業 | 発症日 | 渡航歴 | 備考欄 |
|---|---|---|---|---|---|---|---|---|---|
|no|confirmed_date|age_group|sex|jurisdiction|residence|occupation|onset_date|travel_history|remarks|

**取得例**
<img width="1440" alt="スクリーンショット 2020-03-21 11.45.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/70df89e7-b07d-3400-30e2-6806d620a817.png">

**全フィールド取得クエリ例**
uuidによるidフィールドもありますがプレイグラウンドで試す際は長すぎて見づらくなるので
ここではidを含めないクエリを貼っておきます。

```graphql
query{
  readInfectedPeoples{
    no
    confirmed_date
    age_group
    sex
    jurisdiction
    residence
    occupation
    onset_date
    travel_history
    remarks
    cluster_places{
      no
      label
      is_relation
    }
  }
}
```


# readExamOverviews
https://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html
上記のページ、「発生状況」すぐ下のpdfファイルを30分おきに
コンテナ内にダウンロード。
そのファイルを読み込みPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

**関連しているデータ**
<img width="625" alt="スクリーンショット 2020-03-21 12.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/10b2e8e4-ae48-1c27-98fc-0eaf323c18ab.png">

**取得例**
<img width="1440" alt="スクリーンショット 2020-03-21 12.42.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/e975ffaf-fa1e-ca4c-852b-ff45e6b13151.png">

**全フィールド取得クエリ例**

```graphql
query{
  readExamOverviews{
    no
    label
    count
  }
}
```

# readExamDetails
https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html
上記のバーチャート下部のテーブルタグを30分おきにスクレイピング
抽出したデータをPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

**関連しているデータ**
<img width="286" alt="スクリーンショット 2020-03-21 12.59.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/7babb86d-b244-fbd2-9cba-02aa1e3bce65.png">

**取得例**
<img width="1440" alt="スクリーンショット 2020-03-21 13.01.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/5d5a621f-e7a0-36de-0d70-735d6901ca8b.png">

**全フィールド取得クエリ例**

```graphql
query{
  readExamDetails{
    no
    date
    exam_count
    positive_count
  }
}
```

# readPCROverviews
[readExamOverviews](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamoverviews)の改善版
2020/3/13までのhttps://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html
のpdf情報を蓄積
ただし、pdfは毎日差し替えられるので
https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html の累積情報と
https://covid-hyogo.now.sh から一部データを拝借しております。
(手入力www)
2020/3/23よりデータ蓄積開始しています。
dateフィールドの日付は兵庫県サイトに掲載されているルールに則って前日の日付を
ISO8601(RFC3339)形式で保存しています。
ちなみに、サイトのデータが更新されるまでは前日公表分のデータと同様のデータを返します。

**関連しているデータ**
<img width="625" alt="スクリーンショット 2020-03-21 12.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/10b2e8e4-ae48-1c27-98fc-0eaf323c18ab.png">

**取得例**
<img width="1440" alt="スクリーンショット 2020-03-23 10.44.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/5101f548-7775-0614-6d1a-f73e11149ea8.png">

**全フィールド取得クエリ例**

```graphql
query{
  readPCROverviews{
  id
  date
  pcr_total
  pcr_positive_count
  hospitalized_count
  not_serious_count
  serious_count
  death_count
  discharge_count
}
}
```

# まとめ
2020/3/23追記
そろそろ、GraphQLのサブスクリプションにトライしてみようかと
あと、運用回りでいよいよ、CIに興味が出てきた。