From 013950ea7a1a1b5cc71bbd8655096f3fa63bf2af Mon Sep 17 00:00:00 2001 From: tsu-so Date: Sun, 24 Aug 2025 17:34:51 +0900 Subject: [PATCH 1/5] feat: Add FeatureFlag model and repository GET method --- model/feature_flags.go | 16 ++++++++++++++++ repository/feature_flag.go | 17 +++++++++++++++++ repository/gorm/feature_flag.go | 18 ++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 model/feature_flags.go create mode 100644 repository/feature_flag.go create mode 100644 repository/gorm/feature_flag.go diff --git a/model/feature_flags.go b/model/feature_flags.go new file mode 100644 index 000000000..5ed44dfbe --- /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/repository/feature_flag.go b/repository/feature_flag.go new file mode 100644 index 000000000..292c3b69c --- /dev/null +++ b/repository/feature_flag.go @@ -0,0 +1,17 @@ +package repository + +import ( + "github.com/gofrs/uuid" + + "github.com/traPtitech/traQ/model" +) + +// FeatureFlagRepository FeatureFlagリポジトリ +type FeatureFlagRepository interface { + // GetFeatureFlagByUserID 指定したユーザーのFeatureFlagを取得します。 + // + // 成功した場合、FeatureFlagとnilを返します。 + // 存在しないFeatureFlagの場合ErrNotFoundを返します。 + // DBによるエラーを返すことがあります。 + GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) +} \ No newline at end of file diff --git a/repository/gorm/feature_flag.go b/repository/gorm/feature_flag.go new file mode 100644 index 000000000..92667be2d --- /dev/null +++ b/repository/gorm/feature_flag.go @@ -0,0 +1,18 @@ +package gorm + +import ( + "github.com/gofrs/uuid" + "github.com/traPtitech/traQ/model" + "github.com/traPtitech/traQ/repository" +) + +func (repo *Repository) GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) { + if userID == uuid.Nil { + return nil, repository.ErrNotFound + } + featureFlag := &model.FeatureFlag{} + if err := repo.db.Take(featureFlag, &model.FeatureFlag{UserID: userID}).Error; err != nil { + return nil, convertError(err) + } + return featureFlag, nil +} \ No newline at end of file From 63c966aacf4c20bdbbd6776f86ac2a339afe42d2 Mon Sep 17 00:00:00 2001 From: tsu-so Date: Sun, 24 Aug 2025 18:05:44 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=E6=96=B0=E3=81=97=E3=81=84FeatureF?= =?UTF-8?q?lag=E3=83=A2=E3=83=87=E3=83=AB=E3=81=AETableName=E3=83=A1?= =?UTF-8?q?=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/feature_flags_test.go | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 model/feature_flags_test.go diff --git a/model/feature_flags_test.go b/model/feature_flags_test.go new file mode 100644 index 000000000..b764c40b0 --- /dev/null +++ b/model/feature_flags_test.go @@ -0,0 +1,11 @@ +package model + +import ( + "testing" + "github.com/stretchr/testify/assert" +) + +func TestFeatureFlag_TableName (t *testing.T) { + t.Parallel() + assert.Equal(t, "feature_flags", (&FeatureFlag{}).TableName()) +} \ No newline at end of file From e096b13f52927c5cbe74b5f59402ba7592d5003b Mon Sep 17 00:00:00 2001 From: tsu-so Date: Sun, 24 Aug 2025 18:10:15 +0900 Subject: [PATCH 3/5] fix:correct lint, format --- model/feature_flags.go | 4 ++-- model/feature_flags_test.go | 6 +++--- repository/feature_flag.go | 2 +- repository/gorm/feature_flag.go | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/model/feature_flags.go b/model/feature_flags.go index 5ed44dfbe..ac6f88902 100644 --- a/model/feature_flags.go +++ b/model/feature_flags.go @@ -6,8 +6,8 @@ import ( // FeatureFlag FeatureFlagの管理をする構造体 type FeatureFlag struct { - UserID uuid.UUID `gorm:"type:char(36);not null;primaryKey;"` - FeatureFlagsJson string `gorm:"type:TEXT NOT NULL"` + UserID uuid.UUID `gorm:"type:char(36);not null;primaryKey;"` + FeatureFlagsJSON string `gorm:"type:TEXT NOT NULL"` } // TableName DBの名前を指定 diff --git a/model/feature_flags_test.go b/model/feature_flags_test.go index b764c40b0..c34e75572 100644 --- a/model/feature_flags_test.go +++ b/model/feature_flags_test.go @@ -1,11 +1,11 @@ package model import ( - "testing" "github.com/stretchr/testify/assert" + "testing" ) -func TestFeatureFlag_TableName (t *testing.T) { +func TestFeatureFlag_TableName(t *testing.T) { t.Parallel() assert.Equal(t, "feature_flags", (&FeatureFlag{}).TableName()) -} \ No newline at end of file +} diff --git a/repository/feature_flag.go b/repository/feature_flag.go index 292c3b69c..ecaa8d0ab 100644 --- a/repository/feature_flag.go +++ b/repository/feature_flag.go @@ -14,4 +14,4 @@ type FeatureFlagRepository interface { // 存在しないFeatureFlagの場合ErrNotFoundを返します。 // DBによるエラーを返すことがあります。 GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) -} \ No newline at end of file +} diff --git a/repository/gorm/feature_flag.go b/repository/gorm/feature_flag.go index 92667be2d..6df833e1d 100644 --- a/repository/gorm/feature_flag.go +++ b/repository/gorm/feature_flag.go @@ -15,4 +15,4 @@ func (repo *Repository) GetFeatureFlagByUserID(userID uuid.UUID) (*model.Feature return nil, convertError(err) } return featureFlag, nil -} \ No newline at end of file +} From 1a59ab6475446e29c6b6bce692c58e4362b26b79 Mon Sep 17 00:00:00 2001 From: tsu-so Date: Sun, 24 Aug 2025 18:21:15 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20GetFeatureFlagByUserID=20=E3=83=A1?= =?UTF-8?q?=E3=82=BD=E3=83=83=E3=83=89=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repository/gorm/feature_flag.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repository/gorm/feature_flag.go b/repository/gorm/feature_flag.go index 6df833e1d..f114693f4 100644 --- a/repository/gorm/feature_flag.go +++ b/repository/gorm/feature_flag.go @@ -8,7 +8,7 @@ import ( func (repo *Repository) GetFeatureFlagByUserID(userID uuid.UUID) (*model.FeatureFlag, error) { if userID == uuid.Nil { - return nil, repository.ErrNotFound + return nil, repository.ErrNilID } featureFlag := &model.FeatureFlag{} if err := repo.db.Take(featureFlag, &model.FeatureFlag{UserID: userID}).Error; err != nil { From 38d971bb9ff6b8a646ea43d0fbabc5a6d5552ba7 Mon Sep 17 00:00:00 2001 From: tsu-so Date: Sun, 24 Aug 2025 18:32:02 +0900 Subject: [PATCH 5/5] feat:Implement Create and update methods for UserFeatureFlag in GORM repository --- repository/feature_flag.go | 16 +++++++++++++++- repository/gorm/feature_flag.go | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/repository/feature_flag.go b/repository/feature_flag.go index ecaa8d0ab..402987b8f 100644 --- a/repository/feature_flag.go +++ b/repository/feature_flag.go @@ -8,10 +8,24 @@ import ( // 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を返します。 - // 存在しないFeatureFlagの場合ErrNotFoundを返します。 + // 指定した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 index f114693f4..ad0ff380a 100644 --- a/repository/gorm/feature_flag.go +++ b/repository/gorm/feature_flag.go @@ -6,6 +6,31 @@ import ( "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