60 lines
1.4 KiB
Dart
60 lines
1.4 KiB
Dart
import 'package:dartx/dartx.dart';
|
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
part 'profile_entity.freezed.dart';
|
|
|
|
enum ProfileType { remote, local }
|
|
|
|
@freezed
|
|
sealed class ProfileEntity with _$ProfileEntity {
|
|
const ProfileEntity._();
|
|
|
|
const factory ProfileEntity.remote({
|
|
required String id,
|
|
required bool active,
|
|
required String name,
|
|
required String url,
|
|
required DateTime lastUpdate,
|
|
String? testUrl,
|
|
ProfileOptions? options,
|
|
SubscriptionInfo? subInfo,
|
|
}) = RemoteProfileEntity;
|
|
|
|
const factory ProfileEntity.local({
|
|
required String id,
|
|
required bool active,
|
|
required String name,
|
|
required DateTime lastUpdate,
|
|
String? testUrl,
|
|
}) = LocalProfileEntity;
|
|
}
|
|
|
|
@freezed
|
|
class ProfileOptions with _$ProfileOptions {
|
|
const factory ProfileOptions({
|
|
required Duration updateInterval,
|
|
}) = _ProfileOptions;
|
|
}
|
|
|
|
@freezed
|
|
class SubscriptionInfo with _$SubscriptionInfo {
|
|
const SubscriptionInfo._();
|
|
|
|
const factory SubscriptionInfo({
|
|
required int upload,
|
|
required int download,
|
|
required int total,
|
|
required DateTime expire,
|
|
String? webPageUrl,
|
|
String? supportUrl,
|
|
}) = _SubscriptionInfo;
|
|
|
|
bool get isExpired => expire <= DateTime.now();
|
|
|
|
int get consumption => upload + download;
|
|
|
|
double get ratio => (consumption / total).clamp(0, 1);
|
|
|
|
Duration get remaining => expire.difference(DateTime.now());
|
|
}
|