@@ -20,90 +20,115 @@ enum UserError: Error {
2020public class UserBuilder {
2121 private let cacheService : CacheServiceProtocol = CacheService ( )
2222
23- var user : DevCycleUser
23+ var userId : String ?
24+ var isAnonymous : Bool ?
25+ var email : String ?
26+ var name : String ?
27+ var language : String ?
28+ var country : String ?
2429 var customData : [ String : Any ] ?
2530 var privateCustomData : [ String : Any ] ?
2631
2732 init ( ) {
28- self . user = DevCycleUser ( )
2933 }
3034
3135 public func userId( _ userId: String ) -> UserBuilder {
32- self . user . userId = userId
36+ self . userId = userId
3337 return self
3438 }
3539
3640 public func isAnonymous( _ isAnonymous: Bool ) -> UserBuilder {
37- self . user . isAnonymous = isAnonymous
41+ self . isAnonymous = isAnonymous
3842 return self
3943 }
4044
41- public func email( _ email: String ) -> UserBuilder {
42- self . user . email = email
45+ public func email( _ email: String ? ) -> UserBuilder {
46+ self . email = email
4347 return self
4448 }
4549
46- public func name( _ name: String ) -> UserBuilder {
47- self . user . name = name
50+ public func name( _ name: String ? ) -> UserBuilder {
51+ self . name = name
4852 return self
4953 }
5054
51- public func language( _ language: String ) -> UserBuilder {
52- self . user . language = language
55+ public func language( _ language: String ? ) -> UserBuilder {
56+ self . language = language
5357 return self
5458 }
5559
56- public func country( _ country: String ) -> UserBuilder {
57- self . user . country = country
60+ public func country( _ country: String ? ) -> UserBuilder {
61+ self . country = country
5862 return self
5963 }
6064
61- public func customData( _ customData: [ String : Any ] ) -> UserBuilder {
65+ public func customData( _ customData: [ String : Any ] ? ) -> UserBuilder {
6266 self . customData = customData
6367 return self
6468 }
6569
66- public func privateCustomData( _ privateCustomData: [ String : Any ] ) -> UserBuilder {
70+ public func privateCustomData( _ privateCustomData: [ String : Any ] ? ) -> UserBuilder {
6771 self . privateCustomData = privateCustomData
6872 return self
6973 }
7074
75+ private func cleanup( ) {
76+ self . userId = nil
77+ self . isAnonymous = nil
78+ self . email = nil
79+ self . name = nil
80+ self . language = nil
81+ self . country = nil
82+ self . customData = nil
83+ self . privateCustomData = nil
84+ }
85+
7186 public func build( ) throws -> DevCycleUser {
72- // Validate the userId
73- let hasValidUserId = self . user. userId != nil && !self . user. userId!. isEmpty
87+ let hasValidUserId = self . userId != nil && !self . userId!. isEmpty
7488
75- // Handle the different cases based on isAnonymous and userId
76- if self . user. isAnonymous == false && !hasValidUserId {
89+ if self . isAnonymous == false && !hasValidUserId {
7790 throw UserError . MissingUserIdAndIsAnonymousFalse
7891 }
7992
80- if self . user. isAnonymous == true && !hasValidUserId {
81- self . user. userId = self . cacheService. getOrCreateAnonUserId ( )
82- } else if !hasValidUserId {
83- // Default case: no userId and isAnonymous not explicitly set to false, make anonymous
84- self . user. userId = self . cacheService. getOrCreateAnonUserId ( )
85- self . user. isAnonymous = true
86- }
87-
88- if let customData = self . customData {
89- self . user. customData = try CustomData . customDataFromDic ( customData)
93+ let finalUserId : String
94+ let finalIsAnonymous : Bool
95+
96+ if !hasValidUserId {
97+ // Default case: no userId provided, make anonymous
98+ finalUserId = self . cacheService. getOrCreateAnonUserId ( )
99+ finalIsAnonymous = true
100+ } else if let userId = self . userId {
101+ // Valid userId provided, use it
102+ finalUserId = userId
103+ finalIsAnonymous = false
104+ } else {
105+ throw UserError . InvalidUser
90106 }
91107
92- if let privateCustomData = self . privateCustomData {
93- self . user. privateCustomData = try CustomData . customDataFromDic ( privateCustomData)
108+ let customDataConverted = try self . customData. map { try CustomData . customDataFromDic ( $0) }
109+ let privateCustomDataConverted = try self . privateCustomData. map {
110+ try CustomData . customDataFromDic ( $0)
94111 }
95112
96- let result = self . user
97- self . user = DevCycleUser ( )
98- self . customData = nil
99- self . privateCustomData = nil
100- return result
113+ let user = DevCycleUser (
114+ userId: finalUserId,
115+ isAnonymous: finalIsAnonymous,
116+ email: self . email,
117+ name: self . name,
118+ language: self . language,
119+ country: self . country,
120+ customData: customDataConverted,
121+ privateCustomData: privateCustomDataConverted
122+ )
123+
124+ self . cleanup ( )
125+ return user
101126 }
102127}
103128
104129public class DevCycleUser : Codable {
105- public var userId : String ?
106- public var isAnonymous : Bool ?
130+ public var userId : String
131+ public var isAnonymous : Bool
107132 public var email : String ?
108133 public var name : String ?
109134 public var language : String ?
@@ -121,7 +146,20 @@ public class DevCycleUser: Codable {
121146 internal var appVersion : String ?
122147 internal var appBuild : Int ?
123148
124- init ( ) {
149+ init (
150+ userId: String , isAnonymous: Bool , email: String ? = nil , name: String ? = nil ,
151+ language: String ? = nil , country: String ? = nil , customData: CustomData ? = nil ,
152+ privateCustomData: CustomData ? = nil
153+ ) {
154+ self . userId = userId
155+ self . isAnonymous = isAnonymous
156+ self . email = email
157+ self . name = name
158+ self . language = language
159+ self . country = country
160+ self . customData = customData
161+ self . privateCustomData = privateCustomData
162+
125163 let platform = PlatformDetails ( )
126164 self . lastSeenDate = Date ( )
127165 self . createdDate = Date ( )
0 commit comments