Actions.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import Foundation
  2. struct Actions {
  3. static let shared = Actions()
  4. private let tag = "Actions"
  5. private let supportedActions = ["view", "http"]
  6. func parse(_ actions: String?) -> [Action]? {
  7. guard let actions = actions,
  8. let data = actions.data(using: .utf8) else { return nil }
  9. do {
  10. return try JSONDecoder().decode([Action].self, from: data)
  11. .filter { supportedActions.contains($0.action) }
  12. } catch {
  13. Log.e(tag, "Unable to parse actions: \(error.localizedDescription)", error)
  14. return nil
  15. }
  16. }
  17. func encode(_ actions: [Action]?) -> String {
  18. guard let actions = actions else { return "" }
  19. if let actionsData = try? JSONEncoder().encode(actions) {
  20. return String(data: actionsData, encoding: .utf8) ?? ""
  21. }
  22. return ""
  23. }
  24. func http(_ action: Action) {
  25. guard let actionUrl = action.url, let url = URL(string: actionUrl) else {
  26. Log.w(tag, "Unable to execute HTTP action, no or invalid URL", action)
  27. return
  28. }
  29. let method = action.method ?? "POST" // POST is the default!!
  30. let body = action.body ?? ""
  31. Log.d(tag, "Performing HTTP \(method) \(url)")
  32. var request = URLRequest(url: url)
  33. request.httpMethod = method
  34. action.headers?.forEach { key, value in
  35. request.setValue(value, forHTTPHeaderField: key)
  36. }
  37. if !["GET", "HEAD"].contains(method) {
  38. request.httpBody = body.data(using: .utf8)
  39. }
  40. URLSession.shared.dataTask(with: request) { (data, response, error) in
  41. guard error == nil else {
  42. Log.e(self.tag, "Error performing HTTP \(method)", error!)
  43. return
  44. }
  45. Log.d(self.tag, "HTTP \(method) succeeded", response)
  46. }.resume()
  47. }
  48. }