( ctx context.Context, service NetworkService, scope *workspaceScope, req *contract.NetworkSendRequest, )
| 207 | } |
| 208 | |
| 209 | func (h *BaseHandlers) populateNetworkDirectSendTarget( |
| 210 | ctx context.Context, |
| 211 | service NetworkService, |
| 212 | scope *workspaceScope, |
| 213 | req *contract.NetworkSendRequest, |
| 214 | ) error { |
| 215 | if req == nil || |
| 216 | strings.TrimSpace(req.Surface) != string(network.SurfaceDirect) || |
| 217 | strings.TrimSpace(req.To) != "" || |
| 218 | strings.TrimSpace(req.DirectID) == "" { |
| 219 | return nil |
| 220 | } |
| 221 | if h == nil || h.NetworkStore == nil { |
| 222 | return errors.New("api: network store is required to resolve direct send target") |
| 223 | } |
| 224 | channel, err := normalizeNetworkChannel(req.Channel) |
| 225 | if err != nil { |
| 226 | return err |
| 227 | } |
| 228 | directID := strings.TrimSpace(req.DirectID) |
| 229 | if err := network.ValidateConversationID(directID, "direct_id"); err != nil { |
| 230 | return err |
| 231 | } |
| 232 | direct, err := h.NetworkStore.GetDirectRoom(ctx, scope.NetworkChannelRef(channel), directID) |
| 233 | if err != nil { |
| 234 | return err |
| 235 | } |
| 236 | peers, err := service.ListPeers(ctx, scope.NetworkWorkspaceID(), channel) |
| 237 | if err != nil { |
| 238 | return err |
| 239 | } |
| 240 | sessionID := strings.TrimSpace(req.SessionID) |
| 241 | for _, peer := range peers { |
| 242 | if peer.SessionID == nil || strings.TrimSpace(*peer.SessionID) != sessionID { |
| 243 | continue |
| 244 | } |
| 245 | peerID := strings.TrimSpace(peer.PeerID) |
| 246 | switch peerID { |
| 247 | case strings.TrimSpace(direct.PeerA): |
| 248 | req.To = strings.TrimSpace(direct.PeerB) |
| 249 | return nil |
| 250 | case strings.TrimSpace(direct.PeerB): |
| 251 | req.To = strings.TrimSpace(direct.PeerA) |
| 252 | return nil |
| 253 | default: |
| 254 | return fmt.Errorf( |
| 255 | "%w: session peer %q is not part of direct room %q", |
| 256 | network.ErrInvalidField, |
| 257 | peerID, |
| 258 | directID, |
| 259 | ) |
| 260 | } |
| 261 | } |
| 262 | return fmt.Errorf( |
| 263 | "%w: session=%q channel=%q", |
| 264 | network.ErrLocalPeerNotFound, |
| 265 | sessionID, |
| 266 | channel, |
no test coverage detected