mirror of
https://github.com/formbricks/formbricks.git
synced 2026-02-11 03:09:15 -06:00
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import "server-only";
|
|
import { Prisma } from "@prisma/client";
|
|
import { TJsEnvironmentStateSurvey } from "@formbricks/types/js";
|
|
import { TSegment } from "@formbricks/types/segment";
|
|
import { TSurvey, TSurveyFilterCriteria } from "@formbricks/types/surveys/types";
|
|
|
|
export const transformPrismaSurvey = <T extends TSurvey | TJsEnvironmentStateSurvey>(
|
|
surveyPrisma: any
|
|
): T => {
|
|
let segment: TSegment | null = null;
|
|
|
|
if (surveyPrisma.segment) {
|
|
segment = {
|
|
...surveyPrisma.segment,
|
|
surveys: surveyPrisma.segment.surveys.map((survey) => survey.id),
|
|
};
|
|
}
|
|
|
|
const transformedSurvey = {
|
|
...surveyPrisma,
|
|
displayPercentage: Number(surveyPrisma.displayPercentage) || null,
|
|
segment,
|
|
} as T;
|
|
|
|
return transformedSurvey;
|
|
};
|
|
|
|
export const buildWhereClause = (filterCriteria?: TSurveyFilterCriteria) => {
|
|
const whereClause: Prisma.SurveyWhereInput["AND"] = [];
|
|
|
|
// for name
|
|
if (filterCriteria?.name) {
|
|
whereClause.push({ name: { contains: filterCriteria.name, mode: "insensitive" } });
|
|
}
|
|
|
|
// for status
|
|
if (filterCriteria?.status && filterCriteria?.status?.length) {
|
|
whereClause.push({ status: { in: filterCriteria.status } });
|
|
}
|
|
|
|
// for type
|
|
if (filterCriteria?.type && filterCriteria?.type?.length) {
|
|
whereClause.push({ type: { in: filterCriteria.type } });
|
|
}
|
|
|
|
// for createdBy
|
|
if (filterCriteria?.createdBy?.value && filterCriteria?.createdBy?.value?.length) {
|
|
if (filterCriteria.createdBy.value.length === 1) {
|
|
if (filterCriteria.createdBy.value[0] === "you") {
|
|
whereClause.push({ createdBy: filterCriteria.createdBy.userId });
|
|
}
|
|
if (filterCriteria.createdBy.value[0] === "others") {
|
|
whereClause.push({
|
|
OR: [
|
|
{
|
|
createdBy: {
|
|
not: filterCriteria.createdBy.userId,
|
|
},
|
|
},
|
|
{
|
|
createdBy: null,
|
|
},
|
|
],
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
return { AND: whereClause };
|
|
};
|
|
|
|
export const buildOrderByClause = (
|
|
sortBy?: TSurveyFilterCriteria["sortBy"]
|
|
): Prisma.SurveyOrderByWithRelationInput[] | undefined => {
|
|
const orderMapping: { [key: string]: Prisma.SurveyOrderByWithRelationInput } = {
|
|
name: { name: "asc" },
|
|
createdAt: { createdAt: "desc" },
|
|
updatedAt: { updatedAt: "desc" },
|
|
};
|
|
|
|
return sortBy ? [orderMapping[sortBy] || { updatedAt: "desc" }] : undefined;
|
|
};
|
|
|
|
export const anySurveyHasFilters = (surveys: TSurvey[]): boolean => {
|
|
return surveys.some((survey) => {
|
|
if ("segment" in survey && survey.segment) {
|
|
return survey.segment.filters && survey.segment.filters.length > 0;
|
|
}
|
|
return false;
|
|
});
|
|
};
|