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"
2018-05-09 19:29:04 +03:00
"github.com/go-xorm/xorm"
2017-02-04 15:37:26 +03:00
)
// IssueUser represents an issue-user relation.
type IssueUser struct {
ID int64 ` xorm:"pk autoincr" `
UID int64 ` xorm:"INDEX" ` // User ID.
IssueID int64
IsRead 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 {
2018-05-09 19:29:04 +03:00
IssueID : issue . ID ,
UID : assignee . ID ,
2017-02-04 15:37:26 +03:00
} )
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
}
2018-05-09 19:29:04 +03:00
func updateIssueAssignee ( e * xorm . Session , issue * Issue , assigneeID int64 ) ( removed bool , err error ) {
// Check if the user exists
2019-01-05 00:51:27 +03:00
assignee , err := getUserByID ( e , assigneeID )
2018-05-09 19:29:04 +03:00
if err != nil {
return false , err
2017-02-04 15:37:26 +03:00
}
2018-05-09 19:29:04 +03:00
// Check if the submitted user is already assigne, if yes delete him otherwise add him
2018-05-21 05:28:29 +03:00
var i int
for i = 0 ; i < len ( issue . Assignees ) ; i ++ {
if issue . Assignees [ i ] . ID == assigneeID {
2018-05-09 19:29:04 +03:00
break
2017-02-04 15:37:26 +03:00
}
}
2018-05-09 19:29:04 +03:00
assigneeIn := IssueAssignees { AssigneeID : assigneeID , IssueID : issue . ID }
2017-02-04 15:37:26 +03:00
2018-05-21 05:28:29 +03:00
toBeDeleted := i < len ( issue . Assignees )
2018-05-09 19:29:04 +03:00
if toBeDeleted {
2018-05-21 05:28:29 +03:00
issue . Assignees = append ( issue . Assignees [ : i ] , issue . Assignees [ i : ] ... )
2018-05-09 19:29:04 +03:00
_ , err = e . Delete ( assigneeIn )
if err != nil {
return toBeDeleted , err
}
} else {
2018-05-21 05:28:29 +03:00
issue . Assignees = append ( issue . Assignees , assignee )
2018-05-09 19:29:04 +03:00
_ , err = e . Insert ( assigneeIn )
if err != nil {
return toBeDeleted , err
}
2017-02-04 15:37:26 +03:00
}
2018-05-09 19:29:04 +03:00
return toBeDeleted , nil
2017-02-04 15:37:26 +03:00
}
// 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
}