Skip to content

Commit a6ecb2c

Browse files
jirevwemekilis
andauthored
refactor: move jobs and feature flags persistence to sqlc (#2622)
raw SQL in database/postgres is replaced by internal/jobs and internal/feature_flags. logger and migrate changes from the earlier branch are not included. Co-authored-by: Smart Mekiliuwa <st.nonso@gmail.com>
1 parent 14d5e98 commit a6ecb2c

30 files changed

Lines changed: 2649 additions & 1224 deletions

‎api/handlers/organisation.go‎

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"github.com/frain-dev/convoy/api/models"
1616
"github.com/frain-dev/convoy/api/policies"
1717
"github.com/frain-dev/convoy/auth"
18-
"github.com/frain-dev/convoy/database/postgres"
1918
"github.com/frain-dev/convoy/datastore"
2019
"github.com/frain-dev/convoy/internal/event_deliveries"
2120
"github.com/frain-dev/convoy/internal/organisation_members"
@@ -323,7 +322,7 @@ func (h *Handler) GetEarlyAdopterFeatures(w http.ResponseWriter, r *http.Request
323322
features := fflag.GetEarlyAdopterFeatures()
324323
responseFeatures := make([]models.EarlyAdopterFeature, 0, len(features))
325324

326-
earlyAdopterFeatures, err := postgres.LoadEarlyAdopterFeaturesByOrg(r.Context(), h.A.DB, org.UID)
325+
earlyAdopterFeatures, err := h.A.FeatureFlagService.LoadEarlyAdopterFeaturesByOrg(r.Context(), org.UID)
327326
if err != nil {
328327
_ = render.Render(w, r, util.NewServiceErrResponse(err))
329328
return
@@ -421,7 +420,7 @@ func (h *Handler) updateFeatureFlag(w http.ResponseWriter, r *http.Request, feat
421420
feature.EnabledAt = null.TimeFrom(time.Now())
422421
}
423422

424-
err := postgres.UpsertEarlyAdopterFeature(r.Context(), h.A.DB, feature)
423+
err := h.A.FeatureFlagService.UpsertEarlyAdopterFeature(r.Context(), feature)
425424
if err != nil {
426425
_ = render.Render(w, r, util.NewServiceErrResponse(err))
427426
return err
@@ -467,7 +466,7 @@ func (h *Handler) GetAllFeatureFlags(w http.ResponseWriter, r *http.Request) {
467466
return
468467
}
469468

470-
flags, err := postgres.LoadFeatureFlags(r.Context(), h.A.DB)
469+
flags, err := h.A.FeatureFlagService.LoadFeatureFlags(r.Context())
471470
if err != nil {
472471
_ = render.Render(w, r, util.NewServiceErrResponse(err))
473472
return
@@ -532,7 +531,7 @@ func (h *Handler) GetOrganisationOverrides(w http.ResponseWriter, r *http.Reques
532531
return
533532
}
534533

535-
overrides, err := postgres.LoadFeatureFlagOverridesByOwner(r.Context(), h.A.DB, "organisation", orgID)
534+
overrides, err := h.A.FeatureFlagService.LoadFeatureFlagOverridesByOwner(r.Context(), "organisation", orgID)
536535
if err != nil {
537536
_ = render.Render(w, r, util.NewServiceErrResponse(err))
538537
return
@@ -546,7 +545,7 @@ func (h *Handler) GetOrganisationOverrides(w http.ResponseWriter, r *http.Reques
546545

547546
enrichedOverrides := make([]OverrideWithKey, 0, len(overrides))
548547
for i := range overrides {
549-
featureFlag, err := postgres.FetchFeatureFlagByID(r.Context(), h.A.DB, overrides[i].FeatureFlagID)
548+
featureFlag, err := h.A.FeatureFlagService.FetchFeatureFlagByID(r.Context(), overrides[i].FeatureFlagID)
550549
if err != nil {
551550
h.A.Logger.WarnContext(r.Context(), fmt.Sprintf("Failed to fetch feature flag for override: %s: %v", overrides[i].FeatureFlagID, err))
552551
continue
@@ -588,9 +587,9 @@ func (h *Handler) UpdateOrganisationOverride(w http.ResponseWriter, r *http.Requ
588587
}
589588

590589
// Fetch the feature flag
591-
featureFlag, err := postgres.FetchFeatureFlagByKey(r.Context(), h.A.DB, overrideRequest.FeatureKey)
590+
featureFlag, err := h.A.FeatureFlagService.FetchFeatureFlagByKey(r.Context(), overrideRequest.FeatureKey)
592591
if err != nil {
593-
if errors.Is(err, postgres.ErrFeatureFlagNotFound) {
592+
if errors.Is(err, datastore.ErrFeatureFlagNotFound) {
594593
_ = render.Render(w, r, util.NewErrorResponse("Feature flag not found: "+overrideRequest.FeatureKey, http.StatusBadRequest))
595594
return
596595
}
@@ -616,7 +615,7 @@ func (h *Handler) UpdateOrganisationOverride(w http.ResponseWriter, r *http.Requ
616615
override.EnabledAt = null.TimeFrom(time.Now())
617616
}
618617

619-
err = postgres.UpsertFeatureFlagOverride(r.Context(), h.A.DB, override)
618+
err = h.A.FeatureFlagService.UpsertFeatureFlagOverride(r.Context(), override)
620619
if err != nil {
621620
_ = render.Render(w, r, util.NewServiceErrResponse(err))
622621
return
@@ -645,17 +644,17 @@ func (h *Handler) DeleteOrganisationOverride(w http.ResponseWriter, r *http.Requ
645644
}
646645

647646
// Fetch the feature flag to get its ID
648-
featureFlag, err := postgres.FetchFeatureFlagByKey(r.Context(), h.A.DB, featureKey)
647+
featureFlag, err := h.A.FeatureFlagService.FetchFeatureFlagByKey(r.Context(), featureKey)
649648
if err != nil {
650-
if errors.Is(err, postgres.ErrFeatureFlagNotFound) {
649+
if errors.Is(err, datastore.ErrFeatureFlagNotFound) {
651650
_ = render.Render(w, r, util.NewErrorResponse("Feature flag not found: "+featureKey, http.StatusBadRequest))
652651
return
653652
}
654653
_ = render.Render(w, r, util.NewServiceErrResponse(err))
655654
return
656655
}
657656

658-
err = postgres.DeleteFeatureFlagOverride(r.Context(), h.A.DB, "organisation", orgID, featureFlag.UID)
657+
err = h.A.FeatureFlagService.DeleteFeatureFlagOverride(r.Context(), "organisation", orgID, featureFlag.UID)
659658
if err != nil {
660659
_ = render.Render(w, r, util.NewServiceErrResponse(err))
661660
return
@@ -955,9 +954,9 @@ func (h *Handler) UpdateFeatureFlag(w http.ResponseWriter, r *http.Request) {
955954
}
956955

957956
// Fetch the feature flag
958-
featureFlag, err := postgres.FetchFeatureFlagByKey(r.Context(), h.A.DB, featureKey)
957+
featureFlag, err := h.A.FeatureFlagService.FetchFeatureFlagByKey(r.Context(), featureKey)
959958
if err != nil {
960-
if errors.Is(err, postgres.ErrFeatureFlagNotFound) {
959+
if errors.Is(err, datastore.ErrFeatureFlagNotFound) {
961960
_ = render.Render(w, r, util.NewErrorResponse("Feature flag not found: "+featureKey, http.StatusBadRequest))
962961
return
963962
}
@@ -967,14 +966,14 @@ func (h *Handler) UpdateFeatureFlag(w http.ResponseWriter, r *http.Request) {
967966

968967
// Update enabled state if provided
969968
if updateRequest.Enabled != nil {
970-
err = postgres.UpdateFeatureFlag(r.Context(), h.A.DB, featureFlag.UID, *updateRequest.Enabled)
969+
err = h.A.FeatureFlagService.UpdateFeatureFlag(r.Context(), featureFlag.UID, *updateRequest.Enabled)
971970
if err != nil {
972971
_ = render.Render(w, r, util.NewServiceErrResponse(err))
973972
return
974973
}
975974
}
976975

977-
updatedFlag, err := postgres.FetchFeatureFlagByID(r.Context(), h.A.DB, featureFlag.UID)
976+
updatedFlag, err := h.A.FeatureFlagService.FetchFeatureFlagByID(r.Context(), featureFlag.UID)
978977
if err != nil {
979978
_ = render.Render(w, r, util.NewServiceErrResponse(err))
980979
return

‎api/oauth2_integration_test.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import (
2525
mcache "github.com/frain-dev/convoy/cache/memory"
2626
"github.com/frain-dev/convoy/config"
2727
"github.com/frain-dev/convoy/database"
28-
"github.com/frain-dev/convoy/database/postgres"
2928
"github.com/frain-dev/convoy/datastore"
3029
"github.com/frain-dev/convoy/internal/api_keys"
3130
"github.com/frain-dev/convoy/internal/endpoints"
31+
"github.com/frain-dev/convoy/internal/feature_flags"
3232
"github.com/frain-dev/convoy/internal/pkg/fflag"
3333
"github.com/frain-dev/convoy/internal/pkg/keys"
3434
"github.com/frain-dev/convoy/internal/pkg/metrics"
@@ -597,7 +597,7 @@ func enableOAuth2FeatureFlag(t *testing.T, db database.Database, orgID string) e
597597
EnabledAt: null.TimeFrom(time.Now()),
598598
}
599599

600-
return postgres.UpsertEarlyAdopterFeature(context.Background(), db, feature)
600+
return feature_flags.New(log.New("convoy", log.LevelInfo), db).UpsertEarlyAdopterFeature(context.Background(), feature)
601601
}
602602

603603
func TestOAuth2IntegrationTestSuite(t *testing.T) {

‎api/server_suite_test.go‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/frain-dev/convoy/database/postgres"
3131
"github.com/frain-dev/convoy/datastore"
3232
"github.com/frain-dev/convoy/internal/configuration"
33+
"github.com/frain-dev/convoy/internal/feature_flags"
3334
"github.com/frain-dev/convoy/internal/pkg/broker"
3435
"github.com/frain-dev/convoy/internal/pkg/fflag"
3536
"github.com/frain-dev/convoy/internal/pkg/keys"
@@ -196,12 +197,14 @@ func newBroker(t *testing.T, cfg config.Configuration, db database.Database, log
196197
// wiring so a partial build cannot run green without touching broker paths.
197198
func newAPIOptions(tl *testInstance, deps *broker.Dependencies, licenser license.Licenser) *types.APIOptions {
198199
db := tl.Database
200+
ffSvc := feature_flags.New(tl.Logger, db)
199201
o := &types.APIOptions{
200202
DB: db,
201203
Logger: tl.Logger,
202204
FFlag: fflag.NewFFlag([]string{string(fflag.Prometheus), string(fflag.FullTextSearch)}),
203-
FeatureFlagFetcher: postgres.NewFeatureFlagFetcher(db),
204-
EarlyAdopterFeatureFetcher: postgres.NewEarlyAdopterFeatureFetcher(db),
205+
FeatureFlagFetcher: ffSvc,
206+
EarlyAdopterFeatureFetcher: ffSvc,
207+
FeatureFlagService: ffSvc,
205208
ConfigRepo: configuration.New(tl.Logger, db),
206209
Licenser: licenser,
207210
Cfg: tl.Config,

‎api/types/types.go‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/frain-dev/convoy/config"
1414
"github.com/frain-dev/convoy/database"
1515
"github.com/frain-dev/convoy/datastore"
16+
"github.com/frain-dev/convoy/internal/feature_flags"
1617
"github.com/frain-dev/convoy/internal/pkg/batch_tracker"
1718
"github.com/frain-dev/convoy/internal/pkg/billing"
1819
"github.com/frain-dev/convoy/internal/pkg/dynamiceventack"
@@ -41,6 +42,7 @@ type APIOptions struct {
4142
FFlag *fflag.FFlag
4243
FeatureFlagFetcher fflag.FeatureFlagFetcher
4344
EarlyAdopterFeatureFetcher fflag.EarlyAdopterFeatureFetcher
45+
FeatureFlagService *feature_flags.Service
4446
DB database.Database
4547
CircuitBreakerStore circuit_breaker.CircuitBreakerStore
4648
Queue queue.Queuer

‎cmd/server/server.go‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import (
1414
"github.com/frain-dev/convoy/api/types"
1515
"github.com/frain-dev/convoy/auth/realm_chain"
1616
"github.com/frain-dev/convoy/config"
17-
"github.com/frain-dev/convoy/database/postgres"
1817
"github.com/frain-dev/convoy/datastore/cached"
1918
"github.com/frain-dev/convoy/internal/api_keys"
2019
"github.com/frain-dev/convoy/internal/configuration"
20+
"github.com/frain-dev/convoy/internal/feature_flags"
2121
"github.com/frain-dev/convoy/internal/pkg/cli"
2222
"github.com/frain-dev/convoy/internal/pkg/exporter"
2323
"github.com/frain-dev/convoy/internal/pkg/fflag"
@@ -130,8 +130,7 @@ func StartConvoyServer(a *cli.App) error {
130130
}
131131

132132
flag := fflag.NewFFlag(cfg.EnableFeatureFlag)
133-
featureFlagFetcher := postgres.NewFeatureFlagFetcher(a.DB)
134-
earlyAdopterFeatureFetcher := postgres.NewEarlyAdopterFeatureFetcher(a.DB)
133+
featureFlagSvc := feature_flags.New(a.Logger, a.DB)
135134

136135
if cfg.Server.HTTP.Port <= 0 {
137136
return errors.New("please provide the HTTP port in the convoy.json file")
@@ -146,8 +145,9 @@ func StartConvoyServer(a *cli.App) error {
146145

147146
apiOpts := &types.APIOptions{
148147
FFlag: flag,
149-
FeatureFlagFetcher: featureFlagFetcher,
150-
EarlyAdopterFeatureFetcher: earlyAdopterFeatureFetcher,
148+
FeatureFlagFetcher: featureFlagSvc,
149+
EarlyAdopterFeatureFetcher: featureFlagSvc,
150+
FeatureFlagService: featureFlagSvc,
151151
DB: a.DB,
152152
Logger: lo,
153153
Licenser: a.Licenser,

‎cmd/utils/org_feature_flags.go‎

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ import (
1212
"github.com/spf13/cobra"
1313
"gopkg.in/guregu/null.v4"
1414

15-
"github.com/frain-dev/convoy/database"
16-
"github.com/frain-dev/convoy/database/postgres"
1715
"github.com/frain-dev/convoy/datastore"
16+
"github.com/frain-dev/convoy/internal/feature_flags"
1817
"github.com/frain-dev/convoy/internal/organisations"
1918
"github.com/frain-dev/convoy/internal/pkg/cli"
2019
"github.com/frain-dev/convoy/internal/pkg/fflag"
@@ -53,8 +52,9 @@ func AddUpdateOrgFeatureFlagsCommand(a *cli.App) *cobra.Command {
5352

5453
slog.Info(fmt.Sprintf("Updating feature flags for organisation: %s (%s)", org.Name, org.UID))
5554

56-
errorList := processFeatureFlags(context.Background(), db, orgID, enableFlags, true)
57-
errorList = append(errorList, processFeatureFlags(context.Background(), db, orgID, disableFlags, false)...)
55+
ffService := feature_flags.New(a.Logger, db)
56+
errorList := processFeatureFlags(context.Background(), ffService, orgID, enableFlags, true)
57+
errorList = append(errorList, processFeatureFlags(context.Background(), ffService, orgID, disableFlags, false)...)
5858

5959
if len(errorList) > 0 {
6060
slog.Error(fmt.Sprintf("Encountered %d errors:", len(errorList)))
@@ -79,7 +79,7 @@ func AddUpdateOrgFeatureFlagsCommand(a *cli.App) *cobra.Command {
7979
return cmd
8080
}
8181

82-
func processFeatureFlags(ctx context.Context, db database.Database, orgID string, flags []string, enabled bool) []string {
82+
func processFeatureFlags(ctx context.Context, ffService *feature_flags.Service, orgID string, flags []string, enabled bool) []string {
8383
var errorList []string
8484
for _, flag := range flags {
8585
flagKey := strings.ToLower(strings.TrimSpace(flag))
@@ -88,7 +88,7 @@ func processFeatureFlags(ctx context.Context, db database.Database, orgID string
8888
continue
8989
}
9090

91-
err := updateOrgFeatureFlag(ctx, db, orgID, flagKey, enabled)
91+
err := updateOrgFeatureFlag(ctx, ffService, orgID, flagKey, enabled)
9292
if err != nil {
9393
action := "enable"
9494
if !enabled {
@@ -107,10 +107,10 @@ func processFeatureFlags(ctx context.Context, db database.Database, orgID string
107107
return errorList
108108
}
109109

110-
func updateOrgFeatureFlag(ctx context.Context, db database.Database, orgID, flagKey string, enabled bool) error {
111-
featureFlag, err := postgres.FetchFeatureFlagByKey(ctx, db, flagKey)
110+
func updateOrgFeatureFlag(ctx context.Context, ffService *feature_flags.Service, orgID, flagKey string, enabled bool) error {
111+
featureFlag, err := ffService.FetchFeatureFlagByKey(ctx, flagKey)
112112
if err != nil {
113-
if errors.Is(err, postgres.ErrFeatureFlagNotFound) {
113+
if errors.Is(err, datastore.ErrFeatureFlagNotFound) {
114114
return fmt.Errorf("%w: %s", ErrFeatureFlagNotFound, flagKey)
115115
}
116116
return err
@@ -126,7 +126,7 @@ func updateOrgFeatureFlag(ctx context.Context, db database.Database, orgID, flag
126126
if enabled {
127127
feature.EnabledAt = null.TimeFrom(time.Now())
128128
}
129-
return postgres.UpsertEarlyAdopterFeature(ctx, db, feature)
129+
return ffService.UpsertEarlyAdopterFeature(ctx, feature)
130130
}
131131

132132
override := &datastore.FeatureFlagOverride{
@@ -141,7 +141,7 @@ func updateOrgFeatureFlag(ctx context.Context, db database.Database, orgID, flag
141141
override.EnabledAt = null.TimeFrom(time.Now())
142142
}
143143

144-
return postgres.UpsertFeatureFlagOverride(ctx, db, override)
144+
return ffService.UpsertFeatureFlagOverride(ctx, override)
145145
}
146146

147147
func isValidFeatureFlag(flagKey string) bool {

‎database/postgres/early_adopter_feature_fetcher.go‎

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)