2021-02-03 09:01:08 +01:00
//
// A P I S e r v i c e + C o r e D a t a + M a s t o d o n U s e r . s w i f t
// M a s t o d o n
//
// C r e a t e d b y M a i n a s u K C i r n o o n 2 0 2 1 / 2 / 3 .
//
import os . log
import Foundation
import CoreData
import CoreDataStack
import MastodonSDK
extension APIService . CoreData {
static func createOrMergeMastodonUser (
into managedObjectContext : NSManagedObjectContext ,
for requestMastodonUser : MastodonUser ? ,
in domain : String ,
entity : Mastodon . Entity . Account ,
2021-03-10 09:38:14 +01:00
userCache : APIService . Persist . PersistCache < MastodonUser > ? ,
2021-02-03 09:01:08 +01:00
networkDate : Date ,
log : OSLog
) -> ( user : MastodonUser , isCreated : Bool ) {
let processEntityTaskSignpostID = OSSignpostID ( log : log )
os_signpost ( . begin , log : log , name : " update database - process entity: createOrMergeMastodonUser " , signpostID : processEntityTaskSignpostID , " process mastodon user %{public}s " , entity . id )
defer {
os_signpost ( . end , log : log , name : " update database - process entity: createOrMergeMastodonUser " , signpostID : processEntityTaskSignpostID , " process msstodon user %{public}s " , entity . id )
}
// f e t c h o l d m a s t o d o n u s e r
let oldMastodonUser : MastodonUser ? = {
2021-03-10 09:38:14 +01:00
if let userCache = userCache {
return userCache . dictionary [ entity . id ]
} else {
let request = MastodonUser . sortedFetchRequest
request . predicate = MastodonUser . predicate ( domain : domain , id : entity . id )
request . fetchLimit = 1
request . returnsObjectsAsFaults = false
do {
return try managedObjectContext . fetch ( request ) . first
} catch {
assertionFailure ( error . localizedDescription )
return nil
}
2021-02-03 09:01:08 +01:00
}
} ( )
if let oldMastodonUser = oldMastodonUser {
// m e r g e o l d m a s t o d o n u s r e
APIService . CoreData . mergeMastodonUser (
for : requestMastodonUser ,
old : oldMastodonUser ,
in : domain ,
entity : entity ,
networkDate : networkDate
)
return ( oldMastodonUser , false )
} else {
let mastodonUserProperty = MastodonUser . Property ( entity : entity , domain : domain , networkDate : networkDate )
let mastodonUser = MastodonUser . insert (
into : managedObjectContext ,
property : mastodonUserProperty
)
2021-03-10 09:38:14 +01:00
userCache ? . dictionary [ entity . id ] = mastodonUser
2021-02-03 09:01:08 +01:00
os_signpost ( . event , log : log , name : " update database - process entity: createOrMergeMastodonUser " , signpostID : processEntityTaskSignpostID , " did insert new mastodon user %{public}s: name %s " , mastodonUser . identifier , mastodonUser . username )
return ( mastodonUser , true )
}
}
static func mergeMastodonUser (
for requestMastodonUser : MastodonUser ? ,
old user : MastodonUser ,
in domain : String ,
entity : Mastodon . Entity . Account ,
networkDate : Date
) {
guard networkDate > user . updatedAt else { return }
let property = MastodonUser . Property ( entity : entity , domain : domain , networkDate : networkDate )
// o n l y f u l f i l l A P I s u p p o r t e d f i e l d s
user . update ( acct : property . acct )
user . update ( username : property . username )
user . update ( displayName : property . displayName )
user . update ( avatar : property . avatar )
user . update ( avatarStatic : property . avatarStatic )
user . didUpdate ( at : networkDate )
}
}