-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathformat-ph-feature-flag-payload.js
99 lines (93 loc) · 3.17 KB
/
format-ph-feature-flag-payload.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
* Takes a PostHog experiment response and formats the feature flag payload
* with proper variant payloads based on experiment type
*/
function formatFeatureFlagPayload(posthogResponse, directusPayload) {
try {
const experimentData = posthogResponse.data;
const directusData = directusPayload.payload;
const testType = directusData.test_type;
// Create a lookup map for variant URLs from the directus payload
const variantUrlMap = {};
if (directusData.variants && directusData.variants.create) {
directusData.variants.create.forEach(variant => {
if (variant.url) {
variantUrlMap[variant.key] = variant.url;
}
});
}
// Find control URL
const controlVariant = directusData.variants.create.find(v => v.key === 'control');
const controlPath = controlVariant && controlVariant.url ? controlVariant.url : '/';
// Format variants for the multivariate section
const variants = experimentData.parameters.feature_flag_variants.map(variant => ({
key: variant.key,
description: variant.description,
rollout_percentage: variant.rollout_percentage,
name: variant.key === 'control' ?
`control is good one` :
variant.description || `variant ${variant.key}`
}));
// Create payloads object based on experiment type
const payloads = {};
experimentData.parameters.feature_flag_variants.forEach(variant => {
if (testType === 'page') {
// For page experiments, include path information using URLs from directus payload
if (variant.key === 'control') {
// For control variant, include both control_path and path (its own path)
payloads[variant.key] = JSON.stringify({
experiment_type: 'page',
control_path: controlPath,
path: variantUrlMap[variant.key] || '/'
});
} else {
// For non-control variants
payloads[variant.key] = JSON.stringify({
experiment_type: 'page',
control_path: controlPath,
path: variantUrlMap[variant.key] || '/'
});
}
} else {
// For block experiments, use empty JSON
payloads[variant.key] = "{}";
}
});
// Create the formatted PostHog payload structure
return {
name: experimentData.feature_flag.name,
key: experimentData.feature_flag_key,
filters: {
groups: [
{
properties: [],
rollout_percentage: 100
}
],
multivariate: {
variants: variants
},
holdout_groups: null,
aggregation_group_type_index: null,
payloads: payloads
}
};
} catch (error) {
console.error('Error formatting feature flag payload:', error.message);
throw error;
}
}
module.exports = function(data) {
try {
const posthogResponse = data.create_experiment;
const directusPayload = data.$trigger;
const featureFlagPayload = formatFeatureFlagPayload(posthogResponse, directusPayload);
return {
id: posthogResponse.data.feature_flag.id,
payload: featureFlagPayload
};
}
catch(error) {
throw new Error(error.message);
}
}