2017-05-26 66 views
1

我正在一起使用僕人和持久性。我有一個User實體,我想知道是否有可能只響應其字段的一個子集,具體取決於上下文。一個持久實體的多個JSON實例

讓我們考慮以下兩個端點:

type UserAPI = "user" 
      :> Capture "username" Username 
      :> Get '[JSON] (Entity User) 

type ProfileAPI = "profiles" 
       :> Capture "username" Username 
       :> Get '[JSON] (Entity User) 

type AppAPI = UserAPI :<|> ProfileAPI 

這裏是我們的User型號:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
User json sql=users 
    username Text 
    email  Text 
    password Text 
    token  Text 
    bio  Text Maybe default=NULL 
    image  Text Maybe default=NULL 
    createdAt UTCTime default=now() 
    updatedAt UTCTime Maybe default=NULL 

    UniqueUser username email 
    deriving Show 
|] 

GET /user請求到達時,讓我們說,我們只是想和emailtoken用於認證目的響應。另一方面,當GET /profile/:username請求到達時,我們只需要回覆username,bioimage

我們該如何做到這一點?謝謝。


更新:我相信這是可能通過使用不同的記錄特定表持久類型和僕人的請求類型之間「轉換」。例如,一個由Persistent使用,另一個用作與客戶端的接口。但是,這可能需要在兩者之間進行轉換的功能。隨着邏輯的發展,我認爲事情會變得麻煩。另外,我在想,定義ToJSON和FromJSON實例可以做到這一點,但是我無法將它包裹起來。

+0

@AlexisKing我編輯了我的帖子,解決您的評論。我有沒有錯過這一點?謝謝。 –

回答

0

爲什麼你想爲相同的數據類型多個實例?爲什麼不爲你希望每個處理程序返回的數據創建單獨的數據類型,並且爲每個數據類型創建了實例ToJSON

type UserAPI = "user" 
      :> Capture "username" Username 
      :> Get '[JSON] UserEmailAndToken 

type ProfileAPI = "profiles" 
       :> Capture "username" Username 
       :> Get '[JSON] UserNameBioAndImage 

type AppAPI = UserAPI :<|> ProfileAPI 

然後,你定義UserEmailAndTokenUserNameBioAndImage(這應該很容易),寫ToJSON情況下每個與User和這些類型之間進行簡單的功能映射一起。