Skip to content

Commit db286bc

Browse files
authored
fix: forward original event names to UI for kits with mapped events (#301)
* fix: forward original event names to UI for kits with mapped events
1 parent ba789d8 commit db286bc

File tree

5 files changed

+81
-39
lines changed

5 files changed

+81
-39
lines changed

UnitTests/MPKitContainerTests.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,13 +1484,19 @@ - (void)testForwardAppsFlyerEvent {
14841484

14851485
MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"];
14861486
MPKitFilter *kitFilter = [kitContainer filter:kitRegister forEvent:event selector:@selector(logEvent:)];
1487+
MPEvent *eventCopy = (MPEvent *)kitFilter.originalEventCopy;
1488+
14871489

14881490
XCTAssert([kitFilter.forwardEvent isKindOfClass:[MPEvent class]]);
14891491
MPEvent *forwardEvent = (MPEvent *)kitFilter.forwardEvent;
14901492
XCTAssertNotNil(forwardEvent);
14911493
XCTAssertEqualObjects(forwardEvent.name, @"new_premium_subscriber");
14921494
XCTAssertNotNil(forwardEvent.customAttributes);
14931495
XCTAssertEqual(forwardEvent.customAttributes.count, 3);
1496+
XCTAssertNotNil(kitFilter.appliedProjections);
1497+
XCTAssertEqualObjects(eventCopy.name, @"subscription_success");
1498+
XCTAssertNotNil(eventCopy.customAttributes);
1499+
XCTAssertEqual(eventCopy.customAttributes.count, 3);
14941500
}
14951501

14961502
- (void)testForwardAppsFlyerCommerceEvent {
@@ -1652,13 +1658,17 @@ - (void)testForwardAppsFlyerCommerceEvent {
16521658

16531659
MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"AppsFlyer" className:@"MPKitAppsFlyerTest"];
16541660
MPKitFilter *kitFilter = [kitContainer filter:kitRegister forCommerceEvent:commerceEvent];
1661+
MPEvent *commerceEventCopy = (MPEvent *)kitFilter.originalCommerceEventCopy;
16551662

16561663
XCTAssert([kitFilter.forwardEvent isKindOfClass:[MPEvent class]]);
16571664
MPEvent *event = (MPEvent *)kitFilter.forwardEvent;
16581665
XCTAssertEqualObjects(event.customAttributes[@"af_quantity"], @"1");
16591666
XCTAssertEqualObjects(event.customAttributes[@"af_content_id"], @"OutATime");
16601667
XCTAssertEqualObjects(event.customAttributes[@"af_content_type"], @"Time Machine");
16611668
XCTAssertEqualObjects(event.name, @"af_add_to_cart");
1669+
XCTAssertNotNil(kitFilter.appliedProjections);
1670+
XCTAssertEqual(commerceEventCopy.type, MPEventTypeAddToCart);
1671+
16621672
}
16631673

16641674
- (void)testMatchArrayProjection {
@@ -1750,13 +1760,17 @@ - (void)testMatchArrayProjection {
17501760
XCTAssertNotNil(forwardEvent);
17511761
XCTAssertNotNil(forwardEvent.customAttributes);
17521762
XCTAssertEqual(forwardEvent.customAttributes.count, 2);
1763+
MPEvent *eventCopy = (MPEvent *)kitFilter.originalEventCopy;
17531764

17541765
[foundEventNames addObject:forwardEvent.name];
17551766

17561767
if (foundEventNames.count == 2) {
17571768
XCTAssertTrue([foundEventNames containsObject:@"X_NEW_SUBSCRIPTION"]);
17581769
XCTAssertTrue([foundEventNames containsObject:@"X_NEW_NOAH_SUBSCRIPTION"]);
17591770
}
1771+
XCTAssertNotNil(kitFilter.appliedProjections);
1772+
XCTAssertEqual(kitFilter.appliedProjections.count, 2);
1773+
XCTAssertEqualObjects(eventCopy.name, @"SUBSCRIPTION_END");
17601774
}
17611775

17621776
- (void)testScreenViewProjectionToBaseEvent {
@@ -1849,10 +1863,13 @@ - (void)testScreenViewProjectionToBaseEvent {
18491863
[(id <MPKitProtocol>)[kitWrapperMock reject] logScreen:OCMOCK_ANY];
18501864

18511865
MPKitFilter *kitFilter = [kitContainer filter:kitRegister forEvent:event selector:@selector(logScreen:)];
1866+
MPEvent *eventCopy = (MPEvent *)kitFilter.originalEventCopy;
18521867

18531868
[kitWrapperMock verifyWithDelay:5.0];
18541869

18551870
XCTAssert([kitFilter.forwardEvent isKindOfClass:[MPEvent class]]);
1871+
XCTAssertNotNil(kitFilter.appliedProjections);
1872+
XCTAssertEqualObjects(eventCopy.name, @"SUBSCRIPTION_END");
18561873
}
18571874

18581875
- (void)testNonMatchingMatchArrayProjection {

mParticle-Apple-SDK/Data Model/MPForwardRecord.m

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,25 @@ - (instancetype)initWithMessageType:(MPMessageType)messageType execStatus:(MPKit
112112
if (kitFilter.appliedProjections.count > 0) {
113113
NSMutableArray *projections = [[NSMutableArray alloc] initWithCapacity:kitFilter.appliedProjections.count];
114114
NSMutableDictionary *projectionDictionary;
115+
NSString *currentProjectionName;
116+
if ([kitFilter.originalEvent isKindOfClass:[MPEvent class]]) {
117+
currentProjectionName = ((MPEvent *)kitFilter.originalEvent).name;
118+
}
115119

116120
for (MPEventProjection *eventProjection in kitFilter.appliedProjections) {
117-
projectionDictionary = [[NSMutableDictionary alloc] initWithCapacity:4];
118-
projectionDictionary[kMPFRProjectionId] = @(eventProjection.projectionId);
119-
projectionDictionary[kMPMessageTypeKey] = NSStringFromMessageType(messageType);
120-
121-
projectionDictionary[kMPEventTypeKey] = NSStringFromEventType(eventProjection.eventType);
122-
123-
if (eventProjection.projectedName) {
124-
projectionDictionary[kMPFRProjectionName] = eventProjection.projectedName;
121+
if ([eventProjection.projectedName isEqual:currentProjectionName]) {
122+
projectionDictionary = [[NSMutableDictionary alloc] initWithCapacity:4];
123+
projectionDictionary[kMPFRProjectionId] = @(eventProjection.projectionId);
124+
projectionDictionary[kMPMessageTypeKey] = NSStringFromMessageType(messageType);
125+
126+
projectionDictionary[kMPEventTypeKey] = NSStringFromEventType(eventProjection.eventType);
127+
128+
if (eventProjection.projectedName) {
129+
projectionDictionary[kMPFRProjectionName] = eventProjection.projectedName;
130+
}
131+
132+
[projections addObject:projectionDictionary];
125133
}
126-
127-
[projections addObject:projectionDictionary];
128134
}
129135

130136
_dataDictionary[kMPFRProjections] = projections;

mParticle-Apple-SDK/Kits/MPKitContainer.mm

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ - (MPKitFilter *)filter:(id<MPExtensionKitProtocol>)kitRegister forCommerceEvent
804804

805805
if (!projectedEvents.empty()) {
806806
for (auto &projectedEvent : projectedEvents) {
807-
kitFilter = [[MPKitFilter alloc] initWithEvent:projectedEvent shouldFilter:NO appliedProjections:appliedProjectionsArray];
807+
kitFilter = [[MPKitFilter alloc] initWithEvent:projectedEvent shouldFilter:NO appliedProjections:appliedProjectionsArray eventCopy:nil commerceEventCopy:commerceEvent];
808808
[self attemptToLogEventToKit:kitRegister kitFilter:kitFilter selector:@selector(logEvent:) parameters:nil messageType:MPMessageTypeEvent userInfo:[[NSDictionary alloc] init]];
809809
}
810810
}
@@ -908,7 +908,7 @@ - (MPKitFilter *)filter:(id<MPExtensionKitProtocol>)kitRegister forEvent:(MPEven
908908
NSArray<MPEventProjection *> *appliedProjectionsArray = !appliedProjections.empty() ? [NSArray arrayWithObjects:&appliedProjections[0] count:appliedProjections.size()] : nil;
909909

910910
for (auto &projectedEvent : projectedEvents) {
911-
kitFilter = [[MPKitFilter alloc] initWithEvent:projectedEvent shouldFilter:shouldFilter appliedProjections:appliedProjectionsArray];
911+
kitFilter = [[MPKitFilter alloc] initWithEvent:projectedEvent shouldFilter:shouldFilter appliedProjections:appliedProjectionsArray eventCopy:event commerceEventCopy:nil];
912912
SEL mutableSelector = selector;
913913
if (selector == @selector(logScreen:)) {
914914
for (int i = 0; i < appliedProjectionsArray.count; i += 1) {
@@ -2215,13 +2215,7 @@ - (void)attemptToLogCommerceEventToKit:(id<MPExtensionKitProtocol>)kitRegister k
22152215
if (execStatus.success && ![lastKit isEqualToNumber:currentKit]) {
22162216
lastKit = currentKit;
22172217

2218-
MPForwardRecord *forwardRecord = [[MPForwardRecord alloc] initWithMessageType:MPMessageTypeCommerceEvent
2219-
execStatus:execStatus
2220-
kitFilter:kitFilter
2221-
originalEvent:kitFilter.originalCommerceEvent];
2222-
dispatch_async([MParticle messageQueue], ^{
2223-
[[MParticle sharedInstance].persistenceController saveForwardRecord:forwardRecord];
2224-
});
2218+
[self forwardCommerceEventRecord:kitFilter execStatus:execStatus commerceEvent:kitFilter.originalCommerceEvent];
22252219
MPILogDebug(@"Forwarded logCommerceEvent call to kit: %@", kitRegister.name);
22262220
}
22272221
});
@@ -2345,28 +2339,49 @@ - (void)attemptToLogEventToKit:(id<MPExtensionKitProtocol>)kitRegister kitFilter
23452339
if (execStatus.success && ![lastKit isEqualToNumber:currentKit] && messageType != MPMessageTypeUnknown && messageType != MPMessageTypeMedia) {
23462340
lastKit = currentKit;
23472341

2348-
MPForwardRecord *forwardRecord = nil;
2349-
2350-
if (messageType == MPMessageTypeOptOut || messageType == MPMessageTypePushRegistration) {
2351-
forwardRecord = [[MPForwardRecord alloc] initWithMessageType:messageType
2352-
execStatus:execStatus
2353-
stateFlag:[userInfo[@"state"] boolValue]];
2354-
} else {
2355-
forwardRecord = [[MPForwardRecord alloc] initWithMessageType:messageType
2356-
execStatus:execStatus
2357-
kitFilter:kitFilter
2358-
originalEvent:kitFilter.originalEvent];
2359-
}
2360-
2361-
if (forwardRecord != nil) {
2362-
dispatch_async([MParticle messageQueue], ^{
2363-
[[MParticle sharedInstance].persistenceController saveForwardRecord:forwardRecord];
2364-
});
2342+
if (!kitFilter.appliedProjections) {
2343+
[self forwardEventRecord:kitFilter messageType:messageType userInfo:userInfo execStatus:execStatus event:kitFilter.originalEvent];
2344+
} else if (kitFilter.originalCommerceEventCopy) {
2345+
[self forwardCommerceEventRecord:kitFilter execStatus:execStatus commerceEvent:kitFilter.originalCommerceEventCopy];
2346+
} else if (kitFilter.originalEventCopy) {
2347+
[self forwardEventRecord:kitFilter messageType:messageType userInfo:userInfo execStatus:execStatus event:kitFilter.originalEventCopy];
23652348
}
23662349
}
23672350
});
23682351
}
23692352

2353+
- (void)forwardEventRecord:(MPKitFilter *)kitFilter messageType:(MPMessageType)messageType userInfo:(NSDictionary *)userInfo execStatus:(MPKitExecStatus*) execStatus event:(MPBaseEvent *)event{
2354+
MPForwardRecord *forwardRecord = nil;
2355+
2356+
if (messageType == MPMessageTypeOptOut || messageType == MPMessageTypePushRegistration) {
2357+
forwardRecord = [[MPForwardRecord alloc] initWithMessageType:messageType
2358+
execStatus:execStatus
2359+
stateFlag:[userInfo[@"state"] boolValue]];
2360+
} else {
2361+
2362+
forwardRecord = [[MPForwardRecord alloc] initWithMessageType:messageType
2363+
execStatus:execStatus
2364+
kitFilter:kitFilter
2365+
originalEvent:event];
2366+
}
2367+
2368+
if (forwardRecord != nil) {
2369+
dispatch_async([MParticle messageQueue], ^{
2370+
[[MParticle sharedInstance].persistenceController saveForwardRecord:forwardRecord];
2371+
});
2372+
}
2373+
}
2374+
2375+
- (void)forwardCommerceEventRecord:(MPKitFilter *)kitFilter execStatus:(MPKitExecStatus*) execStatus commerceEvent:(MPCommerceEvent *)commerceEvent{
2376+
MPForwardRecord *forwardRecord = [[MPForwardRecord alloc] initWithMessageType:MPMessageTypeCommerceEvent
2377+
execStatus:execStatus
2378+
kitFilter:kitFilter
2379+
originalEvent:commerceEvent];
2380+
dispatch_async([MParticle messageQueue], ^{
2381+
[[MParticle sharedInstance].persistenceController saveForwardRecord:forwardRecord];
2382+
});
2383+
}
2384+
23702385
- (void)forwardSDKCall:(SEL)selector userAttributeKey:(NSString *)key value:(id)value kitHandler:(void (^)(id<MPKitProtocol> kit, MPKitConfiguration * _Nonnull kitConfiguration))kitHandler {
23712386
NSArray<id<MPExtensionKitProtocol>> *activeKitsRegistry = [self activeKitsRegistry];
23722387

mParticle-Apple-SDK/Kits/MPKitFilter.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
@property (nonatomic, strong, readonly, nullable) NSDictionary *filteredAttributes;
1212
@property (nonatomic, strong, readonly, nullable) MPCommerceEvent *originalCommerceEvent;
1313
@property (nonatomic, strong, readonly, nullable) MPBaseEvent *originalEvent;
14+
@property (nonatomic, strong, readonly, nullable) MPCommerceEvent *originalCommerceEventCopy;
15+
@property (nonatomic, strong, readonly, nullable) MPBaseEvent *originalEventCopy;
1416
@property (nonatomic, strong, readonly, nullable) MPCommerceEvent *forwardCommerceEvent;
1517
@property (nonatomic, strong, readonly, nullable) MPBaseEvent *forwardEvent;
1618
@property (nonatomic, strong, readonly, nullable) MPConsentState *forwardConsentState;
@@ -19,7 +21,7 @@
1921
- (nonnull instancetype)initWithFilter:(BOOL)shouldFilter;
2022
- (nonnull instancetype)initWithFilter:(BOOL)shouldFilter filteredAttributes:(nullable NSDictionary *)filteredAttributes;
2123
- (nonnull instancetype)initWithEvent:(nonnull MPBaseEvent *)event shouldFilter:(BOOL)shouldFilter;
22-
- (nonnull instancetype)initWithEvent:(nonnull MPBaseEvent *)event shouldFilter:(BOOL)shouldFilter appliedProjections:(nullable NSArray<MPEventProjection *> *)appliedProjections;
24+
- (nonnull instancetype)initWithEvent:(nonnull MPBaseEvent *)event shouldFilter:(BOOL)shouldFilter appliedProjections:(nullable NSArray<MPEventProjection *> *)appliedProjections eventCopy:(nullable MPBaseEvent *)eventCopy commerceEventCopy:(nullable MPCommerceEvent *)commerceEventCopy;
2325
- (nonnull instancetype)initWithCommerceEvent:(nonnull MPCommerceEvent *)commerceEvent shouldFilter:(BOOL)shouldFilter;
2426
- (nonnull instancetype)initWithCommerceEvent:(nonnull MPCommerceEvent *)commerceEvent shouldFilter:(BOOL)shouldFilter appliedProjections:(nullable NSArray<MPEventProjection *> *)appliedProjections;
2527
- (nonnull instancetype)initWithConsentState:(nonnull MPConsentState *)state shouldFilter:(BOOL)shouldFilter;

mParticle-Apple-SDK/Kits/MPKitFilter.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ - (instancetype)initWithFilter:(BOOL)shouldFilter filteredAttributes:(NSDictiona
2727
}
2828

2929
- (instancetype)initWithEvent:(MPBaseEvent *)event shouldFilter:(BOOL)shouldFilter {
30-
return [self initWithEvent:event shouldFilter:shouldFilter appliedProjections:nil];
30+
return [self initWithEvent:event shouldFilter:shouldFilter appliedProjections:nil eventCopy:nil commerceEventCopy:nil];
3131
}
3232

33-
- (instancetype)initWithEvent:(MPEvent *)event shouldFilter:(BOOL)shouldFilter appliedProjections:(NSArray<MPEventProjection *> *)appliedProjections {
33+
- (instancetype)initWithEvent:(MPEvent *)event shouldFilter:(BOOL)shouldFilter appliedProjections:(NSArray<MPEventProjection *> *)appliedProjections eventCopy:(MPEvent *)eventCopy commerceEventCopy:(MPCommerceEvent *)commerceEventCopy{
3434
self = [self initWithFilter:shouldFilter filteredAttributes:event.customAttributes];
3535
if (!self) {
3636
return nil;
@@ -39,6 +39,8 @@ - (instancetype)initWithEvent:(MPEvent *)event shouldFilter:(BOOL)shouldFilter a
3939
_originalEvent = event;
4040
_forwardEvent = event;
4141
_appliedProjections = appliedProjections;
42+
_originalEventCopy = eventCopy;
43+
_originalCommerceEventCopy = commerceEventCopy;
4244

4345
return self;
4446
}

0 commit comments

Comments
 (0)