openreplay/backend/pkg/db/postgres/feature-flag.go
Alexander db7d624b3b
[Backend] feature flags (#1354)
* 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
2023-06-21 13:41:06 +02:00

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
}