1- import { Router } from 'express' ;
1+ import { Request , Router } from 'express' ;
2+ import { identity } from 'lodash' ;
23
34import {
45 addAdProvidersForAllSites ,
@@ -7,12 +8,14 @@ import {
78 adProvidersMethods ,
89 adProvidersByDomainRulesMethods ,
910 AdProviderSelectorsRule ,
10- filterByVersion
11+ filterByVersion ,
12+ AdProvidersByDomainRule
1113} from '../../advertising/external-ads' ;
1214import { basicAuth } from '../../middlewares/basic-auth.middleware' ;
1315import { addObjectStorageMethodsToRouter , withBodyValidation , withExceptionHandler } from '../../utils/express-helpers' ;
16+ import { isDefined , transformValues } from '../../utils/helpers' ;
1417import {
15- adTypesListSchema ,
18+ nonEmptyStringsListSchema ,
1619 hostnamesListSchema ,
1720 adProvidersByDomainsRulesDictionarySchema ,
1821 adProvidersDictionarySchema
@@ -69,17 +72,36 @@ import {
6972 * type: array
7073 * items:
7174 * type: string
75+ * parentDepth:
76+ * type: integer
77+ * minimum: 0
78+ * default: 0
79+ * AdByProviderSelector:
80+ * oneOf:
81+ * - type: string
82+ * - type: object
83+ * required:
84+ * - selector
85+ * - parentDepth
86+ * properties:
87+ * selector:
88+ * type: string
89+ * parentDepth:
90+ * type: integer
7291 * AdProvidersDictionary:
7392 * type: object
7493 * additionalProperties:
7594 * type: array
7695 * items:
77- * type: string
96+ * $ref: '#/components/schemas/AdByProviderSelector'
7897 * example:
7998 * google:
8099 * - '#Ads_google_bottom_wide'
81100 * - '.GoogleAdInfo'
82101 * - 'a[href^="https://googleads.g.doubleclick.net/pcs/click"]'
102+ * persona:
103+ * - selector: "a.persona-product"
104+ * parentDepth: 1
83105 * AdProvidersInputsDictionary:
84106 * type: object
85107 * additionalProperties:
@@ -178,7 +200,7 @@ adProvidersRouter
178200 . post (
179201 basicAuth ,
180202 withExceptionHandler (
181- withBodyValidation ( adTypesListSchema , async ( req , res ) => {
203+ withBodyValidation ( nonEmptyStringsListSchema , async ( req , res ) => {
182204 const providersAddedCount = await addAdProvidersForAllSites ( req . body ) ;
183205
184206 res . status ( 200 ) . send ( { message : `${ providersAddedCount } providers have been added` } ) ;
@@ -188,7 +210,7 @@ adProvidersRouter
188210 . delete (
189211 basicAuth ,
190212 withExceptionHandler (
191- withBodyValidation ( adTypesListSchema , async ( req , res ) => {
213+ withBodyValidation ( nonEmptyStringsListSchema , async ( req , res ) => {
192214 const providersRemovedCount = await removeAdProvidersForAllSites ( req . body ) ;
193215
194216 res . status ( 200 ) . send ( { message : `${ providersRemovedCount } providers have been removed` } ) ;
@@ -287,13 +309,15 @@ adProvidersRouter
287309 * '500':
288310 * $ref: '#/components/responses/ErrorResponse'
289311 */
290- addObjectStorageMethodsToRouter ( adProvidersRouter , {
312+ addObjectStorageMethodsToRouter < AdProvidersByDomainRule [ ] > ( adProvidersRouter , {
291313 path : '/by-sites' ,
292314 methods : adProvidersByDomainRulesMethods ,
293315 keyName : 'domain' ,
294316 objectValidationSchema : adProvidersByDomainsRulesDictionarySchema ,
295317 keysArrayValidationSchema : hostnamesListSchema ,
296- successfulRemovalMessage : entriesCount => `${ entriesCount } entries have been removed`
318+ successfulRemovalMessage : entriesCount => `${ entriesCount } entries have been removed` ,
319+ valueTransformFn : identity ,
320+ objectTransformFn : identity
297321} ) ;
298322
299323/**
@@ -361,11 +385,13 @@ addObjectStorageMethodsToRouter(adProvidersRouter, {
361385 * schema:
362386 * type: array
363387 * items:
364- * type: string
388+ * $ref: '#/components/schemas/AdByProviderSelector'
365389 * example:
366390 * - '#Ads_google_bottom_wide'
367391 * - '.GoogleAdInfo'
368392 * - 'a[href^="https://googleads.g.doubleclick.net/pcs/click"]'
393+ * - selector: "a.persona-product"
394+ * parentDepth: 1
369395 * '500':
370396 * $ref: '#/components/responses/ErrorResponse'
371397 * /api/slise-ad-rules/providers:
@@ -437,19 +463,30 @@ addObjectStorageMethodsToRouter(adProvidersRouter, {
437463 * '500':
438464 * $ref: '#/components/responses/ErrorResponse'
439465 */
440- addObjectStorageMethodsToRouter < AdProviderSelectorsRule [ ] , string [ ] > ( adProvidersRouter , {
466+ const transformAdProviderSelectorsRules = ( rules : AdProviderSelectorsRule [ ] , req : Request ) =>
467+ Array . from (
468+ new Set (
469+ filterByVersion ( rules , req . query . extVersion as string | undefined )
470+ . map ( ( { selectors, parentDepth } ) =>
471+ isDefined ( parentDepth ) && parentDepth > 0 ? { selector : selectors . join ( ', ' ) , parentDepth } : selectors
472+ )
473+ . flat ( )
474+ )
475+ ) ;
476+
477+ type AdByProviderSelector = string | { selector : string ; parentDepth : number } ;
478+
479+ addObjectStorageMethodsToRouter <
480+ AdProviderSelectorsRule [ ] ,
481+ Record < string , AdByProviderSelector [ ] > ,
482+ AdByProviderSelector [ ]
483+ > ( adProvidersRouter , {
441484 path : '/' ,
442485 methods : adProvidersMethods ,
443486 keyName : 'providerId' ,
444487 objectValidationSchema : adProvidersDictionarySchema ,
445- keysArrayValidationSchema : adTypesListSchema ,
488+ keysArrayValidationSchema : nonEmptyStringsListSchema ,
446489 successfulRemovalMessage : entriesCount => `${ entriesCount } providers have been removed` ,
447- transformGotValueFn : ( rules , req ) =>
448- Array . from (
449- new Set (
450- filterByVersion ( rules , req . query . extVersion as string | undefined )
451- . map ( ( { selectors } ) => selectors )
452- . flat ( )
453- )
454- )
490+ valueTransformFn : transformAdProviderSelectorsRules ,
491+ objectTransformFn : ( rules , req ) => transformValues ( rules , value => transformAdProviderSelectorsRules ( value , req ) )
455492} ) ;
0 commit comments