Unified search algorithm across all lists; per-section record visibility (contacts, deals, activities, leads, finance, tickets, notes, projects)
This commit is contained in:
@@ -8,7 +8,9 @@ import {
|
||||
import { IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
|
||||
import { Type } from 'class-transformer';
|
||||
import { CurrentUser } from '../auth/current-user.decorator';
|
||||
import type { Prisma } from '@prisma/client';
|
||||
import { PrismaService } from '../prisma/prisma.service';
|
||||
import { buildSearchWhere, ci } from '../common/search';
|
||||
import { ApiKeyAuthGuard } from './api-key-auth.guard';
|
||||
|
||||
class ListQueryDto {
|
||||
@@ -42,18 +44,16 @@ export class PublicApiV1Controller {
|
||||
) {
|
||||
const page = query.page ?? 1;
|
||||
const limit = query.limit ?? 20;
|
||||
const where = {
|
||||
const search = buildSearchWhere<Prisma.PersonWhereInput>(query.q, (t) => [
|
||||
{ firstName: ci(t) },
|
||||
{ lastName: ci(t) },
|
||||
{ mobile: { contains: t } },
|
||||
{ phone: { contains: t } },
|
||||
{ email: ci(t) },
|
||||
]);
|
||||
const where: Prisma.PersonWhereInput = {
|
||||
organizationId: user.organizationId,
|
||||
...(query.q?.trim()
|
||||
? {
|
||||
OR: [
|
||||
{ firstName: { contains: query.q.trim(), mode: 'insensitive' as const } },
|
||||
{ lastName: { contains: query.q.trim(), mode: 'insensitive' as const } },
|
||||
{ mobile: { contains: query.q.trim() } },
|
||||
{ email: { contains: query.q.trim(), mode: 'insensitive' as const } },
|
||||
],
|
||||
}
|
||||
: {}),
|
||||
...(search ? { AND: [search] } : {}),
|
||||
};
|
||||
const [total, items] = await Promise.all([
|
||||
this.prisma.person.count({ where }),
|
||||
@@ -123,13 +123,10 @@ export class PublicApiV1Controller {
|
||||
) {
|
||||
const page = query.page ?? 1;
|
||||
const limit = query.limit ?? 20;
|
||||
const where = {
|
||||
const search = buildSearchWhere<Prisma.DealWhereInput>(query.q, (t) => [{ title: ci(t) }]);
|
||||
const where: Prisma.DealWhereInput = {
|
||||
organizationId: user.organizationId,
|
||||
...(query.q?.trim()
|
||||
? {
|
||||
title: { contains: query.q.trim(), mode: 'insensitive' as const },
|
||||
}
|
||||
: {}),
|
||||
...(search ? { AND: [search] } : {}),
|
||||
};
|
||||
const [total, items] = await Promise.all([
|
||||
this.prisma.deal.count({ where }),
|
||||
|
||||
Reference in New Issue
Block a user