Skip to content

Commit 8dc6e96

Browse files
committed
ms-store updates
- refactor packages fetching and handling and use typesafe models (packages will be more accurate) - download (& install) all files at the same time (parallel processing) - xml files in 'msstore' folder are read once when the class is loaded - avoid unnecessary xml document parsing
1 parent e8b6a3d commit 8dc6e96

7 files changed

Lines changed: 707 additions & 391 deletions

File tree

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:common/src/dto/ms_store/update_response.dart';
12
import 'package:freezed_annotation/freezed_annotation.dart';
23
part 'packages_info_dto.freezed.dart';
34
part 'packages_info_dto.g.dart';
@@ -8,24 +9,21 @@ class MSStorePackagesInfoDTO
89
implements Comparable<MSStorePackagesInfoDTO> {
910
MSStorePackagesInfoDTO._();
1011

11-
factory MSStorePackagesInfoDTO(
12-
String? name,
13-
String? extension,
14-
String? uri,
15-
String? revisionNumber,
16-
String? updateID,
17-
String? id,
18-
double? size,
19-
String? digest,
20-
DateTime? lastModified,
21-
int? originalIndex,
22-
String? commandLines) = _MSStorePackagesInfoDTO;
12+
factory MSStorePackagesInfoDTO({
13+
required final String id,
14+
required final bool isDependency,
15+
required final String uri,
16+
required final String arch,
17+
final FileModel? fileModel,
18+
final UpdateIdentity? updateIdentity,
19+
final String? commandLines,
20+
}) = _MSStorePackagesInfoDTO;
2321

2422
factory MSStorePackagesInfoDTO.fromJson(Map<String, dynamic> json) =>
2523
_$MSStorePackagesInfoDTOFromJson(json);
2624

2725
@override
2826
int compareTo(MSStorePackagesInfoDTO other) {
29-
return name!.compareTo(other.name!);
27+
return fileModel!.fileName!.compareTo(other.fileModel!.fileName!);
3028
}
3129
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// ignore_for_file: invalid_annotation_target
2+
3+
import 'dart:convert';
4+
5+
import 'package:freezed_annotation/freezed_annotation.dart';
6+
part 'product.freezed.dart';
7+
part 'product.g.dart';
8+
9+
@freezed
10+
class Product with _$Product {
11+
const factory Product({
12+
@JsonKey(name: "ExpiryUtc") DateTime? expiryUtc,
13+
@JsonKey(name: "Payload") Payload? payload,
14+
}) = _Product;
15+
16+
factory Product.fromJson(Map<String, Object?> json) =>
17+
_$ProductFromJson(json);
18+
}
19+
20+
@freezed
21+
class Payload with _$Payload {
22+
const factory Payload({
23+
@JsonKey(name: "ProductId") String? productId,
24+
@JsonKey(name: "Title") String? title,
25+
@JsonKey(name: "Description") String? description,
26+
@JsonKey(name: "Skus") List<Skus>? skus,
27+
@JsonKey(name: "Platforms") List<String>? platforms,
28+
@JsonKey(name: "PermissionsRequired") List<String>? permissionsRequired,
29+
@JsonKey(name: "PackageAndDeviceCapabilities")
30+
List<String>? packageAndDeviceCapabilities,
31+
32+
@JsonKey(name: "ContainsDownloadPackage") bool? containsDownloadPackage,
33+
}) = _Payload;
34+
35+
factory Payload.fromJson(Map<String, Object?> json) =>
36+
_$PayloadFromJson(json);
37+
}
38+
39+
enum SkuType {
40+
full(value: "full"),
41+
trial(value: "trial");
42+
43+
const SkuType({required this.value});
44+
45+
final String value;
46+
}
47+
48+
@freezed
49+
class Skus with _$Skus {
50+
const factory Skus({
51+
@JsonKey(name: "SkuId") String? skuId,
52+
@JsonKey(name: "Title") String? title,
53+
@JsonKey(name: "SkuType") SkuType? skuType,
54+
@JsonKey(name: "Price") double? price,
55+
@JsonKey(name: "DisplayPrice") String? displayPrice,
56+
@JsonKey(name: "FulfillmentData")
57+
@FulfillmentDataConverter()
58+
FulfillmentData? fulfillmentData,
59+
}) = _Skus;
60+
61+
factory Skus.fromJson(Map<String, Object?> json) => _$SkusFromJson(json);
62+
}
63+
64+
@freezed
65+
class FulfillmentData with _$FulfillmentData {
66+
const factory FulfillmentData({
67+
@JsonKey(name: "ProductId") String? productId,
68+
@JsonKey(name: "WuBundleId") String? wuBundleId,
69+
@JsonKey(name: "WuCategoryId") String? wuCategoryId,
70+
@JsonKey(name: "PackageFamilyName") String? packageFamilyName,
71+
@JsonKey(name: "SkuId") String? skuId,
72+
}) = _FulfillmentData;
73+
74+
factory FulfillmentData.fromJson(Map<String, Object?> json) =>
75+
_$FulfillmentDataFromJson(json);
76+
}
77+
78+
class FulfillmentDataConverter
79+
implements JsonConverter<FulfillmentData, String> {
80+
const FulfillmentDataConverter();
81+
82+
@override
83+
FulfillmentData fromJson(String data) {
84+
return FulfillmentData.fromJson(json.decode(data));
85+
}
86+
87+
@override
88+
String toJson(FulfillmentData data) {
89+
return json.encode(data.toJson());
90+
}
91+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
2+
3+
part 'update_response.freezed.dart';
4+
part 'update_response.g.dart';
5+
6+
@freezed
7+
class UpdateResponse with _$UpdateResponse {
8+
const factory UpdateResponse({required Set<UpdateModel> updates}) =
9+
_UpdateResponse;
10+
11+
factory UpdateResponse.fromJson(Map<String, Object?> json) =>
12+
_$UpdateResponseFromJson(json);
13+
}
14+
15+
@freezed
16+
class UpdateModel with _$UpdateModel {
17+
const factory UpdateModel({
18+
required final String id,
19+
required final ElementXml xml,
20+
String? arch,
21+
}) = _UpdateModel;
22+
23+
factory UpdateModel.fromJson(Map<String, Object?> json) =>
24+
_$UpdateModelFromJson(json);
25+
}
26+
27+
@freezed
28+
class ElementXml with _$ElementXml {
29+
const factory ElementXml({
30+
UpdateIdentity? updateIdentity,
31+
String? packageMoniker,
32+
ExtendedProperties? extendedProperties,
33+
required Set<FileModel> fileModel,
34+
}) = _ElementXml;
35+
36+
factory ElementXml.fromJson(Map<String, Object?> json) =>
37+
_$ElementXmlFromJson(json);
38+
}
39+
40+
@freezed
41+
class UpdateIdentity with _$UpdateIdentity {
42+
const factory UpdateIdentity({
43+
required String id,
44+
required String revisionNumber,
45+
}) = _UpdateIdentity;
46+
47+
factory UpdateIdentity.fromJson(Map<String, Object?> json) =>
48+
_$UpdateIdentityFromJson(json);
49+
}
50+
51+
@freezed
52+
class ExtendedProperties with _$ExtendedProperties {
53+
const factory ExtendedProperties({
54+
String? contentType,
55+
bool? isAppxFramework,
56+
DateTime? creationDate,
57+
String? packageIdentityName,
58+
}) = _ExtendedProperties;
59+
60+
factory ExtendedProperties.fromJson(Map<String, Object?> json) =>
61+
_$ExtendedPropertiesFromJson(json);
62+
}
63+
64+
@freezed
65+
class FileModel with _$FileModel {
66+
const factory FileModel({
67+
String? fileName,
68+
String? fileType, // custom
69+
String? packageFullName, //PackageFullName
70+
String? digest,
71+
String? digestAlgorithm,
72+
int? size,
73+
DateTime? modifiedDate,
74+
}) = _FileModel;
75+
76+
factory FileModel.fromJson(Map<String, Object?> json) =>
77+
_$FileModelFromJson(json);
78+
}

0 commit comments

Comments
 (0)