team backend started

This commit is contained in:
Sendou
2020-01-19 01:12:24 +02:00
parent 571bb18edb
commit 8792d3f693
4 changed files with 112 additions and 1 deletions

75
graphql-schemas/team.js Normal file
View File

@@ -0,0 +1,75 @@
const { UserInputError, gql } = require("apollo-server-express")
const Team = require("../mongoose-models/team")
const User = require("../mongoose-models/user")
const typeDef = gql`
extend type Query {
teams: [Team!]!
}
extend type Mutation {
createTeam(name: String!): Team!
}
extend type User {
team: Team
}
type Result {
date: String
tweet_url: String
tournament_name: String!
placement: Int!
}
type Team {
name: String!
twitter_name: String
captain_discord_id: String!
member_discord_ids: [String!]!
member_users: [User!]!
countries: [String!]!
tag: String
invite_code: String
lf_post: String
tournament_results: [Result!]!
}
`
const resolvers = {
Query: {
teams: (root, args) => Team.find({}),
},
Mutation: {
createTeam: async (root, args, { user }) => {
if (!user) throw new UserInputError("Must be logged in to create a team")
if (user.team)
throw new UserInputError(
"Can't create a team since you are already in one"
)
const name = args.name.replace(/\s\s+/g, " ").trim()
if (name.length < 2 || name.length > 32 || !/^[a-z0-9␣]+$/i.test(name)) {
throw new UserInputError("Invalid team name provided", {
invalidArgs: args,
})
}
const name_regex = `^${name}$`
const existing_team = await Team.findOne({
name: { $regex: new RegExp(name_regex, "i") },
})
if (existing_team)
throw new UserInputError("Team with this name already exists")
const team = new Team({ name, captain_discord_id: user.discord_id })
await User.findByIdAndUpdate(user._id, { $set: { team: team._id } })
return team.save()
},
},
}
module.exports = {
Team: typeDef,
teamResolvers: resolvers,
}

29
mongoose-models/team.js Normal file
View File

@@ -0,0 +1,29 @@
const mongoose = require("mongoose")
const teamSchema = new mongoose.Schema({
name: String,
twitter_name: String,
captain_discord_id: String,
member_discord_ids: [String],
countries: [String],
tag: String,
invite_code: String,
lf_post: String,
tournament_results: [
{
date: Date,
tweet_url: String,
tournament_name: String,
placement: Number,
},
],
})
teamSchema.virtual("member_users", {
ref: "User",
localField: "member_discord_ids",
foreignField: "discord_id",
justOne: true,
})
module.exports = mongoose.model("Team", teamSchema)

View File

@@ -4,6 +4,10 @@ const userSchema = new mongoose.Schema({
username: { type: String, required: true },
discriminator: { type: String, required: true },
discord_id: { type: String, required: true },
team: {
type: mongoose.Schema.Types.ObjectId,
ref: "Team",
},
twitch_name: String,
twitter_name: String,
country: String,

View File

@@ -16,6 +16,7 @@ const {
} = require("./graphql-schemas/tournament")
const { FAPost, faPostResolvers } = require("./graphql-schemas/fapost")
const { Plus, plusResolvers } = require("./graphql-schemas/plus")
const { Team, teamResolvers } = require("./graphql-schemas/team")
const Query = gql`
type Query {
@@ -46,6 +47,7 @@ const schema = makeExecutableSchema({
Tournament,
FAPost,
Plus,
Team,
],
resolvers: merge(
resolvers,
@@ -59,7 +61,8 @@ const schema = makeExecutableSchema({
trendResolvers,
tournamentResolvers,
faPostResolvers,
plusResolvers
plusResolvers,
teamResolvers
),
})