我一起使用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
请求到达时,假设我们只想回复email
和token
进行身份验证。另一方面,当GET /profile/:username
请求到达时,我们只想回复username
,bio
和image
。
我们怎样才能做到这一点?感谢。
更新:我相信通过使用特定表的不同记录,可以在Persistent类型和Servant请求类型之间进行“转换”。例如,一个由Persistent使用,另一个用作与客户端的接口。但是,这可能需要在两者之间进行转换的功能。随着逻辑的发展,我认为事情会变得很麻烦。
此外,我认为定义ToJSON和FromJSON实例可以解决这个问题,但我无法绕过它。
答案 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
然后你定义UserEmailAndToken
和UserNameBioAndImage
(这应该很容易),为每个实例编写ToJSON
个实例,以及User
和这些实例之间的平凡函数映射类型。