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/website.ts | |
| download | umami-main.tar.xz umami-main.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/prisma/website.ts')
| -rw-r--r-- | src/queries/prisma/website.ts | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts new file mode 100644 index 0000000..79cb724 --- /dev/null +++ b/src/queries/prisma/website.ts @@ -0,0 +1,234 @@ +import type { Prisma } from '@/generated/prisma/client'; +import { ROLES } from '@/lib/constants'; +import prisma from '@/lib/prisma'; +import redis from '@/lib/redis'; +import type { QueryFilters } from '@/lib/types'; + +export async function findWebsite(criteria: Prisma.WebsiteFindUniqueArgs) { + return prisma.client.website.findUnique(criteria); +} + +export async function getWebsite(websiteId: string) { + return findWebsite({ + where: { + id: websiteId, + }, + }); +} + +export async function getSharedWebsite(shareId: string) { + return findWebsite({ + where: { + shareId, + deletedAt: null, + }, + }); +} + +export async function getWebsites(criteria: Prisma.WebsiteFindManyArgs, filters: QueryFilters) { + const { search } = filters; + const { getSearchParameters, pagedQuery } = prisma; + + const where: Prisma.WebsiteWhereInput = { + ...criteria.where, + ...getSearchParameters(search, [ + { + name: 'contains', + }, + { domain: 'contains' }, + ]), + deletedAt: null, + }; + + return pagedQuery('website', { ...criteria, where }, filters); +} + +export async function getAllUserWebsitesIncludingTeamOwner(userId: string, filters?: QueryFilters) { + return getWebsites( + { + where: { + OR: [ + { userId }, + { + team: { + deletedAt: null, + members: { + some: { + role: ROLES.teamOwner, + userId, + }, + }, + }, + }, + ], + }, + }, + { + orderBy: 'name', + ...filters, + }, + ); +} + +export async function getUserWebsites(userId: string, filters?: QueryFilters) { + return getWebsites( + { + where: { + userId, + }, + include: { + user: { + select: { + username: true, + id: true, + }, + }, + }, + }, + { + orderBy: 'name', + ...filters, + }, + ); +} + +export async function getTeamWebsites(teamId: string, filters?: QueryFilters) { + return getWebsites( + { + where: { + teamId, + }, + include: { + createUser: { + select: { + id: true, + username: true, + }, + }, + }, + }, + filters, + ); +} + +export async function createWebsite( + data: Prisma.WebsiteCreateInput | Prisma.WebsiteUncheckedCreateInput, +) { + return prisma.client.website.create({ + data, + }); +} + +export async function updateWebsite( + websiteId: string, + data: Prisma.WebsiteUpdateInput | Prisma.WebsiteUncheckedUpdateInput, +) { + return prisma.client.website.update({ + where: { + id: websiteId, + }, + data, + }); +} + +export async function resetWebsite(websiteId: string) { + const { client, transaction } = prisma; + const cloudMode = !!process.env.CLOUD_MODE; + + return transaction( + [ + client.revenue.deleteMany({ + where: { websiteId }, + }), + client.eventData.deleteMany({ + where: { websiteId }, + }), + client.sessionData.deleteMany({ + where: { websiteId }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId }, + }), + client.session.deleteMany({ + where: { websiteId }, + }), + client.website.update({ + where: { id: websiteId }, + data: { + resetAt: new Date(), + }, + }), + ], + { + timeout: 30000, + }, + ).then(async data => { + if (cloudMode) { + await redis.client.set( + `website:${websiteId}`, + data.find(website => website.id), + ); + } + + return data; + }); +} + +export async function deleteWebsite(websiteId: string) { + const { client, transaction } = prisma; + const cloudMode = !!process.env.CLOUD_MODE; + + return transaction( + [ + client.revenue.deleteMany({ + where: { websiteId }, + }), + client.eventData.deleteMany({ + where: { websiteId }, + }), + client.sessionData.deleteMany({ + where: { websiteId }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId }, + }), + client.session.deleteMany({ + where: { websiteId }, + }), + client.report.deleteMany({ + where: { websiteId }, + }), + client.segment.deleteMany({ + where: { websiteId }, + }), + cloudMode + ? client.website.update({ + data: { + deletedAt: new Date(), + }, + where: { id: websiteId }, + }) + : client.website.delete({ + where: { id: websiteId }, + }), + ], + { + timeout: 30000, + }, + ).then(async data => { + if (cloudMode) { + await redis.client.del(`website:${websiteId}`); + } + + return data; + }); +} + +export async function getWebsiteCount(userId: string) { + return prisma.client.website.count({ + where: { + userId, + deletedAt: null, + }, + }); +} |