bygdata/pkg/devtodev/types.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,
})
}