|
@@ -1106,70 +1106,6 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) {
|
1106
|
1106
|
return issues, nil
|
1107
|
1107
|
}
|
1108
|
1108
|
|
1109
|
|
-// .___ ____ ___
|
1110
|
|
-// | | ______ ________ __ ____ | | \______ ___________
|
1111
|
|
-// | |/ ___// ___/ | \_/ __ \| | / ___// __ \_ __ \
|
1112
|
|
-// | |\___ \ \___ \| | /\ ___/| | /\___ \\ ___/| | \/
|
1113
|
|
-// |___/____ >____ >____/ \___ >______//____ >\___ >__|
|
1114
|
|
-// \/ \/ \/ \/ \/
|
1115
|
|
-
|
1116
|
|
-// IssueUser represents an issue-user relation.
|
1117
|
|
-type IssueUser struct {
|
1118
|
|
- ID int64 `xorm:"pk autoincr"`
|
1119
|
|
- UID int64 `xorm:"INDEX"` // User ID.
|
1120
|
|
- IssueID int64
|
1121
|
|
- IsRead bool
|
1122
|
|
- IsAssigned bool
|
1123
|
|
- IsMentioned bool
|
1124
|
|
-}
|
1125
|
|
-
|
1126
|
|
-func newIssueUsers(e *xorm.Session, repo *Repository, issue *Issue) error {
|
1127
|
|
- assignees, err := repo.getAssignees(e)
|
1128
|
|
- if err != nil {
|
1129
|
|
- return fmt.Errorf("getAssignees: %v", err)
|
1130
|
|
- }
|
1131
|
|
-
|
1132
|
|
- // Poster can be anyone, append later if not one of assignees.
|
1133
|
|
- isPosterAssignee := false
|
1134
|
|
-
|
1135
|
|
- // Leave a seat for poster itself to append later, but if poster is one of assignee
|
1136
|
|
- // and just waste 1 unit is cheaper than re-allocate memory once.
|
1137
|
|
- issueUsers := make([]*IssueUser, 0, len(assignees)+1)
|
1138
|
|
- for _, assignee := range assignees {
|
1139
|
|
- issueUsers = append(issueUsers, &IssueUser{
|
1140
|
|
- IssueID: issue.ID,
|
1141
|
|
- UID: assignee.ID,
|
1142
|
|
- IsAssigned: assignee.ID == issue.AssigneeID,
|
1143
|
|
- })
|
1144
|
|
- isPosterAssignee = isPosterAssignee || assignee.ID == issue.PosterID
|
1145
|
|
- }
|
1146
|
|
- if !isPosterAssignee {
|
1147
|
|
- issueUsers = append(issueUsers, &IssueUser{
|
1148
|
|
- IssueID: issue.ID,
|
1149
|
|
- UID: issue.PosterID,
|
1150
|
|
- })
|
1151
|
|
- }
|
1152
|
|
-
|
1153
|
|
- if _, err = e.Insert(issueUsers); err != nil {
|
1154
|
|
- return err
|
1155
|
|
- }
|
1156
|
|
- return nil
|
1157
|
|
-}
|
1158
|
|
-
|
1159
|
|
-// NewIssueUsers adds new issue-user relations for new issue of repository.
|
1160
|
|
-func NewIssueUsers(repo *Repository, issue *Issue) (err error) {
|
1161
|
|
- sess := x.NewSession()
|
1162
|
|
- defer sessionRelease(sess)
|
1163
|
|
- if err = sess.Begin(); err != nil {
|
1164
|
|
- return err
|
1165
|
|
- }
|
1166
|
|
-
|
1167
|
|
- if err = newIssueUsers(sess, repo, issue); err != nil {
|
1168
|
|
- return err
|
1169
|
|
- }
|
1170
|
|
-
|
1171
|
|
- return sess.Commit()
|
1172
|
|
-}
|
1173
|
1109
|
|
1174
|
1110
|
// UpdateIssueMentions extracts mentioned people from content and
|
1175
|
1111
|
// updates issue-user relations for them.
|
|
@@ -1400,67 +1336,6 @@ func UpdateIssue(issue *Issue) error {
|
1400
|
1336
|
return updateIssue(x, issue)
|
1401
|
1337
|
}
|
1402
|
1338
|
|
1403
|
|
-func updateIssueUserByAssignee(e *xorm.Session, issue *Issue) (err error) {
|
1404
|
|
- if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?", false, issue.ID); err != nil {
|
1405
|
|
- return err
|
1406
|
|
- }
|
1407
|
|
-
|
1408
|
|
- // Assignee ID equals to 0 means clear assignee.
|
1409
|
|
- if issue.AssigneeID > 0 {
|
1410
|
|
- if _, err = e.Exec("UPDATE `issue_user` SET is_assigned = ? WHERE uid = ? AND issue_id = ?", true, issue.AssigneeID, issue.ID); err != nil {
|
1411
|
|
- return err
|
1412
|
|
- }
|
1413
|
|
- }
|
1414
|
|
-
|
1415
|
|
- return updateIssue(e, issue)
|
1416
|
|
-}
|
1417
|
|
-
|
1418
|
|
-// UpdateIssueUserByAssignee updates issue-user relation for assignee.
|
1419
|
|
-func UpdateIssueUserByAssignee(issue *Issue) (err error) {
|
1420
|
|
- sess := x.NewSession()
|
1421
|
|
- defer sessionRelease(sess)
|
1422
|
|
- if err = sess.Begin(); err != nil {
|
1423
|
|
- return err
|
1424
|
|
- }
|
1425
|
|
-
|
1426
|
|
- if err = updateIssueUserByAssignee(sess, issue); err != nil {
|
1427
|
|
- return err
|
1428
|
|
- }
|
1429
|
|
-
|
1430
|
|
- return sess.Commit()
|
1431
|
|
-}
|
1432
|
|
-
|
1433
|
|
-// UpdateIssueUserByRead updates issue-user relation for reading.
|
1434
|
|
-func UpdateIssueUserByRead(uid, issueID int64) error {
|
1435
|
|
- _, err := x.Exec("UPDATE `issue_user` SET is_read=? WHERE uid=? AND issue_id=?", true, uid, issueID)
|
1436
|
|
- return err
|
1437
|
|
-}
|
1438
|
|
-
|
1439
|
|
-// UpdateIssueUsersByMentions updates issue-user pairs by mentioning.
|
1440
|
|
-func UpdateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
|
1441
|
|
- for _, uid := range uids {
|
1442
|
|
- iu := &IssueUser{
|
1443
|
|
- UID: uid,
|
1444
|
|
- IssueID: issueID,
|
1445
|
|
- }
|
1446
|
|
- has, err := e.Get(iu)
|
1447
|
|
- if err != nil {
|
1448
|
|
- return err
|
1449
|
|
- }
|
1450
|
|
-
|
1451
|
|
- iu.IsMentioned = true
|
1452
|
|
- if has {
|
1453
|
|
- _, err = e.Id(iu.ID).AllCols().Update(iu)
|
1454
|
|
- } else {
|
1455
|
|
- _, err = e.Insert(iu)
|
1456
|
|
- }
|
1457
|
|
- if err != nil {
|
1458
|
|
- return err
|
1459
|
|
- }
|
1460
|
|
- }
|
1461
|
|
- return nil
|
1462
|
|
-}
|
1463
|
|
-
|
1464
|
1339
|
// _____ .__.__ __
|
1465
|
1340
|
// / \ |__| | ____ _______/ |_ ____ ____ ____
|
1466
|
1341
|
// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \
|