NCManageDatabase.swift 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. //
  2. // NCManageDatabase.swift
  3. // Nextcloud
  4. //
  5. // Created by Marino Faggiana on 06/05/17.
  6. // Copyright © 2017 TWS. All rights reserved.
  7. //
  8. import RealmSwift
  9. class NCManageDatabase: NSObject {
  10. static let sharedInstance: NCManageDatabase = {
  11. let instance = NCManageDatabase()
  12. return instance
  13. }()
  14. override init() {
  15. let dirGroup = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: NCBrandOptions.sharedInstance.capabilitiesGroups)
  16. var config = Realm.Configuration()
  17. config.fileURL = dirGroup?.appendingPathComponent("\(appDatabaseNextcloud)/\(k_databaseDefault)")
  18. Realm.Configuration.defaultConfiguration = config
  19. }
  20. //MARK: -
  21. //MARK: Utility Database
  22. func clearTable(_ table : Object.Type, account: String?) {
  23. let results : Results<Object>
  24. let realm = try! Realm()
  25. if (account != nil) {
  26. results = realm.objects(table).filter("account = '\(account!)'")
  27. } else {
  28. results = realm.objects(table)
  29. }
  30. try! realm.write {
  31. realm.delete(results)
  32. }
  33. }
  34. func removeDB() {
  35. let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
  36. let realmURLs = [
  37. realmURL,
  38. realmURL.appendingPathExtension("lock"),
  39. realmURL.appendingPathExtension("note"),
  40. realmURL.appendingPathExtension("management")
  41. ]
  42. for URL in realmURLs {
  43. do {
  44. try FileManager.default.removeItem(at: URL)
  45. } catch {
  46. // handle error
  47. }
  48. }
  49. }
  50. //MARK: -
  51. //MARK: Table Account
  52. func addAccount(_ account: String, url: String, user: String, password: String) {
  53. let realm = try! Realm()
  54. try! realm.write {
  55. let addAccount = tableAccount()
  56. addAccount.account = account
  57. // Brand
  58. /*
  59. if (k_option_use_default_automatic_upload) {
  60. } else {
  61. }
  62. */
  63. }
  64. }
  65. //MARK: -
  66. //MARK: Table Activity
  67. func addActivityServer(_ listOfActivity: [OCActivity], account: String) {
  68. let realm = try! Realm()
  69. try! realm.write {
  70. for activity in listOfActivity {
  71. // Verify
  72. let results = realm.objects(tableActivity.self).filter("idActivity = \(activity.idActivity)")
  73. if (results.count > 0) {
  74. continue
  75. }
  76. // Add new Activity
  77. let addActivity = tableActivity()
  78. addActivity.account = account
  79. addActivity.date = activity.date
  80. addActivity.idActivity = Double(activity.idActivity)
  81. addActivity.link = activity.link
  82. addActivity.note = activity.subject
  83. addActivity.type = k_activityTypeInfo
  84. realm.add(addActivity)
  85. }
  86. }
  87. }
  88. func addActivityClient(_ file: String, fileID: String, action: String, selector: String, note: String, type: String, verbose: Bool, account: String?, activeUrl: String?) {
  89. var noteReplacing : String = ""
  90. if (activeUrl != nil) {
  91. noteReplacing = note.replacingOccurrences(of: "\(activeUrl!)\(webDAV)", with: "")
  92. }
  93. noteReplacing = note.replacingOccurrences(of: "\(k_domain_session_queue).", with: "")
  94. let realm = try! Realm()
  95. try! realm.write {
  96. // Add new Activity
  97. let addActivity = tableActivity()
  98. if (account != nil) {
  99. addActivity.account = account!
  100. }
  101. addActivity.action = action
  102. addActivity.file = file
  103. addActivity.fileID = fileID
  104. addActivity.note = noteReplacing
  105. addActivity.selector = selector
  106. addActivity.type = type
  107. addActivity.verbose = verbose
  108. realm.add(addActivity)
  109. }
  110. }
  111. func getAllActivityWithPredicate(_ predicate: NSPredicate) -> [tableActivity] {
  112. let realm = try! Realm()
  113. let results = realm.objects(tableActivity.self).filter(predicate).sorted(byKeyPath: "date", ascending: false)
  114. return Array(results)
  115. }
  116. //MARK: -
  117. //MARK: Table Automatic Upload
  118. func addAutomaticUpload(_ metadataNet: CCMetadataNet, account: String) -> Bool {
  119. let realm = try! Realm()
  120. // Verify if exists
  121. let results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND assetLocalIdentifier = '\(metadataNet.assetLocalIdentifier)'")
  122. if (results.count > 0) {
  123. return false
  124. }
  125. try! realm.write {
  126. // Add new AutomaticUpload
  127. let addAutomaticUpload = tableAutomaticUpload()
  128. addAutomaticUpload.account = account
  129. addAutomaticUpload.assetLocalIdentifier = metadataNet.assetLocalIdentifier
  130. addAutomaticUpload.fileName = metadataNet.fileName
  131. addAutomaticUpload.selector = metadataNet.selector
  132. if (metadataNet.selectorPost != nil) {
  133. addAutomaticUpload.selectorPost = metadataNet.selectorPost
  134. }
  135. addAutomaticUpload.serverUrl = metadataNet.serverUrl
  136. addAutomaticUpload.session = metadataNet.session
  137. addAutomaticUpload.priority = metadataNet.priority
  138. realm.add(addAutomaticUpload)
  139. }
  140. return true
  141. }
  142. func getAutomaticUploadForAccount(_ account: String, selector: String) -> CCMetadataNet? {
  143. let realm = try! Realm()
  144. // Verify if exists
  145. let results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND selector = '\(selector)' AND (lock == false)")
  146. if (results.count == 0) {
  147. return nil
  148. }
  149. let metadataNet = CCMetadataNet()
  150. metadataNet.action = actionUploadAsset
  151. metadataNet.assetLocalIdentifier = results[0].assetLocalIdentifier
  152. metadataNet.fileName = results[0].fileName
  153. metadataNet.priority = results[0].priority
  154. metadataNet.selector = results[0].selector
  155. metadataNet.selectorPost = results[0].selectorPost
  156. metadataNet.serverUrl = results[0].serverUrl
  157. metadataNet.session = results[0].session
  158. metadataNet.taskStatus = Int(k_taskStatusResume)
  159. // Lock True
  160. try! realm.write {
  161. results[0].lock = true
  162. }
  163. return metadataNet
  164. }
  165. func getAllLockAutomaticUploadForAccount(_ account: String) -> [tableAutomaticUpload] {
  166. let realm = try! Realm()
  167. let results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND (lock = true)")
  168. return Array(results)
  169. }
  170. func unlockAutomaticUploadForAccount(_ account: String, assetLocalIdentifier: String) {
  171. let realm = try! Realm()
  172. let results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND (assetLocalIdentifier = '\(assetLocalIdentifier)')")
  173. if (results.count > 0) {
  174. // Lock False
  175. try! realm.write {
  176. results[0].lock = false
  177. }
  178. }
  179. }
  180. func deleteAutomaticUploadForAccount(_ account: String, assetLocalIdentifier: String) {
  181. let realm = try! Realm()
  182. let results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND (assetLocalIdentifier = '\(assetLocalIdentifier)')")
  183. if (results.count > 0) {
  184. try! realm.write {
  185. realm.delete(results)
  186. }
  187. }
  188. }
  189. func countAutomaticUploadForAccount(_ account: String, selector: String?) -> Int {
  190. let realm = try! Realm()
  191. let results : Results<tableAutomaticUpload>
  192. if (selector == nil) {
  193. results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)'")
  194. } else {
  195. results = realm.objects(tableAutomaticUpload.self).filter("account = '\(account)' AND (selector = '\(selector!)')")
  196. }
  197. return results.count
  198. }
  199. //MARK: -
  200. //MARK: Table Capabilities
  201. func addCapabilities(_ capabilities: OCCapabilities, account: String) {
  202. let realm = try! Realm()
  203. let results = realm.objects(tableCapabilities.self).filter("account = '\(account)'")
  204. try! realm.write {
  205. var resultCapabilities = tableCapabilities()
  206. if (results.count > 0) {
  207. resultCapabilities = results[0]
  208. }
  209. resultCapabilities.account = account
  210. resultCapabilities.themingBackground = capabilities.themingBackground
  211. resultCapabilities.themingColor = capabilities.themingColor
  212. resultCapabilities.themingLogo = capabilities.themingLogo
  213. resultCapabilities.themingName = capabilities.themingName
  214. resultCapabilities.themingSlogan = capabilities.themingSlogan
  215. resultCapabilities.themingUrl = capabilities.themingUrl
  216. resultCapabilities.versionMajor = capabilities.versionMajor
  217. resultCapabilities.versionMinor = capabilities.versionMinor
  218. resultCapabilities.versionMicro = capabilities.versionMicro
  219. resultCapabilities.versionString = capabilities.versionString
  220. if (results.count == 0) {
  221. realm.add(resultCapabilities)
  222. }
  223. }
  224. }
  225. func getCapabilitesForAccount(_ account: String) -> tableCapabilities? {
  226. let realm = try! Realm()
  227. let results = realm.objects(tableCapabilities.self).filter("account = '\(account)'")
  228. if (results.count > 0) {
  229. return results[0]
  230. } else {
  231. return nil
  232. }
  233. }
  234. func getServerVersionAccount(_ account: String) -> Int {
  235. let realm = try! Realm()
  236. let results = realm.objects(tableCapabilities.self).filter("account = '\(account)'")
  237. if (results.count > 0) {
  238. return results[0].versionMajor
  239. } else {
  240. return 0
  241. }
  242. }
  243. //MARK: -
  244. //MARK: Table Certificates
  245. func addCertificates(_ certificateLocation: String) {
  246. let realm = try! Realm()
  247. try! realm.write {
  248. let addCertificates = tableCertificates()
  249. addCertificates.certificateLocation = certificateLocation
  250. realm.add(addCertificates)
  251. }
  252. }
  253. func getAllCertificatesLocation(_ localCertificatesFolder: String) -> [String] {
  254. let realm = try! Realm()
  255. let results = realm.objects(tableCertificates.self)
  256. var arraycertificatePath = [String]()
  257. for result in results {
  258. arraycertificatePath.append("\(localCertificatesFolder)\(result.certificateLocation)")
  259. }
  260. return arraycertificatePath
  261. }
  262. //MARK: -
  263. //MARK: Table External Sites
  264. func addExternalSites(_ externalSites: OCExternalSites, account: String) {
  265. let realm = try! Realm()
  266. try! realm.write {
  267. let addExternalSite = tableExternalSites()
  268. addExternalSite.account = account
  269. addExternalSite.idExternalSite = externalSites.idExternalSite
  270. addExternalSite.icon = externalSites.icon
  271. addExternalSite.lang = externalSites.lang
  272. addExternalSite.name = externalSites.name
  273. addExternalSite.url = externalSites.url
  274. addExternalSite.type = externalSites.type
  275. realm.add(addExternalSite)
  276. }
  277. }
  278. func deleteAllExternalSitesForAccount(_ account: String) {
  279. let realm = try! Realm()
  280. let results = realm.objects(tableExternalSites.self).filter("account = '\(account)'")
  281. try! realm.write {
  282. realm.delete(results)
  283. }
  284. }
  285. func getAllExternalSitesWithPredicate(_ predicate: NSPredicate) -> [tableExternalSites] {
  286. let realm = try! Realm()
  287. let results = realm.objects(tableExternalSites.self).filter(predicate).sorted(byKeyPath: "idExternalSite", ascending: true)
  288. return Array(results)
  289. }
  290. //MARK: -
  291. //MARK: Table GPS
  292. func addGeocoderLocation(_ location: String, placemarkAdministrativeArea: String, placemarkCountry: String, placemarkLocality: String, placemarkPostalCode: String, placemarkThoroughfare: String, latitude: String, longitude: String) {
  293. let realm = try! Realm()
  294. // Verify if exists
  295. let results = realm.objects(tableGPS.self).filter("latitude = '\(latitude)' AND longitude = '\(longitude)'")
  296. if (results.count > 0) {
  297. return
  298. }
  299. try! realm.write {
  300. // Add new GPS
  301. let addGPS = tableGPS()
  302. addGPS.location = location
  303. addGPS.placemarkAdministrativeArea = placemarkAdministrativeArea
  304. addGPS.placemarkCountry = placemarkCountry
  305. addGPS.placemarkLocality = placemarkLocality
  306. addGPS.placemarkPostalCode = placemarkPostalCode
  307. addGPS.placemarkThoroughfare = placemarkThoroughfare
  308. addGPS.latitude = latitude
  309. addGPS.longitude = longitude
  310. realm.add(addGPS)
  311. }
  312. }
  313. func getLocationFromGeoLatitude(_ latitude: String, longitude: String) -> String? {
  314. let realm = try! Realm()
  315. let results = realm.objects(tableGPS.self).filter("latitude = '\(latitude)' AND longitude = '\(longitude)'")
  316. if (results.count == 0) {
  317. return nil
  318. } else {
  319. return results[0].location
  320. }
  321. }
  322. //MARK: -
  323. //MARK: Table Share
  324. func addShareLink(_ share: String, fileName: String, serverUrl: String, account: String) -> [String:String] {
  325. let realm = try! Realm()
  326. // Verify if exists
  327. let results = realm.objects(tableShare.self).filter("account = '\(account)' AND fileName = '\(fileName)' AND serverUrl = '\(serverUrl)'")
  328. if (results.count > 0) {
  329. try! realm.write {
  330. results[0].shareLink = share;
  331. }
  332. } else {
  333. // Add new record
  334. try! realm.write {
  335. let addShare = tableShare()
  336. addShare.account = account
  337. addShare.fileName = fileName
  338. addShare.serverUrl = serverUrl
  339. addShare.shareLink = share
  340. realm.add(addShare)
  341. }
  342. }
  343. return ["\(serverUrl)\(fileName)" : share]
  344. }
  345. func addShareUserAndGroup(_ share: String, fileName: String, serverUrl: String, account: String) -> [String:String] {
  346. let realm = try! Realm()
  347. // Verify if exists
  348. let results = realm.objects(tableShare.self).filter("account = '\(account)' AND fileName = '\(fileName)' AND serverUrl = '\(serverUrl)'")
  349. if (results.count > 0) {
  350. try! realm.write {
  351. results[0].shareUserAndGroup = share;
  352. }
  353. } else {
  354. // Add new record
  355. try! realm.write {
  356. let addShare = tableShare()
  357. addShare.account = account
  358. addShare.fileName = fileName
  359. addShare.serverUrl = serverUrl
  360. addShare.shareUserAndGroup = share
  361. realm.add(addShare)
  362. }
  363. }
  364. return ["\(serverUrl)\(fileName)" : share]
  365. }
  366. func unShare(_ share: String, fileName: String, serverUrl: String, sharesLink: [String:String], sharesUserAndGroup: [String:String], account: String) -> [Any] {
  367. var sharesLink = sharesLink
  368. var sharesUserAndGroup = sharesUserAndGroup
  369. let realm = try! Realm()
  370. let results = realm.objects(tableShare.self).filter("account = '\(account)' AND (shareLink CONTAINS '\(share)' OR shareUserAndGroup CONTAINS '\(share)')")
  371. if (results.count > 0) {
  372. let result = results[0]
  373. realm.beginWrite()
  374. if (result.shareLink.contains(share)) {
  375. result.shareLink = ""
  376. }
  377. if (result.shareUserAndGroup.contains(share)) {
  378. var shares : [String] = result.shareUserAndGroup.components(separatedBy: ",")
  379. if let index = shares.index(of:share) {
  380. shares.remove(at: index)
  381. }
  382. result.shareUserAndGroup = shares.joined(separator: ",")
  383. }
  384. if (result.shareLink.characters.count > 0) {
  385. sharesLink.updateValue(result.shareLink, forKey:"\(serverUrl)\(fileName)")
  386. } else {
  387. sharesLink.removeValue(forKey: "\(serverUrl)\(fileName)")
  388. }
  389. if (result.shareUserAndGroup.characters.count > 0) {
  390. sharesUserAndGroup.updateValue(result.shareUserAndGroup, forKey:"\(serverUrl)\(fileName)")
  391. } else {
  392. sharesUserAndGroup.removeValue(forKey: "\(serverUrl)\(fileName)")
  393. }
  394. if (result.shareLink.characters.count == 0 && result.shareUserAndGroup.characters.count == 0) {
  395. realm.delete(result)
  396. }
  397. try! realm.commitWrite()
  398. }
  399. return [sharesLink, sharesUserAndGroup]
  400. }
  401. func removeAllShareActiveAccount(_ account: String) {
  402. let realm = try! Realm()
  403. let results = realm.objects(tableShare.self).filter("account = '\(account)'")
  404. try! realm.write {
  405. realm.delete(results)
  406. }
  407. }
  408. func updateShare(_ items: [String:OCSharedDto], account: String, activeUrl: String) -> [Any] {
  409. var sharesLink = [String:String]()
  410. var sharesUserAndGroup = [String:String]()
  411. self.removeAllShareActiveAccount(account)
  412. var itemsLink = [OCSharedDto]()
  413. var itemsUsersAndGroups = [OCSharedDto]()
  414. for (_, itemOCSharedDto) in items {
  415. if (itemOCSharedDto.shareType == Int(shareTypeLink.rawValue)) {
  416. itemsLink.append(itemOCSharedDto)
  417. }
  418. if (itemOCSharedDto.shareWith.characters.count > 0 && (itemOCSharedDto.shareType == Int(shareTypeUser.rawValue) || itemOCSharedDto.shareType == Int(shareTypeGroup.rawValue) || itemOCSharedDto.shareType == Int(shareTypeRemote.rawValue) )) {
  419. itemsUsersAndGroups.append(itemOCSharedDto)
  420. }
  421. }
  422. // Manage sharesLink
  423. for itemOCSharedDto in itemsLink {
  424. let fullPath = CCUtility.getHomeServerUrlActiveUrl(activeUrl) + "\(itemOCSharedDto.path!)"
  425. let fileName = NSString(string: fullPath).lastPathComponent
  426. var serverUrl = NSString(string: fullPath).substring(to: (fullPath.characters.count - fileName.characters.count - 1))
  427. if serverUrl.hasSuffix("/") {
  428. serverUrl = NSString(string: serverUrl).substring(to: (serverUrl.characters.count - 1))
  429. }
  430. if itemOCSharedDto.idRemoteShared > 0 {
  431. let sharesLinkReturn = self.addShareLink("\(itemOCSharedDto.idRemoteShared)", fileName: fileName, serverUrl: serverUrl, account: account)
  432. for (key,value) in sharesLinkReturn {
  433. sharesLink.updateValue(value, forKey:key)
  434. }
  435. }
  436. }
  437. // Manage sharesUserAndGroup
  438. var paths = [String:[String]]()
  439. for itemOCSharedDto in itemsUsersAndGroups {
  440. if paths[itemOCSharedDto.path] != nil {
  441. var share : [String] = paths[itemOCSharedDto.path]!
  442. share.append("\(itemOCSharedDto.idRemoteShared)")
  443. paths[itemOCSharedDto.path] = share
  444. } else {
  445. paths[itemOCSharedDto.path] = ["\(itemOCSharedDto.idRemoteShared)"]
  446. }
  447. }
  448. for (path, idsRemoteSharedArray) in paths {
  449. let idsRemoteShared = idsRemoteSharedArray.joined(separator: ",")
  450. print("[LOG] share \(String(describing: idsRemoteShared))")
  451. let fullPath = CCUtility.getHomeServerUrlActiveUrl(activeUrl) + "\(path)"
  452. let fileName = NSString(string: fullPath).lastPathComponent
  453. var serverUrl = NSString(string: fullPath).substring(to: (fullPath.characters.count - fileName.characters.count - 1))
  454. if serverUrl.hasSuffix("/") {
  455. serverUrl = NSString(string: serverUrl).substring(to: (serverUrl.characters.count - 1))
  456. }
  457. let sharesUserAndGroupReturn = self.addShareUserAndGroup(idsRemoteShared, fileName: fileName, serverUrl: serverUrl, account: account)
  458. for (key,value) in sharesUserAndGroupReturn {
  459. sharesUserAndGroup.updateValue(value, forKey:key)
  460. }
  461. }
  462. return [sharesLink, sharesUserAndGroup]
  463. }
  464. func getSharesAccount(_ account: String) -> [Any] {
  465. var sharesLink = [String:String]()
  466. var sharesUserAndGroup = [String:String]()
  467. let realm = try! Realm()
  468. let results = realm.objects(tableShare.self).filter("account = '\(account)'")
  469. for resultShare in results {
  470. if (resultShare.shareLink.characters.count > 0) {
  471. sharesLink = [resultShare.shareLink: "\(resultShare.serverUrl)\(resultShare.fileName)"]
  472. }
  473. if (resultShare.shareUserAndGroup.characters.count > 0) {
  474. sharesUserAndGroup = [resultShare.shareUserAndGroup: "\(resultShare.serverUrl)\(resultShare.fileName)"]
  475. }
  476. }
  477. return [sharesLink, sharesUserAndGroup]
  478. }
  479. //MARK: -
  480. }