背景
我GraphQL
在我的AWS Amplify
和ReactJS
项目中使用。它是一个基于事件的应用程序,用户可以在其中创建参与事件。现在我正在尝试实现一个功能,让活动参与者可以在群组中和私下聊天。每个事件将有一个组,包括所有参与者作为聊天成员,以及任何给定用户的一对一私人对话。我是新手GraphQL
。
问题
为新的聊天功能创建适当的模式一直是一个障碍。作为一个一直在做 RESTFull API 的人,我应该如何GraphQL connections
在不同的模型之间进行创建?放大文档几乎没有帮助。
- 活动应该有聊天室吗?或聊天室有与之相关的事件?
- 聊天室应该有成员还是用户应该有聊天室?
- 一个用户可以有多个房间,一个房间可以有多个用户(聊天成员)。如何正确连接它们?
示例代码
- 有一个
RideEvent
表格,用户可以在其中创建其他人可以参与并在群组中聊天的事件。 - 有一个
User
表格存储AWS Cognito
使用AWS Lambda
后确认功能获取的注册用户信息。 Room
table 是一个公正的聊天室,里面有成员和Message
s。它还存储有关RideEvent
它所属的信息。我正在尝试将其用于群组和个人聊天。Message
是一个存储聊天消息、聊天作者以及所属房间的表。
AWS Amplify
自动生成queries
和。所以我几乎不处理自己创建它们。mutations
subscriptions
这是一个示例架构:
# [RideEvent] where
# [RideEvent]s can be created, updated, read and deleted.
# [User]s can request for participation, participate, and group chat with members.
type RideEvent @model {
id: ID!
name: String!
date: AWSDate!
description: String
course_id: ID
course: Course @connection(fields: ["course_id"])
creator_id: ID
creator: User @connection(fields: ["creator_id"])
participants: [ParticipantsUsers]
@connection(keyName: "byRideEvent", fields: ["id"])
waiting_users: [WaitingUsers]
@connection(keyName: "byRideEvent", fields: ["id"])
}
type Course @model {
id: ID!
title: String!
description: String
distance: String!
origin: String
destination: String
duration: String
summary: String
overview_polyline: String
creator_id: ID
creator: User @connection(fields: ["creator_id"])
}
type ParticipantsUsers
@model
@key(name: "byRideEvent", fields: ["ride_event_id"]) {
id: ID!
ride_event_id: ID!
user_id: ID
user: User @connection(fields: ["user_id"])
}
type WaitingUsers
@model
@key(name: "byRideEvent", fields: ["ride_event_id", "user_id"]) {
id: ID!
ride_event_id: ID!
user_id: ID!
user: User @connection(fields: ["user_id"])
}
# Registered [User] info grabbed from AWS Cognito with AWS Lambda PostConfirmation function
type User @model {
id: ID!
username: String!
email: AWSEmail!
phone_number: AWSPhone
# is it wise to have a user have a room?
# room: [Room] @connection how to properly connect a chat room to a user?
}
type Room @model {
id: ID!
ride_event_id: ID
# do rooms have a RideEvent? or RideEvent should have a chat room?
ride_event: RideEvent @connection(keyField: "ride_event_id")
# could not properly connect a chat [Room] to a [User], so I used a connection to [ChatMember]
members: [ChatMember] @connection(keyName: "byRoomID", fields: ["id"])
messages: [Message] @connection(keyName: "byRoomID", fields: ["id"])
}
type ChatMember @model @key(name: "byRoomID", fields: ["room_id"]) {
id: ID!
room_id: ID!
user_id: ID
user: User @connection(fields: ["user_id"])
}
type Message @model @key(name: "byRoomID", fields: ["room_id"]) {
id: ID!
room_id: ID!
author_id: ID!
author: User @connection(fields: ["author_id"])
body: String!
}