107 lines
3.9 KiB
Dart
107 lines
3.9 KiB
Dart
// ServiceInfo를 외부에서 접근 가능하도록 export
|
|
export 'url_matcher/models/service_info.dart';
|
|
|
|
import 'url_matcher/models/service_info.dart';
|
|
import 'url_matcher/data/service_data_repository.dart';
|
|
import 'url_matcher/services/url_matcher_service.dart';
|
|
import 'url_matcher/services/category_mapper_service.dart';
|
|
import 'url_matcher/services/cancellation_url_service.dart';
|
|
import 'url_matcher/services/service_name_resolver.dart';
|
|
import 'url_matcher/services/sms_extractor_service.dart';
|
|
|
|
/// 구독 서비스와 웹사이트 URL 매칭을 처리하는 서비스 클래스 (Facade 패턴)
|
|
class SubscriptionUrlMatcher {
|
|
static ServiceDataRepository? _dataRepository;
|
|
static UrlMatcherService? _urlMatcher;
|
|
static CategoryMapperService? _categoryMapper;
|
|
static CancellationUrlService? _cancellationService;
|
|
static ServiceNameResolver? _nameResolver;
|
|
static SmsExtractorService? _smsExtractor;
|
|
|
|
/// 서비스 초기화
|
|
static Future<void> initialize() async {
|
|
if (_dataRepository != null && _dataRepository!.isInitialized) return;
|
|
|
|
// 1. 데이터 저장소 초기화
|
|
_dataRepository = ServiceDataRepository();
|
|
await _dataRepository!.initialize();
|
|
|
|
// 2. 서비스 초기화
|
|
_categoryMapper = CategoryMapperService(_dataRepository!);
|
|
_urlMatcher = UrlMatcherService(_dataRepository!, _categoryMapper!);
|
|
_cancellationService = CancellationUrlService(_dataRepository!, _urlMatcher!);
|
|
_nameResolver = ServiceNameResolver(_dataRepository!);
|
|
_smsExtractor = SmsExtractorService(_urlMatcher!, _categoryMapper!);
|
|
}
|
|
|
|
/// 도메인 추출 (www와 TLD 제외)
|
|
static String? extractDomain(String url) {
|
|
return _urlMatcher?.extractDomain(url);
|
|
}
|
|
|
|
/// URL로 서비스 찾기
|
|
static Future<ServiceInfo?> findServiceByUrl(String url) async {
|
|
await initialize();
|
|
return _urlMatcher?.findServiceByUrl(url);
|
|
}
|
|
|
|
/// 서비스명으로 URL 찾기 (기존 suggestUrl 메서드 유지)
|
|
static String? suggestUrl(String serviceName) {
|
|
return _urlMatcher?.suggestUrl(serviceName);
|
|
}
|
|
|
|
/// 서비스명 또는 URL로 해지 안내 페이지 URL 찾기
|
|
static Future<String?> findCancellationUrl({
|
|
String? serviceName,
|
|
String? websiteUrl,
|
|
String locale = 'kr',
|
|
}) async {
|
|
await initialize();
|
|
return _cancellationService?.findCancellationUrl(
|
|
serviceName: serviceName,
|
|
websiteUrl: websiteUrl,
|
|
locale: locale,
|
|
);
|
|
}
|
|
|
|
/// 서비스에 공식 해지 안내 페이지가 있는지 확인
|
|
static Future<bool> hasCancellationPage(String serviceNameOrUrl) async {
|
|
await initialize();
|
|
return await _cancellationService?.hasCancellationPage(serviceNameOrUrl) ?? false;
|
|
}
|
|
|
|
/// 서비스명으로 카테고리 찾기
|
|
static Future<String?> findCategoryByServiceName(String serviceName) async {
|
|
await initialize();
|
|
return _categoryMapper?.findCategoryByServiceName(serviceName);
|
|
}
|
|
|
|
/// 현재 로케일에 따라 서비스 표시명 가져오기
|
|
static Future<String> getServiceDisplayName({
|
|
required String serviceName,
|
|
required String locale,
|
|
}) async {
|
|
await initialize();
|
|
return await _nameResolver?.getServiceDisplayName(
|
|
serviceName: serviceName,
|
|
locale: locale,
|
|
) ?? serviceName;
|
|
}
|
|
|
|
/// SMS에서 URL과 서비스 정보 추출
|
|
static Future<ServiceInfo?> extractServiceFromSms(String smsText) async {
|
|
await initialize();
|
|
return _smsExtractor?.extractServiceFromSms(smsText);
|
|
}
|
|
|
|
/// URL이 알려진 서비스 URL인지 확인
|
|
static Future<bool> isKnownServiceUrl(String url) async {
|
|
await initialize();
|
|
return await _urlMatcher?.isKnownServiceUrl(url) ?? false;
|
|
}
|
|
|
|
/// 입력된 서비스 이름이나 문자열에서 매칭되는 URL을 찾아 반환 (레거시 호환성)
|
|
static String? findMatchingUrl(String text, {bool usePartialMatch = true}) {
|
|
return _urlMatcher?.findMatchingUrl(text, usePartialMatch: usePartialMatch);
|
|
}
|
|
} |