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..368fdad21a935 --- /dev/null +++ b/models/migrations/v1_24/v314.go @@ -0,0 +1,43 @@ +// 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 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"` +} + +type StarListRepo struct { + UID int64 `xorm:"UNIQUE(s)"` + StarListID int64 `xorm:"UNIQUE(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` +} + +func AddStarList(x *xorm.Engine) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + err := sess.Sync(new(StarList)) + if err != nil { + return err + } + err = sess.Sync(new(StarListRepo)) + if err != nil { + return err + } + return sess.Commit() +} 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_list.go b/models/repo/star_list.go new file mode 100644 index 0000000000000..8cfbe293cd4e5 --- /dev/null +++ b/models/repo/star_list.go @@ -0,0 +1,58 @@ +// Copyright 2025 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repo + +import ( + "context" + + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" +) + +type StarList struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX"` + Name string + Desc string + + Repos []Repository `xorm:"-"` + + CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` + UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` +} + +func init() { + db.RegisterModel(new(StarList)) +} + +func InsertStarList(ctx context.Context, starList *StarList) error { + _, err := db.GetEngine(ctx).Insert(starList) + return err +} + +func UpdateStarList(ctx context.Context, starList *StarList) error { + _, err := db.GetEngine(ctx).Where("id = ?", starList.ID).AllCols().Update(starList) + return err +} + +func DeleteStarListByID(ctx context.Context, id int64) error { + _, err := db.GetEngine(ctx).Delete(&StarList{ID: id}) + return err +} + +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 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 +}