Skip to content

Commit 4840705

Browse files
committed
feat: add feature flags
1 parent a50e809 commit 4840705

9 files changed

Lines changed: 71 additions & 1 deletion

File tree

domain/domain.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type Repository struct {
2121
Workspace WorkspaceRepository
2222
Assignment AssignmentRepository
2323
Survey SurveyRepository
24+
Misc MiscRepository
2425
}
2526

2627
type Usecase struct {
@@ -31,6 +32,7 @@ type Usecase struct {
3132
Workspace WorkspaceUsecase
3233
Assignment AssignmentUsecase
3334
Survey SurveyUsecase
35+
Misc MiscUsecase
3436
}
3537

3638
type Publisher struct {

domain/misc.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package domain
2+
3+
type MiscRepository interface {
4+
GetFeatureFlag(feature string) (bool, error)
5+
}
6+
7+
type MiscUsecase interface {
8+
GetFeatureFlag(feature string) (bool, error)
9+
}

main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func initRepository(mysql *platform.MySql) *domain.Repository {
142142
Workspace: repository.NewWorkspaceRepository(mysql),
143143
Assignment: repository.NewAssignmentRepository(mysql),
144144
Survey: repository.NewSurveyRepository(mysql),
145+
Misc: repository.NewMiscRepsitory(mysql),
145146
}
146147
}
147148

@@ -152,6 +153,7 @@ func initUsecase(
152153
repository *domain.Repository,
153154
publisher *domain.Publisher,
154155
) *domain.Usecase {
156+
miscUsecase := usecase.NewMiscUsecase(repository.Misc)
155157
googleUsecase := usecase.NewGoogleUsecase(cfg)
156158
sessionUsecase := usecase.NewSessionUsecase(cfg, repository.Session)
157159
userUsecase := usecase.NewUserUsecase(platform.SeaweedFs, repository.User, sessionUsecase)
@@ -168,6 +170,7 @@ func initUsecase(
168170
Workspace: workspaceUsecase,
169171
Assignment: assignmentUsecase,
170172
Survey: surveyUsecase,
173+
Misc: miscUsecase,
171174
}
172175
}
173176

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE IF EXISTS `feature_flag`;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE IF NOT EXISTS `feature_flag` (
2+
`feature` VARCHAR(255) NOT NULL,
3+
`enabled` BOOLEAN NOT NULL
4+
)

platform/server/fiber.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (s *FiberServer) applyRoutes() {
9797
authMiddleware := middleware.NewAuthMiddleware(validator, s.usecase.Auth)
9898
publishableWorkspaceMiddleware := middleware.NewPublishableWorkspaceMiddleware(validator, s.usecase.Auth, s.usecase.Workspace)
9999
workspaceMiddleware := middleware.NewWorkspaceMiddleware(validator, s.usecase.Workspace)
100-
scoreboardMiddleware := middleware.NewScoreboardMiddleware(validator, s.usecase.Auth, s.usecase.Workspace)
100+
scoreboardMiddleware := middleware.NewScoreboardMiddleware(validator, s.usecase.Auth, s.usecase.Workspace, s.usecase.Misc)
101101

102102
// Initialize Controllers
103103
healtController := controller.NewHealthController(s.cfg)

platform/server/middleware/scoreboard.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,17 @@ func NewScoreboardMiddleware(
1111
validator domain.PayloadValidator,
1212
authUsecase domain.AuthUsecase,
1313
workspaceUsecase domain.WorkspaceUsecase,
14+
miscUsecase domain.MiscUsecase,
1415
) fiber.Handler {
1516
return func(ctx *fiber.Ctx) error {
17+
enabled, err := miscUsecase.GetFeatureFlag("scoreboard")
18+
if err != nil {
19+
return errs.New(errs.ErrGetScoreboard, "error get scoreboard ff", err)
20+
}
21+
if !enabled {
22+
return errs.New(errs.ErrGetScoreboard, "scoreboard feature is disabled")
23+
}
24+
1625
var pl payload.WorkspacePath
1726
if ok, err := validator.Validate(&pl, ctx); !ok {
1827
return err

repository/misc.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package repository
2+
3+
import (
4+
"database/sql"
5+
6+
"github.com/codern-org/codern/domain"
7+
"github.com/codern-org/codern/platform"
8+
)
9+
10+
type miscRepository struct {
11+
db *platform.MySql
12+
}
13+
14+
func NewMiscRepsitory(db *platform.MySql) domain.MiscRepository {
15+
return &miscRepository{db: db}
16+
}
17+
18+
func (r *miscRepository) GetFeatureFlag(feature string) (bool, error) {
19+
var enabled bool
20+
err := r.db.Get(&enabled, "SELECT enabled FROM feature_flag WHERE feature = ?", feature)
21+
if err == sql.ErrNoRows {
22+
return false, nil
23+
} else if err != nil {
24+
return false, err
25+
}
26+
return enabled, nil
27+
}

usecase/misc.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package usecase
2+
3+
import "github.com/codern-org/codern/domain"
4+
5+
type miscUsecase struct {
6+
miscRepository domain.MiscRepository
7+
}
8+
9+
func NewMiscUsecase(miscRepository domain.MiscRepository) domain.MiscUsecase {
10+
return &miscUsecase{miscRepository: miscRepository}
11+
}
12+
13+
func (u *miscUsecase) GetFeatureFlag(feature string) (bool, error) {
14+
return u.miscRepository.GetFeatureFlag(feature)
15+
}

0 commit comments

Comments
 (0)