FEATURE: Add group and category restrictions to house ads (#205)

# Description

This PR adds the ability to apply **group** and **category** restrictions to a **house ad**.

# What is included
- In order to get the group and category selectors to work within `admin/assets/javascripts/discourse/controllers/admin-plugins-house-ads-show.js` I needed to modernize the file. 
- I dropped the `bufferedProperty` implementation in favor of a vanilla ember approach
- I added `category_ids` and `group_ids` to our house ads model
- I added tests for group / category restrictions
- I added a preview button to display the house ad
- `/site.json` would return a object called `house_creatives` and a list of key value pairs that matched the ad name with the html, like so:
```js
{ AD_KEY: ad.html }
```
I need access to the category ids on the client to conditionally render the house ads so the new format will be: 
```js
{ AD_KEY: { html: ad.html, category_ids: ad.category_ids } }
```

# Screenshots
<img width="658" alt="Screenshot 2024-04-08 at 2 39 22 PM" src="https://github.com/discourse/discourse-adplugin/assets/50783505/b44b386d-65a1-4a2a-a487-d735b13357dd">

# Preview Video

https://github.com/discourse/discourse-adplugin/assets/50783505/6d0d8253-afef-4e15-b6fc-c6f696efd169
This commit is contained in:
Isaac Janzen
2024-04-09 11:54:11 -06:00
committed by GitHub
parent c4227de1b5
commit 554f03f3da
17 changed files with 604 additions and 153 deletions
+192 -8
View File
@@ -25,14 +25,26 @@ acceptance("House Ads", function (needs) {
after_nth_topic: 6,
},
creatives: {
"Topic List Top": "<div class='h-topic-list'>TOPIC LIST TOP</div>",
"Above Post Stream":
"<div class='h-above-post-stream'>ABOVE POST STREAM</div>",
"Above Suggested":
"<div class='h-above-suggested'>ABOVE SUGGESTED</div>",
Post: "<div class='h-post'>BELOW POST</div>",
"Between Topic List":
"<div class='h-between-topic-list'>BETWEEN TOPIC LIST</div>",
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
category_ids: [],
},
"Above Post Stream": {
html: "<div class='h-above-post-stream'>ABOVE POST STREAM</div>",
category_ids: [],
},
"Above Suggested": {
html: "<div class='h-above-suggested'>ABOVE SUGGESTED</div>",
category_ids: [],
},
Post: {
html: "<div class='h-post'>BELOW POST</div>",
category_ids: [],
},
"Between Topic List": {
html: "<div class='h-between-topic-list'>BETWEEN TOPIC LIST</div>",
category_ids: [],
},
},
},
});
@@ -114,3 +126,175 @@ acceptance("House Ads", function (needs) {
);
});
});
acceptance(
"House Ads | Category and Group Permissions | Authenticated | Display Ad",
function (needs) {
needs.user();
needs.settings({
no_ads_for_categories: "",
});
needs.site({
house_creatives: {
settings: {
topic_list_top: "Topic List Top",
},
creatives: {
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
// match /c/bug/1
category_ids: [1],
},
},
},
});
test("displays ad to users when current category id is included in ad category_ids", async (assert) => {
updateCurrentUser({
staff: false,
trust_level: 1,
show_to_groups: true,
});
await visit("/c/bug/1");
assert
.dom(".h-topic-list")
.exists(
"ad is displayed above the topic list because the current category id is included in the ad category_ids"
);
});
}
);
acceptance(
"House Ads | Category and Group Permissions | Authenticated | Hide Ad",
function (needs) {
needs.user();
needs.settings({
no_ads_for_categories: "",
});
needs.site({
house_creatives: {
settings: {
topic_list_top: "Topic List Top",
},
creatives: {
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
// restrict ad to a different category than /c/bug/1
category_ids: [2],
},
},
},
});
test("hides ad to users when current category id is not included in ad category_ids", async (assert) => {
updateCurrentUser({
staff: false,
trust_level: 1,
show_to_groups: true,
});
await visit("/c/bug/1");
assert
.dom(".h-topic-list")
.doesNotExist(
"ad is not displayed because the current category id is included in the ad category_ids"
);
});
}
);
acceptance(
"House Ads | Category and Group Permissions | Anonymous | Hide Ad",
function (needs) {
needs.settings({
no_ads_for_categories: "",
});
needs.site({
house_creatives: {
settings: {
topic_list_top: "Topic List Top",
},
creatives: {
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
// restrict ad to a different category than /c/bug/1
category_ids: [2],
},
},
},
});
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
await visit("/c/bug/1");
assert
.dom(".h-topic-list")
.doesNotExist(
"ad is not displayed because the current category id is included in the ad category_ids"
);
});
}
);
acceptance(
"House Ads | Category and Group Permissions | Anonymous | Hide Ad",
function (needs) {
needs.settings({
no_ads_for_categories: "",
});
needs.site({
house_creatives: {
settings: {
topic_list_top: "Topic List Top",
},
creatives: {
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
// restrict ad to a different category than /c/bug/1
category_ids: [2],
},
},
},
});
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
await visit("/c/bug/1");
assert
.dom(".h-topic-list")
.doesNotExist(
"ad is not displayed because the current category id is included in the ad category_ids"
);
});
}
);
acceptance(
"House Ads | Category and Group Permissions | Anonymous | Show Ad",
function (needs) {
needs.settings({
no_ads_for_categories: "",
});
needs.site({
house_creatives: {
settings: {
topic_list_top: "Topic List Top",
},
creatives: {
"Topic List Top": {
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
// match /c/bug/1
category_ids: [1],
},
},
},
});
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
await visit("/c/bug/1");
assert
.dom(".h-topic-list")
.exists(
"ad is displayed because the current category id is included in the ad category_ids"
);
});
}
);