zerebom / tsukumen-backend

つくばのラーメンを推薦するアプリ”ツクめん”のバックエンド実装レポジトリ
2 stars 0 forks source link

RailsからGCPサーバーにリクエストする #15

Closed zerebom closed 3 years ago

zerebom commented 3 years ago

13 より、RailsからGCPサーバーにGETしにいくことにした。

ここに、どんな実装が必要かをメモする

データフロー

  1. フロント側から現在地周辺のデータを取得するAPIにリクエストされる ex) /shops/neigbors?range=20km&current_lat=32.18...&current_lon=68.88.../
  2. クエリに含まれている緯度経度が過去に検索された位置から近い場合DBに格納されているので、DBから返す
  3. そうでない場合、GCPに緯度経度を含めてリクエストしてデータを返す
  4. GCPから取得した場合は、DBに格納する

このうち 3,4をこのissueのスコープとする_

todo

zerebom commented 3 years ago

GCPへのリクエストの組み立て

下記クエリにアクセスすれば情報が返ってくる。 これをrails内で組み立てる

curl "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=1500&type=restaurant&keyword=cruise&key=API_KEY"
zsh: no matches foundについて zsh: no matches found とエラーが出たので下記を参照に修正した。 https://eitya.hatenadiary.org/entry/20110707/1310023383 ↑結局ダメだったが、URLを""で囲んだら治った `curl "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=1500&type=restaurant&keyword=cruise&key=KEY"`
zerebom commented 3 years ago

GCP のレスポンスからActiveRecordにインスタンス化する方法

ActiveRecordのインスタンス化は、直接そのModelにメソッドを生やすのがロジックが集約されるので筋が良さそう。 各モデルにクラスメソッを作成し、GCPのレスポンスであるresult(=json)を渡して組み立てることにする。

例↓

class Shop < ApplicationRecord
  has_many :reviews, dependent: :destroy
  has_many :photos, dependent: :destroy
  has_one :address

  # ref: https://qiita.com/suzuki-koya/items/1553c405beeb73f83bbc
  def self.from_result(result:,
                       place_id:)
    shop = self.new
    shop.name = result['name']
    shop.phone_number = result['formatted_phone_number']
    shop.email = result['email']
    shop.place_id = place_id
    shop
  end
end

また、挙動の確認にはうちの会社で使われているテストライブラリである、Rspecでテストを書くことにした。

https://qiita.com/tocomi/items/2dba0de52eefdcf33fd7

zerebom commented 3 years ago

必要なデータはすべて取得できたためclose