/
siblun
/
ReadFlow
Обзор
Документация
Войти
/
siblun
/
ReadFlow
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
lib/domain/services/session_service.dart
64 строки
3 KB
siblun
Add docs
21 апр 2026, 16:13
21 апр 2026, 16:13
c40d018
Код
Авторство
О чём код?
import 'package:uuid/uuid.dart'; import '../models/session_model.dart'; import '../repositories/session_repository.dart'; /// Сервис управления сессиями чтения. /// /// Обеспечивает логику перехода между состояниями процесса чтения: /// [startSession] -> [updateProgress] -> [endSession]. class SessionService { final ISessionRepository _repository; final Uuid _uuid = const Uuid(); SessionService(this._repository); /// Начинает новую сессию чтения для указанной книги. /// /// Если для книги уже есть незавершенная сессия, возвращает её. /// В противном случае генерирует новый [id] через UUID и фиксирует [startPage]. Future<Session?> startSession(String bookId, int startPage) async { final existing = await _repository.getActiveByBook(bookId); if (existing != null && !existing.isCompleted) return existing; final session = Session( id: _uuid.v4(), bookId: bookId, startPage: startPage, endPage: startPage, startTime: DateTime.now(), ); await _repository.insert(session); return session; } /// Обновляет текущий прогресс в рамках активной сессии. /// /// Используется для синхронизации прогресса без завершения самой сессии. Future<Session?> updateProgress(String sessionId, int currentPage) async { final session = await _repository.getById(sessionId); if (session == null) return null; final updated = session.copyWith(endPage: currentPage); await _repository.update(updated); return updated; } /// Фиксирует завершение сессии чтения. /// /// Устанавливает [endTime], финальную страницу [endPage] и сохраняет опциональную заметку [note]. /// После вызова этого метода сессия считается закрытой ([isCompleted] == true). Future<Session?> endSession(String sessionId, int endPage, {String? note}) async { final session = await _repository.getById(sessionId); if (session == null) return null; final updated = session.copyWith( endPage: endPage, endTime: DateTime.now(), note: note, ); await _repository.update(updated); return updated; } }