2017-05-26 72 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和这些类型之间进行简单的功能映射一起。