leaveTeam

This commit is contained in:
Sendou 2020-06-16 22:48:08 +03:00
parent ea1022cac6
commit 5e8cb8600f
3 changed files with 93 additions and 21 deletions

View File

@ -14,6 +14,11 @@ const typeDef = gql`
extend type Mutation {
addTeam(name: String!): Boolean!
joinTeam(inviteCode: String!): Boolean!
resetInviteCode: String!
leaveTeam: Boolean!
# disbandTeam: Boolean!
# transferCaptain: Boolean!
# updateTeam(newValues: UpdateTeamInput!): Boolean!
}
extend type User {
@ -80,6 +85,48 @@ const getUsersBestPlacement = async (twitter, discordId) => {
}
}
const recalculateTeamsXp = async (team, discordIdToSkip) => {
const teamsPlacements = []
for (const member of team.members) {
if (member.discordId === discordIdToSkip) {
continue
}
const user = await User.findOne({ discord_id: member.discordId })
const bestPlacement = await getUsersBestPlacement(
user.twitter_name,
user.discord_id
)
if (bestPlacement) teamsPlacements.push(bestPlacement)
}
const xpPlacements = teamsPlacements
.sort((a, b) => b.xPower - a.xPower)
.slice(0, 4)
team.xpPlacements = xpPlacements
let teamXp = xpPlacements.reduce((acc, cur) => (acc += cur.xPower), 0)
teamXp += 2000 * (4 - xpPlacements.length)
teamXp /= 4
team.teamXp = teamXp
}
const recalculateTeamsCountries = async (team, newCountry, discordIdToSkip) => {
const newCountries = new Set()
if (newCountry) newCountries.add(newCountry)
for (const member of team.members) {
if (member.discordId === discordIdToSkip) {
continue
}
const user = await User.findOne({ discord_id: member.discordId })
if (user.country) newCountries.add(user.country)
}
team.countries = Array.from(newCountries)
}
const resolvers = {
Query: {
teams: () => Team.find({}),
@ -200,6 +247,47 @@ const resolvers = {
team.countries = countries
}
await team.save()
await User.findByIdAndUpdate(ctx.user._id, { $set: { team: team._id } })
return true
},
leaveTeam: async (_root, _args, { user }) => {
if (!user) throw new UserInputError("Must be logged in to leave a team")
if (!user.team) {
throw new UserInputError("Can't leave a team if you aren't in one")
}
const team = await Team.findById(user.team)
if (!team) {
throw new Error("Unexpected error: team not found with the id")
}
const memberOfTeam = team.members.find(
(member) => member.discordId === user.discord_id
)
if (!memberOfTeam) {
throw new Error("Unexpected error: user not found in the member list")
}
if (memberOfTeam.captain) {
throw new UserInputError("Can't leave a team you are captain for")
}
team.members = team.members.filter(
(member) => member.discordId !== user._id
)
await User.findByIdAndUpdate(user._id, { $unset: { team: "" } })
const pastMembers = team.pastMembersDiscordIds
? team.pastMembersDiscordIds
: []
if (!pastMembers.includes(user.discord_id))
pastMembers.push(user.discord_id)
team.pastMembersDiscordIds = pastMembers
await recalculateTeamsCountries(team, null, user.discord_id)
await recalculateTeamsXp(team, user.discord_id)
await team.save()
return true
@ -210,4 +298,5 @@ const resolvers = {
module.exports = {
Team: typeDef,
teamResolvers: resolvers,
recalculateTeamsCountries,
}

View File

@ -5,6 +5,7 @@ const Team = require("../mongoose-models/team")
const countries = require("../utils/countries")
const weapons = require("../utils/weapons")
const mockUser = require("../utils/mocks")
const { recalculateTeamsCountries } = require("./team")
require("dotenv").config()
const typeDef = gql`
@ -55,25 +56,6 @@ const typeDef = gql`
}
`
const recalculateTeamsCountries = async (team, newCountry, discordIdToSkip) => {
const newCountries = new Set()
newCountries.add(newCountry)
for (const member of team.members) {
if (member.discordId === discordIdToSkip) {
continue
}
const user = await User.findOne({ discord_id: member.discordId })
console.log("user.id", user.id)
console.log("user.country", user.country)
if (user.country) newCountries.add(user.country)
}
console.log("newCountries", newCountries)
team.countries = Array.from(newCountries)
await team.save()
}
const resolvers = {
User: {
top500: async (root) => {
@ -165,6 +147,7 @@ const resolvers = {
args.country,
ctx.user.discord_id
)
await team.save()
} else {
const countries = team.countries || []
if (!countries.includes(args.country)) countries.push(args.country)

View File

@ -1,9 +1,9 @@
const mockUser = {
_id: "5cee8f73d1120d4315c55011",
id: "5cee8f73d1120d4315c55011",
//id: "5cee8f73d1120d4315c55011",
team: "5ee60f1fff81d717ecae4bb1",
discord_id: "79237403620945920",
//discord_id: "79237403620945920",
discord_id: "220344765240180738",
__v: 0,
avatar: "a22c9557975494f859242aaf9b317058",
discriminator: "0043",