From 8792d3f693d16cf1edb2a568ab8867050c210dc4 Mon Sep 17 00:00:00 2001 From: Sendou Date: Sun, 19 Jan 2020 01:12:24 +0200 Subject: [PATCH] team backend started --- graphql-schemas/team.js | 75 +++++++++++++++++++++++++++++++++++++++++ mongoose-models/team.js | 29 ++++++++++++++++ mongoose-models/user.js | 4 +++ schema.js | 5 ++- 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 graphql-schemas/team.js create mode 100644 mongoose-models/team.js diff --git a/graphql-schemas/team.js b/graphql-schemas/team.js new file mode 100644 index 000000000..3d9f28855 --- /dev/null +++ b/graphql-schemas/team.js @@ -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, +} diff --git a/mongoose-models/team.js b/mongoose-models/team.js new file mode 100644 index 000000000..078d65c53 --- /dev/null +++ b/mongoose-models/team.js @@ -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) diff --git a/mongoose-models/user.js b/mongoose-models/user.js index 2d3679616..503dccdf7 100644 --- a/mongoose-models/user.js +++ b/mongoose-models/user.js @@ -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, diff --git a/schema.js b/schema.js index bf85ea6da..972d6fa43 100644 --- a/schema.js +++ b/schema.js @@ -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 ), })