一个Persistent实体的多个JSON实例

时间:2017-05-26 22:17:29

标签: haskell persistent servant

我一起使用Servant和Persistent。我有一个User实体,我想知道是否可以只根据上下文对其字段的一部分进行响应。

让我们考虑以下两个端点:

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请求到达时,我们只想回复usernamebioimage

我们怎样才能做到这一点?感谢。

更新:我相信通过使用特定表的不同记录,可以在Persistent类型和Servant请求类型之间进行“转换”。例如,一个由Persistent使用,另一个用作与客户端的接口。但是,这可能需要在两者之间进行转换的功能。随着逻辑的发展,我认为事情会变得很麻烦。

此外,我认为定义ToJSON和FromJSON实例可以解决这个问题,但我无法绕过它。

1 个答案:

答案 0 :(得分:1)

为什么要为同一数据类型设置多个实例?为什么不为每个处理程序返回的数据创建单独的数据类型,为每个数据库创建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和这些实例之间的平凡函数映射类型。