mirror of
https://bitbucket.org/vendoo/vendoo_v1.0.git
synced 2025-12-25 11:47:40 +00:00
234 lines
13 KiB
Swift
234 lines
13 KiB
Swift
//
|
|
// ServiceNotificationManager.swift
|
|
// Vendoo
|
|
//
|
|
// Created by Okechi Onyeje on 8/30/16.
|
|
// Copyright © 2016 Okechi Onyeje. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
protocol ServiceNotificationManagerDelegate {
|
|
func listingHasEnded(fbInfo: AnyObject?, ebayInfo: AnyObject?, amazonInfo: AnyObject?, etsyInfo: AnyObject?)
|
|
func listingHasNewNotifications(fbInfo: AnyObject?, ebayInfo: AnyObject?, amazonInfo: AnyObject?, etsyInfo: AnyObject?)
|
|
func listingHasFinishedRetrievingNotifications()
|
|
func listingHasStartedRetrievingNotifications()
|
|
|
|
}
|
|
|
|
class ServiceNotificationManager: NSObject {
|
|
|
|
var etsyManager: EtsyRESTAPIManager!
|
|
var fbGraphManager: FacebookGraphAPIManager!
|
|
var firebaseManager: FirebaseManager!
|
|
var ebayGraphManager: EbayWebServiceManager!
|
|
var userListings: [Listing] = []
|
|
var timer: NSTimer!
|
|
static var delegate: ServiceNotificationManagerDelegate?
|
|
|
|
override init() {
|
|
super.init()
|
|
|
|
|
|
}
|
|
|
|
func startServicePolling() {
|
|
//timer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: #selector(ServiceNotificationManager.pollServices), userInfo: nil, repeats: true)
|
|
pollServices()
|
|
}
|
|
|
|
func stopServicePolling() {
|
|
timer.invalidate()
|
|
}
|
|
|
|
func setManagers(fbManager: FacebookGraphAPIManager, fireManager: FirebaseManager, ebayManager: EbayWebServiceManager, etsyManager: EtsyRESTAPIManager){
|
|
self.fbGraphManager = fbManager
|
|
self.firebaseManager = fireManager
|
|
self.ebayGraphManager = ebayManager
|
|
self.etsyManager = etsyManager
|
|
}
|
|
|
|
func setListings(listings: [Listing]) {
|
|
self.userListings = listings
|
|
}
|
|
|
|
func pollServices(){
|
|
let notificationGroup = dispatch_group_create()
|
|
for listing in userListings {
|
|
|
|
self.firebaseManager.ref.child("Users/\(self.firebaseManager.user_email)/user_Listings/\(listing.key)").observeSingleEventOfType( .Value, withBlock: {
|
|
(snapshot) -> Void in
|
|
//dispatch_group_enter(notificationGroup)
|
|
|
|
let listingDict = snapshot.value as? [String : AnyObject]
|
|
|
|
if !(listingDict!["isListingDraft"] as! Bool) {
|
|
if let networksDict = listingDict!["networkIDs"] as? [String : AnyObject] {
|
|
let ebayID = (networksDict["ebay"] as? String)
|
|
let facebookID = (networksDict["facebook"] as? String)
|
|
let etsyID = (networksDict["etsy"] as? Int)
|
|
let amazonID = (networksDict["amazon"] as? String)
|
|
|
|
//@TODO: Skeleton for Notfications Manager is set up. Need to implement listing request for each listing to retrieve relevant notifications for user such as if listing has ended
|
|
if(ebayID != nil){
|
|
if self.ebayGraphManager.isAuthorized {
|
|
self.ebayGraphManager.isGettingNotification = true
|
|
self.ebayGraphManager.getListingInfo(ebayID!, onComplete: {
|
|
(listingNotificationInfo, error) -> Void in
|
|
//dispatch_group_leave(notificationGroup)
|
|
let info = (listingNotificationInfo as! [String : AnyObject])
|
|
if(info["status"] as! String == "Ended") {
|
|
if((info["quantitySold"] as! Int) > 0) {
|
|
//@TODO: Add both firbase logic and code logic to do notifications for sold listings
|
|
if (((info["itemQuantity"] as! Int) - (info["quantitySold"] as! Int)) == 0) {
|
|
|
|
ServiceNotificationManager.delegate?.listingHasNewNotifications(
|
|
nil,
|
|
ebayInfo: [
|
|
"type": "Sold",
|
|
"notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has sold out on ebay.",
|
|
"listingKey": listing.key],
|
|
amazonInfo: nil,
|
|
etsyInfo: nil
|
|
)
|
|
}
|
|
}else{
|
|
ServiceNotificationManager.delegate?.listingHasEnded(
|
|
nil,
|
|
ebayInfo: [
|
|
"type": "Ended",
|
|
"notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has ended on ebay.",
|
|
"listingKey": listing.key],
|
|
amazonInfo: nil,
|
|
etsyInfo: nil
|
|
)
|
|
}
|
|
|
|
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
if(facebookID != nil){
|
|
if(self.fbGraphManager.isAuthorized) {
|
|
self.fbGraphManager.getListingInfo ("/\(facebookID!)/comments", onCompletion: {
|
|
(listingNotificationInfo, error) -> Void in
|
|
|
|
dispatch_async(dispatch_get_main_queue(), {
|
|
self.firebaseManager.ref.child("Users/\(self.firebaseManager.user_email)").observeEventType(.Value, withBlock: {
|
|
(snapshot) -> Void in
|
|
|
|
let notifications = ((snapshot.value as? [String : AnyObject])!["notifications"]) as? [String : AnyObject]
|
|
|
|
|
|
for commentInfo in (listingNotificationInfo as! [[String: AnyObject]]) {
|
|
let fromInfo = commentInfo["from"] as! [String : AnyObject]
|
|
if notifications != nil {
|
|
if notifications![(commentInfo["id"] as! String)] == nil {
|
|
let commentDict = [
|
|
"UUID":(commentInfo["id"] as! String),
|
|
"commentMessage":(commentInfo["message"] as! String),
|
|
"network":"facebook",
|
|
"notification": "Your item \"\(listingDict!["listingTitle"] as! String)\" has a new comment.",
|
|
"key": listing.key,
|
|
"seen":false,
|
|
"senderID":(fromInfo["id"]! as! String),
|
|
"senderName":(fromInfo["name"]! as! String),
|
|
"type":"FBComment"
|
|
]
|
|
ServiceNotificationManager.delegate?.listingHasNewNotifications(commentDict, ebayInfo: nil, amazonInfo: nil, etsyInfo: nil)
|
|
}
|
|
|
|
}else{
|
|
let commentDict = [
|
|
"UUID":(commentInfo["id"] as! String),
|
|
"commentMessage":(commentInfo["message"] as! String),
|
|
"network":"facebook",
|
|
"notification": "Your item \"\(listingDict!["listingTitle"] as! String)\" has a new comment.",
|
|
"key": listing.key,
|
|
"seen":false,
|
|
"senderID":(fromInfo["id"]! as! String),
|
|
"senderName":(fromInfo["name"]! as! String),
|
|
"type":"FBComment"
|
|
]
|
|
ServiceNotificationManager.delegate?.listingHasNewNotifications(commentDict, ebayInfo: nil, amazonInfo: nil, etsyInfo: nil)
|
|
}
|
|
|
|
}
|
|
|
|
|
|
})
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
}
|
|
if(etsyID != nil){
|
|
if (self.etsyManager.isAuthorized) {
|
|
self.etsyManager.getListingInfo ("/listings/\(etsyID!)", onCompletion: {
|
|
(listingNotificationInfo, error) -> Void in
|
|
|
|
let info = (listingNotificationInfo as! [String : AnyObject])
|
|
|
|
//@TODO: Test this code with the draft condition for both expired and sold_out
|
|
if ((info["status"] as! String == "expired") || (info["status"] as! String == "removed")) {
|
|
|
|
ServiceNotificationManager.delegate?.listingHasEnded(
|
|
nil,
|
|
ebayInfo: nil,
|
|
amazonInfo: nil,
|
|
etsyInfo: [
|
|
"type": "Ended",
|
|
"notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has ended on etsy.",
|
|
"listingKey": listing.key]
|
|
)
|
|
|
|
|
|
}else if info["status"] as! String == "sold_out" {
|
|
|
|
ServiceNotificationManager.delegate?.listingHasNewNotifications(
|
|
nil,
|
|
ebayInfo: nil,
|
|
amazonInfo: nil,
|
|
etsyInfo: [
|
|
"type": "Sold",
|
|
"notification": "Your listing \"\(listingDict!["listingTitle"] as! String)\" has sold out on etsy.",
|
|
"listingKey": listing.key]
|
|
)
|
|
|
|
} else if info["status"] as! String == "draft" {
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
}
|
|
if(amazonID != nil){
|
|
|
|
}
|
|
//dispatch_group_leave(notificationGroup)
|
|
}else {
|
|
// dispatch_group_leave(notificationGroup)
|
|
}
|
|
|
|
|
|
}else {
|
|
//dispatch_group_leave(notificationGroup)
|
|
}
|
|
})
|
|
}
|
|
self.ebayGraphManager.isGettingNotification = false
|
|
|
|
|
|
//dispatch_group_notify(notificationGroup, dispatch_get_main_queue(), {
|
|
//self.delegate?.listingHasNewNotifications(nil, ebayInfo: nil, amazonInfo: nil, etsyInfo: nil)
|
|
//})
|
|
|
|
}
|
|
|
|
}
|
|
|