Save TimeStamps for Star, Label, Follow, Watch and Collaboration to Database (#13124)

* Add timestamps to Star, Label, LanguageStat, Follow, Watch and Collaboration

* Star do not need updated

* LanguageStat do not need update (they wont change)

* fix unit-test
release/v1.15
6543 2020-10-13 02:01:57 +02:00 committed by GitHub
parent f2858600af
commit f4ffe8ed54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 108 additions and 25 deletions

View File

@ -12,6 +12,8 @@ import (
"strconv" "strconv"
"strings" "strings"
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder" "xorm.io/builder"
"xorm.io/xorm" "xorm.io/xorm"
) )
@ -21,14 +23,17 @@ var LabelColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$")
// Label represents a label of repository for issues. // Label represents a label of repository for issues.
type Label struct { type Label struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
RepoID int64 `xorm:"INDEX"` RepoID int64 `xorm:"INDEX"`
OrgID int64 `xorm:"INDEX"` OrgID int64 `xorm:"INDEX"`
Name string Name string
Description string Description string
Color string `xorm:"VARCHAR(7)"` Color string `xorm:"VARCHAR(7)"`
NumIssues int NumIssues int
NumClosedIssues int NumClosedIssues int
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
NumOpenIssues int `xorm:"-"` NumOpenIssues int `xorm:"-"`
NumOpenRepoIssues int64 `xorm:"-"` NumOpenRepoIssues int64 `xorm:"-"`
IsChecked bool `xorm:"-"` IsChecked bool `xorm:"-"`

View File

@ -263,7 +263,10 @@ func TestUpdateLabel(t *testing.T) {
label.Name = update.Name label.Name = update.Name
assert.NoError(t, UpdateLabel(update)) assert.NoError(t, UpdateLabel(update))
newLabel := AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label) newLabel := AssertExistsAndLoadBean(t, &Label{ID: 1}).(*Label)
assert.Equal(t, *label, *newLabel) assert.EqualValues(t, label.ID, newLabel.ID)
assert.EqualValues(t, label.Color, newLabel.Color)
assert.EqualValues(t, label.Name, newLabel.Name)
assert.EqualValues(t, label.Description, newLabel.Description)
CheckConsistencyFor(t, &Label{}, &Repository{}) CheckConsistencyFor(t, &Label{}, &Repository{})
} }

View File

@ -242,6 +242,8 @@ var migrations = []Migration{
NewMigration("add TrustModel field to Repository", addTrustModelToRepository), NewMigration("add TrustModel field to Repository", addTrustModelToRepository),
// v153 > v154 // v153 > v154
NewMigration("add Team review request support", addTeamReviewRequestSupport), NewMigration("add Team review request support", addTeamReviewRequestSupport),
// v154 > v155
NewMigration("add timestamps to Star, Label, Follow, Watch and Collaboration", addTimeStamps),
} }
// GetCurrentDBVersion returns the current db version // GetCurrentDBVersion returns the current db version

56
models/migrations/v154.go Normal file
View File

@ -0,0 +1,56 @@
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package migrations
import (
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/xorm"
)
func addTimeStamps(x *xorm.Engine) error {
// this will add timestamps where it is useful to have
// Star represents a starred repo by an user.
type Star struct {
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
}
if err := x.Sync2(new(Star)); err != nil {
return err
}
// Label represents a label of repository for issues.
type Label struct {
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
if err := x.Sync2(new(Label)); err != nil {
return err
}
// Follow represents relations of user and his/her followers.
type Follow struct {
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
}
if err := x.Sync2(new(Follow)); err != nil {
return err
}
// Watch is connection request for receiving repository notification.
type Watch struct {
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
if err := x.Sync2(new(Watch)); err != nil {
return err
}
// Collaboration represent the relation between an individual and a repository.
type Collaboration struct {
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
}
return x.Sync2(new(Collaboration))
}

View File

@ -8,15 +8,19 @@ package models
import ( import (
"fmt" "fmt"
"code.gitea.io/gitea/modules/timeutil"
"xorm.io/builder" "xorm.io/builder"
) )
// Collaboration represent the relation between an individual and a repository. // Collaboration represent the relation between an individual and a repository.
type Collaboration struct { type Collaboration struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
Mode AccessMode `xorm:"DEFAULT 2 NOT NULL"` Mode AccessMode `xorm:"DEFAULT 2 NOT NULL"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
} }
func (repo *Repository) addCollaborator(e Engine, u *User) error { func (repo *Repository) addCollaborator(e Engine, u *User) error {

View File

@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/timeutil"
) )
// RepoWatchMode specifies what kind of watch the user has on a repository // RepoWatchMode specifies what kind of watch the user has on a repository
@ -26,10 +27,12 @@ const (
// Watch is connection request for receiving repository notification. // Watch is connection request for receiving repository notification.
type Watch struct { type Watch struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"UNIQUE(watch)"` UserID int64 `xorm:"UNIQUE(watch)"`
RepoID int64 `xorm:"UNIQUE(watch)"` RepoID int64 `xorm:"UNIQUE(watch)"`
Mode RepoWatchMode `xorm:"SMALLINT NOT NULL DEFAULT 1"` Mode RepoWatchMode `xorm:"SMALLINT NOT NULL DEFAULT 1"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
} }
// getWatch gets what kind of subscription a user has on a given repository; returns dummy record if none found // getWatch gets what kind of subscription a user has on a given repository; returns dummy record if none found

View File

@ -4,11 +4,16 @@
package models package models
import (
"code.gitea.io/gitea/modules/timeutil"
)
// Star represents a starred repo by an user. // Star represents a starred repo by an user.
type Star struct { type Star struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
UID int64 `xorm:"UNIQUE(s)"` UID int64 `xorm:"UNIQUE(s)"`
RepoID int64 `xorm:"UNIQUE(s)"` RepoID int64 `xorm:"UNIQUE(s)"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
} }
// StarRepo or unstar repository. // StarRepo or unstar repository.
@ -39,7 +44,7 @@ func StarRepo(userID, repoID int64, star bool) error {
return nil return nil
} }
if _, err := sess.Delete(&Star{0, userID, repoID}); err != nil { if _, err := sess.Delete(&Star{UID: userID, RepoID: repoID}); err != nil {
return err return err
} }
if _, err := sess.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil { if _, err := sess.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil {
@ -59,7 +64,7 @@ func IsStaring(userID, repoID int64) bool {
} }
func isStaring(e Engine, userID, repoID int64) bool { func isStaring(e Engine, userID, repoID int64) bool {
has, _ := e.Get(&Star{0, userID, repoID}) has, _ := e.Get(&Star{UID: userID, RepoID: repoID})
return has return has
} }

View File

@ -4,11 +4,16 @@
package models package models
import (
"code.gitea.io/gitea/modules/timeutil"
)
// Follow represents relations of user and his/her followers. // Follow represents relations of user and his/her followers.
type Follow struct { type Follow struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
UserID int64 `xorm:"UNIQUE(follow)"` UserID int64 `xorm:"UNIQUE(follow)"`
FollowID int64 `xorm:"UNIQUE(follow)"` FollowID int64 `xorm:"UNIQUE(follow)"`
CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
} }
// IsFollowing returns true if user is following followID. // IsFollowing returns true if user is following followID.