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
import (
"time"
)
// IssueWatch is connection request for receiving issue notification.
type IssueWatch struct {
ID int64 ` xorm:"pk autoincr" `
UserID int64 ` xorm:"UNIQUE(watch) NOT NULL" `
IssueID int64 ` xorm:"UNIQUE(watch) NOT NULL" `
IsWatching bool ` xorm:"NOT NULL" `
Created time . Time ` xorm:"-" `
CreatedUnix int64 ` xorm:"NOT NULL" `
2017-03-30 02:59:28 +03:00
Updated time . Time ` xorm:"-" `
UpdatedUnix int64 ` xorm:"NOT NULL" `
2017-03-19 22:54:12 +03:00
}
// BeforeInsert is invoked from XORM before inserting an object of this type.
func ( iw * IssueWatch ) BeforeInsert ( ) {
2017-03-31 01:14:16 +03:00
var (
t = time . Now ( )
u = t . Unix ( )
)
iw . Created = t
iw . CreatedUnix = u
iw . Updated = t
iw . UpdatedUnix = u
2017-03-30 02:59:28 +03:00
}
2017-03-30 03:18:28 +03:00
// BeforeUpdate is invoked from XORM before updating an object of this type.
2017-03-30 02:59:28 +03:00
func ( iw * IssueWatch ) BeforeUpdate ( ) {
2017-03-31 01:14:16 +03:00
var (
t = time . Now ( )
u = t . Unix ( )
)
iw . Updated = t
iw . UpdatedUnix = u
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
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 ) .
Join ( "INNER" , "user" , "`user`.id = `issue_watch`.user_id" ) .
2017-03-30 02:54:57 +03:00
Find ( & watches )
return
}