From ccb244d4580c865d6f84f45f896e5b12499cc8c4 Mon Sep 17 00:00:00 2001 From: Mo Mustafa Date: Wed, 15 Jan 2025 14:51:58 -0800 Subject: [PATCH] feat: forward product custom attributes --- .../MPKitFirebaseGA4Analytics.m | 80 ++++++++----------- .../MPKitFirebaseGA4AnalyticsTests.m | 21 +++++ 2 files changed, 54 insertions(+), 47 deletions(-) diff --git a/mParticle-Google-Analytics-Firebase-GA4/MPKitFirebaseGA4Analytics.m b/mParticle-Google-Analytics-Firebase-GA4/MPKitFirebaseGA4Analytics.m index e5e44da..2fda5d3 100755 --- a/mParticle-Google-Analytics-Firebase-GA4/MPKitFirebaseGA4Analytics.m +++ b/mParticle-Google-Analytics-Firebase-GA4/MPKitFirebaseGA4Analytics.m @@ -506,54 +506,9 @@ - (NSString *)getEventNameForCommerceEvent:(MPCommerceEvent *)commerceEvent para return parameters; } -- (NSDictionary *)getParameterForImpression:(NSString *)impressionKey commerceEvent:(MPCommerceEvent *)commerceEvent products:(NSSet *)products { - NSMutableDictionary *parameters = [[self standardizeValues:commerceEvent.customAttributes forEvent:YES] mutableCopy]; - - [parameters setObject:impressionKey forKey:kFIRParameterItemListID]; - [parameters setObject:impressionKey forKey:kFIRParameterItemListName]; - - if (products.count > 0) { - NSMutableArray *itemArray = [[NSMutableArray alloc] init]; - for (MPProduct *product in products) { - NSMutableDictionary *productParameters = [[NSMutableDictionary alloc] init]; - - if (product.quantity) { - [productParameters setObject:product.quantity forKey:kFIRParameterQuantity]; - } - if (product.sku) { - [productParameters setObject:product.sku forKey:kFIRParameterItemID]; - } - if (product.name) { - [productParameters setObject:product.name forKey:kFIRParameterItemName]; - } - if (product.category) { - [productParameters setObject:product.category forKey:kFIRParameterItemCategory]; - } - if (product.brand) { - [productParameters setObject:product.brand forKey:kFIRParameterItemBrand]; - } - if (product.price) { - [productParameters setObject:product.price forKey:kFIRParameterPrice]; - } - - [self limitDictionary:productParameters maxCount:FIR_MAX_ITEM_PARAMETERS]; - [itemArray addObject:productParameters]; - } - - if (itemArray.count > 0) { - [parameters setObject:itemArray forKey:kFIRParameterItems]; - } - } - - [self limitDictionary:parameters maxCount:FIR_MAX_EVENT_PARAMETERS_PROPERTIES]; - return parameters; -} - -- (NSDictionary *)getParameterForCommerceEvent:(MPCommerceEvent *)commerceEvent { - NSMutableDictionary *parameters = [[self standardizeValues:commerceEvent.customAttributes forEvent:YES] mutableCopy]; - +- (NSMutableArray *)getParametersForProducts:(id)products { NSMutableArray *itemArray = [[NSMutableArray alloc] init]; - for (MPProduct *product in commerceEvent.products) { + for (MPProduct *product in products) { NSMutableDictionary *productParameters = [[NSMutableDictionary alloc] init]; if (product.quantity) { @@ -574,11 +529,42 @@ - (NSString *)getEventNameForCommerceEvent:(MPCommerceEvent *)commerceEvent para if (product.price) { [productParameters setObject:product.price forKey:kFIRParameterPrice]; } + if (product.userDefinedAttributes) { + for (NSString *productCustomAttribute in product.userDefinedAttributes) { + [productParameters setObject:product.userDefinedAttributes[productCustomAttribute] forKey:productCustomAttribute]; + } + } [self limitDictionary:productParameters maxCount:FIR_MAX_ITEM_PARAMETERS]; [itemArray addObject:productParameters]; } + return itemArray; +} + +- (NSDictionary *)getParameterForImpression:(NSString *)impressionKey commerceEvent:(MPCommerceEvent *)commerceEvent products:(NSSet *)products { + NSMutableDictionary *parameters = [[self standardizeValues:commerceEvent.customAttributes forEvent:YES] mutableCopy]; + + [parameters setObject:impressionKey forKey:kFIRParameterItemListID]; + [parameters setObject:impressionKey forKey:kFIRParameterItemListName]; + + if (products.count > 0) { + NSMutableArray *itemArray = [self getParametersForProducts:products]; + + if (itemArray.count > 0) { + [parameters setObject:itemArray forKey:kFIRParameterItems]; + } + } + + [self limitDictionary:parameters maxCount:FIR_MAX_EVENT_PARAMETERS_PROPERTIES]; + return parameters; +} + +- (NSDictionary *)getParameterForCommerceEvent:(MPCommerceEvent *)commerceEvent { + NSMutableDictionary *parameters = [[self standardizeValues:commerceEvent.customAttributes forEvent:YES] mutableCopy]; + + NSMutableArray *itemArray = [self getParametersForProducts:commerceEvent.products]; + if (itemArray.count > 0) { [parameters setObject:itemArray forKey:kFIRParameterItems]; } diff --git a/mParticle-Google-Analytics-Firebase-GA4Tests/MPKitFirebaseGA4AnalyticsTests.m b/mParticle-Google-Analytics-Firebase-GA4Tests/MPKitFirebaseGA4AnalyticsTests.m index 320efc6..dcea287 100644 --- a/mParticle-Google-Analytics-Firebase-GA4Tests/MPKitFirebaseGA4AnalyticsTests.m +++ b/mParticle-Google-Analytics-Firebase-GA4Tests/MPKitFirebaseGA4AnalyticsTests.m @@ -12,6 +12,7 @@ - (NSString *)standardizeNameOrKey:(NSString *)nameOrKey forEvent:(BOOL)forEvent - (NSString *)standardizeValue:(id)value forEvent:(BOOL)forEvent; - (NSString *)getEventNameForCommerceEvent:(MPCommerceEvent *)commerceEvent parameters:(NSDictionary *)parameters; - (NSDictionary *)getParameterForCommerceEvent:(MPCommerceEvent *)commerceEvent; +- (NSMutableArray *)getParametersForProducts:(id)products; @end @interface mParticle_Firebase_AnalyticsTests : XCTestCase @@ -289,6 +290,26 @@ - (void)testSanitizationMax { XCTAssertTrue(execStatus.success); } +- (void)testProductParameters { + MPKitFirebaseGA4Analytics *exampleKit = [[MPKitFirebaseGA4Analytics alloc] init]; + [exampleKit didFinishLaunchingWithConfiguration:@{}]; + + MPProduct *product = [[MPProduct alloc] initWithName:@"expensivePotato" sku:@"SKU123" quantity:@1 price:@40.0]; + NSMutableDictionary *testProductCustomAttributes = [[@{@"productCustomAttribute": @"potato", @"store": @"Target"} mutableCopy] mutableCopy]; + product.brand = @"LV"; + product.category = @"vegetable"; + product.userDefinedAttributes = testProductCustomAttributes; + + MPCommerceEvent *event = [[MPCommerceEvent alloc] initWithImpressionName:@"suggested products list" product:product]; + NSSet *impressionProducts = event.impressions[@"suggested products list"]; + + NSArray *itemsArray = [exampleKit getParametersForProducts:impressionProducts]; + id item = itemsArray[0]; + + // The item inside itemsArray should include 8 parameters in total including the 2 product custom attributes + XCTAssertEqual([item count], 8); +} + - (void)testCommerceEventCheckoutOptions { MPKitFirebaseGA4Analytics *exampleKit = [[MPKitFirebaseGA4Analytics alloc] init]; [exampleKit didFinishLaunchingWithConfiguration:@{}];