feat: Added team leave
This commit is contained in:
parent
034e203c1e
commit
f9c13e5ada
@ -13,6 +13,7 @@
|
|||||||
"vue/multi-word-component-names": "off",
|
"vue/multi-word-component-names": "off",
|
||||||
"vue/singleline-html-element-content-newline": "off",
|
"vue/singleline-html-element-content-newline": "off",
|
||||||
"no-undef": "off",
|
"no-undef": "off",
|
||||||
"no-console": "off"
|
"no-console": "off",
|
||||||
|
"space-before-function-paren": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
export default defineEventHandler((event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const userId: string = event.context.params ? event.context.params.id : '@me'
|
let teamId: string = event.context.params ? event.context.params.id : '@current'
|
||||||
|
|
||||||
|
if (teamId === '@current') {
|
||||||
|
const user = await getUser('@me', event)
|
||||||
|
teamId = user.team._id.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
return await TeamModel.findById(teamId).populate('members')
|
||||||
})
|
})
|
||||||
|
30
webv2/server/api/teams/[id]/members/[userId].delete.ts
Normal file
30
webv2/server/api/teams/[id]/members/[userId].delete.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
let teamId: string = event.context.params ? event.context.params.id : '@current'
|
||||||
|
const userId: string = event.context.params ? event.context.params.userId : '@me'
|
||||||
|
|
||||||
|
const user = await getUser(userId, event)
|
||||||
|
|
||||||
|
if (!user.team) {
|
||||||
|
throw createError({ statusCode: 400, statusMessage: 'User must be in a team' })
|
||||||
|
}
|
||||||
|
|
||||||
|
if (teamId === '@current') {
|
||||||
|
teamId = user.team._id.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
const team = await TeamModel.findOneAndUpdate({ _id: user.team._id }, {
|
||||||
|
$pull: {
|
||||||
|
members: user._id
|
||||||
|
}
|
||||||
|
}, { returnDocument: 'after' })
|
||||||
|
|
||||||
|
if (team && team.members.length < 1) {
|
||||||
|
team.deleteOne()
|
||||||
|
}
|
||||||
|
|
||||||
|
user.team = undefined
|
||||||
|
|
||||||
|
await user.save()
|
||||||
|
|
||||||
|
return ''
|
||||||
|
})
|
@ -1,16 +1,23 @@
|
|||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const { name, color } = await readBody(event)
|
const { name, color, userId } = await readBody(event)
|
||||||
|
|
||||||
const user = await getUser('@me', event)
|
const user = await getUser(userId ?? '@me', event)
|
||||||
|
|
||||||
|
if (user.team) {
|
||||||
|
throw createError({ statusCode: 400, statusMessage: 'User already in a team' })
|
||||||
|
}
|
||||||
|
|
||||||
const team = new TeamModel({
|
const team = new TeamModel({
|
||||||
name,
|
name,
|
||||||
color
|
color,
|
||||||
|
members: [
|
||||||
|
user._id
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
await team.save()
|
await team.save()
|
||||||
|
|
||||||
user.teamId = team._id
|
user.team = team._id
|
||||||
|
|
||||||
await user.save()
|
await user.save()
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { Schema, Types, model } from 'mongoose'
|
|||||||
const userSchema = new Schema({
|
const userSchema = new Schema({
|
||||||
username: { type: String, required: false },
|
username: { type: String, required: false },
|
||||||
usernameType: { type: String, required: true, default: 'discord' },
|
usernameType: { type: String, required: true, default: 'discord' },
|
||||||
teamId: { type: Types.ObjectId, ref: 'Team', required: false },
|
team: { type: Types.ObjectId, ref: 'Team', required: false },
|
||||||
discord: {
|
discord: {
|
||||||
id: { type: String, required: true, unique: true },
|
id: { type: String, required: true, unique: true },
|
||||||
username: { type: String, required: true }
|
username: { type: String, required: true }
|
||||||
@ -31,9 +31,11 @@ const whitelistSchema = new Schema({
|
|||||||
const teamSchema = new Schema({
|
const teamSchema = new Schema({
|
||||||
name: { type: String, required: true, minLength: 3, maxLength: 16, unique: true, match: /^[a-zA-Z0-9]+$/ },
|
name: { type: String, required: true, minLength: 3, maxLength: 16, unique: true, match: /^[a-zA-Z0-9]+$/ },
|
||||||
color: { type: String, required: true, match: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/ },
|
color: { type: String, required: true, match: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/ },
|
||||||
amount: { type: Number, required: true, default: 1 },
|
|
||||||
textChannelId: { type: String, required: false },
|
textChannelId: { type: String, required: false },
|
||||||
voiceChannelId: { type: String, required: false }
|
voiceChannelId: { type: String, required: false },
|
||||||
|
members: [
|
||||||
|
{ type: Types.ObjectId, ref: 'User' }
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
export const UserModel = model<IUser>('User', userSchema)
|
export const UserModel = model<IUser>('User', userSchema)
|
||||||
|
@ -33,7 +33,7 @@ export const getUser = async (userId: string, event: any) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const user = await UserModel.findById(userId)
|
const user = await UserModel.findById(userId).populate('team')
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw createError({ statusCode: 400, statusMessage: 'No user was found' })
|
throw createError({ statusCode: 400, statusMessage: 'No user was found' })
|
||||||
|
12
webv2/types/global.d.ts
vendored
12
webv2/types/global.d.ts
vendored
@ -1,10 +1,10 @@
|
|||||||
import { Document } from 'mongoose'
|
import { Document, Types } from 'mongoose'
|
||||||
|
|
||||||
export {}
|
export {}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface IUser extends Document {
|
interface IUser extends Document {
|
||||||
_id: string,
|
_id: Types.ObjectId,
|
||||||
username: string,
|
username: string,
|
||||||
usernameType: string,
|
usernameType: string,
|
||||||
discord: {
|
discord: {
|
||||||
@ -21,22 +21,22 @@ declare global {
|
|||||||
admin: boolean,
|
admin: boolean,
|
||||||
moderator: boolean,
|
moderator: boolean,
|
||||||
},
|
},
|
||||||
teamId: string,
|
team?: ITeam,
|
||||||
accessToken?: string
|
accessToken?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IWhitelist {
|
interface IWhitelist {
|
||||||
_id: string,
|
_id: types.ObjectId,
|
||||||
uuid: string,
|
uuid: string,
|
||||||
connected: boolean,
|
connected: boolean,
|
||||||
code: string
|
code: string
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ITeam {
|
interface ITeam {
|
||||||
_id: string,
|
_id: types.ObjectId,
|
||||||
name: string,
|
name: string,
|
||||||
color: string,
|
color: string,
|
||||||
amount: number,
|
members: string[],
|
||||||
textChannelId: string,
|
textChannelId: string,
|
||||||
voiceChannelId: string
|
voiceChannelId: string
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user