Controller#Action : Api::V1::SmokingAreasController#index
Route(API設計リンク) : GET /v1/smoking_areas
Auth : なし
Params(キー・型・必須/制約) : API設計の Query と同じ。
・latitude: integer(必須、 -90…90 、範囲外はinvalid_param ) ・longitude: integer(必須、-180…180、範囲外はinvalid_param)
・tobacco_type_ids[] : integer[] (任意、フィルター(繰り返しキー) )
・radius_m : integer (任意、既定1000、[100, 3000] にclamp。フロントはビューポートから算出) ・q : string (任意、名称(将来的には 建物名)の部分一致)
・sort : string (任意、既定distance_asc、distance_* は latitude, longitude必須)
・page : integer (任意、既定1、1未満は1 に丸める)
・per_page : integer (任意、既定20、[1, 50] にclamp)
処理の流れ :
1.パラメータの型・範囲をバリデーション(latitude / longitude, radius_m, sort, page, per_page など。不正時は 400 invalid_param)
2.tobacco_type_ids[](タバコ種別)が指定されていれば、中間テーブル経由で該当喫煙所だけをDB側の絞り込みで残す
3.q が指定されていれば、name の部分一致でさらに絞り込み
4.位置情報(latitude, longitude)と radius_m で距離(distance_m)を計算し、範囲内(既定:1000m, [100, 3000] でclamp)の喫煙所に絞る
5.sort で distance_asc が指定されている場合は、distance_m の昇順で並び替え、page / per_page でページネーションして返す
成功HTTP : 200
代表エラー : 400 invalid_param
Notes :