aboutsummaryrefslogtreecommitdiff
path: root/src/queries/prisma/website.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/website.ts
downloadumami-main.tar.xz
umami-main.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/prisma/website.ts')
-rw-r--r--src/queries/prisma/website.ts234
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,
+ },
+ });
+}