Skip to content

Commit

Permalink
makes paywall events flexible
Browse files Browse the repository at this point in the history
  • Loading branch information
vegaro committed Oct 21, 2024
1 parent 099846e commit ec57fbe
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 23 deletions.
52 changes: 38 additions & 14 deletions Sources/Paywalls/Events/Networking/PaywallEventsRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,39 @@ import Foundation
/// The content of a request to the events endpoints.
struct PaywallEventsRequest {

var events: [Event]
var events: [AnyEncodable]

init(events: [Event]) {
init(events: [AnyEncodable]) {
self.events = events
}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
init(events: [PaywallStoredEvent]) {
self.init(events: events.map { .init(storedEvent: $0) })
self.init(events: events.compactMap { storedEvent in
switch storedEvent.feature {
case .paywalls:
guard let event = PaywallEventRequest.Event(storedEvent: storedEvent) else {
return nil
}
return AnyEncodable(event)
})
}

}

extension PaywallEventsRequest {
protocol FeatureEvent: Encodable {

var id: String? { get }
var version: Int { get }
var appUserID: String { get }
var sessionID: String { get }

}

// This is a `struct` instead of `enum` so that
// we can use make it conform to Encodable
// swiftlint:disable:next convenience_type
struct PaywallEventRequest {

enum EventType: String {

Expand All @@ -39,7 +58,7 @@ extension PaywallEventsRequest {

}

struct Event {
struct Event: FeatureEvent {

let id: String?
let version: Int
Expand All @@ -57,17 +76,22 @@ extension PaywallEventsRequest {

}

extension PaywallEventsRequest.Event {
extension PaywallEventRequest.Event {

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
init(storedEvent: PaywallStoredEvent) {
let creationData = storedEvent.event.creationData
let data = storedEvent.event.data
init?(storedEvent: PaywallStoredEvent) {
guard let eventData = storedEvent.event.value as? [String: Any],
let paywallEvent: PaywallEvent = try? JSONDecoder.default.decode(dictionary: eventData) else {
return nil
}

let creationData = paywallEvent.creationData
let data = paywallEvent.data

self.init(
id: creationData.id.uuidString,
version: Self.version,
type: storedEvent.event.eventType,
type: paywallEvent.eventType,
appUserID: storedEvent.userID,
sessionID: data.sessionIdentifier.uuidString,
offeringID: data.offeringIdentifier,
Expand All @@ -86,7 +110,7 @@ extension PaywallEventsRequest.Event {
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
private extension PaywallEvent {

var eventType: PaywallEventsRequest.EventType {
var eventType: PaywallEventRequest.EventType {
switch self {
case .impression: return .impression
case .cancel: return .cancel
Expand All @@ -99,9 +123,9 @@ private extension PaywallEvent {

// MARK: - Codable

extension PaywallEventsRequest.EventType: Encodable {}

extension PaywallEventsRequest.Event: Encodable {
extension PaywallEventRequest: Encodable {}
extension PaywallEventRequest.EventType: Encodable {}
extension PaywallEventRequest.Event: Encodable {

private enum CodingKeys: String, CodingKey {

Expand Down
2 changes: 1 addition & 1 deletion Sources/Paywalls/Events/PaywallEventSerializer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ enum PaywallEventSerializer {
.orThrow(FailedEncodingEventError())
}

/// Decodes a `PaywallEvent`.
/// Decodes a `PaywallStoredEvent`.
static func decode(_ event: String) throws -> PaywallStoredEvent {
return try JSONDecoder.default.decode(jsonData: event.asData)
}
Expand Down
19 changes: 14 additions & 5 deletions Sources/Paywalls/Events/PaywallEventStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,14 @@ internal actor PaywallEventStore: PaywallEventStoreType {

func store(_ storedEvent: PaywallStoredEvent) async {
do {
Logger.verbose(PaywallEventStoreStrings.storing_event(storedEvent.event))
if let eventDescription = try? storedEvent.event.prettyPrintedJSON {
Logger.verbose(PaywallEventStoreStrings.storing_event(eventDescription))
} else {
Logger.verbose(PaywallEventStoreStrings.storing_event_without_json)
}

await self.handler.append(line: try PaywallEventSerializer.encode(storedEvent))
let event = try PaywallEventSerializer.encode(storedEvent)
await self.handler.append(line: event)
} catch {
Logger.error(PaywallEventStoreStrings.error_storing_event(error))
}
Expand Down Expand Up @@ -167,7 +172,8 @@ private enum PaywallEventStoreStrings {
case removing_old_documents_store(URL)
case error_removing_old_documents_store(Error)

case storing_event(PaywallEvent)
case storing_event(String)
case storing_event_without_json

case error_storing_event(Error)
case error_fetching_events(Error)
Expand All @@ -191,8 +197,11 @@ extension PaywallEventStoreStrings: LogMessage {
case let .error_removing_old_documents_store(error):
return "Failed removing old store: \((error as NSError).description)"

case let .storing_event(event):
return "Storing event: \(event.debugDescription)"
case let .storing_event(eventDescription):
return "Storing event: \(eventDescription)"

case .storing_event_without_json:
return "Storing an event. There was an error trying to print it"

case let .error_storing_event(error):
return "Error storing event: \((error as NSError).description)"
Expand Down
4 changes: 3 additions & 1 deletion Sources/Paywalls/Events/PaywallEventsManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ actor PaywallEventsManager: PaywallEventsManagerType {
}

func track(paywallEvent: PaywallEvent) async {
await self.store.store(.init(event: paywallEvent, userID: self.userProvider.currentAppUserID))
await self.store.store(.init(event: AnyEncodable(paywallEvent),
userID: self.userProvider.currentAppUserID,
feature: .paywalls))
}

func flushEvents(count: Int) async throws -> Int {
Expand Down
20 changes: 18 additions & 2 deletions Sources/Paywalls/Events/PaywallStoredEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,18 @@

import Foundation

/// Contains the necessary information for `PaywallEventStore`.
/// Contains the necessary information for storing and sending events.
struct PaywallStoredEvent {

var event: PaywallEvent
var event: AnyEncodable
var userID: String
var feature: Feature

}

enum Feature: String, Codable {

case paywalls

}

Expand All @@ -31,7 +38,16 @@ extension PaywallStoredEvent: Codable {

case event
case userID = "userId"
case feature

}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

self.event = try container.decode(AnyEncodable.self, forKey: .event)
self.userID = try container.decode(String.self, forKey: .userID)
self.feature = try container.decodeIfPresent(Feature.self, forKey: .feature) ?? .paywalls
}

}

0 comments on commit ec57fbe

Please sign in to comment.