Multiple Images Works for Firebase and Facebook

Currently getting the correct number of ebay images uploaded with listing but images are duplicates of the first image posted
This commit is contained in:
Okechi Onyeje 2016-08-27 18:21:08 -04:00
parent 0aa8f23789
commit c11fe99bda
7 changed files with 718 additions and 708 deletions

View File

@ -207,8 +207,10 @@ extension EbayWebServiceManager {
self.requestMaker(soapMessage, theRequest: theRequest)
}
func addImagesToListing(listingID: String, imageURL: String, onCompletion: ServiceResponse) {
func addImagesToListing(listingID: String, imageURLs: [String], listingOnCompletion: ServiceResponse, body: [String:String],onCompletion: ServiceResponse) {
listItem(body, imageUrls: imageURLs, completion: listingOnCompletion)
/*
var soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<ReviseItemRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">" +
"<RequesterCredentials>" +
@ -217,21 +219,26 @@ extension EbayWebServiceManager {
soapMessage = soapMessage + "<ErrorLanguage>en_US</ErrorLanguage>" +
"<Item>" +
"<ItemID>\(listingID)</ItemID>" +
"<PictureDetails>" +
"<PictureURL>\(imageURL.stringByReplacingOccurrencesOfString("&", withString: "&amp;"))</PictureURL>" +
"</PictureDetails>" +
"</Item></ReviseItemRequest>"
"<ItemID>\(listingID)</ItemID>"
for i in 0...(imageURLs.count - 1) {
soapMessage = soapMessage + "<PictureDetails>" +
"<PictureURL>\(imageURLs[i].stringByReplacingOccurrencesOfString("&", withString: "&amp;"))</PictureURL>" +
"</PictureDetails>"
}
soapMessage = soapMessage + "</Item></ReviseItemRequest>"
let url = NSURL(string: self.baseURL)
let theRequest = NSMutableURLRequest(URL: url!)
theRequest.addValue("ReviseItem", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")
self.completion = onCompletion
self.requestMaker(soapMessage, theRequest: theRequest)
*/
}
func listItem(params: [String: String], completion: ServiceResponse?){
func listItem(params: [String: String], imageUrls: [String], completion: ServiceResponse?){
var dict = EbayWebServiceManager.settingsDictionary
var emailRetrievalGroup = dispatch_group_create()
var soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
@ -268,8 +275,15 @@ extension EbayWebServiceManager {
"<ListingDuration>\(dict["listingDuration"] as! String!)</ListingDuration>" +
"<ListingType>\(dict["listingType"] as! String!)</ListingType>" +
"<PaymentMethods>\(dict["payment"] as! String!)</PaymentMethods>" +
"<PayPalEmailAddress>\(dict["paypal_email"] as! String!)</PayPalEmailAddress>" +
"<PostalCode>\(dict["postalCode"] as! String!)</PostalCode>" +
"<PayPalEmailAddress>\(dict["paypal_email"] as! String!)</PayPalEmailAddress><PictureDetails>"
for i in 0...(imageUrls.count - 1) {
soapMessage = soapMessage +
"<PictureURL>\(imageUrls[i].stringByReplacingOccurrencesOfString("&", withString: "&amp;"))</PictureURL>"
}
soapMessage = soapMessage + "</PictureDetails><PostalCode>\(dict["postalCode"] as! String!)</PostalCode>" +
"<Quantity>\(params["quantity"] as String!)</Quantity>" +
"<ReturnPolicy>" +
"<ReturnsAcceptedOption>\(dict["return"] as! String!)</ReturnsAcceptedOption>" +
@ -285,7 +299,7 @@ extension EbayWebServiceManager {
"</ShippingDetails>" +
"<Site>US</Site>" +
"</Item></AddItemRequest>"
print(soapMessage)
let url = NSURL(string: self.baseURL)
let theRequest = NSMutableURLRequest(URL: url!)
theRequest.addValue("AddItem", forHTTPHeaderField: "X-EBAY-API-CALL-NAME")

View File

@ -54,13 +54,13 @@ class HomeViewController: UITabBarController {
var listingImages: [UIImage] = [mainImage!]
var count = 0
//Get supporting images
for i in 2...5 {
for i in 1...4 {
let supportListingImg1 = storageRef.child("images/\(key)/\(i).jpg")
supportListingImg1.dataWithMaxSize(10 * 1024 * 1024, completion: {
(data1, error) -> Void in
if(error != nil){
print("support image \(i - 1) for key, \(key), does not exist")
print("support image \(i) for key, \(key), does not exist")
}else{
listingImages.append(UIImage(data: data1!)!)
}

View File

@ -14,13 +14,18 @@
*/
import UIKit
import FirebaseStorage
//@TODO: Need to make multiple images work for etsy and facebook and need to implement multiple images saving to firebase
class ListingPreviewViewController: UIViewController {
//IBOutlets
@IBOutlet weak var containerScrollView: UIScrollView!
@IBOutlet weak var itemQuantity: UITextView!
@IBOutlet weak var itemPicture: UIImageView!
@IBOutlet weak var itemPictureMain: UIImageView!
@IBOutlet weak var itemPictureSup1: UIImageView!
@IBOutlet weak var itemPictureSup2: UIImageView!
@IBOutlet weak var itemPictureSup3: UIImageView!
@IBOutlet weak var itemPictureSup4: UIImageView!
@IBOutlet weak var itemTitle: UITextView!
@IBOutlet weak var itemDescription: UITextView!
@IBOutlet weak var itemPrice: UITextView!
@ -62,7 +67,27 @@ class ListingPreviewViewController: UIViewController {
func setListing(){
self.itemPicture.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![0].image
for i in 0...((self.itemListingDictionary["pictures"] as! [UIImageView]).count - 1) {
switch i {
case 0:
self.itemPictureMain.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![i].image
break
case 1:
self.itemPictureSup1.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![i].image
break
case 2:
self.itemPictureSup2.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![i].image
break
case 3:
self.itemPictureSup3.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![i].image
break
case 4:
self.itemPictureSup4.image = (self.itemListingDictionary["pictures"] as? [UIImageView])![i].image
break
default:
break
}
}
self.itemTitle.text = self.itemListingDictionary["title"] as! String
self.itemDescription.text = self.itemListingDictionary["description"] as! String
self.itemPrice.text = self.itemListingDictionary["price"] as! String
@ -82,7 +107,14 @@ class ListingPreviewViewController: UIViewController {
self.etsyManager = etsyManager
}
func saveToFirebase(listingImageRef: FIRStorageReference, completion: ServiceResponse! ) {
listingImageRef.putData(UIImageJPEGRepresentation(self.itemPictureMain.image!, 0.8)!, metadata: nil,completion: {
(metadata, error) -> Void in
completion(metadata, error)
})
}
// MARK: - Navigation
@ -96,7 +128,7 @@ class ListingPreviewViewController: UIViewController {
vc.itemName.text? = self.itemTitle.text
vc.itemPrice.text? = self.itemPrice.text
vc.itemDescription.text? = self.itemDescription.text
vc.possibleItemImageMain = self.itemPicture
vc.possibleItemImageMain = self.itemPictureMain
vc.itemQuantity.text? = self.itemQuantity.text
}
}
@ -131,7 +163,7 @@ extension ListingPreviewViewController {
@IBAction func publishItem(sender: AnyObject) {
if(self.itemPicture.image == nil){
if(self.itemPictureMain.image == nil){
let alert = UIAlertController(title: "Image Needed", message: "To proceed to choose networks, you must supply at least one picture for your listing", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in alert.dismissViewControllerAnimated(true, completion: nil)}))
@ -142,10 +174,14 @@ extension ListingPreviewViewController {
//save listing to private user path in firebase
let newListingRef = self.firManager.ref.child("Users").child("\(self.firManager.user_email)").child("user_Listings").childByAutoId()
let postingGroup: dispatch_group_t = dispatch_group_create()
/*if(!(self.networksDictionary["ebay"]!)&&(!(self.networksDictionary["etsy"]!))&&(!(self.networksDictionary["amazon"]!))&&(!(self.networksDictionary["facebook"]!))) {
}else {
dispatch_g
}*/
//post to ebay
if(self.networksDictionary["ebay"]!){
/*if(self.networksDictionary["ebay"]!){
dispatch_group_enter(postingGroup)
var categoryCode: String!
var dict = EbayWebServiceManager.settingsDictionary["categories"]!
@ -267,7 +303,7 @@ extension ListingPreviewViewController {
self.newInProgressListing["networkIDs"] = networkIDs
dispatch_group_leave(postingGroup)
})
}
}*/
//post to amazon
@ -404,7 +440,7 @@ extension ListingPreviewViewController {
let imageBody = ["listing_id": networkIDs["etsy"] as! Int,
//"type":"image/jpg",
"image": UIImageJPEGRepresentation(self.itemPicture.image!, 0.45)!]
"image": UIImageJPEGRepresentation(self.itemPictureMain.image!, 0.45)!]
self.etsyManager.sendPOSTRequest(("listings/\(networkIDs["etsy"] as! Int)/images"), body: imageBody, onCompletion: {
(dict, error) -> Void in
@ -421,26 +457,93 @@ extension ListingPreviewViewController {
//post to facebook
if(self.networksDictionary["facebook"]!){
dispatch_group_enter(postingGroup)
let fb_group: dispatch_group_t = dispatch_group_create()
let tmpDirURL = NSURL.fileURLWithPath(NSTemporaryDirectory(), isDirectory: true)
let fileURL = tmpDirURL.URLByAppendingPathComponent("main").URLByAppendingPathExtension("jpg")
print("FilePath: \(fileURL.path!)")
do {
try UIImageJPEGRepresentation(self.itemPicture.image!, 0.45)!.writeToFile(fileURL.path!, options: NSDataWritingOptions.AtomicWrite)
try UIImageJPEGRepresentation(self.itemPictureMain.image!, 0.45)!.writeToFile(fileURL.path!, options: NSDataWritingOptions.AtomicWrite)
}catch{
(error)
print(error)
}
//let parameters: Dictionary<String, AnyObject> = ["message":("**"+self.itemTitle.text!+"**\n\n"+"Price: "+self.itemPrice.text! + "\n\n"+self.itemDescription.text!)]
let parameters: Dictionary<String, AnyObject> = ["Source": UIImageJPEGRepresentation(self.itemPicture.image!, 0.45)!, "published":false]
self.lastListingKey = newListingRef.key
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
var imageIDs: [String] = []
//post multiple images to fb
for i in 0...(self.itemListingDictionary["pictures"] as! [UIImageView]).count - 1 {
var parameters: Dictionary<String, AnyObject> = Dictionary<String, AnyObject>()
switch (i) {
case 0:
dispatch_group_enter(fb_group)
parameters["Source"] = UIImageJPEGRepresentation(self.itemPictureMain.image!,0.45)!
parameters["published"] = false
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
imageIDs.append(imageId as! String)
dispatch_group_leave(fb_group)
})
break
case 1:
dispatch_group_enter(fb_group)
parameters["Source"] = UIImageJPEGRepresentation(self.itemPictureSup1.image!,0.45)!
parameters["published"] = false
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
imageIDs.append(imageId as! String)
dispatch_group_leave(fb_group)
})
break
case 2:
dispatch_group_enter(fb_group)
parameters["Source"] = UIImageJPEGRepresentation(self.itemPictureSup2.image!,0.45)!
parameters["published"] = false
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
imageIDs.append(imageId as! String)
dispatch_group_leave(fb_group)
})
break
case 3:
dispatch_group_enter(fb_group)
parameters["Source"] = UIImageJPEGRepresentation(self.itemPictureSup3.image!,0.45)!
parameters["published"] = false
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
imageIDs.append(imageId as! String)
dispatch_group_leave(fb_group)
})
break
case 4:
dispatch_group_enter(fb_group)
parameters["Source"] = UIImageJPEGRepresentation(self.itemPictureSup4.image!,0.45)!
parameters["published"] = false
self.graphManager.makePOSTResquest("me/photos", params: parameters, onComplete: {
(imageId, error) -> Void in
imageIDs.append(imageId as! String)
dispatch_group_leave(fb_group)
})
break
default:
break
}
}
//notifies that all images are ready to be attached to new listing on facebook
dispatch_group_notify(fb_group, dispatch_get_main_queue(), {
var listingParams: Dictionary<String, AnyObject> = ["message":("**"+self.itemTitle.text!+"**\n\n"+"Price: "+self.itemPrice.text! + "\n\n"+self.itemDescription.text!)]
for i in 0...(self.itemListingDictionary["pictures"] as! [UIImageView]).count - 1 {
listingParams["attached_media[\(i)]"] = "{\"media_fbid\":\"\(imageIDs[i])\"}"
}
var listingParams: Dictionary<String, AnyObject> = ["message":("**"+self.itemTitle.text!+"**\n\n"+"Price: "+self.itemPrice.text! + "\n\n"+self.itemDescription.text!), "attached_media[0]":"{\"media_fbid\":\"\(imageId as! String)\"}"]
self.graphManager.makePOSTResquest("me/feed", params: listingParams, onComplete: {
(listingId, error) -> Void in
@ -451,19 +554,16 @@ extension ListingPreviewViewController {
networkIDs["facebook"] = listingId as! String
self.newInProgressListing["networkIDs"] = networkIDs
dispatch_group_leave(postingGroup)
})
/*
*/
})
//let parameters: Dictionary<String, AnyObject> = ["":""]
}
//notifies once all selected networks have been posted to
dispatch_group_notify(postingGroup, dispatch_get_main_queue(), {
self.newInProgressListing.update(["listingID": newListingRef.key,
"seller email": (NSUserDefaults.standardUserDefaults().objectForKey("email") as? String)!,
@ -482,54 +582,122 @@ extension ListingPreviewViewController {
let storageRef = self.firManager.storage.referenceForURL((databaseDict["image_storage"] as? String)!)
var imageURLs: [String] = []
let completion: ServiceResponse = {(metadata, error) -> Void in
//for ebay due to its unique posting flow, will use firbase image storage url to add pictures
if (self.networksDictionary["ebay"]!){
imageURLs.append((metadata?.downloadURL()?.absoluteString)!)
dispatch_group_leave(postingGroup)
}else{
dispatch_group_leave(postingGroup)
}
}
//change code to new multi-image saving
let listingImageRef = storageRef.child("images/\(newListingRef.key)"+".jpg")
listingImageRef.putData(UIImageJPEGRepresentation(self.itemPicture.image!, 0.8)!, metadata: nil,completion:
{(metadata, error) -> Void in
for i in 0...(self.itemListingDictionary["pictures"] as! [UIImageView]).count - 1 {
switch (i) {
//for ebay due to its unique posting flow, will use firbase image storage url to add pictures
case 0:
dispatch_group_enter(postingGroup)
if (self.networksDictionary["ebay"]!){
var networkIDs = self.newInProgressListing["networkIDs"] as! Dictionary<String, AnyObject>
self.ebayManager.addImagesToListing(networkIDs["ebay"] as! String, imageURL: (metadata?.downloadURL()?.absoluteString)!, onCompletion: {
(_, _) -> Void in
dispatch_group_leave(postingGroup)
})
}else{
let listingImageRef = storageRef.child("images/\(newListingRef.key)/main"+".jpg")
self.saveToFirebase(listingImageRef, completion: completion)
break
case 1:
dispatch_group_enter(postingGroup)
let listingImageRef = storageRef.child("images/\(newListingRef.key)/1"+".jpg")
self.saveToFirebase(listingImageRef, completion: completion)
break
case 2:
dispatch_group_enter(postingGroup)
let listingImageRef = storageRef.child("images/\(newListingRef.key)/2"+".jpg")
self.saveToFirebase(listingImageRef, completion: completion)
break
case 3:
dispatch_group_enter(postingGroup)
let listingImageRef = storageRef.child("images/\(newListingRef.key)/3"+".jpg")
self.saveToFirebase(listingImageRef, completion: completion)
break
case 4:
dispatch_group_enter(postingGroup)
let listingImageRef = storageRef.child("images/\(newListingRef.key)/4"+".jpg")
self.saveToFirebase(listingImageRef, completion: completion)
break
default:
break
}
}
//notify to upload multiple ebay photos
dispatch_group_notify(postingGroup, dispatch_get_main_queue(), {
dispatch_group_enter(postingGroup)
if (self.networksDictionary["ebay"]!){
let body: [String: String] = [ "title": self.itemTitle.text,
"quantity":self.itemQuantity.text,
"description":self.itemDescription.text,
"price":self.itemPrice.text,
"category_id":self.itemListingDictionary["ebaySubCategoryID"] as! String
]
let listingCompletion: ServiceResponse = {
(listingID, error) -> Void in
if((self.newInProgressListing["networkIDs"] == nil)){
self.newInProgressListing["networkIDs"] = Dictionary<String, AnyObject>()
}
var networkIDs = (self.newInProgressListing["networkIDs"] as! Dictionary<String, AnyObject>)
networkIDs["ebay"] = listingID as! String
self.newInProgressListing["networkIDs"] = networkIDs
dispatch_group_leave(postingGroup)
}
/*self.ebayManager.listItem(body, completion: {
(listingID, error) -> Void in
if((self.newInProgressListing["networkIDs"] == nil)){
self.newInProgressListing["networkIDs"] = Dictionary<String, AnyObject>()
}
var networkIDs = (self.newInProgressListing["networkIDs"] as! Dictionary<String, AnyObject>)
networkIDs["ebay"] = listingID as! String
self.newInProgressListing["networkIDs"] = networkIDs
dispatch_group_leave(postingGroup)
})*/
self.ebayManager.listItem(body, imageUrls: imageURLs, completion: listingCompletion)
//self.ebayManager.addImagesToListing(networkIDs["ebay"] as! String, imageURLs: imageURLs, listingOnCompletion: listingCompletion, body: body, onCompletion: {
//(_, _) -> Void in
//dispatch_group_leave(postingGroup)
//})
}
else {
dispatch_group_leave(postingGroup)
}
//notify to save final listing to firebase
dispatch_group_notify(postingGroup, dispatch_get_main_queue(), {
newListingRef.setValue(self.newInProgressListing)
dispatch_group_notify(postingGroup, dispatch_get_main_queue(), {
newListingRef.setValue(self.newInProgressListing)
// self.alert.title = "Listing saved with error"
// self.alert.message = "Your listing has been saved but something went wrong when trying to publish to facebook"
//let alert = UIAlertController(title: "Listing Published", message: "Your listing has been published", preferredStyle: .Alert)
// self.alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in self.alert.dismissViewControllerAnimated(true, completion: nil)}))
//register new listing id in global path of firebase root'
self.firManager.ref.child("Global_listings").child(newListingRef.key).setValue(newListingRef.key)
})
// self.alert.title = "Listing saved with error"
// self.alert.message = "Your listing has been saved but something went wrong when trying to publish to facebook"
//let alert = UIAlertController(title: "Listing Published", message: "Your listing has been published", preferredStyle: .Alert)
// self.alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:{(action: UIAlertAction!) in self.alert.dismissViewControllerAnimated(true, completion: nil)}))
//register new listing id in global path of firebase root'
self.firManager.ref.child("Global_listings").child(newListingRef.key).setValue(newListingRef.key)
})
})
})
})
}
}
@IBAction func editListing(sender: AnyObject) {
@ -539,8 +707,8 @@ extension ListingPreviewViewController {
}
}
extension ListingPreviewViewController: UICollectionViewDelegate {
/*

View File

@ -1027,7 +1027,11 @@
<outlet property="containerScrollView" destination="T3U-DI-Ome" id="gad-zv-hsO"/>
<outlet property="itemCategory" destination="ije-TG-4S5" id="XGu-Uw-hLl"/>
<outlet property="itemDescription" destination="u7b-0N-xli" id="d1N-lw-6sw"/>
<outlet property="itemPicture" destination="K0z-pp-hzH" id="6Zm-Ig-Rm3"/>
<outlet property="itemPictureMain" destination="K0z-pp-hzH" id="cXG-P9-emv"/>
<outlet property="itemPictureSup1" destination="ldz-4W-iID" id="PHY-Nf-9Qv"/>
<outlet property="itemPictureSup2" destination="MRj-nD-Hnj" id="KPH-H3-Z5z"/>
<outlet property="itemPictureSup3" destination="L24-JN-niQ" id="fyJ-HY-klx"/>
<outlet property="itemPictureSup4" destination="LsU-De-laD" id="eBn-7o-WIl"/>
<outlet property="itemPrice" destination="Jh9-KG-0Yt" id="nbh-aq-W0b"/>
<outlet property="itemQuantity" destination="shU-ew-26O" id="yNg-ov-7q5"/>
<outlet property="itemTitle" destination="WuZ-2K-lz7" id="EkY-UX-lSj"/>

View File

@ -158,7 +158,7 @@ extension NetworksTableViewController: UITableViewDataSource {
cell = (self.tableView.dequeueReusableCellWithIdentifier("etsy", forIndexPath: indexPath) as! EtsyTableViewCell)
break
default:
//loads network cell for ebay
//loads network cell for facebook
cell = (self.tableView.dequeueReusableCellWithIdentifier("facebook", forIndexPath: indexPath) as! FBTableViewCell)
break