為 app 端的各種需求開API
品牌廚房、活動 tab 開 API 給 app
愛料理 app 上面,品牌廚房、活動的頁面原本是純 hybrid view。為了要通過 Google Android Excellence 的審核,需要讓 hybrid view 的 navbar 與 app 的一致,於是拆掉hybrid view header,改用 api 出。
- 原本品牌廚房、活動頁 hybrid view 的 navbar 是用 semantic_navigation 這套件,一個 tab 一個判斷式,判斷要出哪些tab
- 最初模仿這寫法,在 jbuilder 的 json template 裡寫了一堆判斷式,整個API超慢
- 後來把它抽象化,在 controller/concern 加個 HybridTabHelper
- 我定義了兩個hash,兩個hash都用一樣的keys
- 先定義一個全部 tab 會有哪些tab、link 的 nested hash
- 然後把該品牌廚房的tab要的就是 true,不要的就是 false,然後只取要的tab 存成一個hash
- 然後兩個 hash 用 select 去挑出 key 存在的 key-value pair 回傳的hash 就是我們要的tab的資訊
這段還沒決定要不要講
- 在此要先講一下品牌帳號的設計,一個品牌帳號其實就是一個 User 帳號
- 但是business user 比普通 user 多出來的資訊,像是哪些 tab 要出,哪些 tab ( 一個true or false 的判斷 )
- 前人過去的實作是再建一個 BrandSetting model 並給他一堆 boolean 欄位,BrandSetting belongs_to User
- 然後 user model 去 delegate BrandSetting 的這些欄位
- 於是 semantic_navigation 這套件, tab 判斷式的判斷條件就是剛剛那些在User model 裡 delegate 的 method。
recipe API 的 cover / cover_pictures 二選一
API 裡面會同時出 cover & cover_pictures,佔用了很大的傳輸空間。從user agent 去判斷 user 的 app 版本,不同版本出不同 API
- 在 application helper 裡寫版本判斷的helper
- 若要在 api controller 裡用 ApplicationHelper,需要用 helper ApplicationHelper
- 我們家有自己寫 UserAgentParser 用 regexp 去取得 app 版本
- 用 Gem::Version 做版本判斷
統一 API 找不到物件的錯誤處理
以前的做法真的很醜,在 api 的 action 裡到處寫判斷式。後來 refactor 把它拆出來用 rescue_from 去解
- 在 api contorller 裡 rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
- 以前的做法真的很醜,在 api 的 action 裡到處寫判斷式,沒有就 render status: 404, json: { error: '...略' }
- 改用 regexp 去撈 exception.message,依照不同的 record_type 來出不同的 error message
重寫 FCM API
FCM API 要增加圖片,並且用 pushing gem 重寫
- 原本的 FCM API 是用前同事自己手刻的 gem 寫的。舊的 FCM 寫法 json format、logic 都寫在一起,維護不易
- 改用 pushing 的好處是,像MVC架構一樣 view、controller 分離,這樣比較乾淨。
- 此外 pushing 對 ActiveJob、Sidekiq也有著較好的支援,
- 用 pushing 的 deliver_later! 並且去 Sidekiq Configuration File 配置,就能把 notifer 丟到 sidekiq Queue 去處理了