使用AWS Amplify,我们可以对Conversation
模型中的消息应用排序吗?在获取会话时,最好根据生成的createdAt
日期对消息进行排序。
这些是目前使用的模型。
type Conversation @model {
id: ID!
messages: [Message!]! @hasMany
...
}
type Message @model {
id: ID!
authorId: String!
content: String!
conversation: Conversation @belongsTo
}
理想情况下希望将排序放在hasMany
指令上,但这是不可能的。
type Conversation @model {
id: ID!
messages: [Message!]! @hasMany(sortKeys:['createdAt'])
...
}
在createdAt
上使用排序字段创建Message
模型上的二级索引。
type Message @model {
id: ID!
authorId: String! @index(name: "byAuthorId", queryField: "getMessagesByAuthorId", sortKeyFields: [ "createdAt" ])
content: String!
conversation: Conversation @belongsTo
}
Amplify创建了一个新的查询来获取消息并应用排序。下面的示例使用react-query通过排序从authorId
中获取消息。
export function useMessagesPerAuthorId({
id,
filter,
enabled = true,
}: {
id: string | undefined;
filter: any;
enabled?: boolean;
}) {
return useQuery(
['conversations', 'messages', id, filter],
() => fetchMessagesByAuthorId({ id: id!, filter }),
{ enabled: enabled && !!id }
);
}
async function fetchMessagesByAuthorId({ id, filter }: { id: string; filter: any }) {
const query: any = await API.graphql({
query: getMessagesByAuthorId,
variables: { authorId: id, sortDirection: 'DESC', filter },
});
const data: Message[] = query.data?.getMessagesByAuthorId.items;
return data;
}
现在我们可以在视图组件中调用这个钩子并传递过滤器了。
const { isLoading, data: messages = [] } = useMessagesPerAuthorId({
id: profile?.id,
filter: {
and: [{ conversationMessagesId: { eq: conversationId } }, { deleted: { eq: false } }],
},
enabled: !!profile?.id,
});