Advertisement
Guest User

firuser

a guest
Apr 16th, 2019
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.94 KB | None | 0 0
  1. //
  2. // FUser.swift
  3. // WChat
  4. //
  5. // Created by David Kababyan on 08/03/2018.
  6. // Copyright © 2018 David Kababyan. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10. import FirebaseAuth
  11. import FirebaseFirestore
  12.  
  13. class FUser {
  14.  
  15. let objectId: String
  16. var pushId: String?
  17.  
  18. let createdAt: Date
  19. var updatedAt: Date
  20.  
  21. var email: String
  22. var firstname: String
  23. var lastname: String
  24. var fullname: String
  25. var avatar: String
  26. var isOnline: Bool
  27. var phoneNumber: String
  28. var countryCode: String
  29. var country:String
  30. var city: String
  31.  
  32. var contacts: [String]
  33. var blockedUsers: [String]
  34. let loginMethod: String
  35.  
  36. //MARK: Initializers
  37.  
  38. init(_objectId: String, _pushId: String?, _createdAt: Date, _updatedAt: Date, _email: String, _firstname: String, _lastname: String, _avatar: String = "", _loginMethod: String, _phoneNumber: String, _city: String, _country: String) {
  39.  
  40. objectId = _objectId
  41. pushId = _pushId
  42.  
  43. createdAt = _createdAt
  44. updatedAt = _updatedAt
  45.  
  46. email = _email
  47. firstname = _firstname
  48. lastname = _lastname
  49. fullname = _firstname + " " + _lastname
  50. avatar = _avatar
  51. isOnline = true
  52.  
  53. city = _city
  54. country = _country
  55.  
  56. loginMethod = _loginMethod
  57. phoneNumber = _phoneNumber
  58. countryCode = ""
  59. blockedUsers = []
  60. contacts = []
  61.  
  62. }
  63.  
  64.  
  65.  
  66. init(_dictionary: NSDictionary) {
  67.  
  68. objectId = _dictionary[kOBJECTID] as! String
  69. pushId = _dictionary[kPUSHID] as? String
  70.  
  71. if let created = _dictionary[kCREATEDAT] {
  72. if (created as! String).count != 14 {
  73. createdAt = Date()
  74. } else {
  75. createdAt = dateFormatter().date(from: created as! String)!
  76. }
  77. } else {
  78. createdAt = Date()
  79. }
  80. if let updateded = _dictionary[kUPDATEDAT] {
  81. if (updateded as! String).count != 14 {
  82. updatedAt = Date()
  83. } else {
  84. updatedAt = dateFormatter().date(from: updateded as! String)!
  85. }
  86. } else {
  87. updatedAt = Date()
  88. }
  89.  
  90. if let mail = _dictionary[kEMAIL] {
  91. email = mail as! String
  92. } else {
  93. email = ""
  94. }
  95. if let fname = _dictionary[kFIRSTNAME] {
  96. firstname = fname as! String
  97. } else {
  98. firstname = ""
  99. }
  100. if let lname = _dictionary[kLASTNAME] {
  101. lastname = lname as! String
  102. } else {
  103. lastname = ""
  104. }
  105. fullname = firstname + " " + lastname
  106. if let avat = _dictionary[kAVATAR] {
  107. avatar = avat as! String
  108. } else {
  109. avatar = ""
  110. }
  111. if let onl = _dictionary[kISONLINE] {
  112. isOnline = onl as! Bool
  113. } else {
  114. isOnline = false
  115. }
  116. if let phone = _dictionary[kPHONE] {
  117. phoneNumber = phone as! String
  118. } else {
  119. phoneNumber = ""
  120. }
  121. if let countryC = _dictionary[kCOUNTRYCODE] {
  122. countryCode = countryC as! String
  123. } else {
  124. countryCode = ""
  125. }
  126. if let cont = _dictionary[kCONTACT] {
  127. contacts = cont as! [String]
  128. } else {
  129. contacts = []
  130. }
  131. if let block = _dictionary[kBLOCKEDUSERID] {
  132. blockedUsers = block as! [String]
  133. } else {
  134. blockedUsers = []
  135. }
  136.  
  137. if let lgm = _dictionary[kLOGINMETHOD] {
  138. loginMethod = lgm as! String
  139. } else {
  140. loginMethod = ""
  141. }
  142. if let cit = _dictionary[kCITY] {
  143. city = cit as! String
  144. } else {
  145. city = ""
  146. }
  147. if let count = _dictionary[kCOUNTRY] {
  148. country = count as! String
  149. } else {
  150. country = ""
  151. }
  152.  
  153. }
  154.  
  155.  
  156. //MARK: Returning current user funcs
  157.  
  158. class func currentId() -> String {
  159.  
  160. return Auth.auth().currentUser!.uid
  161. }
  162.  
  163. class func currentUser () -> FUser? {
  164.  
  165. if Auth.auth().currentUser != nil {
  166.  
  167. if let dictionary = UserDefaults.standard.object(forKey: kCURRENTUSER) {
  168.  
  169. return FUser.init(_dictionary: dictionary as! NSDictionary)
  170. }
  171. }
  172.  
  173. return nil
  174.  
  175. }
  176.  
  177.  
  178.  
  179. //MARK: Login function
  180.  
  181. class func loginUserWith(email: String, password: String, completion: @escaping (_ error: Error?) -> Void) {
  182.  
  183. Auth.auth().signIn(withEmail: email, password: password, completion: { (firUser, error) in
  184.  
  185. if error != nil {
  186.  
  187. completion(error)
  188. return
  189.  
  190. } else {
  191.  
  192. //get user from firebase and save locally
  193. fetchCurrentUserFromFirestore(userId: firUser!.user.uid)
  194. completion(error)
  195. }
  196.  
  197. })
  198.  
  199. }
  200.  
  201. //MARK: Register functions
  202.  
  203. class func registerUserWith(email: String, password: String, firstName: String, lastName: String, avatar: String = "", completion: @escaping (_ error: Error?) -> Void ) {
  204.  
  205. Auth.auth().createUser(withEmail: email, password: password, completion: { (firuser, error) in
  206.  
  207. if error != nil {
  208.  
  209. completion(error)
  210. return
  211. }
  212.  
  213. let fUser = FUser(_objectId: firuser!.user.uid, _pushId: "", _createdAt: Date(), _updatedAt: Date(), _email: firuser!.user.email!, _firstname: firstName, _lastname: lastName, _avatar: avatar, _loginMethod: kEMAIL, _phoneNumber: "", _city: "", _country: "")
  214.  
  215.  
  216. saveUserLocally(fUser: fUser)
  217. saveUserToFirestore(fUser: fUser)
  218. completion(error)
  219.  
  220. })
  221.  
  222. }
  223.  
  224. //phoneNumberRegistration
  225.  
  226. class func registerUserWith(phoneNumber: String, verificationCode: String, verificationId: String!, completion: @escaping (_ error: Error?, _ shouldLogin: Bool) -> Void) {
  227.  
  228.  
  229. let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationId, verificationCode: verificationCode)
  230.  
  231. Auth.auth().signInAndRetrieveData(with: credential) { (firuser, error) in
  232.  
  233. if error != nil {
  234.  
  235. completion(error!, false)
  236. return
  237. }
  238.  
  239. //check if user exist - login else register
  240. fetchCurrentUserFromFirestore(userId: firuser!.user.uid, completion: { (user) in
  241.  
  242. if user != nil && user!.firstname != "" {
  243. //we have user, login
  244.  
  245. saveUserLocally(fUser: user!)
  246. saveUserToFirestore(fUser: user!)
  247.  
  248. completion(error, true)
  249.  
  250. } else {
  251.  
  252. // we have no user, register
  253. let fUser = FUser(_objectId: firuser!.user.uid, _pushId: "", _createdAt: Date(), _updatedAt: Date(), _email: "", _firstname: "", _lastname: "", _avatar: "", _loginMethod: kPHONE, _phoneNumber: firuser!.user.phoneNumber!, _city: "", _country: "")
  254.  
  255. saveUserLocally(fUser: fUser)
  256. saveUserToFirestore(fUser: fUser)
  257. completion(error, false)
  258.  
  259. }
  260.  
  261. })
  262.  
  263. }
  264.  
  265. }
  266.  
  267.  
  268. //MARK: LogOut func
  269.  
  270. class func logOutCurrentUser(completion: @escaping (_ success: Bool) -> Void) {
  271.  
  272. userDefaults.removeObject(forKey: kPUSHID)
  273. removeOneSignalId()
  274.  
  275. userDefaults.removeObject(forKey: kCURRENTUSER)
  276. userDefaults.synchronize()
  277.  
  278. do {
  279. try Auth.auth().signOut()
  280.  
  281. completion(true)
  282.  
  283. } catch let error as NSError {
  284. completion(false)
  285. print(error.localizedDescription)
  286.  
  287. }
  288.  
  289.  
  290. }
  291.  
  292. //MARK: Delete user
  293.  
  294. class func deleteUser(completion: @escaping (_ error: Error?) -> Void) {
  295.  
  296. let user = Auth.auth().currentUser
  297.  
  298. user?.delete(completion: { (error) in
  299.  
  300. completion(error)
  301. })
  302.  
  303. }
  304.  
  305. } //end of class funcs
  306.  
  307.  
  308.  
  309.  
  310. //MARK: Save user funcs
  311.  
  312. func saveUserToFirestore(fUser: FUser) {
  313. reference(.User).document(fUser.objectId).setData(userDictionaryFrom(user: fUser) as! [String : Any]) { (error) in
  314.  
  315. print("error is \(error?.localizedDescription)")
  316. }
  317. }
  318.  
  319.  
  320. func saveUserLocally(fUser: FUser) {
  321.  
  322. UserDefaults.standard.set(userDictionaryFrom(user: fUser), forKey: kCURRENTUSER)
  323. UserDefaults.standard.synchronize()
  324. }
  325.  
  326.  
  327. //MARK: Fetch User funcs
  328.  
  329. func fetchCurrentUserFromFirestore(userId: String) {
  330.  
  331. reference(.User).document(userId).getDocument { (snapshot, error) in
  332.  
  333. guard let snapshot = snapshot else { return }
  334.  
  335. if snapshot.exists {
  336. print("updated current users param")
  337.  
  338. UserDefaults.standard.setValue(snapshot.data() as! NSDictionary, forKeyPath: kCURRENTUSER)
  339. UserDefaults.standard.synchronize()
  340.  
  341. }
  342.  
  343. }
  344.  
  345. }
  346.  
  347.  
  348. func fetchCurrentUserFromFirestore(userId: String, completion: @escaping (_ user: FUser?)->Void) {
  349.  
  350. reference(.User).document(userId).getDocument { (snapshot, error) in
  351.  
  352. guard let snapshot = snapshot else { return }
  353.  
  354. if snapshot.exists {
  355.  
  356. let user = FUser(_dictionary: snapshot.data()! as NSDictionary)
  357. completion(user)
  358. } else {
  359. completion(nil)
  360. }
  361.  
  362. }
  363. }
  364.  
  365.  
  366. //MARK: Helper funcs
  367.  
  368. func userDictionaryFrom(user: FUser) -> NSDictionary {
  369.  
  370. let createdAt = dateFormatter().string(from: user.createdAt)
  371. let updatedAt = dateFormatter().string(from: user.updatedAt)
  372.  
  373. return NSDictionary(objects: [user.objectId, createdAt, updatedAt, user.email, user.loginMethod, user.pushId!, user.firstname, user.lastname, user.fullname, user.avatar, user.contacts, user.blockedUsers, user.isOnline, user.phoneNumber, user.countryCode, user.city, user.country], forKeys: [kOBJECTID as NSCopying, kCREATEDAT as NSCopying, kUPDATEDAT as NSCopying, kEMAIL as NSCopying, kLOGINMETHOD as NSCopying, kPUSHID as NSCopying, kFIRSTNAME as NSCopying, kLASTNAME as NSCopying, kFULLNAME as NSCopying, kAVATAR as NSCopying, kCONTACT as NSCopying, kBLOCKEDUSERID as NSCopying, kISONLINE as NSCopying, kPHONE as NSCopying, kCOUNTRYCODE as NSCopying, kCITY as NSCopying, kCOUNTRY as NSCopying])
  374.  
  375. }
  376.  
  377. func getUsersFromFirestore(withIds: [String], completion: @escaping (_ usersArray: [FUser]) -> Void) {
  378.  
  379. var count = 0
  380. var usersArray: [FUser] = []
  381.  
  382. //go through each user and download it from firestore
  383. for userId in withIds {
  384.  
  385. reference(.User).document(userId).getDocument { (snapshot, error) in
  386.  
  387. guard let snapshot = snapshot else { return }
  388.  
  389. if snapshot.exists {
  390.  
  391. let user = FUser(_dictionary: snapshot.data() as! NSDictionary)
  392. count += 1
  393.  
  394. //dont add if its current user
  395. if user.objectId != FUser.currentId() {
  396. usersArray.append(user)
  397. }
  398.  
  399. } else {
  400. completion(usersArray)
  401. }
  402.  
  403. if count == withIds.count {
  404. //we have finished, return the array
  405. completion(usersArray)
  406. }
  407.  
  408. }
  409.  
  410. }
  411. }
  412.  
  413.  
  414. func updateCurrentUserInFirestore(withValues : [String : Any], completion: @escaping (_ error: Error?) -> Void) {
  415.  
  416. if let dictionary = UserDefaults.standard.object(forKey: kCURRENTUSER) {
  417.  
  418. var tempWithValues = withValues
  419.  
  420. let currentUserId = FUser.currentId()
  421.  
  422. let updatedAt = dateFormatter().string(from: Date())
  423.  
  424. tempWithValues[kUPDATEDAT] = updatedAt
  425.  
  426. let userObject = (dictionary as! NSDictionary).mutableCopy() as! NSMutableDictionary
  427.  
  428. userObject.setValuesForKeys(tempWithValues)
  429.  
  430. reference(.User).document(currentUserId).updateData(withValues) { (error) in
  431.  
  432. if error != nil {
  433.  
  434. completion(error)
  435. return
  436. }
  437.  
  438. //update current user
  439. UserDefaults.standard.setValue(userObject, forKeyPath: kCURRENTUSER)
  440. UserDefaults.standard.synchronize()
  441.  
  442. completion(error)
  443. }
  444.  
  445. }
  446. }
  447.  
  448.  
  449. //MARK: OneSignal
  450.  
  451. func updateOneSignalId() {
  452.  
  453. if FUser.currentUser() != nil {
  454.  
  455. if let pushId = UserDefaults.standard.string(forKey: kPUSHID) {
  456. setOneSignalId(pushId: pushId)
  457. } else {
  458. removeOneSignalId()
  459. }
  460. }
  461. }
  462.  
  463.  
  464. func setOneSignalId(pushId: String) {
  465. updateCurrentUserOneSignalId(newId: pushId)
  466. }
  467.  
  468.  
  469. func removeOneSignalId() {
  470. updateCurrentUserOneSignalId(newId: "")
  471. }
  472.  
  473. //MARK: Updating Current user funcs
  474.  
  475. func updateCurrentUserOneSignalId(newId: String) {
  476.  
  477. updateCurrentUserInFirestore(withValues: [kPUSHID : newId]) { (error) in
  478. if error != nil {
  479. print("error updating push id \(error!.localizedDescription)")
  480. }
  481. }
  482. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement