📚
クリーンアーキテクチャ with Go でモンハンAPI作ってみた
何を作ったか?
モンスターハンターのモンスターの名前や分類、生息地を取得できるAPI
どうして作ったか?
- クリーンアーキテクチャを使って、何かアウトプットしたい!
- クリーンアーキテクチャで何かするならGoがいい!(使い慣れているので。)
- poke APIはあるのにモンハンAPIはないの!?
作った人の自己紹介
王立古生物書士隊 情報分隊技術部 所属 のオーガといいます!
(モンハン世界の研究員という設定)
真面目に書くと、
- Goが好き!
- エンジニア歴4年目
- サーバ好き!
- 障害対応や検証ほど楽しい業務はない!
- 最近、アーキテクチャも学ばないとだなと感じて色々学習している
成果物
https://mh-api-xpzdc5i4rq-an.a.run.app/
取得できる情報
json key | 型 | 内容 |
---|---|---|
id | int | モンスターのid |
name | string | モンスターの名前 |
desc | string | モンスターの説明 |
location | string | モンスターの生息地 |
specify | string | モンスターの分類 |
weakness___attack | string | モンスターの弱点(物理) |
weakness___element | string | モンスターの弱点(属性) |
{
"monster": {
"id": {
"Value": 1
},
"name": {
"Value": "アプトノス"
},
"desc": {
"Value": ""
},
"location": {
"Value": ""
},
"specify": {
"Value": ""
},
"weakness___attack": {
"Value": {
"前脚": "",
"頭部": "",
"胴体": "",
"後脚": ""
"尻尾": ""
}
},
"weakness___element": {
"Value": {
"前脚": "",
"頭部": "",
"胴体": "",
"後脚": "",
"尻尾": ""
}
}
}
}
API仕様
誰でも参照可能
- GET
- /v1/monsters
- /v1/monsters/{id}
認証が必要
- POST
- /v1/auth/monsters
- /v1/auth/monsters/json
- PATCH
- /v1/auth/monsters/{id}
- DELETE
- /v1/auth/monsters/{id}
システム系
- GET
- /v1/health
- /v1/auth
- API
メソッド | エンドポイント | 内容 |
---|---|---|
GET | /v1/auth/monsters | 全モンスター一覧を取得する |
GET | /v1/monsters/{id} | モンスターのidを指定して取得する |
POST | /v1/auth/monsters | モンスター情報追加する |
POST | /v1/auth/monsters/json | モンスター情報をjsonから追加する |
PATCH | /v1/auth/monsters/{id} | モンスター情報をidを指定して更新する |
DELETE | /v1/auth/monsters/{id} | モンスター情報をidを指定して削除する |
- システム
メソッド | エンドポイント | 内容 |
---|---|---|
GET | /v1/health | サーバのヘルスチェック用 |
GET | /v1/auth | データの追加、更新、削除を行うための認証を行うため |
ソースコードについて
本アプリは、オープンソースとして開発していますので、以下のGitHubにコードを公開しております。
データの追加について
モンスターハンターの新作発売に伴い新しく登場したモンスターを追加したい場合は、data/input/data.csvにモンスターの情報を追加してコミットするとgithub actionsでjsonの作成、APIへの認証、データの追加まで行います。
このAPIについて
ひとまず完成しましたので、Zennにアウトプットとして記事を残ししておき、オープンソースプロジェクトとして成長させていきたいと考えています!
そのために、データの収集からなのですが。。。
まとめ
クリーンアーキテクチャは、依存性注入とか依存性逆転とかよくわからなかったり、パッケージ構成のベストプラクティスがよくわからなかったりしましたがとにかく書いて作ってみることが一番理解することを学びました。(体で覚えていくタイプなので。。。)
つぎは、flutter,Rust,Reactあたりクリーンアーキテクチャをやっていきたいと思います!
Discussion