I have an upsert mutation that looks like the following:
mutation AddUsers($users: [AddUserInput!]!) {
addUser(input: $users, upsert: true) {
user {
fbUid
}
numUids
}
}
Which I then populate with a format that looks like this:
// Transform user format
const dgUsers = hsUsers.map((hsUser) => ({
fbUid: hsUser.uid,
private: {
fbUid: hsUser.uid,
playKey: hsUser.playKey,
},
connectCode: hsUser.connectCode ? {
code: hsUser.connectCode,
} : null,
isOnlineEnabled: hsUser.isOnlineEnabled,
displayName: hsUser.displayName,
status: (hsUser.status || "ACTIVE").toUpperCase(),
}));
For inserting, this seems to work fine. For upserting, it also seems to work fine if there’s only one user at a time. When upserting with multiple users though, I get the error message mutation addUser failed because Dgraph execution failed because Some variables are declared multiple times
Here is my schema for reference:
interface DbObject @auth(
add: { rule: "{$ROLE: { eq: \"SERVICE\" }}" },
update: { rule: "{$ROLE: { eq: \"SERVICE\" }}" },
delete: { rule: "{$ROLE: { eq: \"SERVICE\" }}" }
) {
id: ID!
}
type User implements DbObject @key(fields: "fbUid") {
fbUid: String! @id
private: PrivateUserInfo @hasInverse(field: user)
connectCode: ConnectCode @hasInverse(field: user)
isOnlineEnabled: Boolean
displayName: String @search(by: [hash, trigram])
status: UserStatus!
}
# Currently using separate object to handle uniqueness constraint of connect code. If a unique
# constraint becomes available, maybe that would be better?
type ConnectCode implements DbObject @key(fields: "code") {
code: String! @id @search(by: [hash, trigram])
user: User!
}
enum UserStatus {
"""
Indicates the account is in good standing
"""
ACTIVE
"""
User has been banned
"""
BANNED
}
# Currently using separate object to manage field rules. Field-based auth was supposed to be
# available in 21.07 which doesn't seem to be out yet. Once it's out, consider using field-based
# auth
type PrivateUserInfo implements DbObject @key(fields: "fbUid") @auth(
query: {
or: [
{ rule: "{$ROLE: { eq: \"SERVICE\" }}" },
{ rule: """
query ($USER: String!) {
queryPrivateUserInfo {
user(filter: { fbUid: {eq: $USER}}) {
fbUid
}
}
}"""
}
]
}
) {
fbUid: String! @id
playKey: String
user: User!
}
Is this a bug? Or am I doing something wrong?