diff options
| author | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
| commit | 396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch) | |
| tree | b9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/queries/prisma/team.ts | |
| download | umami-main.tar.xz umami-main.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/prisma/team.ts')
| -rw-r--r-- | src/queries/prisma/team.ts | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/queries/prisma/team.ts b/src/queries/prisma/team.ts new file mode 100644 index 0000000..5987c1d --- /dev/null +++ b/src/queries/prisma/team.ts @@ -0,0 +1,165 @@ +import { Prisma, type Team } from '@/generated/prisma/client'; +import { ROLES } from '@/lib/constants'; +import { uuid } from '@/lib/crypto'; +import prisma from '@/lib/prisma'; +import type { PageResult, QueryFilters } from '@/lib/types'; + +import TeamFindManyArgs = Prisma.TeamFindManyArgs; + +export async function findTeam(criteria: Prisma.TeamFindUniqueArgs): Promise<Team> { + return prisma.client.team.findUnique(criteria); +} + +export async function getTeam( + teamId: string, + options: { includeMembers?: boolean } = {}, +): Promise<Team> { + const { includeMembers } = options; + + return findTeam({ + where: { + id: teamId, + }, + ...(includeMembers && { include: { members: true } }), + }); +} + +export async function getTeams( + criteria: TeamFindManyArgs, + filters: QueryFilters, +): Promise<PageResult<Team[]>> { + const { getSearchParameters } = prisma; + const { search } = filters; + + const where: Prisma.TeamWhereInput = { + ...criteria.where, + ...getSearchParameters(search, [{ name: 'contains' }]), + }; + + return prisma.pagedQuery<TeamFindManyArgs>( + 'team', + { + ...criteria, + where, + }, + filters, + ); +} + +export async function getUserTeams(userId: string, filters: QueryFilters = {}) { + return getTeams( + { + where: { + deletedAt: null, + members: { + some: { userId }, + }, + }, + include: { + members: { + include: { + user: { + select: { + id: true, + username: true, + }, + }, + }, + }, + _count: { + select: { + websites: { + where: { deletedAt: null }, + }, + members: { + where: { + user: { deletedAt: null }, + }, + }, + }, + }, + }, + }, + filters, + ); +} + +export async function getAllUserTeams(userId: string) { + return prisma.client.team.findMany({ + where: { + deletedAt: null, + members: { + some: { userId }, + }, + }, + select: { + id: true, + name: true, + logoUrl: true, + }, + }); +} + +export async function createTeam(data: Prisma.TeamCreateInput, userId: string): Promise<any> { + const { id } = data; + const { client, transaction } = prisma; + + return transaction([ + client.team.create({ + data, + }), + client.teamUser.create({ + data: { + id: uuid(), + teamId: id, + userId, + role: ROLES.teamOwner, + }, + }), + ]); +} + +export async function updateTeam(teamId: string, data: Prisma.TeamUpdateInput): Promise<Team> { + const { client } = prisma; + + return client.team.update({ + where: { + id: teamId, + }, + data: { + ...data, + updatedAt: new Date(), + }, + }); +} + +export async function deleteTeam(teamId: string) { + const { client, transaction } = prisma; + const cloudMode = !!process.env.CLOUD_MODE; + + if (cloudMode) { + return transaction([ + client.team.update({ + data: { + deletedAt: new Date(), + }, + where: { + id: teamId, + }, + }), + ]); + } + + return transaction([ + client.teamUser.deleteMany({ + where: { + teamId, + }, + }), + client.team.delete({ + where: { + id: teamId, + }, + }), + ]); +} |