Skip to content

Instantly share code, notes, and snippets.

@frootloops
Created August 31, 2017 14:36
Show Gist options
  • Select an option

  • Save frootloops/6418491def7d6ef29667c90a4842a23a to your computer and use it in GitHub Desktop.

Select an option

Save frootloops/6418491def7d6ef29667c90a4842a23a to your computer and use it in GitHub Desktop.
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