diff --git a/graphql-schemas/team.js b/graphql-schemas/team.js index f9e52f9fb..4722fd3a2 100644 --- a/graphql-schemas/team.js +++ b/graphql-schemas/team.js @@ -13,6 +13,7 @@ const typeDef = gql` extend type Mutation { addTeam(name: String!): Boolean! + joinTeam(inviteCode: String!): Boolean! } extend type User { @@ -44,6 +45,7 @@ const typeDef = gql` disbanded: Boolean founded: Founded members: [Member!] + countries: [String!] pastMembersDiscordIds: [String] tag: String # inviteCode: String @@ -122,6 +124,8 @@ const resolvers = { : undefined const xpPlacements = bestPlacement ? [bestPlacement] : undefined + const countries = user.country ? [user.country] : undefined + const team = new Team({ name, members: [ @@ -130,6 +134,7 @@ const resolvers = { captain: true, }, ], + countries, inviteCode: uuidv4(), teamXp, xpPlacements, @@ -138,6 +143,65 @@ const resolvers = { await User.findByIdAndUpdate(user._id, { $set: { team: team._id } }) await team.save() + return true + }, + joinTeam: async (root, { inviteCode }, { user }) => { + if (!user) throw new UserInputError("Must be logged in to join a team") + if (user.team) { + throw new UserInputError( + "Can't join a team since you are already in one" + ) + } + + const team = await Team.findOne({ inviteCode }) + if (!team) { + throw new UserInputError("Invalid invite code provided") + } + + if (team.members.length >= 12) { + throw new UserInputError( + "This team already has the max number of members" + ) + } + + team.members.push({ + discordId: user.discord_id, + }) + + const bestPlacement = await getUsersBestPlacement( + user.twitter_name, + user.discord_id + ) + + if (bestPlacement) { + const teamsPlacements = team.xpPlacements || [] + teamsPlacements.push(bestPlacement) + teamsPlacements.sort((a, b) => b.xPower - a.xPower) + + if (teamsPlacements.length === 5) teamsPlacements.pop() + + team.xpPlacements = teamsPlacements + + let teamXp = teamsPlacements.reduce( + (acc, cur) => (acc += cur.xPower), + 0 + ) + + teamXp += 2000 * (4 - teamsPlacements.length) + teamXp /= 4 + + team.teamXp = teamXp + } + + if (user.country) { + const countries = team.countries || [] + if (!countries.includes(user.country)) countries.push(user.country) + + team.countries = countries + } + + await team.save() + return true }, }, diff --git a/mongoose-models/team.js b/mongoose-models/team.js index f63b03a2b..7549ac7c1 100644 --- a/mongoose-models/team.js +++ b/mongoose-models/team.js @@ -14,6 +14,7 @@ const teamSchema = new mongoose.Schema({ role: String, }, ], + countries: [String], pastMembersDiscordIds: [String], tag: String, inviteCode: String, diff --git a/utils/mocks.js b/utils/mocks.js index 17ad154bc..1bc6d8a76 100644 --- a/utils/mocks.js +++ b/utils/mocks.js @@ -8,6 +8,7 @@ const mockUser = { twitch_name: "sendou", twitter_name: "sendouc", username: "Sendou", + country: "fi", top500: true, custom_url: "sendou", plus: {