Files
gochat/backend/internal/repository/conversationassignee/gate.go
T
Rogeeandrogee 391fe98ad6 HH-565: complete assignment parity regressions (#142)
* fix(HH-565): complete assignment parity regressions

* fix(HH-565): scope capacity exclusions per agent

---------

Co-authored-by: Rogee <rogee@ipao.vip>
2026-08-24 00:16:03 +08:00

54 lines
1.9 KiB
Go

package conversationassignee
import (
"context"
"errors"
"github.com/gochat/gochat/internal/model"
"gorm.io/gorm"
)
var ErrNotEligible = errors.New("assignee is not an active agent or administrator in this account")
func Update(ctx context.Context, db *gorm.DB, accountID, conversationID, assigneeID uint, extraUpdates map[string]any) error {
updates := make(map[string]any, len(extraUpdates)+1)
for key, value := range extraUpdates {
updates[key] = value
}
updates["assignee_id"] = nil
query := db.WithContext(ctx).Model(&model.Conversation{}).
Where("conversations.id = ? AND conversations.account_id = ?", conversationID, accountID)
if assigneeID != 0 {
updates["assignee_id"] = assigneeID
query = query.Where("EXISTS (?)", eligible(db, assigneeID))
}
result := query.Updates(updates)
if result.Error != nil {
return result.Error
}
if assigneeID != 0 && result.RowsAffected != 1 {
return ErrNotEligible
}
return nil
}
func AutoAssign(ctx context.Context, db *gorm.DB, accountID, inboxID, conversationID, assigneeID uint) (bool, error) {
result := db.WithContext(ctx).Model(&model.Conversation{}).
Where("conversations.id = ? AND conversations.account_id = ?", conversationID, accountID).
Where("conversations.inbox_id = ? AND conversations.status = ? AND conversations.assignee_id IS NULL", inboxID, model.ConversationStatusOpen).
Where("EXISTS (?)", eligible(db, assigneeID)).
Update("assignee_id", assigneeID)
return result.RowsAffected == 1, result.Error
}
func eligible(db *gorm.DB, assigneeID uint) *gorm.DB {
return db.Table("account_users").Select("1").
Joins("JOIN users ON users.id = account_users.user_id").
Where("account_users.account_id = conversations.account_id").
Where("account_users.user_id = ?", assigneeID).
Where("account_users.deleted_at IS NULL AND users.deleted_at IS NULL").
Where("account_users.role IN ? AND users.active = ?", []string{"agent", "administrator"}, true)
}