Add includeMessages API [skip ci]

This commit is contained in:
Ali
2022-12-29 00:14:29 +04:00
parent a2da668fdf
commit b3ac092f2f
4 changed files with 26 additions and 15 deletions

View File

@@ -766,17 +766,13 @@ public final class StorageBox {
return allStats return allStats
} }
func remove(peerId: Int64?, contentTypes: [UInt8], excludeIds: [Data]) -> [Data] { func remove(peerId: Int64?, contentTypes: [UInt8], includeIds: [Data], excludeIds: [Data]) -> [Data] {
var resultIds: [Data] = [] var resultIds: [Data] = []
self.valueBox.begin() self.valueBox.begin()
var scannedIds: [Data: Data] = [:] var scannedIds: [Data: Data] = [:]
for contentType in contentTypes {
self.internalAddSize(contentType: contentType, delta: 0)
}
self.valueBox.scan(self.hashIdToInfoTable, values: { key, value in self.valueBox.scan(self.hashIdToInfoTable, values: { key, value in
let info = ItemInfo(buffer: value) let info = ItemInfo(buffer: value)
if !contentTypes.contains(info.contentType) { if !contentTypes.contains(info.contentType) {
@@ -786,6 +782,10 @@ public final class StorageBox {
return true return true
}) })
for id in includeIds {
scannedIds[md5Hash(id).data] = id
}
let excludeIds = Set(excludeIds) let excludeIds = Set(excludeIds)
if let peerId = peerId { if let peerId = peerId {
@@ -945,9 +945,9 @@ public final class StorageBox {
} }
} }
public func remove(peerId: PeerId?, contentTypes: [UInt8], excludeIds: [Data], completion: @escaping ([Data]) -> Void) { public func remove(peerId: PeerId?, contentTypes: [UInt8], includeIds: [Data], excludeIds: [Data], completion: @escaping ([Data]) -> Void) {
self.impl.with { impl in self.impl.with { impl in
let ids = impl.remove(peerId: peerId?.toInt64(), contentTypes: contentTypes, excludeIds: excludeIds) let ids = impl.remove(peerId: peerId?.toInt64(), contentTypes: contentTypes, includeIds: includeIds, excludeIds: excludeIds)
completion(ids) completion(ids)
} }
} }

View File

@@ -284,15 +284,26 @@ func _internal_renderStorageUsageStatsMessages(account: Account, stats: StorageU
} }
} }
func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], excludeMessages: [Message]) -> Signal<Never, NoError> { func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], includeMessages: [Message], excludeMessages: [Message]) -> Signal<Never, NoError> {
let mediaBox = account.postbox.mediaBox let mediaBox = account.postbox.mediaBox
return Signal { subscriber in return Signal { subscriber in
var resourceIds = Set<MediaResourceId>() var includeResourceIds = Set<MediaResourceId>()
for message in includeMessages {
extractMediaResourceIds(message: message, resourceIds: &includeResourceIds)
}
var includeIds: [Data] = []
for resourceId in includeResourceIds {
if let data = resourceId.stringRepresentation.data(using: .utf8) {
includeIds.append(data)
}
}
var excludeResourceIds = Set<MediaResourceId>()
for message in excludeMessages { for message in excludeMessages {
extractMediaResourceIds(message: message, resourceIds: &resourceIds) extractMediaResourceIds(message: message, resourceIds: &excludeResourceIds)
} }
var excludeIds: [Data] = [] var excludeIds: [Data] = []
for resourceId in resourceIds { for resourceId in excludeResourceIds {
if let data = resourceId.stringRepresentation.data(using: .utf8) { if let data = resourceId.stringRepresentation.data(using: .utf8) {
excludeIds.append(data) excludeIds.append(data)
} }
@@ -319,7 +330,7 @@ func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories
} }
} }
mediaBox.storageBox.remove(peerId: peerId, contentTypes: mappedContentTypes, excludeIds: excludeIds, completion: { ids in mediaBox.storageBox.remove(peerId: peerId, contentTypes: mappedContentTypes, includeIds: includeIds, excludeIds: excludeIds, completion: { ids in
var resourceIds: [MediaResourceId] = [] var resourceIds: [MediaResourceId] = []
for id in ids { for id in ids {
if let value = String(data: id, encoding: .utf8) { if let value = String(data: id, encoding: .utf8) {

View File

@@ -233,8 +233,8 @@ public extension TelegramEngine {
return _internal_renderStorageUsageStatsMessages(account: self.account, stats: stats, categories: categories, existingMessages: existingMessages) return _internal_renderStorageUsageStatsMessages(account: self.account, stats: stats, categories: categories, existingMessages: existingMessages)
} }
public func clearStorage(peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], excludeMessages: [Message]) -> Signal<Never, NoError> { public func clearStorage(peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], includeMessages: [Message], excludeMessages: [Message]) -> Signal<Never, NoError> {
return _internal_clearStorage(account: self.account, peerId: peerId, categories: categories, excludeMessages: excludeMessages) return _internal_clearStorage(account: self.account, peerId: peerId, categories: categories, includeMessages: includeMessages, excludeMessages: excludeMessages)
} }
public func clearStorage(peerIds: Set<EnginePeer.Id>, includeMessages: [Message], excludeMessages: [Message]) -> Signal<Never, NoError> { public func clearStorage(peerIds: Set<EnginePeer.Id>, includeMessages: [Message], excludeMessages: [Message]) -> Signal<Never, NoError> {

View File

@@ -2509,7 +2509,7 @@ final class StorageUsageScreenComponent: Component {
self.isClearing = true self.isClearing = true
self.state?.updated(transition: .immediate) self.state?.updated(transition: .immediate)
let _ = (component.context.engine.resources.clearStorage(peerId: peerId, categories: mappedCategories, excludeMessages: []) let _ = (component.context.engine.resources.clearStorage(peerId: peerId, categories: mappedCategories, includeMessages: [], excludeMessages: [])
|> deliverOnMainQueue).start(completed: { [weak self] in |> deliverOnMainQueue).start(completed: { [weak self] in
guard let self, let component = self.component, let currentStats = self.currentStats else { guard let self, let component = self.component, let currentStats = self.currentStats else {
return return