-
Notifications
You must be signed in to change notification settings - Fork 850
New Adapter: Zentotem #4053
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New Adapter: Zentotem #4053
Conversation
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
fix after review
fix after review
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
add adapter for zentotem
fix after review
fix after review
replace v2 to v3
# Conflicts: # adapters/zentotem/params_test.go # adapters/zentotem/zentotem.go # adapters/zentotem/zentotem_test.go # exchange/adapter_builders.go
Code coverage summaryNote:
zentotemRefer here for heat map coverage report |
| @@ -0,0 +1,16 @@ | |||
| endpoint: "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g" | |||
| maintainer: | |||
| email: [email protected] | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I sent email. Please response.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@przemkaczmarek hello, we sent a response letter for verification
| @@ -0,0 +1,16 @@ | |||
| endpoint: "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g" | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@przemkaczmarek Hello! This is a correct response because no body was sent in the request.
|
@ccorbo can you please review? |
| for i := range seatBid.Bid { | ||
| bidType, err := getMediaTypeForBid(seatBid.Bid[i]) | ||
| if err != nil { | ||
| errors = append(errors, err) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: you're collecting errors, then not returning the errors below. Can you update to return the errors, or remove this
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed it
| retract v3.0.0 // Forgot to update major version in import path and module name | ||
|
|
||
| require ( | ||
| github.com/51Degrees/device-detection-go/v4 v4.4.35 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why were these moved from the indirect section to the direct section?
adapters/zentotem/zentotem_test.go
Outdated
|
|
||
| func TestJsonSamples(t *testing.T) { | ||
| bidder, buildErr := Builder(openrtb_ext.BidderZentotem, config.Adapter{ | ||
| Endpoint: "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suggest using fake urls for your tests for maintenance reasons.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
replaced by a fake url
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the significance of the numbers in the file names of the exemplary JSON test files?
I think you can get rid of these numbers and some of these tests. For example, I ran a diff on adapters/zentotem/zentotemtest/exemplary/banner-200-212.json and adapters/zentotem/zentotemtest/exemplary/banner-201-202-203.json and they appear to be the same except for id, adid and crid which should not have any impact on your code coverage.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The numbers denote banner subtypes in our system. We left one test
adapters/zentotem/params_test.go
Outdated
| ) | ||
|
|
||
| //Zentotem doesn't currently require any custom fields. This file is included for conformity only | ||
| //We do include an unused, non-required custom param in static/bidder-params/zentotem.json, but only to hinder the prebid server from crashing by looking for at least 1 custom param |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like this was copied from another adapter, vrtcal, which was created six years ago. Is a custom param still needed to keep prebid server from crashing? I suspect not; I will investigate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right, the custom parameter has no effect on the prebid server crash, so we removed the params tests, since we don't handle any custom parameters at all
adapters/zentotem/zentotem_test.go
Outdated
| wantErr bool | ||
| }{ | ||
| { | ||
| name: "get bid native type", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: t.Run will substitute underscores for spaces in the test name so we advise using underscores instead of spaces to separate words in name so when a test fails we can simply copy the test name from the output and search for it in the code base.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed it
adapters/zentotem/zentotem.go
Outdated
| endpoint string | ||
| } | ||
|
|
||
| // Builder builds a new instance of the {bidder} adapter for the given bidder with the given config. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: {bidder} should be Zentotem
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suggest keeping your tests lean. For example, I don't see much value in having all of those device fields in your tests as they are not fields that are explicitly touched in your adapter. You can probably remove some of them and other pieces of data to reduce the noise.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We removed unnecessary tests
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you need video-300.json and video-301.json? I think you can delete one of these and just have video.json. They are almost identical tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left one test
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Based on your adapter's behavior and the fact that calls aren't being made to your server during the test suite run, I consider the following tests to basically be the same, in which case I suggest replacing these with a single 204.json test:
adapters/zentotem/zentotemtest/supplemental/banner-empty-width-height-204.json
adapters/zentotem/zentotemtest/supplemental/banner-invalid-width-204.json
adapters/zentotem/zentotemtest/supplemental/banner-invalid-height-204.json
The lone differences here are what the width and height are set to but they have no bearing on the mock response.
The same applies to:
adapters/zentotem/zentotemtest/supplemental/video-empty-protocol-204.json
adapters/zentotem/zentotemtest/supplemental/video-invalid-mimes-204.json
adapters/zentotem/zentotemtest/supplemental/video-without-mimes-204.json
You shouldn't need separate 204 tests for these scenarios. The single 204.json should suffice.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left one test for 204 status code
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The three 400 status code tests could probably be combined as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left one 400 status code test
|
@zentotem please see my comments above. |
|
@zentotem just a reminder to see my comments above. |
|
@zentotem please see the above comments. |
|
@zentotem are you still planning to move forward with this PR? |
|
@zentotem I sent an email to the provided email address reminding about the unresolved comments. We will close this PR in two weeks if we do not receive a response. If we close it you can always open it again at a later date if you decide to continue work. |
|
Hi! We will get back to solving the problems now |
fix after review
adapters/zentotem/zentotem.go
Outdated
|
|
||
| // Builder builds a new instance of the {bidder} adapter for the given bidder with the given config. | ||
| func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { | ||
| bidder := &ZentotemAdapter{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can call this simply "adapter", the ZentotemAdapter identification is already supplied by the package name. As you have it, referencing your adapter from outside the package would be ZentotemAdapter.ZentotemAdapter which looks a little redundant. See example below:
package foo
type adapter struct {
endpoint string
}
func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
return &adapter{endpoint: "https://www.foo.com/"}, nil
}
Code coverage summaryNote:
zentotemRefer here for heat map coverage report |
fix after review
Code coverage summaryNote:
zentotemRefer here for heat map coverage report |
Code coverage summaryNote:
zentotemRefer here for heat map coverage report |
|
All comments have been fixed, await approve |
hhhjort
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
* Dianomi: Update user syncs to send gdpr_consent (prebid#4345) * MobileFuse: Remove tagid_src and pub_id params (prebid#4303) * Remove tagid_src ext from MobileFuse Adapter * remove pub_id query param * removed comment * Simplify Endpoint assignment in MobileFuseAdapter * New Adapter: Flatads (prebid#4243) Co-authored-by: wuzhijian <[email protected]> * Rubicon: Add bid meta seat (prebid#4348) * Gothamads: Add Intenze alias (prebid#4319) * GumGum: Collect ad unit name for reporting (prebid#4302) * Seedtag: Fix required content-type header on http calls (prebid#4299) * Kobler: Remove sensitive device and user data (prebid#4295) * New Adapter: Nexx360 (prebid#4286) Co-authored-by: Gabriel Chicoye <[email protected]> * HTTP Fetcher: Implement RFC 3986 compatibility as optional (prebid#4272) * Targeting: Add configurable targeting prefix (prebid#4355) * Pubmatic: Set bid.meta.mediaType=video when bid.ext.ibv=true (prebid#4189) * Rules Engine Module: Phase 1 (prebid#4407) Co-authored-by: Veronika Solovei <[email protected]> Co-authored-by: guscarreon <[email protected]> * New Adapter: Sparteo (prebid#4275) * PubMatic: Fix missing bid type in bid response (prebid#4417) * Fix: Remove module per request JSON marshal and add custom viper decoder (prebid#4422) * RichAudience: change endpoint to https (prebid#4384) Co-authored-by: IAN <[email protected]> * Missena: Pass full openrtb request (prebid#4394) * New Adapter: Rediads (prebid#4233) * Zeta Global SSP: Declare OpenRTB 2.6 and GPP support (prebid#4389) * Record metric unsuccessful for PBC non-200 response status code or error (prebid#4341) Co-authored-by: oleksandr <[email protected]> * New Adapter: Akcelo (prebid#4237) * New Adapter: Zentotem (prebid#4053) * New Adapter: Exco (prebid#4250) * Floors: Fix panic while getting adunit code for signaling (prebid#4424) * Stroeercore: Add adomain to bids (prebid#4392) * VIS.X: Relay bid currency from bid response (prebid#4381) * TMax: Add default host config (prebid#4430) * Fix the package (iterators) to agree with the dir (iterutil). (prebid#4447) * TheTradeDesk: Throw error for malformed endpoint url (prebid#4419) * Smartadserver : Send multi-impression requests without flattening (prebid#4402) Co-authored-by: nlesommer <[email protected]> Co-authored-by: gtodeschi <[email protected]> * RTB House: Remove PAAPI signals from imp[].ext (prebid#4399) * GumGum: Enable Opt-In change notification (prebid#4390) * Tappx: Add GPID support (prebid#4438) Co-authored-by: Jordi Arnau <[email protected]> * New Adapter: progx - Vidazoo alias (prebid#4428) * New Adapter: Kuantyx - Aso alias (prebid#4420) * MinuteMedia: Add test endpoint (prebid#4425) * Adagio: Add site bidder param and web inventory tests (prebid#4403) Co-authored-by: Godefroi Roussel <[email protected]> * Modularity: Add hook code to module invocation context (prebid#4036) * Rubicon: Pass ext.prebid.multibid[].maxbids to XAPI (prebid#4412) * OpenX: Add gpp params to user sync (prebid#4445) Co-authored-by: gmiedlar-ox <[email protected]> * New Adapter: Blis (prebid#4304) Co-authored-by: Tomas Koutny <[email protected]> * Ogury: Support gpp for cookie sync (prebid#4406) * TheTradeDesk: Resolve AUCTION_PRICE macro (prebid#4448) * Fix: Set account http fetcher defaults enabling env vars (prebid#4460) * Bidder throttling code to increase network stability. (prebid#4415) * Adding request throttling to bidder requests * Add latency health * Adds new config options, metrics, and fixes * Set default window to 1000 and fix error type typo * Addresses PR comments * More PR feedback * Proper handling of the atomic uint in tests * Yieldlab: Forward ADomain to OpenRTB bid (prebid#4404) * Yandex: Add video support (prebid#4344) * Request: Add hb_env=amp targeting to AMP responses (prebid#4414) * Pubmatic: Forward skadn object in bid request (prebid#4453) * Adds missing defaults to network throttling code (prebid#4477) * New Adapter: Tagoras - Vidazoo alias (prebid#4329) Co-authored-by: anna-y-perion <[email protected]> * New Adapter: Omnidex - Vidazoo alias (prebid#4441) * Define An Adapter As White Label Only (prebid#4461) * Rules Engine Module: Result functions fix (prebid#4451) * Account: Support bid rounding options (prebid#4470) * Sovrn: Fix passing through imp.ext.gpid (prebid#4413) * Smartadserver: Add second endpoint for programmatic guaranteed (prebid#4467) Co-authored-by: Guillaume Laubier <[email protected]> * sspBC: Updates moving operations to backend service (prebid#4351) * New Adapter: Adipolo - Xeworks alias (prebid#4350) Co-authored-by: And-Rud <[email protected]> Co-authored-by: rbstdev <[email protected]> * Modules: Exitpoint Stage (prebid#4435) * New Adapter: Afront (prebid#4380) * Harden HTTP Response Body Handling (prebid#4489) * New Adapter: TeqBlaze (prebid#4480) * Onetag: imp.ext read generalization (prebid#4446) Co-authored-by: lorenzob <[email protected]> * Rules Engine Module: Configurable cache update frequency (prebid#4423) Co-authored-by: VeronikaSolovei9 <[email protected]> * New Adapter: RocketLab (prebid#4383) * change zmaticoo.yaml endpoint (prebid#4471) Co-authored-by: Quentin.zuo <[email protected]> * Metrics: Record GVL fetch count (prebid#4500) * TheTradeDesk: Resolve burl if not resolved (prebid#4481) * New Adapter: pinkLion (prebid#4376) * Metrics: Record HTTP connections wanted and obtained (prebid#4518) * Metrics: Record incoming request sizes (prebid#4495) * Modules: Execute mutations in the order they are listed (prebid#4279) * 4278 Execute mutations in the sequence they are listed. * Ensure that the rejected channel is closed (once) on reject * Use stack var. * Add comments. * Ensure rejected is closed. * Just return explicitly in all 3 cases. * Keep the same style - of passing the params to the go routine. * Revert "Modules: Execute mutations in the order they are listed (prebid#4279)" (prebid#4529) This reverts commit 93c17c2. * Revert "Metrics: Record HTTP connections wanted and obtained (prebid#4518)" (prebid#4538) * New Adapter: Nativery (prebid#4321) Co-authored-by: Andrea Fassina <[email protected]> Co-authored-by: nicoladellamorte <[email protected]> * E-Planning: Add support for adomain (prebid#4472) * SmileWanted: Append zoneId to endpoint path (prebid#4468) Co-authored-by: QuentinGallard <[email protected]> * Add configurable dialer timeouts to HTTP clients (prebid#4511) * New Adapter: 360playvid (prebid#4395) * New Adapter: MediaYo (prebid#4391) * 33across: Make zoneId the preferred option (prebid#4531) * 33across: Remove deprecated video.placement (prebid#4530) * New Adapter: RobustApps - Xeworks alias (prebid#4434) Co-authored-by: And-Rud <[email protected]> Co-authored-by: rbstdev <[email protected]> * Adagio: Remove max length on params (prebid#4524) Co-authored-by: Godefroi Roussel <[email protected]> * fwssp: Add iframe usersync (prebid#4487) Co-authored-by: wenyuanzhang <[email protected]> * Module: Scope3 Real-Time Data (prebid#4397) * Add Scope3 Real-Time Data (RTD) module This module integrates Scope3's Real-Time Data API to provide audience segments for targeting in Prebid Server auctions. Features: - Fetches real-time audience segments from Scope3 API - Adds targeting data to bid requests via hooks system - Thread-safe segment storage during auction lifecycle - Configurable timeout and endpoint settings - Graceful error handling that doesn't fail auctions The module implements three hook stages: - Entrypoint: Initialize module context - Raw Auction Request: Fetch segments from Scope3 API - Processed Auction Request: Add segments to targeting data 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Add LiveRamp ATS integration and execution order documentation - Document proper execution order when using with LiveRamp ATS - Add user identifier detection for RampID integration - Include configuration examples for sequential module execution - Enhance API requests with available user identifiers - Add comprehensive documentation for Yahoo deployment scenario 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Add LiveRamp ATS envelope support for publishers without sidecar - Support forwarding encrypted ATS envelopes directly to Scope3 API - Check multiple envelope locations: user.ext.liveramp_idl, user.ext.ats_envelope, ext.liveramp_idl - Prioritize sidecar RampID over envelope when both available - Document both sidecar and envelope integration patterns - Add note about Scope3 needing LiveRamp partner authorization This enables publishers without LiveRamp sidecar to still benefit from LiveRamp ATS user signals via encrypted envelope forwarding. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Clean up debug code and finalize production-ready Scope3 RTD module - Remove all debug logging statements - Streamline segment storage and retrieval between hooks - Finalize request-level targeting for GAM integration - Production-ready code with proper error handling - Complete documentation with configuration examples The module is now ready for production deployment with: - Successful Scope3 API integration - LiveRamp ATS compatibility (sidecar and envelope) - GAM targeting data output - Thread-safe segment management 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Simplify targeting output to single GAM-compatible format - Remove duplicate data.scope3_segments array format - Keep only targeting.hb_scope3_segments as comma-separated string - Follows standard header bidding targeting key conventions - Optimized for GAM key-value targeting integration 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Add unit tests for Scope3 RTD module - Add basic unit tests for module builder and hook functions - Test invalid config handling and error cases - Test entrypoint hook initialization - Test processed auction hook with no segments - Satisfy CI requirements for test coverage 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix Go formatting issues - Remove trailing whitespace in module.go - Add missing newline at end of module_test.go - Satisfy gofmt validation requirements 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Address PR feedback: Add caching, improve LiveRamp integration, enhance configurability Key improvements based on reviewer feedback: - Add intelligent caching with configurable TTL to handle repeated requests - Set 60-second default cache TTL for frequency cap compatibility - Improve LiveRamp identifier detection across multiple locations - Remove unsubstantiated partnership claims and improve documentation - Add cache_ttl_seconds and bid_meta_data configuration options - Implement MD5-based cache keys from user IDs and site context - Add comprehensive test coverage for new caching functionality - Update documentation to explain targeting vs bid.meta approach - Change default timeout to 1000ms for better API compatibility Addresses concerns about: - Performance with hundreds of identical requests per user session - Flexibility in targeting data output (bid.meta future enhancement noted) - Accurate LiveRamp integration documentation - Proper hook implementation code naming 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Complete PR feedback implementation: Response-level segments with GAM targeting Major changes to address all PR reviewer feedback: **Response Format Changes:** - Move from request targeting to auction response data per reviewer feedback - Change hook stage from processed_auction_request to auction_response - Add segments to response.ext.scope3.segments for publisher control - Add individual GAM targeting keys when add_to_targeting=true (e.g., gmp_eligible=true) **Configuration Updates:** - Rename bid_meta_data to add_to_targeting for clarity - Add comprehensive GAM integration with individual segment keys - Remove incorrect LiveRamp RTD adapter references from README - Update hook configuration examples to use auction_response stage **API Integration Fixes:** - Correct segment parsing to exclude destination field (triplelift.com) - Extract only actual segments from imp[].ext.scope3.segments[] - Maintain working authentication and caching functionality **Enhanced Testing:** - Add comprehensive mock API integration tests - Test both response formats (scope3 + targeting sections) - Test error handling with mock server responses - Apply gofmt formatting to all code **Publisher Benefits:** - Full control over segment usage via response.ext.scope3.segments - Optional automated GAM integration via individual targeting keys - Flexible configuration for different use cases - Maintains caching for high-frequency scenarios Addresses all PR reviewer concerns while providing maximum publisher flexibility. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Address PR feedback: Add optimized HTTP Transport for high-frequency API calls Per reviewer feedback (@gravelg): 'if we're going to be make a lot of calls, we should use a Transport with better defaults' - MaxIdleConns: 100 (increased connection pool) - MaxIdleConnsPerHost: 10 (multiple connections per host) - IdleConnTimeout: 90s (longer connection reuse) - ForceAttemptHTTP2: true (HTTP/2 for better performance) - DisableCompression: false (bandwidth optimization) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * run gofmt * update default endpoint * fix test * address comments * more review comments * address more comments * remove unused enhanceRequestWithUserIDs method * jsonutil, add more tests * Add privacy field masking for Scope3 RTD module Implement comprehensive privacy protection by masking sensitive user data before sending bid requests to the Scope3 API while preserving essential targeting capabilities. Features: - Configurable field masking with privacy-first defaults - Geographic data truncation with configurable precision (default: 2 decimals ~1.1km) - Identity provider filtering with allowlist for preserved EIDs - Always removes: IP addresses, user IDs, demographics, first-party data - Always preserves: device characteristics, country/region, site/app context - Comprehensive test coverage (92.3%) with edge case handling - All linting checks pass with zero issues 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix cache key generation for proper per-user caching - Use SHA-256 hashed user.id as fallback when privacy-safe identifiers are unavailable - Maintains per-user cache segmentation for performance while protecting privacy - Privacy-safe identifiers (RampID, LiverampIDL) take priority over hashed user.id - Prevents accidental data leakage by returning nil on masking failures - Add configuration validation for geo precision (max 4 decimal places) - Add comprehensive tests for cache key behavior and configuration validation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * Fix gofmt formatting in module_test.go 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]> * review fixes * more review comments * make it async * address more comments --------- Co-authored-by: Claude <[email protected]> Co-authored-by: Gabriel Gravel <[email protected]> * Metrics: Add connection dial metrics by adapter (prebid#4528) * KueezRTB: Remove additionalProperties from schema (prebid#4490) * Kargo: Add email to codepath notification workflow (prebid#4484) Co-authored-by: Nick Llerandi <[email protected]> * New Adapter: Contxtful (prebid#4443) Co-authored-by: rufiange <[email protected]> * Modules: Exitpoint Hook typo fix (prebid#4542) * Consumable: Declare geoscope (prebid#4496) * Connatix: Copy entire imp[i].ext (prebid#4521) * Fix: Preload Prometheus adapter connection dial metric labels when enabled (prebid#4543) Co-authored-by: oleksandr <[email protected]> * Host Option To Use OS Certs (prebid#4536) * CPMStar: imp.ext passthrough (prebid#4450) * MetaX: Add redirect user sync (prebid#4550) Signed-off-by: Kehan Pan <[email protected]> * New Adapter: Xapads - AdKernel alias (prebid#4534) * Connatix: Add GPP macros (prebid#4525) * OpenX: Return buyer exts in response (prebid#4507) Co-authored-by: Rafal Sieczka <[email protected]> * Yandex: Set referer and target-ref to site.page (prebid#4488) * Nextmillennium: New fields and adapter version update (prebid#4486) * Accounts: Add coop cookiesync priority groups (prebid#4561) * Mobkoi: Remove url endpoint override (prebid#4555) * GDPR: Move enforcement processing upstream (prebid#4567) * Actions: Add publish to docker hub workflow (prebid#4558) * Omnidex: Add GVL ID (prebid#4568) * Adagio: Fix typo (prebid#4570) * Improve Digital: Switch to HTTPS (prebid#4559) * Mobkoi: Update endpoint (prebid#4523) * Remove flaky agma test (prebid#4578) * New Adapter: appStockSSP (prebid#4502) Co-authored-by: Kanceliarenko <[email protected]> * Rules Engine Module: Dynamic ruleset from YAML geoscopes (prebid#4509) * In order to protect users of prebid-server that don't use CGO, add build flag (prebid#4058) * In order to protect users of prebid-server that don't use CGO, add build flag. * Conditionally configure fiftyonedegrees. * Because the module file is auto-generated, let it include fiftyonedegrees but just explain that it can't be enabled. * include used packages. * fix builder. * Remove unused file. * Add a test for the Builder when CGO is not enabled. * New Adapter: Gravite (prebid#4547) * New Adapter: Goldbach (prebid#4476) * New Adapter: Showheroes (prebid#4533) * New Adapter: Performist - Limelight Alias (prebid#4283) * Connatix: Support GZIP (prebid#4575) * RTBHouse: PMP removal, publisherId parameter extraction (prebid#4564) * Adnuntius: Pass targeting to ad server (prebid#4545) * New Adapter: Boldwin Rapid (prebid#4478) * Scope3: Various fixes to RTD module (prebid#4544) * PubMatic: Pass alias bidder name through (prebid#4588) * BidTheatre: Update endpoint and add redirect user sync (prebid#4562) * CWire: Add userSync (prebid#4516) * New Adapter: Clydo (prebid#4535) * New Adapter: Microsoft (msft) (prebid#4592) * Syncer: Allow Duplicate Syncer Key For Identical Config (prebid#4622) * Adagio: Enable site capability (prebid#4590) * Adagio: Remove hardcoded seat name (prebid#4596) * Warn in auction response for bidders blocked by privacy settings (prebid#4537) Co-authored-by: oleksandr <[email protected]> * Logging: Add interface with default glog implementation (prebid#4085) Co-authored-by: postindustria-code <[email protected]> * msp 25-12 --------- Signed-off-by: Kehan Pan <[email protected]> Co-authored-by: Michael Stevens <[email protected]> Co-authored-by: tomaszbmf <[email protected]> Co-authored-by: FlatAds <[email protected]> Co-authored-by: wuzhijian <[email protected]> Co-authored-by: Anton Babak <[email protected]> Co-authored-by: support-gotham-ads <[email protected]> Co-authored-by: ShayanK16GumGum <[email protected]> Co-authored-by: sangarbe <[email protected]> Co-authored-by: Tommy Pettersen <[email protected]> Co-authored-by: Gabriel Chicoye <[email protected]> Co-authored-by: Gabriel Chicoye <[email protected]> Co-authored-by: Sigma Software <[email protected]> Co-authored-by: pm-priyanka-bagade <[email protected]> Co-authored-by: Brian Sardo <[email protected]> Co-authored-by: Veronika Solovei <[email protected]> Co-authored-by: guscarreon <[email protected]> Co-authored-by: t-sormonte <[email protected]> Co-authored-by: Isha Bharti <[email protected]> Co-authored-by: Rich Audience <[email protected]> Co-authored-by: IAN <[email protected]> Co-authored-by: Jean-Sébastien Ney <[email protected]> Co-authored-by: rediads <[email protected]> Co-authored-by: abermanov-zeta <[email protected]> Co-authored-by: linux019 <[email protected]> Co-authored-by: oleksandr <[email protected]> Co-authored-by: Roger <[email protected]> Co-authored-by: zentotem <[email protected]> Co-authored-by: Pete <[email protected]> Co-authored-by: Nikhil Vaidya <[email protected]> Co-authored-by: Philip Watson <[email protected]> Co-authored-by: Vladimir Fedoseev <[email protected]> Co-authored-by: Sheridan C Rawlins <[email protected]> Co-authored-by: andre-gielow-ttd <[email protected]> Co-authored-by: Nathan Le Sommer <[email protected]> Co-authored-by: nlesommer <[email protected]> Co-authored-by: gtodeschi <[email protected]> Co-authored-by: Piotr Jaworski <[email protected]> Co-authored-by: sindhuja-sridharan <[email protected]> Co-authored-by: jordi-tappx <[email protected]> Co-authored-by: Jordi Arnau <[email protected]> Co-authored-by: Anna Yablonsky <[email protected]> Co-authored-by: Adserver.Online <[email protected]> Co-authored-by: inna <[email protected]> Co-authored-by: GodefroiRoussel <[email protected]> Co-authored-by: Godefroi Roussel <[email protected]> Co-authored-by: Kacper Fus <[email protected]> Co-authored-by: gmiedlar-ox <[email protected]> Co-authored-by: tomaskoutny-blis <[email protected]> Co-authored-by: Tomas Koutny <[email protected]> Co-authored-by: Vincent Bachelier <[email protected]> Co-authored-by: hhhjort <[email protected]> Co-authored-by: yuu.t <[email protected]> Co-authored-by: Dmitry Ermakov <[email protected]> Co-authored-by: Saar Amrani <[email protected]> Co-authored-by: Scott Kay <[email protected]> Co-authored-by: Sandy Janicki <[email protected]> Co-authored-by: Guillaume Laubier <[email protected]> Co-authored-by: Guillaume Laubier <[email protected]> Co-authored-by: mabielinski-wpm <[email protected]> Co-authored-by: Andrii Rudyk <[email protected]> Co-authored-by: And-Rud <[email protected]> Co-authored-by: rbstdev <[email protected]> Co-authored-by: Afrontio <[email protected]> Co-authored-by: MaksymTeqBlaze <[email protected]> Co-authored-by: esimonelli@onetag <[email protected]> Co-authored-by: lorenzob <[email protected]> Co-authored-by: VeronikaSolovei9 <[email protected]> Co-authored-by: Leandro Marty <[email protected]> Co-authored-by: g-coder-baiai <[email protected]> Co-authored-by: Quentin.zuo <[email protected]> Co-authored-by: prebidPinkLion <[email protected]> Co-authored-by: andreafassina <[email protected]> Co-authored-by: Andrea Fassina <[email protected]> Co-authored-by: nicoladellamorte <[email protected]> Co-authored-by: Agustin Insua <[email protected]> Co-authored-by: Quentin Gallard <[email protected]> Co-authored-by: QuentinGallard <[email protected]> Co-authored-by: pb360playvid <[email protected]> Co-authored-by: mediayo <[email protected]> Co-authored-by: Carlos Felix <[email protected]> Co-authored-by: rbstdev <[email protected]> Co-authored-by: Wenyuan Zhang <[email protected]> Co-authored-by: wenyuanzhang <[email protected]> Co-authored-by: Brian O'Kelley <[email protected]> Co-authored-by: Claude <[email protected]> Co-authored-by: Gabriel Gravel <[email protected]> Co-authored-by: Amit Biton <[email protected]> Co-authored-by: Shane Lacey <[email protected]> Co-authored-by: Nick Llerandi <[email protected]> Co-authored-by: Sebastien Boisvert <[email protected]> Co-authored-by: rufiange <[email protected]> Co-authored-by: richardngo-consumable <[email protected]> Co-authored-by: Karim Mourra <[email protected]> Co-authored-by: Joshua Tomlinson <[email protected]> Co-authored-by: metax-kehan <[email protected]> Co-authored-by: Denis Logachov <[email protected]> Co-authored-by: Rafal Sieczka <[email protected]> Co-authored-by: Dmitry Ermakov <[email protected]> Co-authored-by: a.popov <[email protected]> Co-authored-by: Marc-Enzo Bonnafon <[email protected]> Co-authored-by: Olivier <[email protected]> Co-authored-by: Jozef Bartek <[email protected]> Co-authored-by: Appstock LTD <[email protected]> Co-authored-by: Kanceliarenko <[email protected]> Co-authored-by: teqblaze <[email protected]> Co-authored-by: Simon Aebli <[email protected]> Co-authored-by: Filip Stamenkovic <[email protected]> Co-authored-by: quietPusher <[email protected]> Co-authored-by: Mikael Lundin <[email protected]> Co-authored-by: BoldwinDev <[email protected]> Co-authored-by: Gabriel Gravel <[email protected]> Co-authored-by: Pubmatic-Supriya-Patil <[email protected]> Co-authored-by: andreasgreen <[email protected]> Co-authored-by: Alessandro Rosetti <[email protected]> Co-authored-by: cto-clydo <[email protected]> Co-authored-by: Eugene Dorfman <[email protected]> Co-authored-by: postindustria-code <[email protected]>

Docs: prebid/prebid.github.io#5553