* feat(backend): added ff mock * feat(backend): added feature flag pg method * fix(backend): fixed ff request field * feat(backend): added multivariant support * feat(backend): added logic handler for feature flag filters * fix(backend): correct sql request for multivariants flags * feat(backend): added new fields to sessionStart response * feat(backend): removed unused fields from getFeatureFlags request * fix(backend): removed comments * feat(backend): added debug logs * feat(backend): added single type case for arrayToNum parser * feat(backend): added unit tests for feature flags
45 lines
1.6 KiB
Go
45 lines
1.6 KiB
Go
package postgres
|
|
|
|
import (
|
|
"openreplay/backend/pkg/featureflags"
|
|
)
|
|
|
|
func (conn *Conn) GetFeatureFlags(projectID uint32) ([]*featureflags.FeatureFlag, error) {
|
|
rows, err := conn.c.Query(`
|
|
SELECT ff.flag_id, ff.flag_key, ff.flag_type, ff.is_persist, ff.payload, ff.rollout_percentages, ff.filters,
|
|
ARRAY_AGG(fv.value) as values,
|
|
ARRAY_AGG(fv.payload) as payloads,
|
|
ARRAY_AGG(fv.rollout_percentage) AS variants_percentages
|
|
FROM (
|
|
SELECT ff.feature_flag_id AS flag_id, ff.flag_key AS flag_key, ff.flag_type, ff.is_persist, ff.payload,
|
|
ARRAY_AGG(fc.rollout_percentage) AS rollout_percentages,
|
|
ARRAY_AGG(fc.filters) AS filters
|
|
FROM public.feature_flags ff
|
|
LEFT JOIN public.feature_flags_conditions fc ON ff.feature_flag_id = fc.feature_flag_id
|
|
WHERE ff.project_id = $1 AND ff.is_active = TRUE
|
|
GROUP BY ff.feature_flag_id
|
|
) AS ff
|
|
LEFT JOIN public.feature_flags_variants fv ON ff.flag_type = 'multi' AND ff.flag_id = fv.feature_flag_id
|
|
GROUP BY ff.flag_id, ff.flag_key, ff.flag_type, ff.is_persist, ff.payload, ff.filters, ff.rollout_percentages;
|
|
`, projectID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var flags []*featureflags.FeatureFlag
|
|
|
|
for rows.Next() {
|
|
var flag featureflags.FeatureFlagPG
|
|
if err := rows.Scan(&flag.FlagID, &flag.FlagKey, &flag.FlagType, &flag.IsPersist, &flag.Payload, &flag.RolloutPercentages,
|
|
&flag.Filters, &flag.Values, &flag.Payloads, &flag.VariantRollout); err != nil {
|
|
return nil, err
|
|
}
|
|
parsedFlag, err := featureflags.ParseFeatureFlag(&flag)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
flags = append(flags, parsedFlag)
|
|
}
|
|
return flags, nil
|
|
}
|