Skip to content

Commit b369658

Browse files
authored
TW-1489: Smarty Ads integration (#170)
* TW-1464 Prepare backend for new native ads * TW-1464 Update API documentation * TW-1464 Enable adding native ads in replace-only mode * TW-1492 Add some properties for ads definitions * TW-1492 Prepare the backend to additional fixtures for Mises * TW-1492 Add an entrypoint for elements to hide or remove * TW-1489 Add an entrypoints for categories of original ads providers
1 parent acc023c commit b369658

File tree

3 files changed

+92
-2
lines changed

3 files changed

+92
-2
lines changed

src/advertising/external-ads.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ const PERMANENT_AD_PLACES_RULES_KEY = 'permanent_ad_places_rules';
175175
const PERMANENT_NATIVE_AD_PLACES_RULES_KEY = 'permanent_native_ad_places_rules';
176176
const REPLACE_ADS_URLS_BLACKLIST_KEY = 'replace_ads_urls_blacklist';
177177
const ELEMENTS_TO_HIDE_OR_REMOVE_KEY = 'elements_to_hide_or_remove';
178+
const AD_PROVIDERS_CATEGORIES_KEY = 'ad_providers_categories';
178179

179180
export const adPlacesRulesMethods = objectStorageMethodsFactory<AdPlacesRule[]>(AD_PLACES_RULES_KEY, []);
180181

@@ -205,6 +206,10 @@ export const elementsToHideOrRemoveMethods = objectStorageMethodsFactory<Element
205206
[]
206207
);
207208

209+
export const adProvidersCategoriesMethods = objectStorageMethodsFactory<string[]>(AD_PROVIDERS_CATEGORIES_KEY, [
210+
'crypto'
211+
]);
212+
208213
export const getAdProvidersForAllSites = async () => redisClient.smembers(AD_PROVIDERS_ALL_SITES_KEY);
209214

210215
export const addAdProvidersForAllSites = async (providers: string[]) =>

src/routers/slise-ad-rules/providers.ts

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
adProvidersByDomainRulesMethods,
1010
AdProviderSelectorsRule,
1111
filterRules,
12-
AdProvidersByDomainRule
12+
AdProvidersByDomainRule,
13+
adProvidersCategoriesMethods
1314
} from '../../advertising/external-ads';
1415
import { basicAuth } from '../../middlewares/basic-auth.middleware';
1516
import { addObjectStorageMethodsToRouter, withBodyValidation, withExceptionHandler } from '../../utils/express-helpers';
@@ -18,7 +19,8 @@ import {
1819
nonEmptyStringsListSchema,
1920
hostnamesListSchema,
2021
adProvidersByDomainsRulesDictionarySchema,
21-
adProvidersDictionarySchema
22+
adProvidersDictionarySchema,
23+
adProvidersCategoriesDictionarySchema
2224
} from '../../utils/schemas';
2325

2426
/**
@@ -116,6 +118,12 @@ import {
116118
* type: array
117119
* items:
118120
* $ref: '#/components/schemas/AdProvidersInputValue'
121+
* AdProvidersCategoriesDictionary:
122+
* type: object
123+
* additionalProperties:
124+
* type: array
125+
* items:
126+
* type: string
119127
*/
120128

121129
export const adProvidersRouter = Router();
@@ -328,6 +336,78 @@ addObjectStorageMethodsToRouter<AdProvidersByDomainRule[]>(adProvidersRouter, {
328336
objectTransformFn: identity
329337
});
330338

339+
/**
340+
* @swagger
341+
* /api/slise-ad-rules/providers/categories:
342+
* get:
343+
* summary: Get categories for providers
344+
* tags:
345+
* - Known ads providers
346+
* responses:
347+
* '200':
348+
* description: Provider - categories dictionary
349+
* content:
350+
* application/json:
351+
* schema:
352+
* $ref: '#/components/schemas/AdProvidersCategoriesDictionary'
353+
* '500':
354+
* $ref: '#/components/responses/ErrorResponse'
355+
* post:
356+
* summary: Upsert categories for providers
357+
* tags:
358+
* - Known ads providers
359+
* security:
360+
* - basicAuth: []
361+
* requestBody:
362+
* description: Provider - categories dictionary
363+
* content:
364+
* application/json:
365+
* schema:
366+
* $ref: '#/components/schemas/AdProvidersCategoriesDictionary'
367+
* responses:
368+
* '200':
369+
* $ref: '#/components/responses/SuccessResponse'
370+
* '400':
371+
* $ref: '#/components/responses/ErrorResponse'
372+
* '401':
373+
* $ref: '#/components/responses/UnauthorizedError'
374+
* '500':
375+
* $ref: '#/components/responses/ErrorResponse'
376+
* delete:
377+
* summary: Delete categories for providers
378+
* tags:
379+
* - Known ads providers
380+
* security:
381+
* - basicAuth: []
382+
* requestBody:
383+
* description: List of provider IDs for which categories should be deleted
384+
* content:
385+
* application/json:
386+
* schema:
387+
* type: array
388+
* items:
389+
* type: string
390+
* responses:
391+
* '200':
392+
* $ref: '#/components/responses/SuccessResponse'
393+
* '400':
394+
* $ref: '#/components/responses/ErrorResponse'
395+
* '401':
396+
* $ref: '#/components/responses/UnauthorizedError'
397+
* '500':
398+
* $ref: '#/components/responses/ErrorResponse'
399+
*/
400+
addObjectStorageMethodsToRouter<string[]>(adProvidersRouter, {
401+
path: '/categories',
402+
methods: adProvidersCategoriesMethods,
403+
keyName: 'providerId',
404+
objectValidationSchema: adProvidersCategoriesDictionarySchema,
405+
keysArrayValidationSchema: nonEmptyStringsListSchema,
406+
successfulRemovalMessage: entriesCount => `${entriesCount} entries have been removed`,
407+
valueTransformFn: identity,
408+
objectTransformFn: identity
409+
});
410+
331411
/**
332412
* @swagger
333413
* /api/slise-ad-rules/providers/negative-selectors:

src/utils/schemas.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,8 @@ export const elementsToHideOrRemoveDictionarySchema = makeDictionarySchema<Eleme
278278
hostnameSchema.clone().required(),
279279
arraySchema().of(elementsToHideOrRemoveEntrySchema.clone().required()).required()
280280
).required();
281+
282+
export const adProvidersCategoriesDictionarySchema = makeDictionarySchema<string[]>(
283+
nonEmptyStringSchema.clone().required(),
284+
arraySchema().of(nonEmptyStringSchema.clone().required()).required()
285+
).required();

0 commit comments

Comments
 (0)