diff --git a/model/feature_flags.go b/model/feature_flags.go new file mode 100644 index 000000000..ac6f88902 --- /dev/null +++ b/model/feature_flags.go @@ -0,0 +1,16 @@ +package model + +import ( + "github.com/gofrs/uuid" +) + +// FeatureFlag FeatureFlagの管理をする構造体 +type FeatureFlag struct { + UserID uuid.UUID `gorm:"type:char(36);not null;primaryKey;"` + FeatureFlagsJSON string `gorm:"type:TEXT NOT NULL"` +} + +// TableName DBの名前を指定 +func (f *FeatureFlag) TableName() string { + return "feature_flags" +} diff --git a/model/feature_flags_test.go b/model/feature_flags_test.go new file mode 100644 index 000000000..c34e75572 --- /dev/null +++ b/model/feature_flags_test.go @@ -0,0 +1,11 @@ +package model + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestFeatureFlag_TableName(t *testing.T) { + t.Parallel() + assert.Equal(t, "feature_flags", (&FeatureFlag{}).TableName()) +} diff --git a/repository/feature_flag.go b/repository/feature_flag.go new file mode 100644 index 000000000..402987b8f --- /dev/null +++ b/repository/feature_flag.go @@ -0,0 +1,31 @@ +package repository + +import ( + "github.com/gofrs/uuid" + + "github.com/traPtitech/traQ/model" +) + +// FeatureFlagRepository FeatureFlagリポジトリ +type FeatureFlagRepository interface { + // CreateUserFeatureFlag ユーザーのFeatureFlagを作成します。 + // + // 成功した場合、nilを返します。 + // userIDがuuid.Nilの場合、ErrNilIDを返します。 + // DBによるエラーを返すことがあります。 + CreateUserFeatureFlag(userID uuid.UUID, featureFlagsJSON string) error + // UpdateUserFeatureFlag ユーザーのFeatureFlagを更新します。 + // + // 成功した場合、nilを返します。 + // 指定したUserIDに対応するFeatureFlagが存在しない場合ErrNotFoundを返します。 + // userIDがuuid.Nilの場合、ErrNilIDを返します。 + // DBによるエラーを返すことがあります。 + UpdateUserFeatureFlag(UserID uuid.UUID, featureFlagsJSON string) error + // GetFeatureFlagByUserID 指定したユーザーのFeatureFlagを取得します。 + // + // 成功した場合、FeatureFlagとnilを返します。 + // 指定したUserIDに対応するFeatureFlagが存在しない場合ErrNotFoundを返します。 + // userIDがuuid.Nilの場合、ErrNilIDを返します。 + // DBによるエラーを返すことがあります。 + GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) +} diff --git a/repository/gorm/feature_flag.go b/repository/gorm/feature_flag.go new file mode 100644 index 000000000..ad0ff380a --- /dev/null +++ b/repository/gorm/feature_flag.go @@ -0,0 +1,43 @@ +package gorm + +import ( + "github.com/gofrs/uuid" + "github.com/traPtitech/traQ/model" + "github.com/traPtitech/traQ/repository" +) + +func (repo *Repository) CreateUserFeatureFlag(userID uuid.UUID, featureFlagsJSON string) error { + if userID == uuid.Nil { + return repository.ErrNilID + } + featureFlag := &model.FeatureFlag{ + UserID: userID, + FeatureFlagsJSON: featureFlagsJSON, + } + if err := repo.db.Create(featureFlag).Error; err != nil { + return convertError(err) + } + return nil +} + +func (repo *Repository) UpdateUserFeatureFlag(userID uuid.UUID, featureFlagsJSON string) error { + if userID == uuid.Nil { + return repository.ErrNilID + } + + if err := repo.db.Model(&model.FeatureFlag{UserID: userID}).Update("feature_flags_json", featureFlagsJSON).Error; err != nil { + return convertError(err) + } + return nil +} + +func (repo *Repository) GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) { + if userID == uuid.Nil { + return nil, repository.ErrNilID + } + featureFlag := &model.FeatureFlag{} + if err := repo.db.Take(featureFlag, &model.FeatureFlag{UserID: userID}).Error; err != nil { + return nil, convertError(err) + } + return featureFlag, nil +}