From 25279271ce84c3193739c0f297f984961cef0af6 Mon Sep 17 00:00:00 2001 From: Brian Cao Date: Fri, 18 Nov 2022 00:27:42 -0800 Subject: [PATCH] Add some api/team endpoints. --- pages/api/teams/[id]/index.ts | 38 ++++++-------------------- pages/api/teams/[id]/user.ts | 48 +++++++++++++++++++++++++++++++++ pages/api/teams/[id]/website.ts | 48 +++++++++++++++++++++++++++++++++ pages/api/teams/index.ts | 47 ++++++++++++++++++++++++++++++++ pages/api/users/index.ts | 2 +- queries/admin/team.ts | 16 +++++------ queries/admin/teamUser.ts | 4 ++- queries/admin/teamWebsite.ts | 4 ++- queries/admin/userRole.ts | 4 ++- queries/admin/userWebsite.ts | 4 ++- 10 files changed, 172 insertions(+), 43 deletions(-) create mode 100644 pages/api/teams/[id]/user.ts create mode 100644 pages/api/teams/[id]/website.ts diff --git a/pages/api/teams/[id]/index.ts b/pages/api/teams/[id]/index.ts index 26440c8b..14710a54 100644 --- a/pages/api/teams/[id]/index.ts +++ b/pages/api/teams/[id]/index.ts @@ -1,17 +1,17 @@ -import { badRequest, hashPassword, methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { getTeam, deleteTeam, updateTeam } from 'queries'; +import { Team } from '@prisma/client'; +import { NextApiRequestQueryBody } from 'interface/api/nextApi'; import { useAuth } from 'lib/middleware'; import { NextApiResponse } from 'next'; -import { NextApiRequestQueryBody } from 'interface/api/nextApi'; -import { Team } from '@prisma/client'; +import { badRequest, methodNotAllowed, ok, unauthorized } from 'next-basics'; +import { deleteTeam, getTeam, updateTeam } from 'queries'; export interface TeamRequestQuery { id: string; } export interface TeamRequestBody { - username: string; - password: string; + name?: string; + is_deleted?: boolean; } export default async ( @@ -36,35 +36,13 @@ export default async ( } if (req.method === 'POST') { - const { username, password } = req.body; + const { name, is_deleted: isDeleted } = req.body; if (id !== userId && !isAdmin) { return unauthorized(res); } - const user = await getTeam({ id }); - - const data: any = {}; - - if (password) { - data.password = hashPassword(password); - } - - // Only admin can change these fields - if (isAdmin) { - data.username = username; - } - - // Check when username changes - if (data.username && user.username !== data.username) { - const userByTeamname = await getTeam({ username }); - - if (userByTeamname) { - return badRequest(res, 'Team already exists'); - } - } - - const updated = await updateTeam(data, { id }); + const updated = await updateTeam({ name, isDeleted }, { id }); return ok(res, updated); } diff --git a/pages/api/teams/[id]/user.ts b/pages/api/teams/[id]/user.ts new file mode 100644 index 00000000..9f1290e1 --- /dev/null +++ b/pages/api/teams/[id]/user.ts @@ -0,0 +1,48 @@ +import { NextApiRequestQueryBody } from 'interface/api/nextApi'; +import { uuid } from 'lib/crypto'; +import { useAuth } from 'lib/middleware'; +import { NextApiResponse } from 'next'; +import { methodNotAllowed, ok } from 'next-basics'; +import { createTeamUser, deleteTeamUser, getUsersByTeamId } from 'queries'; + +export interface TeamUserRequestQuery { + id: string; +} + +export interface TeamUserRequestBody { + user_id: string; + team_user_id?: string; +} + +export default async ( + req: NextApiRequestQueryBody, + res: NextApiResponse, +) => { + await useAuth(req, res); + + const { id: teamId } = req.query; + + if (req.method === 'GET') { + const user = await getUsersByTeamId({ teamId }); + + return ok(res, user); + } + + if (req.method === 'POST') { + const { user_id: userId } = req.body; + + const updated = await createTeamUser({ id: uuid(), userId, teamId }); + + return ok(res, updated); + } + + if (req.method === 'DELETE') { + const { team_user_id } = req.body; + + await deleteTeamUser(team_user_id); + + return ok(res); + } + + return methodNotAllowed(res); +}; diff --git a/pages/api/teams/[id]/website.ts b/pages/api/teams/[id]/website.ts new file mode 100644 index 00000000..35c2e36e --- /dev/null +++ b/pages/api/teams/[id]/website.ts @@ -0,0 +1,48 @@ +import { NextApiRequestQueryBody } from 'interface/api/nextApi'; +import { uuid } from 'lib/crypto'; +import { useAuth } from 'lib/middleware'; +import { NextApiResponse } from 'next'; +import { methodNotAllowed, ok } from 'next-basics'; +import { createTeamWebsite, deleteTeamWebsite, getWebsitesByTeamId } from 'queries'; + +export interface TeamWebsiteRequestQuery { + id: string; +} + +export interface TeamWebsiteRequestBody { + website_id: string; + team_website_id?: string; +} + +export default async ( + req: NextApiRequestQueryBody, + res: NextApiResponse, +) => { + await useAuth(req, res); + + const { id: teamId } = req.query; + + if (req.method === 'GET') { + const website = await getWebsitesByTeamId({ teamId }); + + return ok(res, website); + } + + if (req.method === 'POST') { + const { website_id: websiteId } = req.body; + + const updated = await createTeamWebsite({ id: uuid(), websiteId, teamId }); + + return ok(res, updated); + } + + if (req.method === 'DELETE') { + const { team_website_id } = req.body; + + await deleteTeamWebsite(team_website_id); + + return ok(res); + } + + return methodNotAllowed(res); +}; diff --git a/pages/api/teams/index.ts b/pages/api/teams/index.ts index e69de29b..8173c3b2 100644 --- a/pages/api/teams/index.ts +++ b/pages/api/teams/index.ts @@ -0,0 +1,47 @@ +import { Team } from '@prisma/client'; +import { NextApiRequestQueryBody } from 'interface/api/nextApi'; +import { uuid } from 'lib/crypto'; +import { useAuth } from 'lib/middleware'; +import { NextApiResponse } from 'next'; +import { badRequest, methodNotAllowed, ok } from 'next-basics'; +import { createTeam, getTeam, getTeamsByUserId } from 'queries'; +export interface TeamsRequestBody { + name: string; + description: string; +} + +export default async ( + req: NextApiRequestQueryBody, + res: NextApiResponse, +) => { + await useAuth(req, res); + + const { + user: { id }, + } = req.auth; + + if (req.method === 'GET') { + const users = await getTeamsByUserId(id); + + return ok(res, users); + } + + if (req.method === 'POST') { + const { name } = req.body; + + const user = await getTeam({ name }); + + if (user) { + return badRequest(res, 'Team already exists'); + } + + const created = await createTeam({ + id: id || uuid(), + name, + }); + + return ok(res, created); + } + + return methodNotAllowed(res); +}; diff --git a/pages/api/users/index.ts b/pages/api/users/index.ts index 6b942287..07007546 100644 --- a/pages/api/users/index.ts +++ b/pages/api/users/index.ts @@ -13,7 +13,7 @@ export interface UsersRequestBody { } export default async ( - req: NextApiRequestQueryBody, + req: NextApiRequestQueryBody, res: NextApiResponse, ) => { await useAuth(req, res); diff --git a/queries/admin/team.ts b/queries/admin/team.ts index 71b5f807..8687fb64 100644 --- a/queries/admin/team.ts +++ b/queries/admin/team.ts @@ -1,19 +1,19 @@ -import { Prisma, Role, Team, TeamUser } from '@prisma/client'; +import { Prisma, Team, TeamUser } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function createTeam(data: Prisma.RoleCreateInput): Promise { +export async function createTeam(data: Prisma.TeamCreateInput): Promise { return prisma.client.role.create({ data, }); } -export async function getTeam(where: Prisma.RoleWhereUniqueInput): Promise { +export async function getTeam(where: Prisma.TeamWhereUniqueInput): Promise { return prisma.client.role.findUnique({ where, }); } -export async function getTeams(where: Prisma.RoleWhereInput): Promise { +export async function getTeams(where: Prisma.TeamWhereInput): Promise { return prisma.client.role.findMany({ where, }); @@ -35,16 +35,16 @@ export async function getTeamsByUserId(userId: string): Promise< } export async function updateTeam( - data: Prisma.RoleUpdateInput, - where: Prisma.RoleWhereUniqueInput, -): Promise { + data: Prisma.TeamUpdateInput, + where: Prisma.TeamWhereUniqueInput, +): Promise { return prisma.client.role.update({ data, where, }); } -export async function deleteTeam(teamId: string): Promise { +export async function deleteTeam(teamId: string): Promise { return prisma.client.role.update({ data: { isDeleted: true, diff --git a/queries/admin/teamUser.ts b/queries/admin/teamUser.ts index e110efcf..b2f7bbf2 100644 --- a/queries/admin/teamUser.ts +++ b/queries/admin/teamUser.ts @@ -1,7 +1,9 @@ import { Prisma, TeamUser } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function createTeamUser(data: Prisma.TeamUserCreateInput): Promise { +export async function createTeamUser( + data: Prisma.TeamUserCreateInput | Prisma.TeamUserUncheckedCreateInput, +): Promise { return prisma.client.teamUser.create({ data, }); diff --git a/queries/admin/teamWebsite.ts b/queries/admin/teamWebsite.ts index 950a7026..6b485da0 100644 --- a/queries/admin/teamWebsite.ts +++ b/queries/admin/teamWebsite.ts @@ -1,7 +1,9 @@ import { Prisma, TeamWebsite } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function createTeamWebsite(data: Prisma.TeamWebsiteCreateInput): Promise { +export async function createTeamWebsite( + data: Prisma.TeamWebsiteCreateInput | Prisma.TeamWebsiteUncheckedCreateInput, +): Promise { return prisma.client.teamWebsite.create({ data, }); diff --git a/queries/admin/userRole.ts b/queries/admin/userRole.ts index c4e365ac..22893412 100644 --- a/queries/admin/userRole.ts +++ b/queries/admin/userRole.ts @@ -1,7 +1,9 @@ import { Prisma, UserRole } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function createUserRole(data: Prisma.UserRoleCreateInput): Promise { +export async function createUserRole( + data: Prisma.UserRoleCreateInput | Prisma.UserRoleUncheckedCreateInput, +): Promise { return prisma.client.userRole.create({ data, }); diff --git a/queries/admin/userWebsite.ts b/queries/admin/userWebsite.ts index 313d6cd4..90039b8f 100644 --- a/queries/admin/userWebsite.ts +++ b/queries/admin/userWebsite.ts @@ -1,7 +1,9 @@ import { Prisma, UserWebsite } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function createUserWebsite(data: Prisma.UserWebsiteCreateInput): Promise { +export async function createUserWebsite( + data: Prisma.UserWebsiteCreateInput | Prisma.UserWebsiteUncheckedCreateInput, +): Promise { return prisma.client.userWebsite.create({ data, });