* fix(HH-565): complete assignment parity regressions * fix(HH-565): scope capacity exclusions per agent --------- Co-authored-by: Rogee <rogee@ipao.vip>
54 lines
1.9 KiB
Go
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)
|
|
}
|