new project stable version

This commit is contained in:
2026-05-10 19:11:31 +03:00
commit 3616f84556
391 changed files with 23857 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/repositories/payment_repository.dart';
class ActivateSubscriptionUsecase {
final PaymentRepository repository;
ActivateSubscriptionUsecase(this.repository);
Future<Result<bool>> call(int optionId) {
return repository.activateSubscription(optionId);
}
}

View File

@@ -0,0 +1,24 @@
import '../repositories/payment_repository.dart';
import '../../core/result.dart';
class AddPaymentCardUsecase {
final PaymentRepository repository;
AddPaymentCardUsecase(this.repository);
Future<Result<void>> call({
required String cardNumber,
required String cardHolder,
required String expiryMonth,
required String expiryYear,
required String cvv,
}) {
return repository.addPaymentCard(
cardNumber: cardNumber,
cardHolder: cardHolder,
expiryMonth: expiryMonth,
expiryYear: expiryYear,
cvv: cvv,
);
}
}

View File

@@ -0,0 +1,27 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class BookScooterUsecase {
final ScooterRepository repository;
BookScooterUsecase(this.repository);
Future<Result<ScooterOrder>> call({
required int scooterId,
required int planId,
int? subscriptionId,
int? cardId,
required bool isBalance,
required bool isInsurance,
}) {
return repository.bookScooter(
scooterId: scooterId,
planId: planId,
subscriptionId: subscriptionId,
cardId: cardId,
isBalance: isBalance,
isInsurance: isInsurance,
);
}
}

View File

@@ -0,0 +1,12 @@
import 'package:be_happy/domain/entities/client_notification.dart';
import 'package:be_happy/domain/repositories/notification_repository.dart';
class CancelNotificationUseCase {
final NotificationRepository repository;
CancelNotificationUseCase(this.repository);
Future<ClientNotification> call(int id) async {
return await repository.cancelNotification(id);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class CancelRideUsecase {
final ScooterRepository repository;
CancelRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId) {
return repository.cancelRide(orderId);
}
}

View File

@@ -0,0 +1,27 @@
import 'package:be_happy/domain/repositories/pin_repository.dart';
import '../repositories/auth_repository.dart';
class ChangePinUseCase {
final PinRepository repository;
ChangePinUseCase(this.repository);
Future<void> call({
required String oldPin,
required String newPin,
}) async {
final savedPin = await repository.getSavedPin();
if (savedPin != oldPin) {
throw Exception('Wrong old PIN');
}
if (newPin.length != 6) {
throw Exception('Invalid new PIN');
}
await repository.savePin(newPin);
}
}

View File

@@ -0,0 +1,12 @@
import '../entities/user_check_flags.dart';
import '../repositories/profile_repository.dart';
class CheckUserUseCase {
final UserProfileRepository repository;
CheckUserUseCase(this.repository);
Future<UserCheckFlags?> call() {
return repository.checkUser();
}
}

View File

@@ -0,0 +1,27 @@
import 'package:be_happy/domain/repositories/pin_repository.dart';
import '../repositories/auth_repository.dart';
class CreatePinUseCase {
final PinRepository repository;
CreatePinUseCase(this.repository);
Future<void> call(String pin) async {
_validate(pin);
final hashed = _hash(pin);
await repository.savePin(hashed);
}
void _validate(String pin) {
if (pin.length != 6) {
throw Exception('PIN must be 6 digits');
}
}
String _hash(String pin) {
// временно просто pin
return pin;
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class FinishRideUsecase {
final ScooterRepository repository;
FinishRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId, List<int> files) {
return repository.finishRide(orderId, files);
}
}

View File

@@ -0,0 +1,11 @@
import 'package:be_happy/data/network/geocoding_remote_datasource.dart';
class GetAddressByPointUsecase {
final GeocodingRemoteDataSource dataSource;
GetAddressByPointUsecase(this.dataSource);
Future<String> call(double latitude, double longitude) {
return dataSource.getAddressFromPoint(latitude: latitude, longitude: longitude);
}
}

View File

@@ -0,0 +1,15 @@
import 'package:be_happy/domain/entities/scooter.dart';
import '../repositories/scooter_repository.dart';
class GetAvailableScootersUsecase {
final ScooterRepository repository;
GetAvailableScootersUsecase(this.repository);
Future<List<Scooter>> call(List<double> area, int page, int pageSize) {
return repository.getScooters(area, page, pageSize);
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/subscription.dart';
import '../repositories/scooter_repository.dart';
class GetAvailableSubscriptionsUsecase {
final ScooterRepository repository;
GetAvailableSubscriptionsUsecase(this.repository);
Future<Result<List<Subscription>>> call() {
return repository.getAvailableSubscriptions();
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/tariff.dart';
import '../repositories/scooter_repository.dart';
class GetAvailableTariffsUsecase {
final ScooterRepository repository;
GetAvailableTariffsUsecase(this.repository);
Future<Result<List<Tariff>>> call(int scooterId) {
return repository.getAvailableTariffs(scooterId);
}
}

View File

@@ -0,0 +1,15 @@
import '../entities/zone.dart';
import '../repositories/zone_repository.dart';
class GetAvailableZonesUsecase {
final ZoneRepository repository;
GetAvailableZonesUsecase(this.repository);
Future<List<Zone>?> call(List<double> area, int page, int pageSize) {
return repository.getZones(area, page, pageSize);
}
}

View File

@@ -0,0 +1,13 @@
import '../entities/certificate.dart';
import '../repositories/certificate_repository.dart';
import '../../core/result.dart';
class GetCertificatesUsecase {
final CertificateRepository repository;
GetCertificatesUsecase(this.repository);
Future<Result<List<Certificate>>> call() async {
return await repository.getCertificates();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class GetClientOrdersUsecase {
final ScooterRepository repository;
GetClientOrdersUsecase(this.repository);
Future<Result<List<ScooterOrder>>> call() {
return repository.getClientOrders();
}
}

View File

@@ -0,0 +1,20 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/subscription.dart';
import '../repositories/scooter_repository.dart';
class GetClientSubscriptionsUsecase {
final ScooterRepository repository;
GetClientSubscriptionsUsecase(this.repository);
Future<Result<List<Subscription>>> call() {
return repository.getClientSubscriptions();
}
}

View File

@@ -0,0 +1,12 @@
import 'package:be_happy/domain/entities/map_settings.dart';
import 'package:be_happy/domain/repositories/app_settings_repository.dart';
class GetMapSettingsUsecase {
AppSettingsRepository repository;
GetMapSettingsUsecase(this.repository);
Future<MapSettings> call() {
return repository.getMapSettings();
}
}

View File

@@ -0,0 +1,12 @@
import '../entities/news.dart';
import '../repositories/news_repository.dart';
class GetNewsByIdUsecase {
final NewsRepository repository;
GetNewsByIdUsecase(this.repository);
Future<NewsEntity> call(int id) {
return repository.getNewsById(id);
}
}

View File

@@ -0,0 +1,12 @@
import 'package:be_happy/domain/entities/client_notification.dart';
import 'package:be_happy/domain/repositories/notification_repository.dart';
class GetNotificationsStreamUseCase {
final NotificationRepository repository;
GetNotificationsStreamUseCase(this.repository);
Stream<ClientNotification> call() {
return repository.getNotificationsStream();
}
}

View File

@@ -0,0 +1,31 @@
import 'package:be_happy/domain/service/security_service.dart';
import '../entities/payment_card.dart';
import '../repositories/payment_repository.dart';
import '../../core/result.dart';
class GetPaymentCardsUsecase {
final PaymentRepository repository;
final SecurityService securityService;
GetPaymentCardsUsecase(this.repository, this.securityService);
Future<Result<List<PaymentCard>>> call() async {
final result = await repository.getPaymentCards();
if (result is Failure) {
return result;
}
final cards = (result as Success).data as List<PaymentCard>;
// Для каждой карты получаем полный номер из локального хранилища
/*final cardsWithFullNumbers = <PaymentCard>[];
for (final card in cards) {
final fullNumber = await securityService.getCardFullNumber(card.id);
cardsWithFullNumbers.add(card.copyWith(fullCardNumber: fullNumber));
}*/
return Success(cards);
}
}

View File

@@ -0,0 +1,12 @@
import 'package:be_happy/data/network/geocoding_remote_datasource.dart';
import 'package:yandex_mapkit/yandex_mapkit.dart';
class GetPedestrianRoutesUsecase {
final GeocodingRemoteDataSource dataSource;
GetPedestrianRoutesUsecase(this.dataSource);
Future<List<MasstransitRoute>?> call(Point userPosition, Point targetPosition) {
return dataSource.getPedestrianRoutes(userPosition, targetPosition);
}
}

View File

@@ -0,0 +1,13 @@
import '../entities/user_profile.dart';
import '../repositories/profile_repository.dart';
class GetProfileUseCase {
final UserProfileRepository repository;
GetProfileUseCase(this.repository);
Future<UserProfile> call() {
return repository.getProfile();
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter.dart';
import '../repositories/scooter_repository.dart';
class GetScooterByTitleUsecase {
final ScooterRepository repository;
GetScooterByTitleUsecase(this.repository);
Future<Result<Scooter?>> call(String title) {
return repository.getScooterByTitle(title);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import '../entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class GetScooterOrderByIdUsecase {
final ScooterRepository repository;
GetScooterOrderByIdUsecase(this.repository);
Future<Result<ScooterOrder>> call(int id) {
return repository.getScooterOrderById(id);
}
}

View File

@@ -0,0 +1,19 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import 'package:be_happy/domain/repositories/scooter_repository.dart';
class GetScooterOrderHistoryUsecase {
final ScooterRepository _repository;
GetScooterOrderHistoryUsecase(this._repository);
Future<Result<List<ScooterOrder>>> call({
int page = 1,
int pageSize = 20,
}) async {
return await _repository.getScooterOrderHistory(
page: page,
pageSize: pageSize,
);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/point.dart';
import 'package:be_happy/domain/repositories/scooter_repository.dart';
class GetScooterOrderRouteHistoryUsecase {
final ScooterRepository _repository;
GetScooterOrderRouteHistoryUsecase(this._repository);
Future<Result<List<Point>>> call(int id) async {
return await _repository.getScooterOrderRouteHistory(id);
}
}

View File

@@ -0,0 +1,16 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter.dart';
import '../repositories/scooter_repository.dart';
class GetScooterUsecase {
final ScooterRepository repository;
GetScooterUsecase(this.repository);
Future<Result<Scooter?>> call(int id) {
return repository.getScooter(id);
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/subscription.dart';
import '../repositories/scooter_repository.dart';
class GetSubscriptionByIdUsecase {
final ScooterRepository repository;
GetSubscriptionByIdUsecase(this.repository);
Future<Result<Subscription>> call(int id) {
return repository.getSubscriptionById(id);
}
}

View File

@@ -0,0 +1,17 @@
import 'package:be_happy/domain/repositories/pin_repository.dart';
import '../repositories/auth_repository.dart';
class IsPinSetUsecase {
final PinRepository repository;
IsPinSetUsecase(this.repository);
Future<bool> call() async {
if (await repository.getSavedPin() == null) {
return false;
} else {
return true;
}
}
}

View File

@@ -0,0 +1,11 @@
import '../repositories/auth_repository.dart';
class LoginUseCase {
final AuthRepository _repository;
LoginUseCase(this._repository);
Future<String> execute(String phone) async {
return await _repository.login(phone);
}
}

View File

@@ -0,0 +1,15 @@
import 'package:be_happy/domain/repositories/pin_repository.dart';
import '../repositories/auth_repository.dart';
class LogoutUseCase {
final AuthRepository _authRepository;
final PinRepository _pinRepository;
LogoutUseCase(this._authRepository, this._pinRepository);
Future<void> call() async {
await _authRepository.logout();
await _pinRepository.removePin();
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class PauseRideUsecase {
final ScooterRepository repository;
PauseRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId) {
return repository.pauseRide(orderId);
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class PayRideUsecase {
final ScooterRepository repository;
PayRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId, int? cardId,
bool isBalance) {
return repository.payScooterOrderWithPhotos(orderId: orderId, cardId: cardId, isBalance: isBalance);
}
}

View File

@@ -0,0 +1,21 @@
import 'package:be_happy/core/result.dart';
import '../entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class PayScooterOrderWithPhotosUsecase {
final ScooterRepository repository;
PayScooterOrderWithPhotosUsecase(this.repository);
Future<Result<ScooterOrder>> call({
required int orderId,
required int cardId,
required bool isBalance,
}) {
return repository.payScooterOrderWithPhotos(
orderId: orderId,
cardId: cardId,
isBalance: isBalance,
);
}
}

View File

@@ -0,0 +1,19 @@
import '../entities/certificate.dart';
import '../repositories/certificate_repository.dart';
import '../../core/result.dart';
class PurchaseCertificateUsecase {
final CertificateRepository repository;
PurchaseCertificateUsecase(this.repository);
Future<Result<Map<String, dynamic>>> call({
required int certificateId,
required int cardId,
}) async {
return await repository.purchaseCertificate(
certificateId: certificateId,
cardId: cardId,
);
}
}

View File

@@ -0,0 +1,12 @@
import '../entities/user_auth_data.dart';
import '../repositories/auth_repository.dart';
class RefreshTokenUseCase {
final AuthRepository _repository;
RefreshTokenUseCase(this._repository);
Future<UserAuthData> execute() async {
return await _repository.refreshToken();
}
}

View File

@@ -0,0 +1,12 @@
import '../repositories/payment_repository.dart';
import '../../core/result.dart';
class RemovePaymentCardUsecase {
final PaymentRepository repository;
RemovePaymentCardUsecase(this.repository);
Future<Result<void>> call(int cardId) {
return repository.removePaymentCard(cardId);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class ResumeRideUsecase {
final ScooterRepository repository;
ResumeRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId) {
return repository.resumeRide(orderId);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/domain/entities/map_settings.dart';
import '../repositories/app_settings_repository.dart';
class SaveMapSettingsUsecase {
AppSettingsRepository repository;
SaveMapSettingsUsecase(this.repository);
Future<void> call(MapSettings settings) {
return repository.saveMapSettings(settings);
}
}

View File

@@ -0,0 +1,12 @@
import '../repositories/payment_repository.dart';
import '../../core/result.dart';
class SetMainPaymentCardUsecase {
final PaymentRepository repository;
SetMainPaymentCardUsecase(this.repository);
Future<Result<void>> call(int cardId) {
return repository.setMainPaymentCard(cardId);
}
}

View File

@@ -0,0 +1,13 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class StartRideUsecase {
final ScooterRepository repository;
StartRideUsecase(this.repository);
Future<Result<ScooterOrder>> call(int orderId) {
return repository.startRide(orderId);
}
}

View File

@@ -0,0 +1,12 @@
import '../entities/user_profile.dart';
import '../repositories/profile_repository.dart';
class UpdateProfileUseCase {
final UserProfileRepository repository;
UpdateProfileUseCase(this.repository);
Future<UserProfile?> call(UserProfile profile) {
return repository.updateProfile(profile);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:be_happy/core/result.dart';
import 'package:be_happy/domain/entities/active_scooter_order.dart';
import '../entities/scooter_order.dart';
import '../repositories/scooter_repository.dart';
class UpdateScooterOrderDataUsecase {
final ScooterRepository repository;
UpdateScooterOrderDataUsecase(this.repository);
Future<Result<ActiveScooterOrder>> call({
required int orderId,
}) {
return repository.updateScooterOrderData(
orderId: orderId,
);
}
}

View File

@@ -0,0 +1,12 @@
import 'dart:io';
import '../repositories/profile_repository.dart';
class UploadProfilePhotoUsecase {
final UserProfileRepository repository;
UploadProfilePhotoUsecase(this.repository);
Future<int?> call(File imageFile) {
return repository.uploadProfilePhoto(imageFile);
}
}

View File

@@ -0,0 +1,13 @@
import 'dart:io';
import 'package:be_happy/core/result.dart';
import '../repositories/scooter_repository.dart';
class UploadScooterPhotosUsecase {
final ScooterRepository repository;
UploadScooterPhotosUsecase(this.repository);
Future<Result<List<int>>> call(List<File> images) {
return repository.uploadScooterPhotos(images);
}
}

View File

@@ -0,0 +1,14 @@
import 'package:be_happy/core/result.dart';
import '../entities/user_auth_data.dart';
import '../repositories/auth_repository.dart';
class VerifyCodeUseCase {
final AuthRepository _repository;
VerifyCodeUseCase(this._repository);
Future<Result<void>> execute(String code, String token) {
return _repository.verifyCode(code, token);
}
}

View File

@@ -0,0 +1,15 @@
import 'package:be_happy/domain/repositories/pin_repository.dart';
import '../repositories/auth_repository.dart';
class VerifyPinUseCase {
final PinRepository repository;
VerifyPinUseCase(this.repository);
Future<bool> call(String enteredPin) async {
final savedPin = await repository.getSavedPin();
return enteredPin == savedPin;
}
}