2 人のユーザーとのチャットをクエリしようとしています。あるなら返品したいです。そうでない場合は、その 2 人のユーザーとの新しいチャットを作成して返したいと思います。
コメントは、チャットが存在する場合に失敗する場所を示しています。
また、このシナリオでこれら 2 人のユーザーとの新しいチャットを作成する方法を示していただけると助かります。
func create(req: Request) throws -> EventLoopFuture<Chat> {
let currentUser = try req.auth.require(User.self)
guard
let userID = req.parameters.get("userID"),
let uuid = UUID(userID)
else { throw Abort(.badRequest) }
return User
.query(on: req.db)
.filter(\.$id == uuid)
.with(\.$chats)
.first()
.unwrap(or: Abort(.internalServerError))
.flatMap({ chatUser -> EventLoopFuture<Chat> in
let chat = chatUser
.chats
.filter({
$0.users.contains(where: { $0.id == currentUser.id }) // FAILS HERE: Fatal error: Siblings relation not eager loaded, use $ prefix to access: Siblings<Chat, User, ChatUser>(from: [chat_id], to: [user_id]): file
})
.first
if let chat = chat {
return req
.eventLoop
.makeSucceededFuture(chat)
} else {
// create new chat with those two users and return
}
})
}
単純化されたモデル:
final class Chat: Model, Content {
@ID(key: .id)
var id: UUID?
@Siblings(through: ChatUser.self, from: \.$chat, to: \.$user)
var users: [User]
}
final class User: Model, Content {
@ID(key: .id)
var id: UUID?
@Siblings(through: ChatUser.self, from: \.$user, to: \.$chat)
var chats: [Chat]
}
final class ChatUser: Model {
@ID(key: .id)
var id: UUID?
@Parent(key: Keys.chatId)
var chat: Chat
@Parent(key: Keys.userId)
var user: User
}