summary refs log tree commit diff
path: root/src/api
diff options
context:
space:
mode:
authorTomatoCake <60300461+DEVTomatoCake@users.noreply.github.com>2024-08-24 07:37:34 +0200
committerTomatoCake <60300461+DEVTomatoCake@users.noreply.github.com>2024-08-24 07:37:34 +0200
commiteca4f1b56c1d71d381a287e9558cd28167e39ca3 (patch)
treeeacc003298fdfecb3103baff5fb8d1f31e5b9b40 /src/api
parentMerge pull request #1194 from DEVTomatoCake/fix/update-vanity-url-widget-invite (diff)
downloadserver-ts-eca4f1b56c1d71d381a287e9558cd28167e39ca3.tar.xz
Listing & creation of Developer Portal teams
Diffstat (limited to 'src/api')
-rw-r--r--src/api/routes/teams.ts84
1 files changed, 77 insertions, 7 deletions
diff --git a/src/api/routes/teams.ts b/src/api/routes/teams.ts

index 26570165..1328f661 100644 --- a/src/api/routes/teams.ts +++ b/src/api/routes/teams.ts
@@ -1,29 +1,99 @@ /* Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Copyright (C) 2023 Spacebar and Spacebar Contributors - + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - + You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ import { Request, Response, Router } from "express"; import { route } from "@spacebar/api"; +import { + Team, + TeamCreateSchema, + TeamMember, + TeamMemberRole, + TeamMemberState, + User, +} from "@spacebar/util"; +import { HTTPError } from "lambert-server"; const router: Router = Router(); -router.get("/", route({}), async (req: Request, res: Response) => { - //TODO - res.send([]); -}); +router.get( + "/", + route({ + query: { + include_payout_account_status: { + type: "boolean", + description: + "Whether to include team payout account status in the response (default false)", + }, + }, + responses: { + 200: { + body: "TeamListResponse", + }, + }, + }), + async (req: Request, res: Response) => { + const teams = await Team.find({ + where: { + owner_user_id: req.user_id, + }, + relations: ["members"], + }); + + res.send(teams); + }, +); + +router.post( + "/", + route({ + requestBody: "TeamCreateSchema", + responses: { + 200: { + body: "Team", + }, + }, + }), + async (req: Request, res: Response) => { + const user = await User.findOneOrFail({ + where: [{ id: req.user_id }], + select: ["mfa_enabled"], + }); + if (!user.mfa_enabled) + throw new HTTPError("You must enable MFA to create a team"); + + const body = req.body as TeamCreateSchema; + + const team = Team.create({ + name: body.name, + owner_user_id: req.user_id, + }); + await team.save(); + + await TeamMember.create({ + user_id: req.user_id, + team_id: team.id, + membership_state: TeamMemberState.ACCEPTED, + permissions: ["*"], + role: TeamMemberRole.ADMIN, + }).save(); + + res.json(team); + }, +); export default router;