2017-02-09 08:44:18 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2017-02-04 15:37:26 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package models
import (
"fmt"
)
// IssueUser represents an issue-user relation.
type IssueUser struct {
ID int64 ` xorm:"pk autoincr" `
UID int64 ` xorm:"INDEX" ` // User ID.
IssueID int64
IsRead bool
IsAssigned bool
IsMentioned bool
}
func newIssueUsers ( e Engine , repo * Repository , issue * Issue ) error {
assignees , err := repo . getAssignees ( e )
if err != nil {
return fmt . Errorf ( "getAssignees: %v" , err )
}
// Poster can be anyone, append later if not one of assignees.
isPosterAssignee := false
// Leave a seat for poster itself to append later, but if poster is one of assignee
// and just waste 1 unit is cheaper than re-allocate memory once.
issueUsers := make ( [ ] * IssueUser , 0 , len ( assignees ) + 1 )
for _ , assignee := range assignees {
issueUsers = append ( issueUsers , & IssueUser {
IssueID : issue . ID ,
UID : assignee . ID ,
IsAssigned : assignee . ID == issue . AssigneeID ,
} )
isPosterAssignee = isPosterAssignee || assignee . ID == issue . PosterID
}
if ! isPosterAssignee {
issueUsers = append ( issueUsers , & IssueUser {
IssueID : issue . ID ,
UID : issue . PosterID ,
} )
}
if _ , err = e . Insert ( issueUsers ) ; err != nil {
return err
}
return nil
}
func updateIssueUserByAssignee ( e Engine , issue * Issue ) ( err error ) {
if _ , err = e . Exec ( "UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?" , false , issue . ID ) ; err != nil {
return err
}
// Assignee ID equals to 0 means clear assignee.
if issue . AssigneeID > 0 {
if _ , err = e . Exec ( "UPDATE `issue_user` SET is_assigned = ? WHERE uid = ? AND issue_id = ?" , true , issue . AssigneeID , issue . ID ) ; err != nil {
return err
}
}
return updateIssue ( e , issue )
}
// UpdateIssueUserByAssignee updates issue-user relation for assignee.
func UpdateIssueUserByAssignee ( issue * Issue ) ( err error ) {
sess := x . NewSession ( )
2017-06-21 03:57:05 +03:00
defer sess . Close ( )
2017-02-04 15:37:26 +03:00
if err = sess . Begin ( ) ; err != nil {
return err
}
if err = updateIssueUserByAssignee ( sess , issue ) ; err != nil {
return err
}
return sess . Commit ( )
}
// UpdateIssueUserByRead updates issue-user relation for reading.
func UpdateIssueUserByRead ( uid , issueID int64 ) error {
_ , err := x . Exec ( "UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?" , true , uid , issueID )
return err
}
// UpdateIssueUsersByMentions updates issue-user pairs by mentioning.
func UpdateIssueUsersByMentions ( e Engine , issueID int64 , uids [ ] int64 ) error {
for _ , uid := range uids {
iu := & IssueUser {
UID : uid ,
IssueID : issueID ,
}
has , err := e . Get ( iu )
if err != nil {
return err
}
iu . IsMentioned = true
if has {
2017-10-05 07:43:04 +03:00
_ , err = e . ID ( iu . ID ) . Cols ( "is_mentioned" ) . Update ( iu )
2017-02-04 15:37:26 +03:00
} else {
_ , err = e . Insert ( iu )
}
if err != nil {
return err
}
}
return nil
}