package devtodev import "encoding/json" // Payload is the top-level request body for Data API 2.0. type Payload struct { Reports []Report `json:"reports"` } // Report groups events for a device (or a player). type Report struct { DeviceID string `json:"deviceId"` UserID string `json:"userId,omitempty"` PreviousDeviceID string `json:"previousDeviceId,omitempty"` PreviousUserID string `json:"previousUserId,omitempty"` DevtodevID string `json:"devtodevId,omitempty"` Packages []DevtodevPackage `json:"packages"` } // DevtodevPackage groups events under package-level metadata. type DevtodevPackage struct { platform string language string country string ip string appVersion string appBuildVersion string sdkVersion string bundle string engine string installationSource string events []Event reporter *Reporter } // Event is the common event interface used by package builders. type Event interface { Payload() map[string]interface{} Err() error } // RawEvent is a generic event implementation backed by a plain map. type RawEvent map[string]interface{} func (e RawEvent) Payload() map[string]interface{} { return map[string]interface{}(e) } func (e RawEvent) Err() error { return nil } type builtEvent struct { payload map[string]interface{} err error } func (e builtEvent) Payload() map[string]interface{} { return e.payload } func (e builtEvent) Err() error { return e.err } func (p *DevtodevPackage) WithPlatform(platform string) *DevtodevPackage { p.platform = platform return p } func (p *DevtodevPackage) WithLanguage(language string) *DevtodevPackage { p.language = language return p } func (p *DevtodevPackage) WithCountry(country string) *DevtodevPackage { p.country = country return p } func (p *DevtodevPackage) WithIP(ip string) *DevtodevPackage { p.ip = ip return p } func (p *DevtodevPackage) WithAppVersion(appVersion string) *DevtodevPackage { p.appVersion = appVersion return p } func (p *DevtodevPackage) WithAppBuildVersion(appBuildVersion string) *DevtodevPackage { p.appBuildVersion = appBuildVersion return p } func (p *DevtodevPackage) WithSDKVersion(sdkVersion string) *DevtodevPackage { p.sdkVersion = sdkVersion return p } func (p *DevtodevPackage) WithBundle(bundle string) *DevtodevPackage { p.bundle = bundle return p } func (p *DevtodevPackage) WithEngine(engine string) *DevtodevPackage { p.engine = engine return p } func (p *DevtodevPackage) WithInstallationSource(installationSource string) *DevtodevPackage { p.installationSource = installationSource return p } func (p *DevtodevPackage) Append(events ...Event) *DevtodevPackage { if p == nil { return nil } for _, evt := range events { if evt == nil { continue } p.events = append(p.events, evt) } return p } func (p *DevtodevPackage) Events() []Event { if p == nil { return nil } return p.events } func (p DevtodevPackage) MarshalJSON() ([]byte, error) { type packageJSON struct { Platform string `json:"platform,omitempty"` Language string `json:"language,omitempty"` Country string `json:"country,omitempty"` IP string `json:"ip,omitempty"` AppVersion string `json:"appVersion,omitempty"` AppBuildVersion string `json:"appBuildVersion,omitempty"` SDKVersion string `json:"sdkVersion,omitempty"` Bundle string `json:"bundle,omitempty"` Engine string `json:"engine,omitempty"` InstallationSource string `json:"installationSource,omitempty"` Events []map[string]interface{} `json:"events"` } events := make([]map[string]interface{}, 0, len(p.events)) for _, evt := range p.events { if evt == nil { events = append(events, nil) continue } events = append(events, evt.Payload()) } return json.Marshal(packageJSON{ Platform: p.platform, Language: p.language, Country: p.country, IP: p.ip, AppVersion: p.appVersion, AppBuildVersion: p.appBuildVersion, SDKVersion: p.sdkVersion, Bundle: p.bundle, Engine: p.engine, InstallationSource: p.installationSource, Events: events, }) }