diff options
Diffstat (limited to 'src/queries/prisma/user.ts')
| -rw-r--r-- | src/queries/prisma/user.ts | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/queries/prisma/user.ts b/src/queries/prisma/user.ts new file mode 100644 index 0000000..14376fc --- /dev/null +++ b/src/queries/prisma/user.ts @@ -0,0 +1,206 @@ +import { Prisma } from '@/generated/prisma/client'; +import { ROLES } from '@/lib/constants'; +import { getRandomChars } from '@/lib/generate'; +import prisma from '@/lib/prisma'; +import type { QueryFilters, Role } from '@/lib/types'; + +import UserFindManyArgs = Prisma.UserFindManyArgs; + +export interface GetUserOptions { + includePassword?: boolean; + showDeleted?: boolean; +} + +async function findUser(criteria: Prisma.UserFindUniqueArgs, options: GetUserOptions = {}) { + const { includePassword = false, showDeleted = false } = options; + + return prisma.client.user.findUnique({ + ...criteria, + where: { + ...criteria.where, + ...(showDeleted && { deletedAt: null }), + }, + select: { + id: true, + username: true, + password: includePassword, + role: true, + createdAt: true, + }, + }); +} + +export async function getUser(userId: string, options: GetUserOptions = {}) { + return findUser( + { + where: { + id: userId, + }, + }, + options, + ); +} + +export async function getUserByUsername(username: string, options: GetUserOptions = {}) { + return findUser({ where: { username } }, options); +} + +export async function getUsers(criteria: UserFindManyArgs, filters: QueryFilters = {}) { + const { search } = filters; + + const where: Prisma.UserWhereInput = { + ...criteria.where, + ...prisma.getSearchParameters(search, [{ username: 'contains' }]), + deletedAt: null, + }; + + return prisma.pagedQuery( + 'user', + { + ...criteria, + where, + }, + { + orderBy: 'createdAt', + sortDescending: true, + ...filters, + }, + ); +} + +export async function createUser(data: { + id: string; + username: string; + password: string; + role: Role; +}) { + return prisma.client.user.create({ + data, + select: { + id: true, + username: true, + role: true, + }, + }); +} + +export async function updateUser(userId: string, data: Prisma.UserUpdateInput) { + return prisma.client.user.update({ + where: { + id: userId, + }, + data, + select: { + id: true, + username: true, + role: true, + createdAt: true, + }, + }); +} + +export async function deleteUser(userId: string) { + const { client, transaction } = prisma; + const cloudMode = !!process.env.CLOUD_MODE; + + const websites = await client.website.findMany({ + where: { userId }, + }); + + let websiteIds = []; + + if (websites.length > 0) { + websiteIds = websites.map(a => a.id); + } + + const teams = await client.team.findMany({ + where: { + members: { + some: { + userId, + role: ROLES.teamOwner, + }, + }, + }, + }); + + const teamIds = teams.map(a => a.id); + + if (cloudMode) { + return transaction([ + client.website.updateMany({ + data: { + deletedAt: new Date(), + }, + where: { id: { in: websiteIds } }, + }), + client.user.update({ + data: { + username: getRandomChars(32), + deletedAt: new Date(), + }, + where: { + id: userId, + }, + }), + ]); + } + + return transaction([ + client.eventData.deleteMany({ + where: { websiteId: { in: websiteIds } }, + }), + client.sessionData.deleteMany({ + where: { websiteId: { in: websiteIds } }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId: { in: websiteIds } }, + }), + client.session.deleteMany({ + where: { websiteId: { in: websiteIds } }, + }), + client.teamUser.deleteMany({ + where: { + OR: [ + { + teamId: { + in: teamIds, + }, + }, + { + userId, + }, + ], + }, + }), + client.team.deleteMany({ + where: { + id: { + in: teamIds, + }, + }, + }), + client.report.deleteMany({ + where: { + OR: [ + { + websiteId: { + in: websiteIds, + }, + }, + { + userId, + }, + ], + }, + }), + client.website.deleteMany({ + where: { id: { in: websiteIds } }, + }), + client.user.delete({ + where: { + id: userId, + }, + }), + ]); +} |