Skip to content

Commit 9afa7ac

Browse files
committed
Extend device detection module with new fields
1 parent 615e5df commit 9afa7ac

File tree

6 files changed

+36
-6
lines changed

6 files changed

+36
-6
lines changed

modules/fiftyonedegrees/devicedetection/device_detector.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ func buildEngineOptions(moduleConfig *config, configHash *dd.ConfigHash) []onpre
6868
"HardwareModel",
6969
"HardwareFamily",
7070
"HardwareModelVariants",
71+
"HardwareNamePrefix",
72+
"HardwareNameVersion",
7173
"ScreenInchesHeight",
7274
"IsCrawler",
7375
}),

modules/fiftyonedegrees/devicedetection/device_info_extractor.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const (
4444
deviceInfoHardwareFamily deviceInfoProperty = "HardwareFamily"
4545
deviceInfoHardwareModelVariants deviceInfoProperty = "HardwareModelVariants"
4646
deviceInfoScreenInchesHeight deviceInfoProperty = "ScreenInchesHeight"
47+
deviceInfoHardwareNamePrefix deviceInfoProperty = "HardwareNamePrefix"
48+
deviceInfoHardwareNameVersion deviceInfoProperty = "HardwareNameVersion"
4749
)
4850

4951
func (x deviceInfoExtractor) extract(results Results, ua string) (*deviceInfo, error) {
@@ -69,6 +71,8 @@ func (x deviceInfoExtractor) extract(results Results, ua string) (*deviceInfo, e
6971
hardwareFamily := x.getValue(results, deviceInfoHardwareFamily)
7072
hardwareModelVariants := x.getValue(results, deviceInfoHardwareModelVariants)
7173
screenInchedHeight, _ := strconv.ParseFloat(x.getValue(results, deviceInfoScreenInchesHeight), 10)
74+
hardwareNamePrefix := x.getValue(results, deviceInfoHardwareNamePrefix)
75+
hardwareNameVersion := x.getValue(results, deviceInfoHardwareNameVersion)
7276

7377
p := &deviceInfo{
7478
HardwareVendor: hardwareVendor,
@@ -90,6 +94,8 @@ func (x deviceInfoExtractor) extract(results Results, ua string) (*deviceInfo, e
9094
HardwareModel: hardwareModel,
9195
HardwareFamily: hardwareFamily,
9296
HardwareModelVariants: hardwareModelVariants,
97+
HardwareNamePrefix: hardwareNamePrefix,
98+
HardwareNameVersion: hardwareNameVersion,
9399
ScreenInchesHeight: screenInchedHeight,
94100
}
95101

modules/fiftyonedegrees/devicedetection/device_info_extractor_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ func mockValues(results *ResultsHashMock) {
107107
mockValue(results, "HardwareModel", "Macbook")
108108
mockValue(results, "HardwareFamily", "Macbook")
109109
mockValue(results, "HardwareModelVariants", "Macbook")
110+
mockValue(results, "HardwareNamePrefix", "Macbook")
111+
mockValue(results, "HardwareNameVersion", "Pro")
110112
mockValue(results, "ScreenInchesHeight", "12")
111113
}
112114

@@ -124,6 +126,8 @@ func assertDeviceInfo(t *testing.T, deviceInfo *deviceInfo) {
124126
assert.Equal(t, deviceInfo.PixelRatio, float64(223))
125127
assert.Equal(t, deviceInfo.Javascript, true)
126128
assert.Equal(t, deviceInfo.GeoLocation, true)
129+
assert.Equal(t, deviceInfo.HardwareNamePrefix, "Macbook")
130+
assert.Equal(t, deviceInfo.HardwareNameVersion, "Pro")
127131
}
128132

129133
func mockValue(results *ResultsHashMock, name string, value string) {

modules/fiftyonedegrees/devicedetection/hook_raw_auction_request.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ func setMissingFields(deviceObj map[string]any, fiftyOneDd *deviceInfo) map[stri
117117
return val
118118
},
119119
"model": func() any {
120+
if fiftyOneDd.HardwareNamePrefix != "" && fiftyOneDd.HardwareNamePrefix != ddUnknown {
121+
return fiftyOneDd.HardwareNamePrefix
122+
}
123+
// Fallback: HardwareModel → HardwareName
120124
newVal := fiftyOneDd.HardwareModel
121125
if newVal == ddUnknown {
122126
newVal = fiftyOneDd.HardwareName
@@ -126,6 +130,12 @@ func setMissingFields(deviceObj map[string]any, fiftyOneDd *deviceInfo) map[stri
126130
}
127131
return nil
128132
},
133+
"hwv": func() any {
134+
if fiftyOneDd.HardwareNameVersion != "" && fiftyOneDd.HardwareNameVersion != ddUnknown {
135+
return fiftyOneDd.HardwareNameVersion
136+
}
137+
return nil
138+
},
129139
"ppi": func() any {
130140
if fiftyOneDd.ScreenPixelsHeight > 0 && fiftyOneDd.ScreenInchesHeight > 0 {
131141
ppi := float64(fiftyOneDd.ScreenPixelsHeight) / fiftyOneDd.ScreenInchesHeight

modules/fiftyonedegrees/devicedetection/models.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ type deviceInfo struct {
6262
HardwareFamily string
6363
HardwareModel string
6464
HardwareModelVariants string
65+
HardwareNamePrefix string
66+
HardwareNameVersion string
6567
UserAgent string
6668
DeviceId string
6769
ScreenInchesHeight float64

modules/fiftyonedegrees/devicedetection/module_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ func TestHandleRawAuctionHookEnrichment(t *testing.T) {
252252
deviceDetectorM.On("getDeviceInfo", mock.Anything, mock.Anything).Return(
253253
&deviceInfo{
254254
HardwareVendor: "Apple",
255-
HardwareName: "Macbook",
255+
HardwareName: "Macbook Pro",
256256
DeviceType: "device",
257257
PlatformVendor: "Apple",
258258
PlatformName: "MacOs",
@@ -268,6 +268,8 @@ func TestHandleRawAuctionHookEnrichment(t *testing.T) {
268268
HardwareFamily: "Macbook",
269269
HardwareModel: "Macbook",
270270
HardwareModelVariants: "Macbook",
271+
HardwareNamePrefix: "Macbook",
272+
HardwareNameVersion: "Pro",
271273
UserAgent: "ua",
272274
DeviceId: "",
273275
},
@@ -401,7 +403,7 @@ func TestHandleRawAuctionHookEnrichment(t *testing.T) {
401403
"architecture": "arm",
402404
"model": ""
403405
}
404-
,"devicetype":2,"ua":"ua","make":"Apple","model":"Macbook","os":"MacOs","osv":"14","h":1080,"w":1024,"pxratio":223,"js":1,"geoFetch":1}
406+
,"devicetype":2,"ua":"ua","make":"Apple","model":"Macbook","hwv":"Pro","os":"MacOs","osv":"14","h":1080,"w":1024,"pxratio":223,"js":1,"geoFetch":1}
405407
}`)
406408

407409
var deviceDetectorErrM mockDeviceDetector
@@ -454,7 +456,7 @@ func TestHandleRawAuctionHookEnrichmentWithErrors(t *testing.T) {
454456
mockDeviceDetector.On("getDeviceInfo", mock.Anything, mock.Anything).Return(
455457
&deviceInfo{
456458
HardwareVendor: "Apple",
457-
HardwareName: "Macbook",
459+
HardwareName: "Macbook Pro",
458460
DeviceType: "device",
459461
PlatformVendor: "Apple",
460462
PlatformName: "MacOs",
@@ -470,6 +472,8 @@ func TestHandleRawAuctionHookEnrichmentWithErrors(t *testing.T) {
470472
HardwareFamily: "Macbook",
471473
HardwareModel: "Macbook",
472474
HardwareModelVariants: "Macbook",
475+
HardwareNamePrefix: "Macbook",
476+
HardwareNameVersion: "Pro",
473477
UserAgent: "ua",
474478
DeviceId: "",
475479
ScreenInchesHeight: 7,
@@ -500,7 +504,7 @@ func TestHandleRawAuctionHookEnrichmentWithErrors(t *testing.T) {
500504

501505
mutationResult, err := mutation.Apply(hookstage.RawAuctionRequestPayload(`{"device":{}}`))
502506
assert.NoError(t, err)
503-
require.JSONEq(t, string(mutationResult), `{"device":{"devicetype":2,"ua":"ua","make":"Apple","model":"Macbook","os":"MacOs","osv":"14","h":1080,"w":1024,"pxratio":223,"js":1,"geoFetch":1,"ppi":154,"ext":{"fiftyonedegrees_deviceId":""}}}`)
507+
require.JSONEq(t, string(mutationResult), `{"device":{"devicetype":2,"ua":"ua","make":"Apple","model":"Macbook","hwv":"Pro","os":"MacOs","osv":"14","h":1080,"w":1024,"pxratio":223,"js":1,"geoFetch":1,"ppi":154,"ext":{"fiftyonedegrees_deviceId":""}}}`)
504508
}
505509

506510
func TestConfigHashFromConfig(t *testing.T) {
@@ -633,7 +637,7 @@ func TestBuilderHandleDeviceDetectorError(t *testing.T) {
633637
func TestHydrateFields(t *testing.T) {
634638
deviceInfo := &deviceInfo{
635639
HardwareVendor: "Apple",
636-
HardwareName: "Macbook",
640+
HardwareName: "Macbook Pro",
637641
DeviceType: "device",
638642
PlatformVendor: "Apple",
639643
PlatformName: "MacOs",
@@ -649,6 +653,8 @@ func TestHydrateFields(t *testing.T) {
649653
HardwareFamily: "Macbook",
650654
HardwareModel: "Macbook",
651655
HardwareModelVariants: "Macbook",
656+
HardwareNamePrefix: "Macbook",
657+
HardwareNameVersion: "Pro",
652658
UserAgent: "ua",
653659
DeviceId: "dev-ide",
654660
}
@@ -699,7 +705,7 @@ func TestHydrateFields(t *testing.T) {
699705

700706
require.JSONEq(
701707
t,
702-
`{"devicetype":2,"dnt":0,"ext":{"fiftyonedegrees_deviceId":"dev-ide","h":"901","w":843},"geoFetch":1,"h":901,"js":1,"language":"en","make":"Apple","model":"Macintosh","os":"MacOs","osv":"14","pxratio":223,"sua":{"browsers":[{"brand":"Not/A)Brand","version":["99","0","0","0"]},{"brand":"Samsung Internet","version":["23","0","1","1"]},{"brand":"Chromium","version":["115","0","5790","168"]}],"mobile":1,"model":"SM-A037U","platform":{"brand":"Android","version":["13","0","0"]},"source":2},"ua":"Mozilla/5.0 (Linux; Android 13; SAMSUNG SM-A037U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36","w":843}`,
708+
`{"devicetype":2,"dnt":0,"ext":{"fiftyonedegrees_deviceId":"dev-ide","h":"901","w":843},"geoFetch":1,"h":901,"hwv":"Pro","js":1,"language":"en","make":"Apple","model":"Macintosh","os":"MacOs","osv":"14","pxratio":223,"sua":{"browsers":[{"brand":"Not/A)Brand","version":["99","0","0","0"]},{"brand":"Samsung Internet","version":["23","0","1","1"]},{"brand":"Chromium","version":["115","0","5790","168"]}],"mobile":1,"model":"SM-A037U","platform":{"brand":"Android","version":["13","0","0"]},"source":2},"ua":"Mozilla/5.0 (Linux; Android 13; SAMSUNG SM-A037U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36","w":843}`,
703709
string(deviceHolder.Device),
704710
)
705711
}

0 commit comments

Comments
 (0)