90 lines
2.5 KiB
TypeScript
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,
|
|
},
|
|
});
|
|
}
|