Photo.swift 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. //
  2. // Photo.swift
  3. // MCPlus
  4. //
  5. // Created by seo ha on 07/02/2019.
  6. // Copyright © 2019 KangSH. All rights reserved.
  7. //
  8. import Foundation
  9. class Photo: CustomStringConvertible, Codable {
  10. var user:User?
  11. var file:String?
  12. var date:String?
  13. var key:String?
  14. var isSended:Bool = false
  15. var isChecked:Bool = false
  16. }
  17. extension Photo{
  18. func create(){
  19. let contactDB = SqlClient.shared.DB
  20. // 데이터베이스를 열고 contacts 테이블을 생성한다.
  21. if contactDB.open() {
  22. let sql_stmt = "CREATE TABLE IF NOT EXISTS Photo (ID INTEGER PRIMARY KEY AUTOINCREMENT, userId TEXT, userName TEXT, userAge TEXT, userGender TEXT, fileName TEXT, fileDate TEXT, fileKey TEXT, user TEXT, fileSend INTEGER NOT NULL DEFAULT 0)"
  23. if !contactDB.executeStatements(sql_stmt) {
  24. print("Error \(contactDB.lastErrorMessage())")
  25. }
  26. contactDB.close()
  27. } else {
  28. print("Error \(contactDB.lastErrorMessage())")
  29. }
  30. }
  31. func isSave() -> Bool {
  32. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  33. return false
  34. }
  35. let contactDB = SqlClient.shared.DB
  36. if contactDB.open() {
  37. let querySQL = "SELECT ID FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  38. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  39. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  40. if result?.next() == true{
  41. return true
  42. }
  43. contactDB.close()
  44. } else {
  45. print("Error \(contactDB.lastErrorMessage())")
  46. }
  47. return false
  48. }
  49. func save(){
  50. self.create()
  51. if self.isSave(){
  52. self.update()
  53. }else{
  54. let contactDB = SqlClient.shared.DB
  55. guard let id = self.user?.patientId, let name = self.user?.patientNm, let age = self.user?.age, let gender = self.user?.gender,
  56. let file = self.file, let date = self.date, let key = self.key, let user = self.user else{
  57. return
  58. }
  59. guard let data = try? JSONEncoder().encode(user) else{ return }
  60. guard let userString = String(data: data, encoding: .utf8) else{ return }
  61. if contactDB.open() {
  62. let insertSQL = "INSERT INTO Photo (userId, userName, userAge, userGender, fileName, fileDate, fileKey, user, fileSend) VALUES ('\(id)', '\(name)', '\(age)', '\(gender)', '\(file)', '\(date)', '\(key)', '\(userString)', '\(self.isSended ? 1 : 0)') "
  63. let result = contactDB.executeUpdate(insertSQL, withArgumentsIn: [])
  64. if !result {
  65. print("Error \(contactDB.lastErrorMessage())")
  66. }
  67. contactDB.close()
  68. } else {
  69. print("Error \(contactDB.lastErrorMessage())")
  70. }
  71. }
  72. }
  73. func update(){
  74. self.create()
  75. let contactDB = SqlClient.shared.DB
  76. guard let id = self.user?.patientId, let name = self.user?.patientNm, let age = self.user?.age, let gender = self.user?.gender,
  77. let file = self.file, let date = self.date, let key = self.key else{
  78. return
  79. }
  80. if contactDB.open() {
  81. let insertSQL = "UPDATE Photo SET userName='\(name)', userAge='\(age)', userGender='\(gender)', fileDate='\(date)', fileSend='\(self.isSended ? 1 : 0)' where userId='\(id)' and fileKey='\(key)' and fileName='\(file)'"
  82. let result = contactDB.executeUpdate(insertSQL, withArgumentsIn: [])
  83. if !result {
  84. print("Error \(contactDB.lastErrorMessage())")
  85. }
  86. contactDB.close()
  87. } else {
  88. print("Error \(contactDB.lastErrorMessage())")
  89. }
  90. }
  91. func recovery() -> Bool {
  92. let contactDB = SqlClient.shared.DB
  93. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  94. return false
  95. }
  96. if contactDB.open() {
  97. let querySQL = "SELECT user, fileDate, fileSend FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  98. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  99. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  100. if result?.next() == true{
  101. guard let userString = result?.string(forColumn: "user") else{ return false}
  102. guard let userData = userString.data(using: .utf8) else{ return false}
  103. guard let user = try? JSONDecoder().decode(User.self, from: userData) else{ return false}
  104. self.user = user
  105. self.date = result?.string(forColumn: "fileDate")
  106. if let send = result?.int(forColumn: "fileSend"), send == 1{
  107. self.isSended = true
  108. }else{
  109. self.isSended = false
  110. }
  111. return true
  112. }
  113. contactDB.close()
  114. } else {
  115. print("Error \(contactDB.lastErrorMessage())")
  116. }
  117. return false
  118. }
  119. func delete() -> Bool {
  120. let contactDB = SqlClient.shared.DB
  121. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  122. return false
  123. }
  124. if contactDB.open() {
  125. let querySQL = "DELETE FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  126. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  127. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  128. if result?.next() == true{
  129. return true
  130. }
  131. contactDB.close()
  132. } else {
  133. print("Error \(contactDB.lastErrorMessage())")
  134. }
  135. return false
  136. }
  137. static func list(user:User) -> [(String,[Photo])]{
  138. var returnDic:[(String,[Photo])]
  139. let contactDB = SqlClient.shared.DB
  140. returnDic = [(String,[Photo])]()
  141. guard let id = user.patientId else{
  142. return returnDic
  143. }
  144. if contactDB.open() {
  145. let querySQL = "SELECT userId, fileName, fileKey FROM Photo where userId='\(id)' ORDER BY fileDate ASC"
  146. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  147. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  148. var photos = [Photo]()
  149. while result?.next() == true{
  150. let photo = Photo()
  151. let _user = User()
  152. photo.user = _user
  153. photo.user?.patientId = result?.string(forColumn: "userId")
  154. photo.file = result?.string(forColumn: "fileName")
  155. photo.key = result?.string(forColumn: "fileKey")
  156. if photo.recovery(){
  157. if self.filter(photo, user){
  158. photos.append(photo)
  159. }
  160. }
  161. }
  162. let keys = photos.map({$0.key})
  163. .compactMap({$0})
  164. let _keys = Set(keys).sorted().reversed()
  165. for key in _keys{
  166. print(key)
  167. returnDic.append((key, photos.filter({$0.key == key})))
  168. }
  169. contactDB.close()
  170. } else {
  171. print("Error \(contactDB.lastErrorMessage())")
  172. }
  173. return returnDic
  174. }
  175. static func allList(user:User) -> [(String,[Photo])]{
  176. var returnDic:[(String,[Photo])] = [(String,[Photo])]()
  177. let contactDB = SqlClient.shared.DB
  178. if contactDB.open() {
  179. let querySQL = "SELECT userId, userName, fileName, fileKey FROM Photo ORDER BY userName ASC, fileDate ASC"
  180. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  181. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  182. var photos = [Photo]()
  183. while result?.next() == true{
  184. let photo = Photo()
  185. let _user = User()
  186. photo.user = _user
  187. photo.user?.patientId = result?.string(forColumn: "userId")
  188. photo.user?.patientNm = result?.string(forColumn: "userName")
  189. photo.file = result?.string(forColumn: "fileName") //kunkuk_20190509053257.jpg
  190. photo.key = result?.string(forColumn: "fileKey") // "2019-05-09 신희래 입원, 외과"
  191. if photo.recovery(){
  192. if self.filter(photo, user){
  193. photos.append(photo)
  194. }
  195. }
  196. }
  197. let keys = photos.map({$0.key}).compactMap({$0})
  198. let _keys = Set(keys).sorted()//.reversed()
  199. for key in _keys{
  200. returnDic.append((key, photos.filter({$0.key == key})))
  201. }
  202. let dicCount = returnDic.count
  203. contactDB.close()
  204. } else {
  205. print("Error \(contactDB.lastErrorMessage())")
  206. }
  207. //딕셔너리 sort 문제 잇음
  208. return returnDic
  209. }
  210. static func filter(_ photo:Photo, _ user:User) -> Bool {
  211. if photo.user?.userId != user.userId{
  212. return false
  213. }
  214. return true
  215. }
  216. }