Skip to content

Commit 4cc30f5

Browse files
Support day-parting for Brave Ads
Resolves brave/brave-browser#5234
1 parent 8e3feb0 commit 4cc30f5

24 files changed

+929
-45
lines changed

components/brave_ads/test/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ source_set("brave_ads_unit_tests") {
3131
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/ad_exclusion_rules/new_tab_page_ad_wallpaper_frequency_cap_unittest.cc",
3232
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap_unittest.cc",
3333
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap_unittest.cc",
34+
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap_unittest.cc",
3435
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap_unittest.cc",
3536
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/landed_frequency_cap_unittest.cc",
3637
"//brave/vendor/bat-native-ads/src/bat/ads/internal/frequency_capping/exclusion_rules/marked_as_inappropriate_frequency_cap_unittest.cc",

vendor/bat-native-ads/BUILD.gn

+5-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ source_set("ads") {
153153
"src/bat/ads/internal/catalog/catalog_creative_new_tab_page_ad_info.h",
154154
"src/bat/ads/internal/catalog/catalog_creative_set_info.cc",
155155
"src/bat/ads/internal/catalog/catalog_creative_set_info.h",
156-
"src/bat/ads/internal/catalog/catalog_day_part_info.h",
156+
"src/bat/ads/internal/catalog/catalog_daypart_info.h",
157157
"src/bat/ads/internal/catalog/catalog_geo_target_info.h",
158158
"src/bat/ads/internal/catalog/catalog_issuer_info.cc",
159159
"src/bat/ads/internal/catalog/catalog_issuer_info.h",
@@ -234,6 +234,8 @@ source_set("ads") {
234234
"src/bat/ads/internal/database/tables/creative_ads_database_table.h",
235235
"src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.cc",
236236
"src/bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h",
237+
"src/bat/ads/internal/database/tables/dayparts_database_table.cc",
238+
"src/bat/ads/internal/database/tables/dayparts_database_table.h",
237239
"src/bat/ads/internal/database/tables/geo_targets_database_table.cc",
238240
"src/bat/ads/internal/database/tables/geo_targets_database_table.h",
239241
"src/bat/ads/internal/eligible_ads/eligible_ads_filter.h",
@@ -259,6 +261,8 @@ source_set("ads") {
259261
"src/bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h",
260262
"src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.cc",
261263
"src/bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h",
264+
"src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.cc",
265+
"src/bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h",
262266
"src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.cc",
263267
"src/bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h",
264268
"src/bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h",

vendor/bat-native-ads/src/bat/ads/internal/ads_impl.cc

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "bat/ads/internal/filters/ads_history_filter_factory.h"
3434
#include "bat/ads/internal/frequency_capping/exclusion_rules/conversion_frequency_cap.h"
3535
#include "bat/ads/internal/frequency_capping/exclusion_rules/daily_cap_frequency_cap.h"
36+
#include "bat/ads/internal/frequency_capping/exclusion_rules/daypart_frequency_cap.h"
3637
#include "bat/ads/internal/frequency_capping/exclusion_rules/exclusion_rule.h"
3738
#include "bat/ads/internal/frequency_capping/exclusion_rules/dismissed_frequency_cap.h"
3839
#include "bat/ads/internal/frequency_capping/exclusion_rules/landed_frequency_cap.h"
@@ -947,6 +948,10 @@ AdsImpl::CreateAdNotificationExclusionRules() const {
947948
std::make_unique<SubdivisionTargetingFrequencyCap>(this);
948949
exclusion_rules.push_back(std::move(subdivision_targeting_frequency_cap));
949950

951+
std::unique_ptr<ExclusionRule> daypart_frequency_cap =
952+
std::make_unique<DaypartFrequencyCap>(this);
953+
exclusion_rules.push_back(std::move(daypart_frequency_cap));
954+
950955
std::unique_ptr<ExclusionRule> dismissed_frequency_cap =
951956
std::make_unique<DismissedFrequencyCap>(this);
952957
exclusion_rules.push_back(std::move(dismissed_frequency_cap));

vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.cc

+28
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ bool Bundle::UpdateFromCatalog(
5858
DeleteCampaigns();
5959
DeleteCategories();
6060
DeleteCreativeAds();
61+
DeleteDayparts();
6162
DeleteGeoTargets();
6263

6364
SaveCreativeAdNotifications(bundle_state->creative_ad_notifications);
@@ -106,6 +107,11 @@ void Bundle::DeleteCreativeAds() {
106107
database_table.Delete(std::bind(&Bundle::OnCreativeAdsDeleted, this, _1));
107108
}
108109

110+
void Bundle::DeleteDayparts() {
111+
database::table::Dayparts database_table(ads_);
112+
database_table.Delete(std::bind(&Bundle::OnDaypartsDeleted, this, _1));
113+
}
114+
109115
void Bundle::DeleteGeoTargets() {
110116
database::table::GeoTargets database_table(ads_);
111117
database_table.Delete(std::bind(&Bundle::OnGeoTargetsDeleted, this, _1));
@@ -183,6 +189,16 @@ std::unique_ptr<BundleState> Bundle::GenerateFromCatalog(
183189
geo_targets.push_back(code);
184190
}
185191

192+
std::vector<CreativeDaypartInfo> creative_dayparts;
193+
for (const auto& daypart : campaign.dayparts) {
194+
CreativeDaypartInfo creative_daypart_info;
195+
creative_daypart_info.dow = daypart.dow;
196+
creative_daypart_info.start_minute = daypart.start_minute;
197+
creative_daypart_info.end_minute = daypart.end_minute;
198+
199+
creative_dayparts.push_back(creative_daypart_info);
200+
}
201+
186202
// Creative Sets
187203
for (const auto& creative_set : campaign.creative_sets) {
188204
uint64_t entries = 0;
@@ -236,6 +252,7 @@ std::unique_ptr<BundleState> Bundle::GenerateFromCatalog(
236252
creative_set.ad_conversions.size() != 0 ? true : false;
237253
info.per_day = creative_set.per_day;
238254
info.total_max = creative_set.total_max;
255+
info.dayparts = creative_dayparts;
239256
info.geo_targets = geo_targets;
240257
info.title = creative.payload.title;
241258
info.body = creative.payload.body;
@@ -318,6 +335,7 @@ std::unique_ptr<BundleState> Bundle::GenerateFromCatalog(
318335
creative_set.ad_conversions.size() != 0 ? true : false;
319336
info.per_day = creative_set.per_day;
320337
info.total_max = creative_set.total_max;
338+
info.dayparts = creative_dayparts;
321339
info.geo_targets = geo_targets;
322340
info.company_name = creative.payload.company_name;
323341
info.alt = creative.payload.alt;
@@ -446,6 +464,16 @@ void Bundle::OnCreativeAdsDeleted(
446464
BLOG(3, "Successfully deleted creative ads");
447465
}
448466

467+
void Bundle::OnDaypartsDeleted(
468+
const Result result) {
469+
if (result != SUCCESS) {
470+
BLOG(0, "Failed to delete dayparts");
471+
return;
472+
}
473+
474+
BLOG(3, "Successfully deleted dayparts");
475+
}
476+
449477
void Bundle::OnGeoTargetsDeleted(
450478
const Result result) {
451479
if (result != SUCCESS) {

vendor/bat-native-ads/src/bat/ads/internal/bundle/bundle.h

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class Bundle {
4040
void DeleteCampaigns();
4141
void DeleteCategories();
4242
void DeleteCreativeAds();
43+
void DeleteDayparts();
4344
void DeleteGeoTargets();
4445

4546
void SaveCreativeAdNotifications(
@@ -71,6 +72,8 @@ class Bundle {
7172
const Result result);
7273
void OnCreativeAdsDeleted(
7374
const Result result);
75+
void OnDaypartsDeleted(
76+
const Result result);
7477
void OnGeoTargetsDeleted(
7578
const Result result);
7679
void OnCreativeAdNotificationsSaved(

vendor/bat-native-ads/src/bat/ads/internal/bundle/creative_ad_info.h

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <string>
1212
#include <vector>
13+
#include "bat/ads/internal/bundle/creative_daypart_info.h"
1314

1415
namespace ads {
1516

@@ -34,6 +35,7 @@ struct CreativeAdInfo {
3435
std::string category;
3536
std::vector<std::string> geo_targets;
3637
std::string target_url;
38+
std::vector<CreativeDaypartInfo> dayparts;
3739
};
3840

3941
using CreativeAdList = std::vector<CreativeAdInfo>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* Copyright (c) 2020 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BAT_ADS_INTERNAL_BUNDLE_CREATIVE_DAYPART_INFO_H_
7+
#define BAT_ADS_INTERNAL_BUNDLE_CREATIVE_DAYPART_INFO_H_
8+
9+
#include <string>
10+
#include <vector>
11+
12+
#include "bat/ads/internal/time_util.h"
13+
14+
namespace ads {
15+
16+
struct CreativeDaypartInfo {
17+
std::string dow = "0123456";
18+
int start_minute = 0;
19+
int end_minute =
20+
(base::Time::kMinutesPerHour * base::Time::kHoursPerDay) - 1;
21+
};
22+
23+
using CreativeDaypartList = std::vector<CreativeDaypartInfo>;
24+
25+
} // namespace ads
26+
27+
#endif // BAT_ADS_INTERNAL_CATALOG_CATALOG_DAYPART_INFO_H_
28+

vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_campaign_info.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include <vector>
1111

1212
#include "bat/ads/internal/catalog/catalog_creative_set_info.h"
13-
#include "bat/ads/internal/catalog/catalog_day_part_info.h"
13+
#include "bat/ads/internal/catalog/catalog_daypart_info.h"
1414
#include "bat/ads/internal/catalog/catalog_geo_target_info.h"
1515

1616
namespace ads {
@@ -30,7 +30,7 @@ struct CatalogCampaignInfo {
3030
unsigned int daily_cap = 0;
3131
std::string advertiser_id;
3232
CatalogCreativeSetList creative_sets;
33-
CatalogDayPartList day_parts;
33+
CatalogDaypartList dayparts;
3434
CatalogGeoTargetList geo_targets;
3535
};
3636

vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_day_part_info.h

-24
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BAT_ADS_INTERNAL_CATALOG_CATALOG_DAYPART_INFO_H_
7+
#define BAT_ADS_INTERNAL_CATALOG_CATALOG_DAYPART_INFO_H_
8+
9+
#include <string>
10+
#include <vector>
11+
12+
#include "bat/ads/internal/time_util.h"
13+
14+
namespace ads {
15+
16+
struct CatalogDaypartInfo {
17+
std::string dow = "0123456";
18+
int start_minute = 0;
19+
int end_minute =
20+
(base::Time::kMinutesPerHour * base::Time::kHoursPerDay) - 1;
21+
};
22+
23+
using CatalogDaypartList = std::vector<CatalogDaypartInfo>;
24+
25+
} // namespace ads
26+
27+
#endif // BAT_ADS_INTERNAL_CATALOG_CATALOG_DAYPART_INFO_H_

vendor/bat-native-ads/src/bat/ads/internal/catalog/catalog_state.cc

+11-6
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,19 @@ Result CatalogState::FromJson(
7272
}
7373

7474
// Day parts
75-
for (const auto& day_part : campaign["dayParts"].GetArray()) {
76-
CatalogDayPartInfo day_part_info;
75+
for (const auto& daypart : campaign["dayParts"].GetArray()) {
76+
CatalogDaypartInfo daypart_info;
7777

78-
day_part_info.dow = day_part["dow"].GetString();
79-
day_part_info.start_minute = day_part["startMinute"].GetUint();
80-
day_part_info.end_minute = day_part["endMinute"].GetUint();
78+
daypart_info.dow = daypart["dow"].GetString();
79+
daypart_info.start_minute = daypart["startMinute"].GetInt();
80+
daypart_info.end_minute = daypart["endMinute"].GetInt();
8181

82-
campaign_info.day_parts.push_back(day_part_info);
82+
campaign_info.dayparts.push_back(daypart_info);
83+
}
84+
85+
if (campaign_info.dayparts.empty()) {
86+
CatalogDaypartInfo daypart_info;
87+
campaign_info.dayparts.push_back(daypart_info);
8388
}
8489

8590
// Creative sets

vendor/bat-native-ads/src/bat/ads/internal/database/database_migration.cc

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "bat/ads/internal/database/tables/creative_ad_notifications_database_table.h"
1818
#include "bat/ads/internal/database/tables/creative_ads_database_table.h"
1919
#include "bat/ads/internal/database/tables/creative_new_tab_page_ads_database_table.h"
20+
#include "bat/ads/internal/database/tables/dayparts_database_table.h"
2021
#include "bat/ads/internal/database/tables/geo_targets_database_table.h"
2122
#include "bat/ads/internal/logging.h"
2223

@@ -86,6 +87,9 @@ void Migration::ToVersion(
8687

8788
table::GeoTargets geo_targets_database_table(ads_);
8889
geo_targets_database_table.Migrate(transaction, to_version);
90+
91+
table::Dayparts dayparts_database_table(ads_);
92+
dayparts_database_table.Migrate(transaction, to_version);
8993
}
9094

9195
} // namespace database

vendor/bat-native-ads/src/bat/ads/internal/database/database_version.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ namespace ads {
99
namespace database {
1010

1111
int32_t version() {
12-
return 3;
12+
return 4;
1313
}
1414

1515
int32_t compatible_version() {
16-
return 3;
16+
return 4;
1717
}
1818

1919
} // namespace database

0 commit comments

Comments
 (0)