Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/modules/helpDesk/db/feedback.db.server.ts
T

90 lines
2.5 KiB
TypeScript

import { Feedback, Prisma } from "@toolctrl/db/prisma-browser";
import { FilterablePropertyDto } from "~/application/dtos/data/FilterablePropertyDto";
import { FiltersDto } from "~/application/dtos/data/FiltersDto";
import { PaginationDto } from "~/application/dtos/data/PaginationDto";
import { db } from "~/utils/db.server";
import { TenantSimple } from "~/utils/db/tenants.db.server";
import { UserSimple } from "~/utils/db/users.db.server";
import TenantModelHelper from "~/utils/helpers/models/TenantModelHelper";
import UserModelHelper from "~/utils/helpers/models/UserModelHelper";
export type FeedbackWithDetails = Feedback & {
tenant: TenantSimple | null;
user: UserSimple | null;
};
export async function getAllFeedback({
filters,
filterableProperties,
pagination,
}: {
filters: FiltersDto;
filterableProperties: FilterablePropertyDto[];
pagination: { pageSize: number; page: number };
}): Promise<{
items: FeedbackWithDetails[];
pagination: PaginationDto;
}> {
const q = filters.query || "";
const AND_filters: Prisma.FeedbackWhereInput[] = [];
filterableProperties.forEach((filter) => {
const value = filters.properties.find((f) => f.name === filter.name)?.value;
if (value) {
AND_filters.push({
[filter.name]: value === "null" ? null : value,
});
}
});
const OR_filters: Prisma.FeedbackWhereInput[] = [];
if (q) {
OR_filters.push({
message: {
contains: q,
},
});
}
const whereFilters: Prisma.FeedbackWhereInput = {};
if (OR_filters.length > 0) {
whereFilters.OR = OR_filters;
}
if (AND_filters.length > 0) {
whereFilters.AND = AND_filters;
}
const items = await db.feedback.findMany({
take: pagination.pageSize,
skip: pagination.pageSize * (pagination.page - 1),
orderBy: {
createdAt: "desc",
},
include: {
tenant: { select: TenantModelHelper.selectSimpleTenantProperties },
user: { select: UserModelHelper.selectSimpleUserProperties },
},
});
const totalItems = await db.feedback.count();
return {
items,
pagination: {
page: pagination.page,
pageSize: pagination.pageSize,
totalItems,
totalPages: Math.ceil(totalItems / pagination.pageSize),
},
};
}
export async function createFeedback(data: { tenantId: string | null; userId: string | null; message: string; fromUrl: string }) {
return await db.feedback.create({
data: {
tenantId: data.tenantId,
userId: data.userId,
message: data.message,
fromUrl: data.fromUrl,
},
});
}