Photo.swift 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. }
  16. extension Photo{
  17. func create(){
  18. let contactDB = SqlClient.shared.DB
  19. // 데이터베이스를 열고 contacts 테이블을 생성한다.
  20. if contactDB.open() {
  21. 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)"
  22. if !contactDB.executeStatements(sql_stmt) {
  23. print("Error \(contactDB.lastErrorMessage())")
  24. }
  25. contactDB.close()
  26. } else {
  27. print("Error \(contactDB.lastErrorMessage())")
  28. }
  29. }
  30. func isSave() -> Bool {
  31. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  32. return false
  33. }
  34. let contactDB = SqlClient.shared.DB
  35. if contactDB.open() {
  36. let querySQL = "SELECT ID FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  37. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  38. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  39. if result?.next() == true{
  40. return true
  41. }
  42. contactDB.close()
  43. } else {
  44. print("Error \(contactDB.lastErrorMessage())")
  45. }
  46. return false
  47. }
  48. func save(){
  49. self.create()
  50. if self.isSave(){
  51. self.update()
  52. }else{
  53. let contactDB = SqlClient.shared.DB
  54. guard let id = self.user?.patientId, let name = self.user?.patientNm, let age = self.user?.age, let gender = self.user?.gender,
  55. let file = self.file, let date = self.date, let key = self.key, let user = self.user else{
  56. return
  57. }
  58. guard let data = try? JSONEncoder().encode(user) else{ return }
  59. guard let userString = String(data: data, encoding: .utf8) else{ return }
  60. if contactDB.open() {
  61. 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)') "
  62. let result = contactDB.executeUpdate(insertSQL, withArgumentsIn: [])
  63. if !result {
  64. print("Error \(contactDB.lastErrorMessage())")
  65. }
  66. contactDB.close()
  67. } else {
  68. print("Error \(contactDB.lastErrorMessage())")
  69. }
  70. }
  71. }
  72. func update(){
  73. self.create()
  74. let contactDB = SqlClient.shared.DB
  75. guard let id = self.user?.patientId, let name = self.user?.patientNm, let age = self.user?.age, let gender = self.user?.gender,
  76. let file = self.file, let date = self.date, let key = self.key else{
  77. return
  78. }
  79. if contactDB.open() {
  80. 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)'"
  81. let result = contactDB.executeUpdate(insertSQL, withArgumentsIn: [])
  82. if !result {
  83. print("Error \(contactDB.lastErrorMessage())")
  84. }
  85. contactDB.close()
  86. } else {
  87. print("Error \(contactDB.lastErrorMessage())")
  88. }
  89. }
  90. func recovery() -> Bool {
  91. let contactDB = SqlClient.shared.DB
  92. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  93. return false
  94. }
  95. if contactDB.open() {
  96. let querySQL = "SELECT user, fileDate, fileSend FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  97. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  98. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  99. if result?.next() == true{
  100. guard let userString = result?.string(forColumn: "user") else{ return false}
  101. guard let userData = userString.data(using: .utf8) else{ return false}
  102. guard let user = try? JSONDecoder().decode(User.self, from: userData) else{ return false}
  103. self.user = user
  104. self.date = result?.string(forColumn: "fileDate")
  105. if let send = result?.int(forColumn: "fileSend"), send == 1{
  106. self.isSended = true
  107. }else{
  108. self.isSended = false
  109. }
  110. return true
  111. }
  112. contactDB.close()
  113. } else {
  114. print("Error \(contactDB.lastErrorMessage())")
  115. }
  116. return false
  117. }
  118. func delete() -> Bool {
  119. let contactDB = SqlClient.shared.DB
  120. guard let id = self.user?.patientId, let key = self.key, let file = self.file else {
  121. return false
  122. }
  123. if contactDB.open() {
  124. let querySQL = "DELETE FROM Photo where userId='\(id)' and fileKey='\(key)' and fileName='\(file)' "
  125. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  126. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  127. if result?.next() == true{
  128. return true
  129. }
  130. contactDB.close()
  131. } else {
  132. print("Error \(contactDB.lastErrorMessage())")
  133. }
  134. return false
  135. }
  136. static func list(user:User) -> [String:[Photo]]{
  137. var returnDic:[String:[Photo]]
  138. let contactDB = SqlClient.shared.DB
  139. returnDic = [String:[Photo]]()
  140. guard let id = user.patientId else{
  141. return returnDic
  142. }
  143. if contactDB.open() {
  144. let querySQL = "SELECT userId, fileName, fileKey FROM Photo where userId='\(id)' ORDER BY fileDate ASC"
  145. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  146. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  147. var photos = [Photo]()
  148. while result?.next() == true{
  149. let photo = Photo()
  150. let user = User()
  151. photo.user = user
  152. photo.user?.patientId = result?.string(forColumn: "userId")
  153. photo.file = result?.string(forColumn: "fileName")
  154. photo.key = result?.string(forColumn: "fileKey")
  155. if photo.recovery(){
  156. if self.filter(photo, user){
  157. photos.append(photo)
  158. }
  159. }
  160. }
  161. let keys = photos.map({$0.key}).compactMap({$0}).reversed()
  162. for key in keys{
  163. returnDic[key] = photos.filter({$0.key == key})
  164. }
  165. contactDB.close()
  166. } else {
  167. print("Error \(contactDB.lastErrorMessage())")
  168. }
  169. return returnDic
  170. }
  171. static func allList(user:User) -> [String:[Photo]]{
  172. var returnDic:[String:[Photo]]
  173. let contactDB = SqlClient.shared.DB
  174. returnDic = [String:[Photo]]()
  175. if contactDB.open() {
  176. let querySQL = "SELECT userId, fileName, fileKey FROM Photo ORDER BY fileDate ASC"
  177. let result: FMResultSet? = contactDB.executeQuery(querySQL, withArgumentsIn: [])
  178. // next 메서드는 일치하는 레코드가 적어도 하나 이상인지 확인하기 위함
  179. var photos = [Photo]()
  180. while result?.next() == true{
  181. let photo = Photo()
  182. let user = User()
  183. photo.user = user
  184. photo.user?.patientId = result?.string(forColumn: "userId")
  185. photo.file = result?.string(forColumn: "fileName")
  186. photo.key = result?.string(forColumn: "fileKey")
  187. if photo.recovery(){
  188. if self.filter(photo, user){
  189. photos.append(photo)
  190. }
  191. }
  192. }
  193. let keys = photos.map({$0.key}).compactMap({$0}).reversed()
  194. for key in keys{
  195. returnDic[key] = photos.filter({$0.key == key})
  196. }
  197. contactDB.close()
  198. } else {
  199. print("Error \(contactDB.lastErrorMessage())")
  200. }
  201. return returnDic
  202. }
  203. static func filter(_ photo:Photo, _ user:User) -> Bool {
  204. if photo.user?.userId != user.userId{
  205. return false
  206. }
  207. return true
  208. }
  209. }