Created
August 31, 2017 14:36
-
-
Save frootloops/6418491def7d6ef29667c90a4842a23a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| protocol TrackingEventType { | |
| var identifier: String { get } | |
| var properties: [String: Any] { get } | |
| } | |
| protocol TrackingProviderType { | |
| func track(event: TrackingEventType) | |
| func associate(with user: User) | |
| func disassociateUser() | |
| func setup() | |
| } | |
| protocol TrackingClientType: TrackingProviderType { | |
| var providers: [TrackingProviderType] { get } | |
| func add(provider: TrackingProviderType) | |
| } | |
| enum UserEvents { | |
| case created(user: User) | |
| case openApp | |
| case bought(product: Product) | |
| case sentMessage | |
| } | |
| extension UserEvents: TrackingEventType { | |
| var identifier: String { | |
| switch self { | |
| case .created: | |
| return "user.created" | |
| case .openApp: | |
| return "user.open-app" | |
| case .bought: | |
| return "user.bought" | |
| case .sentMessage: | |
| return "user.sent-message" | |
| } | |
| } | |
| var properties: [String: Any] { | |
| switch self { | |
| case let .created(user): | |
| return ["name": user.name, "age": user.age] | |
| case let .bought(product): | |
| return ["title": product.title, "price": product.price] | |
| default: | |
| return [:] | |
| } | |
| } | |
| } | |
| final class AmplitudeProvider: TrackingProviderType { | |
| private let amplitude = Amplitude() | |
| func setup() { | |
| amplitude.initializeApiKey("XXXX-XXXX") | |
| amplitude.eventUploadPeriodSeconds = 120 | |
| } | |
| func track(event: TrackingEventType) { | |
| amplitude.logEvent(event.identifier, withEventProperties: event.properties) | |
| } | |
| func associate(with user: User) { | |
| amplitude.setUserId(user.id) | |
| let identify = AMPIdentify() | |
| identify.set("name", value: user.name) | |
| identify.set("price", value: user.price) | |
| amplitude.identify(identify) | |
| } | |
| func disassociateUser() { | |
| amplitude.setUserId(nil) | |
| } | |
| } | |
| class TrackingClient: TrackingClientType { | |
| var providers = [TrackingProviderType]() | |
| func add(provider: TrackingProviderType) { | |
| providers.append(provider) | |
| } | |
| func track(event: TrackingEventType) { | |
| for provider in providers { | |
| provider.track(event: event) | |
| } | |
| } | |
| func associate(with user: User) { | |
| for provider in providers { | |
| provider.associate(with: user) | |
| } | |
| } | |
| func disassociateUser() { | |
| for provider in providers { | |
| provider.disassociateUser() | |
| } | |
| } | |
| func setup() { | |
| for provider in providers { | |
| provider.setup() | |
| } | |
| } | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment