0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo.git synced 2024-12-29 02:44:08 -05:00
forgejo/models/issue_watch.go

100 lines
2.5 KiB
Go
Raw Normal View History

2017-03-30 17:11:58 -05: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 14:54:12 -05: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-29 18:59:28 -05:00
Updated time.Time `xorm:"-"`
UpdatedUnix int64 `xorm:"NOT NULL"`
2017-03-19 14:54:12 -05:00
}
// BeforeInsert is invoked from XORM before inserting an object of this type.
func (iw *IssueWatch) BeforeInsert() {
2017-03-30 17:14:16 -05:00
var (
t = time.Now()
u = t.Unix()
)
iw.Created = t
iw.CreatedUnix = u
iw.Updated = t
iw.UpdatedUnix = u
2017-03-29 18:59:28 -05:00
}
2017-03-29 19:18:28 -05:00
// BeforeUpdate is invoked from XORM before updating an object of this type.
2017-03-29 18:59:28 -05:00
func (iw *IssueWatch) BeforeUpdate() {
2017-03-30 17:14:16 -05:00
var (
t = time.Now()
u = t.Unix()
)
iw.Updated = t
iw.UpdatedUnix = u
2017-03-19 14:54:12 -05:00
}
2017-03-29 18:31:47 -05: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-29 18:59:28 -05:00
iw.IsWatching = isWatching
if _, err := x.ID(iw.ID).Cols("is_watching", "updated_unix").Update(iw); err != nil {
2017-03-29 18:31:47 -05: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 07:58:20 -05:00
return getIssueWatch(x, userID, issueID)
2017-03-29 18:31:47 -05:00
}
2017-04-01 07:58:20 -05:00
2017-03-29 18:31:47 -05: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-29 19:18:28 -05:00
// GetIssueWatchers returns watchers/unwatchers of a given issue
func GetIssueWatchers(issueID int64) ([]*IssueWatch, error) {
return getIssueWatchers(x, issueID)
}
2017-04-01 07:58:20 -05:00
func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error) {
err = e.
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").
Find(&watches)
return
}