Browse Source

#3027

add repo watch notify type
pull/3270/head
chenyifan01 2 years ago
parent
commit
4be102021b
4 changed files with 35 additions and 5 deletions
  1. +1
    -1
      models/repo.go
  2. +30
    -3
      models/repo_watch.go
  3. +1
    -0
      modules/context/repo.go
  4. +3
    -1
      routers/repo/repo.go

+ 1
- 1
models/repo.go View File

@@ -1279,7 +1279,7 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, opts ...Cr
} }


if setting.Service.AutoWatchNewRepos { if setting.Service.AutoWatchNewRepos {
if err = watchRepo(ctx.e, doer.ID, repo.ID, true); err != nil {
if err = watchRepo(ctx.e, doer.ID, repo.ID, true, ReceiveAllNotification); err != nil {
return fmt.Errorf("watchRepo: %v", err) return fmt.Errorf("watchRepo: %v", err)
} }
} }


+ 30
- 3
models/repo_watch.go View File

@@ -24,6 +24,14 @@ const (
RepoWatchModeAuto // 3 RepoWatchModeAuto // 3
) )


// NotifyType specifies what kind of watch the user has on a repository
type NotifyType int8

const (
RejectAllNotification NotifyType = 0
ReceiveAllNotification NotifyType = 9
)

var ActionChan = make(chan *Action, 200) var ActionChan = make(chan *Action, 200)
var ActionChan4Task = make(chan Action, 200) var ActionChan4Task = make(chan Action, 200)


@@ -34,6 +42,7 @@ type Watch struct {
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 int64 `xorm:"created"` CreatedUnix int64 `xorm:"created"`
NotifyType NotifyType `xorm:"SMALLINT NOT NULL DEFAULT 0"`
} }


// 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
@@ -60,8 +69,20 @@ func IsWatching(userID, repoID int64) bool {
return err == nil && isWatchMode(watch.Mode) return err == nil && isWatchMode(watch.Mode)
} }


// GetWatchNotifyType
func GetWatchNotifyType(userID, repoID int64) NotifyType {
watch, err := getWatch(x, userID, repoID)
if err != nil {
return RejectAllNotification
}
return watch.NotifyType
}

func watchRepoMode(e Engine, watch Watch, mode RepoWatchMode) (err error) { func watchRepoMode(e Engine, watch Watch, mode RepoWatchMode) (err error) {
if watch.Mode == mode { if watch.Mode == mode {
if _, err := e.ID(watch.ID).Cols("notify_type").Update(watch); err != nil {
return err
}
return nil return nil
} }
if mode == RepoWatchModeAuto && (watch.Mode == RepoWatchModeDont || isWatchMode(watch.Mode)) { if mode == RepoWatchModeAuto && (watch.Mode == RepoWatchModeDont || isWatchMode(watch.Mode)) {
@@ -109,7 +130,7 @@ func WatchRepoMode(userID, repoID int64, mode RepoWatchMode) (err error) {
return watchRepoMode(x, watch, mode) return watchRepoMode(x, watch, mode)
} }


func watchRepo(e Engine, userID, repoID int64, doWatch bool) (err error) {
func watchRepo(e Engine, userID, repoID int64, doWatch bool, notifyTypes ...NotifyType) (err error) {
var watch Watch var watch Watch
if watch, err = getWatch(e, userID, repoID); err != nil { if watch, err = getWatch(e, userID, repoID); err != nil {
return err return err
@@ -119,14 +140,19 @@ func watchRepo(e Engine, userID, repoID int64, doWatch bool) (err error) {
} else if !doWatch { } else if !doWatch {
err = watchRepoMode(e, watch, RepoWatchModeNone) err = watchRepoMode(e, watch, RepoWatchModeNone)
} else { } else {
notifyType := RejectAllNotification
if len(notifyTypes) > 0 {
notifyType = notifyTypes[0]
}
watch.NotifyType = notifyType
err = watchRepoMode(e, watch, RepoWatchModeNormal) err = watchRepoMode(e, watch, RepoWatchModeNormal)
} }
return err return err
} }


// WatchRepo watch or unwatch repository. // WatchRepo watch or unwatch repository.
func WatchRepo(userID, repoID int64, watch bool) (err error) {
return watchRepo(x, userID, repoID, watch)
func WatchRepo(userID, repoID int64, watch bool, notifyType ...NotifyType) (err error) {
return watchRepo(x, userID, repoID, watch, notifyType...)
} }


func getWatchers(e Engine, repoID int64) ([]*Watch, error) { func getWatchers(e Engine, repoID int64) ([]*Watch, error) {
@@ -156,6 +182,7 @@ func getRepoWatchersIDs(e Engine, repoID int64) ([]int64, error) {
return ids, e.Table("watch"). return ids, e.Table("watch").
Where("watch.repo_id=?", repoID). Where("watch.repo_id=?", repoID).
And("watch.mode<>?", RepoWatchModeDont). And("watch.mode<>?", RepoWatchModeDont).
And("watch.notify_type > ?", RejectAllNotification).
Select("user_id"). Select("user_id").
Find(&ids) Find(&ids)
} }


+ 1
- 0
modules/context/repo.go View File

@@ -474,6 +474,7 @@ func RepoAssignment() macaron.Handler {


if ctx.IsSigned { if ctx.IsSigned {
ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID) ctx.Data["IsWatchingRepo"] = models.IsWatching(ctx.User.ID, repo.ID)
ctx.Data["WatchNotifyType"] = models.GetWatchNotifyType(ctx.User.ID, repo.ID)
ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID) ctx.Data["IsStaringRepo"] = models.IsStaring(ctx.User.ID, repo.ID)


ctx.Data["IsStaringDataset"] = models.IsDatasetStaringByRepoId(ctx.User.ID, repo.ID) ctx.Data["IsStaringDataset"] = models.IsDatasetStaringByRepoId(ctx.User.ID, repo.ID)


+ 3
- 1
routers/repo/repo.go View File

@@ -414,7 +414,9 @@ func Action(ctx *context.Context) {
var err error var err error
switch ctx.Params(":action") { switch ctx.Params(":action") {
case "watch": case "watch":
err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true)
err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true, models.ReceiveAllNotification)
case "watch_but_reject":
err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true, models.RejectAllNotification)
case "unwatch": case "unwatch":
err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, false) err = models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, false)
case "star": case "star":


Loading…
Cancel
Save