Skip to content

Commit

Permalink
chore: remove audience _id field from config and update bucketing code (
Browse files Browse the repository at this point in the history
  • Loading branch information
ajwootto authored Apr 9, 2024
1 parent 440af74 commit 2a1890d
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import {
validSubTypes,
CustomDataFilter,
UserFilter,
NoIdAudience, AudienceMatchFilter
AudienceMatchFilter,
Audience
} from '../types'
import { JSON } from '@devcycle/assemblyscript-json/assembly'
import { getF64FromJSONValue } from '../helpers/jsonHelpers'
Expand All @@ -24,7 +25,7 @@ import { getF64FromJSONValue } from '../helpers/jsonHelpers'
*/
export function _evaluateOperator(
operator: AudienceOperator,
audiences: Map<string, NoIdAudience>,
audiences: Map<string, Audience>,
user: DVCPopulatedUser,
clientCustomData: JSON.Obj
): bool {
Expand Down Expand Up @@ -61,7 +62,7 @@ export function _evaluateOperator(

function doesUserPassFilter(
filter: AudienceFilter,
audiences: Map<string, NoIdAudience>,
audiences: Map<string, Audience>,
user: DVCPopulatedUser,
clientCustomData: JSON.Obj
): bool {
Expand Down Expand Up @@ -96,7 +97,7 @@ function doesUserPassFilter(

function filterForAudienceMatch(
filter: AudienceMatchFilter,
configAudiences: Map<string, NoIdAudience>,
configAudiences: Map<string, Audience>,
user: DVCPopulatedUser,
clientCustomData: JSON.Obj
): bool {
Expand Down
8 changes: 4 additions & 4 deletions lib/shared/bucketing-assembly-script/assembly/testHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import {
Rollout as PublicRollout,
Target as PublicTarget,
AudienceOperator, UserFilter,
NoIdAudience,
decodeVariableForUserParams_PB,
encodeVariableForUserParams_PB,
decodeDVCUser_PB,
decodeSDKVariable_PB,
encodeSDKVariable_PB
encodeSDKVariable_PB,
Audience
} from './types'
import {
_checkCustomData,
Expand Down Expand Up @@ -87,7 +87,7 @@ export function evaluateOperatorFromJSON(
if (!operatorJSON.isObj) {
throw new Error('evaluateOperatorFromJSON operatorStr or userStr param not a JSON Object')
}
const audiences = new Map<string, NoIdAudience>()
const audiences = new Map<string, Audience>()
if (audiencesStr !== '' && audiencesStr !== '{}') {
const audiencesJSON = JSON.parse(audiencesStr) as JSON.Obj
if (!audiencesJSON.isObj) {
Expand All @@ -96,7 +96,7 @@ export function evaluateOperatorFromJSON(
const keys = audiencesJSON.keys
for (let i = 0; i < keys.length; i++) {
const aud = audiencesJSON.get(keys[i]) as JSON.Obj
audiences.set(keys[i], new NoIdAudience(aud))
audiences.set(keys[i], new Audience(aud))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
getJSONObjFromJSONOptional,
} from '../helpers/jsonHelpers'
import { Feature } from './feature'
import { NoIdAudience } from './target'
import { Audience } from './target'

export class PublicProject extends JSON.Value {
readonly _id: string
Expand Down Expand Up @@ -79,7 +79,7 @@ export class Variable extends JSON.Value {

export class ConfigBody {
readonly project: PublicProject
readonly audiences: Map<string, NoIdAudience>
readonly audiences: Map<string, Audience>
readonly environment: PublicEnvironment
readonly features: Feature[]
readonly variables: Variable[]
Expand Down Expand Up @@ -170,13 +170,13 @@ export class ConfigBody {
configJSONObj,
'audiences',
)
const audiences = new Map<string, NoIdAudience>()
const audiences = new Map<string, Audience>()
if (audiencesJSON) {
const audienceKeys = audiencesJSON.keys
for (let i = 0; i < audienceKeys.length; i++) {
const audience_id = audienceKeys[i]
const aud = audiencesJSON.get(audience_id)
audiences.set(audience_id, new NoIdAudience(aud as JSON.Obj))
audiences.set(audience_id, new Audience(aud as JSON.Obj))
}
}
this.audiences = audiences
Expand Down
18 changes: 1 addition & 17 deletions lib/shared/bucketing-assembly-script/assembly/types/target.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ export class AudienceOperator extends JSON.Value {
}
}

export class NoIdAudience extends JSON.Value {
export class Audience extends JSON.Value {
readonly filters: AudienceOperator

constructor(audience: JSON.Obj) {
Expand All @@ -161,22 +161,6 @@ export class NoIdAudience extends JSON.Value {
}
}

export class Audience extends NoIdAudience {
readonly _id: string

constructor(audience: JSON.Obj) {
super(audience)
this._id = getStringFromJSON(audience, '_id')
}

stringify(): string {
const json = new JSON.Obj()
json.set('_id', this._id)
json.set('filters', this.filters)
return json.stringify()
}
}

const validAudienceOperators = ['and', 'or']

const validTypes = ['all', 'user', 'optIn', 'audienceMatch']
Expand Down
11 changes: 2 additions & 9 deletions lib/shared/bucketing-test-data/src/data/largeConfig.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { ConfigBody } from '@devcycle/types'

export const largeConfig = {
project: {
_id: '52979e6b353148fe8d54f1b7946578da',
Expand Down Expand Up @@ -51,7 +53,6 @@ export const largeConfig = {
targets: [
{
_audience: {
_id: 'b8c6aca26fb540c78cea5560620d3fa5',
filters: {
filters: [
{
Expand All @@ -78,7 +79,6 @@ export const largeConfig = {
},
{
_audience: {
_id: '59b2ecbd6d204f3ba8bd59ea17871844',
filters: {
filters: [
{
Expand Down Expand Up @@ -140,7 +140,6 @@ export const largeConfig = {
targets: [
{
_audience: {
_id: '9a3c47be82ec469b836ef2aa63de3fdc',
filters: {
filters: [
{
Expand Down Expand Up @@ -275,7 +274,6 @@ export const largeConfig = {
targets: [
{
_audience: {
_id: 'fa43ca76fc0943ba922051e144088065',
filters: {
filters: [
{
Expand Down Expand Up @@ -313,7 +311,6 @@ export const largeConfig = {
},
{
_audience: {
_id: 'a0f11ee6388e4e7984667c779f423163',
filters: {
filters: [
{
Expand Down Expand Up @@ -371,7 +368,6 @@ export const largeConfig = {
targets: [
{
_audience: {
_id: '19aec1d651d64ec7993df5c5a13ea33f',
filters: {
filters: [
{
Expand Down Expand Up @@ -403,7 +399,6 @@ export const largeConfig = {
},
{
_audience: {
_id: '49b2698a5aa84622975f37d0582164e9',
filters: {
filters: [
{
Expand Down Expand Up @@ -461,7 +456,6 @@ export const largeConfig = {
targets: [
{
_audience: {
_id: '09dce2cbd4594bf8bfc164769ec51415',
filters: {
filters: [
{
Expand Down Expand Up @@ -507,7 +501,6 @@ export const largeConfig = {
},
{
_audience: {
_id: '86393f91545f4922a81b5567ac3ec901',
filters: {
filters: [
{
Expand Down
30 changes: 21 additions & 9 deletions lib/shared/bucketing-test-data/src/data/testData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
PublicProject,
PublicVariable,
PublicVariation,
TargetAudience,
UserSubType,
VariableType,
} from '@devcycle/types'
Expand All @@ -32,7 +33,7 @@ export const environment: PublicEnvironment = {
key: 'test-environment',
}

export const audiences: PublicAudience[] = [
export const reusableAudiences: PublicAudience[] = [
{
_id: '614ef6ea475929459060721a',
filters: {
Expand All @@ -47,8 +48,23 @@ export const audiences: PublicAudience[] = [
operator: AudienceOperator.and,
},
},
]

export const audiences: TargetAudience[] = [
{
filters: {
filters: [
{
type: FilterType.user,
subType: UserSubType.email,
comparator: FilterComparator['='],
values: ['test@email.com', 'test2@email.com'],
},
],
operator: AudienceOperator.and,
},
},
{
_id: '6153557f1ed7bac7268ea0d9',
filters: {
filters: [
{
Expand Down Expand Up @@ -85,7 +101,6 @@ export const audiences: PublicAudience[] = [
},
},
{
_id: '6153557f1ed7bac7268ea0d5',
filters: {
filters: [
{
Expand Down Expand Up @@ -115,7 +130,6 @@ export const audiences: PublicAudience[] = [
},
},
{
_id: '6153557f1ed7bac7268ea0d6',
filters: {
filters: [
{
Expand All @@ -139,7 +153,6 @@ export const audiences: PublicAudience[] = [
},
},
{
_id: '6153557f1ed7bac7268ea074',
filters: {
filters: [
{
Expand All @@ -152,7 +165,6 @@ export const audiences: PublicAudience[] = [
},
},
{
_id: '6153557f1ed7bac7268ea0d7',
filters: {
filters: [
{
Expand All @@ -168,7 +180,6 @@ export const audiences: PublicAudience[] = [
},
},
{
_id: '6153557f1ed7bac7268ea0d8',
filters: {
filters: [
{
Expand Down Expand Up @@ -404,10 +415,11 @@ function configBodyAudiences(audiences: PublicAudience[]): {
})
return auds
}

export const config: ConfigBody = {
project,
environment,
audiences: configBodyAudiences(audiences),
audiences: configBodyAudiences(reusableAudiences),
features: [
{
_id: '614ef6aa473928459060721a',
Expand Down Expand Up @@ -634,7 +646,7 @@ export const barrenConfig: ConfigBody = {
export const configWithNullCustomData: ConfigBody = {
project,
environment,
audiences: configBodyAudiences(audiences),
audiences: configBodyAudiences(reusableAudiences),
features: [
{
_id: '614ef6aa475928459060721d',
Expand Down
9 changes: 5 additions & 4 deletions lib/shared/bucketing/src/bucketing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ import pick from 'lodash/pick'
import last from 'lodash/last'
import first from 'lodash/first'
import {
AudienceOperator,
BucketedUserConfig,
ConfigBody,
PublicTarget,
DVCBucketingUser,
Feature,
PublicFeature,
BucketedUserConfig,
PublicRollout,
PublicRolloutStage,
DVCBucketingUser,
PublicTarget,
Variation,
Feature,
} from '@devcycle/types'

import murmurhash from 'murmurhash'
Expand Down
37 changes: 37 additions & 0 deletions lib/shared/types/src/types/config/models/audience.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,43 @@ export enum AudienceOperator {
or = 'or',
}

export class AudienceFilter<IdType = string> {
/**
* Filter type of this audience filter (user, audienceTemplate etc.)
*/
type: FilterType

/**
* Sub type of this filter (appVersion, mixpanel etc.)
*/
subType?: UserSubType

/**
* Comparator to use if this is a filter
*/
comparator: FilterComparator

/**
* Data Key used for custom data and other filter sub-type that require a key-value mapping.
*/
dataKey?: string

/**
* Data Key used for custom data and other filter sub-type that require a key-value mapping.
*/
dataKeyType?: DataKeyType

/**
* Filter values to segment against, must be set for all filter types other than 'all'
*/
values?: string[] | boolean[] | number[]

/**
* Array of audience id's for filters of type audienceMatch
*/
_audiences?: IdType[]
}

/**
* Audience filter used to describe a segmentation for a user audience.
*/
Expand Down
Loading

0 comments on commit 2a1890d

Please sign in to comment.