Merge pull request #1063 from kiwix/categories-to-languages-fix-for-etag-304

Fix categories parsing, when eTag 304 is used
This commit is contained in:
Kelson 2025-01-03 13:42:50 +01:00 committed by GitHub
commit 4a0d565751
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -87,9 +87,29 @@ final class LibraryViewModel: ObservableObject {
// refresh library
guard let data = try await fetchData() else {
error = nil
process.state = .complete
return
// this is the case when we have no new data (304 http)
// but we still need to refresh the memory only stored
// zimfile categories to languages dictionary
if CategoriesToLanguages.allCategories().count < 2 {
let context = Database.shared.viewContext
if let zimFiles: [ZimFile] = try? context.fetch(ZimFile.fetchRequest()) {
saveCategoryAvailableInLanguages(fromDBZimFiles: zimFiles)
// populate library language code if there isn't one set already
await setDefaultContentFilterLanguage()
error = nil
process.state = .complete
return
} else {
error = LibraryRefreshError.process
process.state = .error
return
}
} else {
error = nil
process.state = .complete
return
}
}
let parser = try await parse(data: data)
// delete all old ISO Lang Code entries if needed, by passing in an empty parser
@ -138,6 +158,22 @@ final class LibraryViewModel: ObservableObject {
}
CategoriesToLanguages.save(dictionary)
}
private func saveCategoryAvailableInLanguages(fromDBZimFiles zimFiles: [ZimFile]) {
var dictionary: [Category: Set<String>] = [:]
for zimFile in zimFiles {
let category = Category(rawValue: zimFile.category) ?? .other
let allLanguagesForCategory: Set<String>
let categoryLanguages: Set<String> = Set<String>(zimFile.languageCode.components(separatedBy: ","))
if let existingLanguages = dictionary[category] {
allLanguagesForCategory = existingLanguages.union(categoryLanguages)
} else {
allLanguagesForCategory = categoryLanguages
}
dictionary[category] = allLanguagesForCategory
}
CategoriesToLanguages.save(dictionary)
}
/// The fetched content is filtered by the languages set in settings.
/// We need to make sure, whatever was set by the user is