aboutsummaryrefslogtreecommitdiff
path: root/src/queries/prisma/user.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-24 13:09:50 +0000
committerFuwn <[email protected]>2026-01-24 13:09:50 +0000
commit396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch)
treeb9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/queries/prisma/user.ts
downloadumami-main.tar.xz
umami-main.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/prisma/user.ts')
-rw-r--r--src/queries/prisma/user.ts206
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,
+ },
+ }),
+ ]);
+}