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
This commit is contained in:
parent
f2858600af
commit
f4ffe8ed54
8 changed files with 108 additions and 25 deletions
|
@ -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"
|
||||||
)
|
)
|
||||||
|
@ -29,6 +31,9 @@ type Label struct {
|
||||||
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:"-"`
|
||||||
|
|
|
@ -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{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
56
models/migrations/v154.go
Normal 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))
|
||||||
|
}
|
|
@ -8,6 +8,8 @@ package models
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
|
|
||||||
"xorm.io/builder"
|
"xorm.io/builder"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,6 +19,8 @@ type Collaboration struct {
|
||||||
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 {
|
||||||
|
|
|
@ -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
|
||||||
|
@ -30,6 +31,8 @@ type Watch struct {
|
||||||
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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Reference in a new issue