package message import ( "database/sql" "git.asio.asia/nixevol/NixMsg/internal/protocol" ) // dispatchMinimalTx 是 M1 最小分发:单聊插一条 pending;群按当前成员去掉发送者各插 pending; // 消息改为 dispatched。完整 7.4 规则见 DEVIATIONS「消息 M」。 func dispatchMinimalTx(tx *sql.Tx, seq int64, senderID, destKind, destID string, sendAt int64, keep int, nowMs int64) (string, error) { recipients := make([]string, 0, 8) switch destKind { case protocol.TargetEndpoint: recipients = append(recipients, destID) case protocol.TargetGroup: rows, err := tx.Query(` SELECT endpoint_id FROM group_members WHERE group_id = ? AND endpoint_id != ?`, destID, senderID) if err != nil { return "", err } defer func() { _ = rows.Close() }() for rows.Next() { var id string if err := rows.Scan(&id); err != nil { return "", err } recipients = append(recipients, id) } if err := rows.Err(); err != nil { return "", err } default: return "", errCode(protocol.CodeBadRequest, "invalid dest_kind") } for _, ep := range recipients { if _, err := tx.Exec(` INSERT INTO deliveries(seq, endpoint_id, send_at, keep, state, reason, expire_at, pushed_conn, pushed_at, attempts, updated_at) VALUES(?,?,?,?,?,?,NULL,NULL,NULL,0,?)`, seq, ep, sendAt, keep, DeliveryPending, "", nowMs, ); err != nil { return "", err } } state := StateDispatched if _, err := tx.Exec(`UPDATE messages SET state = ? WHERE seq = ?`, state, seq); err != nil { return "", err } return state, nil }