# Сервисы

Эта директория содержит сервисы для взаимодействия с API и внешними сервисами.

## Структура

```
services/
└── pocketbaseService.js    # Сервис для работы с PocketBase API
```

## Описание сервисов

### pocketbaseService
Основной сервис для взаимодействия с PocketBase API. Предоставляет методы для:

#### Аутентификация
```javascript
signUp(email, password, username)
signIn(email, password)
signOut()
getCurrentUser()
requestPasswordReset(email)
```

#### Пользователи
```javascript
getUserProfile(userId)
getUserProfileByUsername(username)
updateUserProfile(userId, data)
updateUserShowcase(userId, reviewIds)
listUsersRankedByReviews(limit)
listUsersRankedByLevel(limit)
```

#### Медиа
```javascript
createMedia(data)
getMediaByPath(path)
getMediaById(id)
listMedia(filters, page, perPage, userProfile, includeSeasons, includeReviews, sort)
listPopularMedia(limit)
updateMedia(id, data)
deleteMedia(id)
searchMedia(query)
```

#### Рецензии
```javascript
getLatestReviews(limit)
getReviewsByMediaId(mediaId)
getReviewsByUserId(userId)
getUserReviewForMedia(userId, mediaId)
createReview(data)
updateReview(id, data)
deleteReview(id)
```

#### Сезоны
```javascript
getSeasonsByMediaId(mediaId)
getSeasonById(id)
createSeason(data)
updateSeason(id, data)
deleteSeason(id)
```

#### Достижения
```javascript
getAllAchievements()
getUserAchievements(userId)
awardAchievement(userId, achievementId)
```

#### Лайки рецензий
```javascript
likeReview(reviewId, userId)
unlikeReview(reviewId, userId)
getReviewLikeCount(reviewId)
hasUserLikedReview(reviewId, userId)
```

#### Тикеты поддержки
```javascript
createSupportTicket(data)
getUserTickets(userId)
getAllTickets()
getTicketById(id)
updateSupportTicket(id, data)
```

#### Файловое хранилище
```javascript
uploadFile(file, collection, recordId, field)
deleteFile(collection, recordId, field)
getFileUrl(record, field, options)
```

#### Утилиты
```javascript
calculateLevel(xp)
getXpForNextLevel(level)
getXpForCurrentLevel(level)
validateMediaData(data)
formatMediaData(data)
updateRatingStats(collection, recordId)
```

## Использование

1. Импортируйте нужные методы:
```javascript
import { getMediaById, createReview } from '../services/pocketbaseService';
```

2. Используйте в компонентах:
```javascript
const MyComponent = () => {
  const fetchMedia = async () => {
    const media = await getMediaById(id);
    // ...
  };
};
```

## Лучшие практики

1. Обрабатывайте ошибки API
2. Используйте мемоизацию для кэширования данных
3. Реализуйте механизм повторных попыток для нестабильных запросов
4. Логируйте важные операции
5. Валидируйте данные перед отправкой
6. Используйте TypeScript для типизации

## Пример использования

```javascript
import { getMediaById, createReview } from '../services/pocketbaseService';

const MediaPage = () => {
  const [media, setMedia] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchMedia = async () => {
      try {
        const data = await getMediaById(id);
        setMedia(data);
      } catch (err) {
        setError(err.message);
      }
    };

    fetchMedia();
  }, [id]);

  const handleReview = async (reviewData) => {
    try {
      await createReview({
        ...reviewData,
        mediaId: media.id,
        userId: currentUser.id
      });
      // Обновить UI
    } catch (err) {
      setError(err.message);
    }
  };

  // ...
};
``` 