175 lines
4.5 KiB
Go
175 lines
4.5 KiB
Go
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,
|
|
})
|
|
}
|