Corp/backend/api/v1/search/serializers.py
igor_nadein 735babbd46 feat: Add frontend integration for watson search API
Backend:
- Created REST API endpoint /api/v1/search/
- Added SearchResultSerializer and SearchResponseSerializer
- Implemented search_api_view with model formatters (employee, department, post, request, chat, message, event)
- Registered search endpoint in api/v1/urls.py
- Added permission check for requests (HR can see all, users only their own)

Frontend:
- Added SearchResponse, SearchResult, SearchModelType types
- Added apiClient.search() method in lib/api.ts
- Completely rewrote search/page.tsx:
  * Single API call instead of 6 parallel requests
  * Cleaner UI with icons for each result type
  * Real-time search with loading states
  * Meta information display (email, phone, status, etc.)
  * Better performance and UX

Benefits:
- Frontend: 220 lines → 178 lines (19% reduction)
- 1 API request instead of 6 (83% less network calls)
- Server-side full-text search via watson (better relevance)
- Unified search results with metadata

Testing:
- API endpoint verified at /api/v1/search/?q=test
- Returns JSON with query, results, counts, total
- Requires authentication (IsAuthenticated decorator)
2026-02-27 18:27:36 +03:00

42 lines
1.6 KiB
Python

# backend/api/v1/search/serializers.py
"""
Сериализаторы для API поиска через django-watson.
"""
from __future__ import annotations
from rest_framework import serializers
from typing import Any
class SearchResultSerializer(serializers.Serializer):
"""Сериализатор для результата поиска watson."""
model_name = serializers.CharField(
help_text="Тип модели: post, employee, department, request, chat, message, event"
)
object_id = serializers.IntegerField(help_text="ID объекта")
title = serializers.CharField(help_text="Заголовок/имя объекта", allow_blank=True)
description = serializers.CharField(
help_text="Описание/превью контента",
allow_blank=True,
required=False
)
url = serializers.CharField(help_text="Ссылка на объект", allow_blank=True)
meta = serializers.DictField(
help_text="Дополнительные метаданные",
required=False,
allow_null=True
)
class SearchResponseSerializer(serializers.Serializer):
"""Сериализатор для ответа API поиска."""
query = serializers.CharField(help_text="Поисковый запрос")
results = SearchResultSerializer(many=True)
counts = serializers.DictField(
help_text="Количество результатов по типам",
child=serializers.IntegerField()
)
total = serializers.IntegerField(help_text="Общее количество результатов")