Le filtre incrémental testait la présence du fichier, jamais sa version. La prémisse d'origine était fausse, et ça change ce que le correctif répare : « une image remplacée dans le CMS ne remonte jamais » n'existe pas, parce que Upload appelle GenerateHexId() à chaque téléversement — remplacer une image produit un nouvel id, donc une nouvelle URL, que l'ancien filtre téléchargeait déjà. Le vrai cas de péremption vient d'être créé par D3 : les MP3 déjà présents sur les devices y sont en <id>.unknown, et « le fichier est présent » les déclarait à jour. Sans D2, D3 ne réparait que les installations neuves. isResourceOutdated traite donc .unknown comme absent. Deux pièges tranchés en écrivant. La montée v4 laisse les dates existantes à NULL et les considère à jour : backfiller à zéro aurait fait re-télécharger l'intégralité des visites de tous les visiteurs sur leur réseau mobile, au premier lancement. Et la boucle en masse héritée de D1 écrasait la date que la boucle de téléchargement venait d'écrire, DatabaseHelper.insert faisant un UPDATE de la ligne entière quand l'id existe ; pour un téléchargement échoué, c'est l'ancienne date locale qui est conservée, jamais celle du serveur. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
38 lines
1.0 KiB
Dart
38 lines
1.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:manager_api_new/api.dart';
|
|
|
|
class ResourceModel {
|
|
String? id = "";
|
|
String? path = "";
|
|
String? source = "";
|
|
String? label = "";
|
|
ResourceType? type;
|
|
DateTime? dateUpdate;
|
|
|
|
ResourceModel({this.id, this.path, this.source, this.type, this.dateUpdate});
|
|
|
|
Map<String, dynamic> toMap() {
|
|
return {
|
|
'id': id,
|
|
'path': path,
|
|
'source': source,
|
|
'type': type?.value,
|
|
'dateUpdate': dateUpdate?.toUtc().toIso8601String()
|
|
};
|
|
}
|
|
|
|
factory ResourceModel.fromJson(Map<String, dynamic> json) {
|
|
return ResourceModel(
|
|
id: json['id'] as String,
|
|
path: json['path'] as String,
|
|
source: json['source'] as String,
|
|
type: json['type'] as ResourceType,
|
|
dateUpdate: json['dateUpdate'] == null ? null : DateTime.parse(json['dateUpdate'] as String)
|
|
);
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return 'ResourceModel{id: $id, type: $type, source: $source, path: $path, label: $label, dateUpdate: $dateUpdate}';
|
|
}
|
|
} |