0

背景

GraphQL在我的AWS AmplifyReactJS项目中使用。它是一个基于事件的应用程序,用户可以在其中创建参与事件。现在我正在尝试实现一个功能,让活动参与者可以在群组中和私下聊天。每个事件将有一个组,包括所有参与者作为聊天成员,以及任何给定用户的一对一私人对话。我是新手GraphQL

问题

为新的聊天功能创建适当的模式一直是一个障碍。作为一个一直在做 RESTFull API 的人,我应该如何GraphQL connections在不同的模型之间进行创建?放大文档几乎没有帮助。

  • 活动应该有聊天室吗?或聊天室有与之相关的事件?
  • 聊天室应该有成员还是用户应该有聊天室?
  • 一个用户可以有多个房间,一个房间可以有多个用户(聊天成员)。如何正确连接它们?

示例代码

  • 有一个RideEvent表格,用户可以在其中创建其他人可以参与并在群组中聊天的事件。
  • 有一个User表格存储AWS Cognito使用AWS Lambda后确认功能获取的注册用户信息。
  • Roomtable 是一个公正的聊天室,里面有成员和Messages。它还存储有关RideEvent它所属的信息。我正在尝试将其用于群组和个人聊天。
  • Message是一个存储聊天消息、聊天作者以及所属房间的表。

AWS Amplify自动生成queries和。所以我几乎不处理自己创建它们。mutationssubscriptions

这是一个示例架构:

# [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!
}
4

0 回答 0