Unified search algorithm across all lists; per-section record visibility (contacts, deals, activities, leads, finance, tickets, notes, projects)

This commit is contained in:
2026-10-06 15:04:46 +03:30
parent 43717392b2
commit e08f1452ef
38 changed files with 699 additions and 420 deletions
@@ -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 }),