From 85f3da9d287a138405493d23251f155684ccedcd Mon Sep 17 00:00:00 2001 From: hiifong Date: Wed, 15 Jan 2025 11:38:33 +0800 Subject: [PATCH 1/5] Feat: Star List --- models/repo/star_list.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 models/repo/star_list.go diff --git a/models/repo/star_list.go b/models/repo/star_list.go new file mode 100644 index 0000000000000..89cb7118869f0 --- /dev/null +++ b/models/repo/star_list.go @@ -0,0 +1,25 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repo + +import ( + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" +) + +// StarList ... +type StarList struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:INDEX uid` + SID int64 `xorm:INDEX sid` + Name string + Desc string + + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` +} + +func init() { + db.RegisterModel(new(StarList)) +} From a53041966c43f541ef70731754dc4c1845d34de3 Mon Sep 17 00:00:00 2001 From: hiifong Date: Tue, 4 Feb 2025 15:26:10 +0800 Subject: [PATCH 2/5] fix model --- models/repo/star_list.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/repo/star_list.go b/models/repo/star_list.go index 89cb7118869f0..f04654f92ec8d 100644 --- a/models/repo/star_list.go +++ b/models/repo/star_list.go @@ -11,8 +11,8 @@ import ( // StarList ... type StarList struct { ID int64 `xorm:"pk autoincr"` - UID int64 `xorm:INDEX uid` - SID int64 `xorm:INDEX sid` + UID int64 `xorm:"INDEX"` + SID int64 `xorm:"INDEX"` Name string Desc string From f1d9ba1f879587c4ff3af637c64774cfdf5f1a04 Mon Sep 17 00:00:00 2001 From: hiifong Date: Tue, 4 Feb 2025 22:06:36 +0800 Subject: [PATCH 3/5] save --- models/migrations/migrations.go | 1 + models/migrations/v1_24/v314.go | 46 +++++++++++++++++++++++++++++++++ models/repo/star.go | 1 + models/repo/star_list.go | 44 ++++++++++++++++++++++++++++++- 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 models/migrations/v1_24/v314.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 95364ab705751..4b035fdd95b29 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -373,6 +373,7 @@ func prepareMigrationTasks() []*migration { // Gitea 1.23.0-rc0 ends at migration ID number 311 (database version 312) newMigration(312, "Add DeleteBranchAfterMerge to AutoMerge", v1_24.AddDeleteBranchAfterMergeForAutoMerge), + newMigration(314, "Add star_list table", v1_24.AddStarList), } return preparedMigrations } diff --git a/models/migrations/v1_24/v314.go b/models/migrations/v1_24/v314.go new file mode 100644 index 0000000000000..182ea4dfaadf6 --- /dev/null +++ b/models/migrations/v1_24/v314.go @@ -0,0 +1,46 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package v1_24 //nolint + +import ( + "code.gitea.io/gitea/modules/timeutil" + + "xorm.io/xorm" +) + +type Star struct { + StarListID int64 `xorm:"UNIQUE(s)"` +} + +type StarList struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX"` + Name string + Desc string + + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` +} + +// TableName return database table name for xorm +func (StarList) TableName() string { + return "star_list" +} + +func AddStarList(x *xorm.Engine) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + err := sess.Sync(new(Star)) + if err != nil { + return err + } + err = sess.Sync(new(StarList)) + if err != nil { + return err + } + return sess.Commit() +} diff --git a/models/repo/star.go b/models/repo/star.go index 4c66855525fa6..62d242fb7c31a 100644 --- a/models/repo/star.go +++ b/models/repo/star.go @@ -16,6 +16,7 @@ type Star struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"UNIQUE(s)"` RepoID int64 `xorm:"UNIQUE(s)"` + StarListID int64 `xorm:"UNIQUE(s)"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` } diff --git a/models/repo/star_list.go b/models/repo/star_list.go index f04654f92ec8d..f9a6df297cefc 100644 --- a/models/repo/star_list.go +++ b/models/repo/star_list.go @@ -4,6 +4,8 @@ package repo import ( + "context" + "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/timeutil" ) @@ -12,10 +14,12 @@ import ( type StarList struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"INDEX"` - SID int64 `xorm:"INDEX"` Name string Desc string + StarIDs []int64 `xorm:"-"` + Repos []Repository `xorm:"-"` + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } @@ -23,3 +27,41 @@ type StarList struct { func init() { db.RegisterModel(new(StarList)) } + +func (list *StarList) GetCount() int64 { + var star Star + count, err := db.GetEngine(context.Background()).Where("star_list_id = ?", list.ID).Count(star) + if err != nil { + return 0 + } + return count +} + +func (list *StarList) LoadStars() { + var star []Star + err := db.GetEngine(context.Background()).Where("star_list_id = ?", list.ID).Find(&star) + if err != nil { + return + } + for _, star := range star { + list.StarIDs = append(list.StarIDs, star.ID) + } +} + +func GetStarListByUID(ctx context.Context, uid int64) ([]*StarList, error) { + var list []*StarList + err := db.GetEngine(ctx).Where("uid = ?", uid).Find(&list) + if err != nil { + return nil, err + } + return list, nil +} + +func GetReposByStarListID(ctx context.Context, starListID int64) ([]*Repository, error) { + repos := make([]*Repository, 0, 100) + err := db.GetEngine(ctx).Where("star_list_id = ?", starListID).Find(&repos) + if err != nil { + return nil, err + } + return repos, nil +} From eeefd0f75f9726045d8539d34a8b90da88d54efd Mon Sep 17 00:00:00 2001 From: hiifong Date: Thu, 6 Feb 2025 00:21:32 +0800 Subject: [PATCH 4/5] Update --- models/migrations/v1_24/v314.go | 14 +++++---- models/repo/issue.go | 7 ----- models/repo/repo.go | 7 ----- models/repo/star.go | 1 - models/repo/star_list.go | 53 ++++++++++++++------------------ models/repo/star_list_repo.go | 54 +++++++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 models/repo/star_list_repo.go diff --git a/models/migrations/v1_24/v314.go b/models/migrations/v1_24/v314.go index 182ea4dfaadf6..98d065b2ad87e 100644 --- a/models/migrations/v1_24/v314.go +++ b/models/migrations/v1_24/v314.go @@ -9,10 +9,6 @@ import ( "xorm.io/xorm" ) -type Star struct { - StarListID int64 `xorm:"UNIQUE(s)"` -} - type StarList struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"INDEX"` @@ -23,6 +19,12 @@ type StarList struct { UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` } +type StarListRepo struct { + UID int64 `xorm:"UNIQUE(s)"` + StarListID int64 `xorm:"UNIQUE(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` +} + // TableName return database table name for xorm func (StarList) TableName() string { return "star_list" @@ -34,11 +36,11 @@ func AddStarList(x *xorm.Engine) error { if err := sess.Begin(); err != nil { return err } - err := sess.Sync(new(Star)) + err := sess.Sync(new(StarList)) if err != nil { return err } - err = sess.Sync(new(StarList)) + err = sess.Sync(new(StarListRepo)) if err != nil { return err } diff --git a/models/repo/issue.go b/models/repo/issue.go index 0dd4fd5ed480e..4f186aae9cc9b 100644 --- a/models/repo/issue.go +++ b/models/repo/issue.go @@ -11,13 +11,6 @@ import ( "code.gitea.io/gitea/modules/setting" ) -// ___________.__ ___________ __ -// \__ ___/|__| _____ ___\__ ___/___________ ____ | | __ ___________ -// | | | |/ \_/ __ \| | \_ __ \__ \ _/ ___\| |/ // __ \_ __ \ -// | | | | Y Y \ ___/| | | | \// __ \\ \___| <\ ___/| | \/ -// |____| |__|__|_| /\___ >____| |__| (____ /\___ >__|_ \\___ >__| -// \/ \/ \/ \/ \/ \/ - // CanEnableTimetracker returns true when the server admin enabled time tracking // This overrules IsTimetrackerEnabled func (repo *Repository) CanEnableTimetracker() bool { diff --git a/models/repo/repo.go b/models/repo/repo.go index 4e27dbaf1467e..478c490444e07 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -732,13 +732,6 @@ func (repo *Repository) MustNotBeArchived() error { return nil } -// __________ .__ __ -// \______ \ ____ ______ ____ _____|__|/ |_ ___________ ___.__. -// | _// __ \\____ \ / _ \/ ___/ \ __\/ _ \_ __ < | | -// | | \ ___/| |_> > <_> )___ \| || | ( <_> ) | \/\___ | -// |____|_ /\___ > __/ \____/____ >__||__| \____/|__| / ____| -// \/ \/|__| \/ \/ - // ErrRepoNotExist represents a "RepoNotExist" kind of error. type ErrRepoNotExist struct { ID int64 diff --git a/models/repo/star.go b/models/repo/star.go index 62d242fb7c31a..4c66855525fa6 100644 --- a/models/repo/star.go +++ b/models/repo/star.go @@ -16,7 +16,6 @@ type Star struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"UNIQUE(s)"` RepoID int64 `xorm:"UNIQUE(s)"` - StarListID int64 `xorm:"UNIQUE(s)"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` } diff --git a/models/repo/star_list.go b/models/repo/star_list.go index f9a6df297cefc..8cfbe293cd4e5 100644 --- a/models/repo/star_list.go +++ b/models/repo/star_list.go @@ -10,15 +10,13 @@ import ( "code.gitea.io/gitea/modules/timeutil" ) -// StarList ... type StarList struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"INDEX"` Name string Desc string - StarIDs []int64 `xorm:"-"` - Repos []Repository `xorm:"-"` + Repos []Repository `xorm:"-"` CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` @@ -28,40 +26,33 @@ func init() { db.RegisterModel(new(StarList)) } -func (list *StarList) GetCount() int64 { - var star Star - count, err := db.GetEngine(context.Background()).Where("star_list_id = ?", list.ID).Count(star) - if err != nil { - return 0 - } - return count +func InsertStarList(ctx context.Context, starList *StarList) error { + _, err := db.GetEngine(ctx).Insert(starList) + return err } -func (list *StarList) LoadStars() { - var star []Star - err := db.GetEngine(context.Background()).Where("star_list_id = ?", list.ID).Find(&star) - if err != nil { - return - } - for _, star := range star { - list.StarIDs = append(list.StarIDs, star.ID) - } +func UpdateStarList(ctx context.Context, starList *StarList) error { + _, err := db.GetEngine(ctx).Where("id = ?", starList.ID).AllCols().Update(starList) + return err } -func GetStarListByUID(ctx context.Context, uid int64) ([]*StarList, error) { - var list []*StarList - err := db.GetEngine(ctx).Where("uid = ?", uid).Find(&list) - if err != nil { - return nil, err - } - return list, nil +func DeleteStarListByID(ctx context.Context, id int64) error { + _, err := db.GetEngine(ctx).Delete(&StarList{ID: id}) + return err } -func GetReposByStarListID(ctx context.Context, starListID int64) ([]*Repository, error) { - repos := make([]*Repository, 0, 100) - err := db.GetEngine(ctx).Where("star_list_id = ?", starListID).Find(&repos) - if err != nil { +func GetStarListByID(ctx context.Context, id int64) (*StarList, error) { + starList := new(StarList) + if has, err := db.GetEngine(ctx).Where("id = ?", id).Get(starList); err != nil { return nil, err + } else if !has { + return nil, nil } - return repos, nil + return starList, nil +} + +func GetStarListsForUser(ctx context.Context, id int64) ([]*StarList, error) { + starLists := make([]*StarList, 0, 10) + err := db.GetEngine(ctx).Where("uid = ?", id).Find(&starLists) + return starLists, err } diff --git a/models/repo/star_list_repo.go b/models/repo/star_list_repo.go new file mode 100644 index 0000000000000..e1861d870aaf1 --- /dev/null +++ b/models/repo/star_list_repo.go @@ -0,0 +1,54 @@ +package repo + +import ( + "context" + + "code.gitea.io/gitea/models/db" +) + +type StarListRepo struct { + UID int64 `xorm:"UNIQUE(s)"` + StarListID int64 `xorm:"UNIQUE(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` +} + +func init() { + db.RegisterModel(new(StarListRepo)) +} + +func StarLists(ctx context.Context, uid, repoID int64, ids []int64) error { + starListRepos := make([]*StarListRepo, 0, len(ids)) + for _, id := range ids { + starListRepos = append(starListRepos, &StarListRepo{ + UID: uid, + StarListID: id, + RepoID: repoID, + }) + } + + ctx, committer, err := db.TxContext(ctx) + if err != nil { + return err + } + defer committer.Close() + + _, err = db.GetEngine(ctx).Insert(&starListRepos) + if err != nil { + return err + } + + _, err = db.GetEngine(ctx).Where("uid = ? AND repo_id = ? AND star_list_id NOT IN (?)", uid, repoID, ids).Delete(new(StarListRepo)) + if err != nil { + return err + } + + return committer.Commit() +} + +func UnStarLists(ctx context.Context, uid, repoID int64, ids []int64) error { + _, err := db.GetEngine(ctx).Where("uid = ? AND repo_id = ? AND star_list_id NOT IN (?)", uid, repoID, ids).Delete(new(StarListRepo)) + if err != nil { + return err + } + return nil +} From 81cff53c928fbe95a2657c518ceb0fed1d245aa4 Mon Sep 17 00:00:00 2001 From: hiifong Date: Thu, 6 Feb 2025 00:23:46 +0800 Subject: [PATCH 5/5] Update --- models/migrations/v1_24/v314.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/models/migrations/v1_24/v314.go b/models/migrations/v1_24/v314.go index 98d065b2ad87e..368fdad21a935 100644 --- a/models/migrations/v1_24/v314.go +++ b/models/migrations/v1_24/v314.go @@ -25,11 +25,6 @@ type StarListRepo struct { RepoID int64 `xorm:"UNIQUE(s)"` } -// TableName return database table name for xorm -func (StarList) TableName() string { - return "star_list" -} - func AddStarList(x *xorm.Engine) error { sess := x.NewSession() defer sess.Close()