2017-03-31 01:11:58 +03:00
// Copyright 2017 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.
2017-03-19 22:54:12 +03:00
package models
2019-08-15 17:46:21 +03:00
import "code.gitea.io/gitea/modules/timeutil"
2017-03-19 22:54:12 +03:00
// IssueWatch is connection request for receiving issue notification.
type IssueWatch struct {
2019-08-15 17:46:21 +03:00
ID int64 ` xorm:"pk autoincr" `
UserID int64 ` xorm:"UNIQUE(watch) NOT NULL" `
IssueID int64 ` xorm:"UNIQUE(watch) NOT NULL" `
IsWatching bool ` xorm:"NOT NULL" `
CreatedUnix timeutil . TimeStamp ` xorm:"created NOT NULL" `
UpdatedUnix timeutil . TimeStamp ` xorm:"updated NOT NULL" `
2017-03-19 22:54:12 +03:00
}
2017-03-30 02:31:47 +03:00
// CreateOrUpdateIssueWatch set watching for a user and issue
func CreateOrUpdateIssueWatch ( userID , issueID int64 , isWatching bool ) error {
iw , exists , err := getIssueWatch ( x , userID , issueID )
if err != nil {
return err
}
if ! exists {
iw = & IssueWatch {
UserID : userID ,
IssueID : issueID ,
IsWatching : isWatching ,
}
if _ , err := x . Insert ( iw ) ; err != nil {
return err
}
} else {
2017-03-30 02:59:28 +03:00
iw . IsWatching = isWatching
2017-10-05 07:43:04 +03:00
if _ , err := x . ID ( iw . ID ) . Cols ( "is_watching" , "updated_unix" ) . Update ( iw ) ; err != nil {
2017-03-30 02:31:47 +03:00
return err
}
}
return nil
}
// GetIssueWatch returns an issue watch by user and issue
func GetIssueWatch ( userID , issueID int64 ) ( iw * IssueWatch , exists bool , err error ) {
2017-04-01 15:58:20 +03:00
return getIssueWatch ( x , userID , issueID )
2017-03-30 02:31:47 +03:00
}
2017-04-01 15:58:20 +03:00
2017-03-30 02:31:47 +03:00
func getIssueWatch ( e Engine , userID , issueID int64 ) ( iw * IssueWatch , exists bool , err error ) {
iw = new ( IssueWatch )
exists , err = e .
Where ( "user_id = ?" , userID ) .
And ( "issue_id = ?" , issueID ) .
Get ( iw )
return
}
2017-03-30 02:54:57 +03:00
2017-03-30 03:18:28 +03:00
// GetIssueWatchers returns watchers/unwatchers of a given issue
2017-03-30 02:54:57 +03:00
func GetIssueWatchers ( issueID int64 ) ( [ ] * IssueWatch , error ) {
return getIssueWatchers ( x , issueID )
}
2017-04-01 15:58:20 +03:00
2017-03-30 02:54:57 +03:00
func getIssueWatchers ( e Engine , issueID int64 ) ( watches [ ] * IssueWatch , err error ) {
err = e .
2017-09-16 03:18:25 +03:00
Where ( "`issue_watch`.issue_id = ?" , issueID ) .
And ( "`user`.is_active = ?" , true ) .
And ( "`user`.prohibit_login = ?" , false ) .
2018-07-20 05:10:17 +03:00
Join ( "INNER" , "`user`" , "`user`.id = `issue_watch`.user_id" ) .
2017-03-30 02:54:57 +03:00
Find ( & watches )
return
}
2018-06-19 22:44:33 +03:00
func removeIssueWatchersByRepoID ( e Engine , userID int64 , repoID int64 ) error {
iw := & IssueWatch {
IsWatching : false ,
}
_ , err := e .
Join ( "INNER" , "issue" , "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?" , repoID ) .
Cols ( "is_watching" , "updated_unix" ) .
Where ( "`issue_watch`.user_id = ?" , userID ) .
Update ( iw )
return err
}