CloudFileViewModel.swift 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. //
  2. // CloudFileViewModel.swift
  3. // O2Platform
  4. //
  5. // Created by FancyLou on 2019/10/16.
  6. // Copyright © 2019 zoneland. All rights reserved.
  7. //
  8. import Moya
  9. import Promises
  10. import CocoaLumberjack
  11. import O2OA_Auth_SDK
  12. protocol CloudFileCheckDelegate {
  13. func checkItem(_ item: DataModel)
  14. }
  15. protocol CloudFileCheckClickDelegate {
  16. func clickFolder(_ folder: OOFolder)
  17. func clickFile(_ file: OOAttachment)
  18. }
  19. class CloudFileViewModel: NSObject {
  20. override init() {
  21. super.init()
  22. }
  23. private let cFileAPI = OOMoyaProvider<OOCloudStorageAPI>()
  24. //获取图片地址 根据传入的大小进行比例缩放
  25. func scaleImageUrl(id: String) -> String {
  26. let model = O2AuthSDK.shared.o2APIServer(context: .x_file_assemble_control)
  27. let baseURLString = "\(model?.httpProtocol ?? "http")://\(model?.host ?? ""):\(model?.port ?? 0)\(model?.context ?? "")"
  28. //固定200px
  29. let width = 200
  30. let height = 200
  31. return baseURLString + "/jaxrs/attachment2/\(id)/download/image/width/\(width)/height/\(height)"
  32. }
  33. //获取图片地址 原图
  34. func originImageUrl(id: String) -> String {
  35. let model = O2AuthSDK.shared.o2APIServer(context: .x_file_assemble_control)
  36. let baseURLString = "\(model?.httpProtocol ?? "http")://\(model?.host ?? ""):\(model?.port ?? 0)\(model?.context ?? "")"
  37. return baseURLString + "/jaxrs/attachment2/\(id)/download"
  38. }
  39. //分页查询分类列表
  40. func listTypeByPage(type: CloudFileType, page: Int, count:Int) -> Promise<[OOAttachment]> {
  41. return Promise { fulfill, reject in
  42. var typeString: String
  43. switch type {
  44. case .image:
  45. typeString = "image"
  46. break
  47. case .office:
  48. typeString = "office"
  49. break
  50. case .movie:
  51. typeString = "movie"
  52. break
  53. case .music:
  54. typeString = "music"
  55. break
  56. case .other:
  57. typeString = "other"
  58. break
  59. }
  60. self.cFileAPI.request(.listTypeByPage(typeString, page, count), completion: { (result) in
  61. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  62. if response.isResultSuccess() {
  63. if let list = response.model?.data {
  64. fulfill(list)
  65. }else {
  66. fulfill([])
  67. }
  68. }else {
  69. reject(response.error!)
  70. }
  71. })
  72. }
  73. }
  74. //移动操作
  75. func moveToFolder(folderList: [OOFolder], fileList: [OOAttachment], destFolder: OOFolder) -> Promise<Bool> {
  76. return Promise { fulfill, reject in
  77. var fileMove : [Promise<Bool>] = []
  78. folderList.forEach({ (folder) in
  79. folder.superior = destFolder.id!
  80. fileMove.append(self.updateFolder(folder: folder))
  81. })
  82. fileList.forEach({ (file) in
  83. file.folder = destFolder.id!
  84. fileMove.append(self.updateFile(file: file))
  85. })
  86. all(fileMove).then({ (results) in
  87. results.forEach({ (r) in
  88. DDLogDebug("移动成功, \(r)")
  89. })
  90. fulfill(true)
  91. }).catch({ (error) in
  92. reject(error)
  93. })
  94. }
  95. }
  96. //分享操作
  97. func share(folderList: [OOFolder], fileList: [OOAttachment], users: [O2PersonPickerItem], orgs: [O2UnitPickerItem]) -> Promise<Bool> {
  98. return Promise { fulfill, reject in
  99. var fileShare : [Promise<Bool>] = []
  100. var userIds: [String] = []
  101. var orgIds: [String] = []
  102. users.forEach({ (person) in
  103. userIds.append(person.distinguishedName!)
  104. })
  105. orgs.forEach({ (unit) in
  106. orgIds.append(unit.distinguishedName!)
  107. })
  108. folderList.forEach({ (folder) in
  109. fileShare.append(self.share(id: folder.id!, users: userIds, orgs: orgIds))
  110. })
  111. fileList.forEach({ (file) in
  112. fileShare.append(self.share(id: file.id!, users: userIds, orgs: orgIds))
  113. })
  114. all(fileShare).then({ (results) in
  115. results.forEach({ (r) in
  116. DDLogDebug("分享成功, \(r)")
  117. })
  118. fulfill(true)
  119. }).catch({ (error) in
  120. reject(error)
  121. })
  122. }
  123. }
  124. //删除我分享的
  125. func deleteShareList(shareList: [String]) -> Promise<Bool> {
  126. return Promise { fulfill, reject in
  127. var fileShare : [Promise<Bool>] = []
  128. shareList.forEach { (id) in
  129. fileShare.append(self.deleteShare(shareId: id))
  130. }
  131. all(fileShare).then { (results) in
  132. results.forEach({ (r) in
  133. DDLogDebug("删除分享, \(r)")
  134. })
  135. fulfill(true)
  136. }.catch { (err) in
  137. reject(err)
  138. }
  139. }
  140. }
  141. //屏蔽给我的分享
  142. func shieldShareList(shareList: [String]) -> Promise<Bool> {
  143. return Promise { fulfill, reject in
  144. var fileShare : [Promise<Bool>] = []
  145. shareList.forEach { (id) in
  146. fileShare.append(self.shieldShare(shareId: id))
  147. }
  148. all(fileShare).then { (results) in
  149. results.forEach({ (r) in
  150. DDLogDebug("屏蔽分享, \(r)")
  151. })
  152. fulfill(true)
  153. }.catch { (err) in
  154. reject(err)
  155. }
  156. }
  157. }
  158. //删除选中的数据 包含文件夹和文件
  159. func deleteCheckedList(folderList: [OOFolder], fileList: [OOAttachment]) -> Promise<Bool> {
  160. return Promise { fulfill, reject in
  161. var fileDelete : [Promise<Bool>] = []
  162. folderList.forEach({ (folder) in
  163. fileDelete.append(self.deleteFolder(id: folder.id!))
  164. })
  165. fileList.forEach({ (file) in
  166. fileDelete.append(self.deleteFile(id: file.id!))
  167. })
  168. all(fileDelete).then({ (results) in
  169. results.forEach({ (r) in
  170. DDLogDebug("删除成功, \(r)")
  171. })
  172. fulfill(true)
  173. }).catch({ (error) in
  174. reject(error)
  175. })
  176. }
  177. }
  178. //重命名文件夹
  179. func updateFolder(folder: OOFolder) -> Promise<Bool> {
  180. return Promise { fulfill, reject in
  181. self.cFileAPI.request(.updateFolder(folder.id!, folder), completion: { (result) in
  182. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  183. if response.isResultSuccess() {
  184. if let id = response.model?.data {
  185. DDLogDebug("重命名文件夹成功:\(id)")
  186. }
  187. fulfill(true)
  188. }else {
  189. reject(response.error!)
  190. }
  191. })
  192. }
  193. }
  194. //重命名文件
  195. func updateFile(file: OOAttachment) -> Promise<Bool> {
  196. return Promise { fulfill, reject in
  197. self.cFileAPI.request(.updateFile(file.id!, file), completion: { (result) in
  198. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  199. if response.isResultSuccess() {
  200. if let id = response.model?.data {
  201. DDLogDebug("重命名文件成功:\(id)")
  202. }
  203. fulfill(true)
  204. }else {
  205. reject(response.error!)
  206. }
  207. })
  208. }
  209. }
  210. //获取分享给我的文件列表 包含文件夹和文件
  211. func loadShareToMeList(folderParentId: String, shareId: String) -> Promise<[DataModel]> {
  212. return Promise{ fulfill, reject in
  213. all(self.shareToMeFolderList(folderId: folderParentId, shareId: shareId), self.shareToMeFileList(folderId: folderParentId, shareId: shareId))
  214. .then { (result) in
  215. var dataList: [DataModel] = []
  216. let folderList = result.0
  217. for folder in folderList {
  218. dataList.append(folder)
  219. }
  220. let fileList = result.1
  221. for file in fileList {
  222. dataList.append(file)
  223. }
  224. fulfill(dataList)
  225. }.catch { (error) in
  226. DDLogError(error.localizedDescription)
  227. reject(error)
  228. }
  229. }
  230. }
  231. func loadMyShareList(folderParentId: String, shareId: String) -> Promise<[DataModel]> {
  232. return Promise{ fulfill, reject in
  233. all(self.myShareFolderList(folderId: folderParentId, shareId: shareId), self.myShareFileList(folderId: folderParentId, shareId: shareId))
  234. .then { (result) in
  235. var dataList: [DataModel] = []
  236. let folderList = result.0
  237. for folder in folderList {
  238. dataList.append(folder)
  239. }
  240. let fileList = result.1
  241. for file in fileList {
  242. dataList.append(file)
  243. }
  244. fulfill(dataList)
  245. }.catch { (error) in
  246. DDLogError(error.localizedDescription)
  247. reject(error)
  248. }
  249. }
  250. }
  251. //获取列表 包含文件夹和文件
  252. func loadCloudFileList(folderParentId: String) -> Promise<[DataModel]> {
  253. return Promise{ fulfill, reject in
  254. all(self.folderList(folderId: folderParentId), self.fileList(folderId: folderParentId))
  255. .then { (result) in
  256. var dataList: [DataModel] = []
  257. let folderList = result.0
  258. DDLogInfo("文件夹:\(folderList.count)")
  259. for folder in folderList {
  260. dataList.append(folder)
  261. }
  262. let fileList = result.1
  263. DDLogInfo("文件:\(fileList.count)")
  264. for file in fileList {
  265. dataList.append(file)
  266. }
  267. fulfill(dataList)
  268. }.catch { (error) in
  269. DDLogError(error.localizedDescription)
  270. reject(error)
  271. }
  272. }
  273. }
  274. //文件列表
  275. func fileList(folderId: String) -> Promise<[OOAttachment]> {
  276. if folderId.isBlank {
  277. return Promise { fulfill, reject in
  278. self.cFileAPI.request(.listTop, completion: { (result) in
  279. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  280. if response.isResultSuccess() {
  281. if let data = response.model?.data {
  282. fulfill(data)
  283. } else {
  284. reject(OOAppError.apiEmptyResultError)
  285. }
  286. }else {
  287. reject(result.error!)
  288. }
  289. })
  290. }
  291. }else {
  292. return Promise { fulfill, reject in
  293. self.cFileAPI.request(.listByFolder(folderId), completion: { (result) in
  294. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  295. if response.isResultSuccess() {
  296. if let data = response.model?.data {
  297. fulfill(data)
  298. } else {
  299. reject(OOAppError.apiEmptyResultError)
  300. }
  301. }else {
  302. reject(response.error!)
  303. }
  304. })
  305. }
  306. }
  307. }
  308. //文件夹列表
  309. func folderList(folderId: String) -> Promise<[OOFolder]> {
  310. if folderId.isBlank {
  311. return Promise { fulfill, reject in
  312. self.cFileAPI.request(.listFolderTop, completion: { (result) in
  313. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  314. if response.isResultSuccess() {
  315. if let data = response.model?.data {
  316. fulfill(data)
  317. } else {
  318. reject(OOAppError.apiEmptyResultError)
  319. }
  320. }else {
  321. reject(response.error!)
  322. }
  323. })
  324. }
  325. } else {
  326. return Promise { fulfill, reject in
  327. self.cFileAPI.request(.listFolderByFolder(folderId), completion: { (result) in
  328. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  329. if response.isResultSuccess() {
  330. if let data = response.model?.data {
  331. fulfill(data)
  332. } else {
  333. reject(OOAppError.apiEmptyResultError)
  334. }
  335. }else {
  336. reject(response.error!)
  337. }
  338. })
  339. }
  340. }
  341. }
  342. //创建文件夹
  343. func createFolder(name: String, superior: String = "") -> Promise<String> {
  344. return Promise { fulfill, reject in
  345. self.cFileAPI.request(.createFolder(name, superior), completion: { (result) in
  346. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  347. if response.isResultSuccess() {
  348. if let id = response.model?.data {
  349. fulfill(id.id ?? "")
  350. }else {
  351. fulfill("")
  352. }
  353. }else {
  354. reject(response.error!)
  355. }
  356. })
  357. }
  358. }
  359. //上传文件
  360. func uploadFile(folderId: String, fileName: String, file: Data) -> Promise<String> {
  361. return Promise { fulfill, reject in
  362. self.cFileAPI.request(.uploadFile(folderId, fileName, file), completion: { (result) in
  363. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  364. if response.isResultSuccess() {
  365. if let id = response.model?.data {
  366. fulfill(id.id ?? "")
  367. }else {
  368. fulfill("")
  369. }
  370. }else {
  371. reject(response.error!)
  372. }
  373. })
  374. }
  375. }
  376. // MARK: - private func
  377. //分享给我的文件夹列表
  378. private func shareToMeFolderList(folderId: String, shareId: String ) -> Promise<[OOFolder]> {
  379. if folderId.isBlank {
  380. return self.shareToMeTopFolderList()
  381. } else {
  382. return Promise { fulfill, reject in
  383. self.cFileAPI.request(.shareFolderListWithFolderId(shareId, folderId), completion: { (result) in
  384. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  385. if response.isResultSuccess() {
  386. if let data = response.model?.data {
  387. fulfill(data)
  388. } else {
  389. reject(OOAppError.apiEmptyResultError)
  390. }
  391. }else {
  392. reject(response.error!)
  393. }
  394. })
  395. }
  396. }
  397. }
  398. //分享给我的顶层文件夹列表
  399. private func shareToMeTopFolderList() -> Promise<[OOFolder]> {
  400. return Promise { fulfill, reject in
  401. self.cFileAPI.request(.shareToMe("folder"), completion: { (result) in
  402. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  403. if response.isResultSuccess() {
  404. if let data = response.model?.data {
  405. fulfill(data)
  406. } else {
  407. reject(OOAppError.apiEmptyResultError)
  408. }
  409. }else {
  410. reject(response.error!)
  411. }
  412. })
  413. }
  414. }
  415. //分享给我的文件列表
  416. func shareToMeFileList(folderId: String, shareId: String ) -> Promise<[OOAttachment]> {
  417. if folderId.isBlank {
  418. return self.shareToMeTopFileList()
  419. }else {
  420. return Promise { fulfill, reject in
  421. self.cFileAPI.request(.shareFileListWithFolderId(shareId, folderId), completion: { (result) in
  422. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  423. if response.isResultSuccess() {
  424. if let data = response.model?.data {
  425. fulfill(data)
  426. } else {
  427. reject(OOAppError.apiEmptyResultError)
  428. }
  429. }else {
  430. reject(response.error!)
  431. }
  432. })
  433. }
  434. }
  435. }
  436. //分享给我的顶层文件列表
  437. private func shareToMeTopFileList() -> Promise<[OOAttachment]> {
  438. return Promise { fulfill, reject in
  439. self.cFileAPI.request(.shareToMe("attachment"), completion: { (result) in
  440. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  441. if response.isResultSuccess() {
  442. if let data = response.model?.data {
  443. fulfill(data)
  444. } else {
  445. reject(OOAppError.apiEmptyResultError)
  446. }
  447. }else {
  448. reject(response.error!)
  449. }
  450. })
  451. }
  452. }
  453. //我分享的顶层文件夹列表
  454. private func myShareFolderList(folderId: String, shareId: String) -> Promise<[OOFolder]> {
  455. if folderId.isBlank {
  456. return self.myShareTopFolderList()
  457. } else {
  458. return Promise { fulfill, reject in
  459. self.cFileAPI.request(.shareFolderListWithFolderId(shareId, folderId), completion: { (result) in
  460. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  461. if response.isResultSuccess() {
  462. if let data = response.model?.data {
  463. fulfill(data)
  464. } else {
  465. reject(OOAppError.apiEmptyResultError)
  466. }
  467. }else {
  468. reject(response.error!)
  469. }
  470. })
  471. }
  472. }
  473. }
  474. //我分享的顶层文件夹列表
  475. private func myShareTopFolderList() -> Promise<[OOFolder]> {
  476. return Promise { fulfill, reject in
  477. self.cFileAPI.request(.myShareList("folder"), completion: { (result) in
  478. let response = OOResult<BaseModelClass<[OOFolder]>>(result)
  479. if response.isResultSuccess() {
  480. if let data = response.model?.data {
  481. fulfill(data)
  482. } else {
  483. reject(OOAppError.apiEmptyResultError)
  484. }
  485. }else {
  486. reject(response.error!)
  487. }
  488. })
  489. }
  490. }
  491. //分享给我的文件列表
  492. func myShareFileList(folderId: String, shareId: String) -> Promise<[OOAttachment]> {
  493. if folderId.isBlank {
  494. return self.myShareTopFileList()
  495. }else {
  496. return Promise { fulfill, reject in
  497. self.cFileAPI.request(.shareFileListWithFolderId(shareId, folderId), completion: { (result) in
  498. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  499. if response.isResultSuccess() {
  500. if let data = response.model?.data {
  501. fulfill(data)
  502. } else {
  503. reject(OOAppError.apiEmptyResultError)
  504. }
  505. }else {
  506. reject(response.error!)
  507. }
  508. })
  509. }
  510. }
  511. }
  512. //我分享的顶层文件列表
  513. private func myShareTopFileList() -> Promise<[OOAttachment]> {
  514. return Promise { fulfill, reject in
  515. self.cFileAPI.request(.myShareList("attachment"), completion: { (result) in
  516. let response = OOResult<BaseModelClass<[OOAttachment]>>(result)
  517. if response.isResultSuccess() {
  518. if let data = response.model?.data {
  519. fulfill(data)
  520. } else {
  521. reject(OOAppError.apiEmptyResultError)
  522. }
  523. }else {
  524. reject(response.error!)
  525. }
  526. })
  527. }
  528. }
  529. //删除文件
  530. private func deleteFile(id: String) -> Promise<Bool> {
  531. return Promise { fulfill, reject in
  532. self.cFileAPI.request(.deleteFile(id), completion: { (result) in
  533. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  534. if response.isResultSuccess() {
  535. if let id = response.model?.data {
  536. DDLogDebug("删除文件成功:\(id)")
  537. }
  538. fulfill(true)
  539. }else {
  540. reject(response.error!)
  541. }
  542. })
  543. }
  544. }
  545. //删除文件夹
  546. private func deleteFolder(id: String) -> Promise<Bool> {
  547. return Promise { fulfill, reject in
  548. self.cFileAPI.request(.deleteFolder(id), completion: { (result) in
  549. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  550. if response.isResultSuccess() {
  551. if let id = response.model?.data {
  552. DDLogDebug("删除文件夹成功:\(id)")
  553. }
  554. fulfill(true)
  555. }else {
  556. reject(response.error!)
  557. }
  558. })
  559. }
  560. }
  561. //分享
  562. private func share(id: String, users: [String], orgs: [String]) -> Promise<Bool> {
  563. return Promise { fulfill, reject in
  564. let form = OOShareForm()
  565. form.fileId = id
  566. form.shareType = "member"
  567. form.shareUserList = users
  568. form.shareOrgList = orgs
  569. self.cFileAPI.request(.share(form), completion: { (result) in
  570. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  571. if response.isResultSuccess() {
  572. if let id = response.model?.data {
  573. DDLogDebug("分享成功:\(id)")
  574. }
  575. fulfill(true)
  576. }else {
  577. reject(response.error!)
  578. }
  579. })
  580. }
  581. }
  582. //删除分享
  583. private func deleteShare(shareId: String) -> Promise<Bool> {
  584. return Promise { fulfill, reject in
  585. self.cFileAPI.request(.deleteMyShare(shareId), completion: { result in
  586. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  587. if response.isResultSuccess() {
  588. if let id = response.model?.data {
  589. DDLogDebug("删除分享成功:\(id)")
  590. }
  591. fulfill(true)
  592. }else {
  593. reject(response.error!)
  594. }
  595. })
  596. }
  597. }
  598. //屏蔽分享给我的文件
  599. private func shieldShare(shareId: String) -> Promise<Bool> {
  600. return Promise { fulfill, reject in
  601. self.cFileAPI.request(.shieldShare(shareId), completion: { result in
  602. let response = OOResult<BaseModelClass<OOCommonIdModel>>(result)
  603. if response.isResultSuccess() {
  604. if let id = response.model?.data {
  605. DDLogDebug("屏蔽分享给我的文件:\(id)")
  606. }
  607. fulfill(true)
  608. }else {
  609. reject(response.error!)
  610. }
  611. })
  612. }
  613. }
  614. }