Skip to content
Snippets Groups Projects
Commit c66a39b0 authored by Adam Zvada's avatar Adam Zvada
Browse files

finished integrating ticket validation backend

parent f67f1bb4
Branches develop
No related tags found
No related merge requests found
......@@ -13,6 +13,13 @@ import AVFoundation
class QRViewController: UIViewController, StoryboardInit {
//MARK: Properties
var responseView: ResponseView? {
willSet {
if let resView = responseView {
resView.removeFromSuperview()
}
}
}
var captureSession = AVCaptureSession()
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
......@@ -22,8 +29,11 @@ class QRViewController: UIViewController, StoryboardInit {
@IBOutlet weak var qrLabel: UILabel!
//MARK: Life Cycle
let viewModel = EventViewModel()
override func viewDidLoad() {
super.viewDidLoad()
initializeQR()
......@@ -88,6 +98,30 @@ extension QRViewController {
self.navigationController?.navigationBar.tintColor = UIColor(red:0.35, green:0.43, blue:0.52, alpha:1)
}
func showResponseView(isSucces: Bool, ticketName: String) {
let resView = ResponseView.instanceFromNib()
resView.button.addTarget(self, action: #selector(closeResponseView), for: .touchUpInside)
isSucces ? resView.conformResponse(name: ticketName) : resView.notConformResponse()
resView.frame = CGRect(x: 0, y: 0, width: 240, height: 240)
resView.center = CGPoint(x: self.view.frame.width / 2.0, y: self.view.frame.height / 2.0)
resView.layer.cornerRadius = 43
UIView.transition(with: self.view, duration: 0.5, options: [.transitionCrossDissolve], animations: {
//self.opacityView.isHidden = false
//self.view.bringSubview(toFront: self.opacityView)
self.view.addSubview(resView)
}, completion: nil)
self.responseView = resView
}
@objc func closeResponseView() {
UIView.transition(with: self.view, duration: 0.4, options: [.transitionCrossDissolve], animations: {
self.responseView!.removeFromSuperview()
//self.opacityView.isHidden = true
}, completion: nil)
}
}
 
//MARK: - QRViewController (AVCaptureMetadataOutputObjectsDelegate)
......@@ -113,6 +147,11 @@ extension QRViewController: AVCaptureMetadataOutputObjectsDelegate {
return
}
qrLabel.text = qrString
if qrString != qrLabel.text {
qrLabel.text = qrString
viewModel.validateTicket(ticketId: qrString) { (isValid) in
self.showResponseView(isSucces: isValid, ticketName: "")
}
}
}
}
......@@ -29,19 +29,22 @@ class APIService {
}
func resourceURL(_ path: String) -> URL {
let URL = Foundation.URL(string: "http://9b7410ab.ngrok.io")!
let URL = Foundation.URL(string: "https://f2a2c140.ngrok.io")!
let relativeURL = Foundation.URL(string: path, relativeTo: URL)!
return relativeURL
}
func request(_ path: String, method: Alamofire.HTTPMethod = .get, parameters: [String: Any]? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: [String: String] = [:], authHandler: AuthHandler? = nil) -> SignalProducer<Any?, NetworkError> {
func request(_ path: String, method: Alamofire.HTTPMethod = .get, parameters: [String: Any]? = nil, encoding: ParameterEncoding = Alamofire.JSONEncoding.default, headers: [String: String] = [:], authHandler: AuthHandler? = nil) -> SignalProducer<Any?, NetworkError> {
let relativeURL = resourceURL(path)
return self.network.request(relativeURL.absoluteString, method: method, parameters: parameters, encoding: encoding, headers: headers, useDisposables: false)
.flatMapError { [unowned self] networkError in
guard networkError.response?.statusCode == 401,
let authHandler = authHandler,
let originalRequest = networkError.request
else { return SignalProducer(error: networkError) }
else {
return SignalProducer(error: networkError)
}
let retry = { [unowned self] in
self.request(path, method: method, parameters: parameters, encoding: encoding, headers: headers, authHandler: authHandler)
......
......@@ -34,7 +34,7 @@ class Network: Networking {
alamofireManager = Alamofire.SessionManager(configuration: configuration)
}
func request(_ url: String, method: Alamofire.HTTPMethod = .get, parameters: [String: Any]?, encoding: ParameterEncoding = URLEncoding.default, headers: [String: String]?, useDisposables: Bool) -> SignalProducer<Any?, NetworkError> {
func request(_ url: String, method: Alamofire.HTTPMethod = .get, parameters: [String: Any]?, encoding: ParameterEncoding = Alamofire.JSONEncoding.default, headers: [String: String]?, useDisposables: Bool) -> SignalProducer<Any?, NetworkError> {
return SignalProducer { sink, disposable in
let request = self.alamofireManager.request(url, method: method, parameters: parameters, encoding: encoding, headers: headers)
.validate()
......
......@@ -10,29 +10,31 @@ import Foundation
import ReactiveSwift
 
protocol EventAPIServicing {
func validateTicket(eventId: String) -> SignalProducer<Bool, RequestError>
func validateTicket(ticketId: String) -> SignalProducer<Bool, RequestError>
}
 
 
class EventAPIService : APIService, EventAPIServicing {
override func resourceURL(_ path: String) -> URL {
let URL = Foundation.URL(string: "//9b7410ab.ngrok.io")!
let URL = Foundation.URL(string: "https://f2a2c140.ngrok.io")!
let relativeURL = Foundation.URL(string: path, relativeTo: URL)!
return relativeURL
}
func validateTicket(eventId: String) -> SignalProducer<Bool, RequestError> {
return self.request("/validate-ticket", method: .post, parameters: ["token": eventId])
.mapError { .network($0) }
func validateTicket(ticketId: String) -> SignalProducer<Bool, RequestError> {
return self.request("/validate-ticket", method: .post, parameters: ["token": ticketId], headers: ["Content-Type": "application/json"])
.mapError {
.network($0)
}
.map{ (data: Any?) in
var isValide = false
if let value = data as? [String : Any] {
print(value)
if let value = data as? Bool {
isValide = value
}
return isValide
}
}
}
......
......@@ -8,10 +8,23 @@
 
import Foundation
 
class EventViewModel {
let apiEvent = EventAPIService(network: Network(), authHandler: nil)
func validateTicket(ticketId: String, complition: @escaping (Bool) -> Void) {
apiEvent.validateTicket(ticketId: ticketId).startWithResult { (result) in
if case .success(let value) = result {
print(value)
complition(value)
}
if case .failure(let error) = result {
print(error)
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment