direct_send.go

v1.0.0
Doc Versions Source
1
package bitwarden
2
3
import (
4
	"context"
5
	"encoding/json"
6
	"fmt"
7
)
8
9
// DirectSendService handles Send operations via the direct server API.
10
type DirectSendService struct {
11
	dc *DirectClient
12
}
13
14
func (s *DirectSendService) List(ctx context.Context) ([]Send, error) {
15
	kc := s.dc.getKeyChain()
16
	if kc == nil {
17
		return nil, &VaultLockedError{}
18
	}
19
20
	// Try cache first
21
	if cached, ok := s.dc.cache.getSends(); ok {
22
		return cached, nil
23
	}
24
25
	data, err := s.dc.transport.Get(ctx, "/api/sends", nil)
26
	if err != nil {
27
		return nil, err
28
	}
29
30
	var resp struct {
31
		Data []json.RawMessage `json:"data"`
32
	}
33
	if err := json.Unmarshal(data, &resp); err != nil {
34
		return nil, fmt.Errorf("parse sends list: %w", err)
35
	}
36
37
	var sends []Send
38
	for _, raw := range resp.Data {
39
		send, err := decryptSend(raw, kc)
40
		if err != nil {
41
			continue
42
		}
43
		sends = append(sends, *send)
44
	}
45
	return sends, nil
46
}
47
48
func (s *DirectSendService) Get(ctx context.Context, id string) (*Send, error) {
49
	kc := s.dc.getKeyChain()
50
	if kc == nil {
51
		return nil, &VaultLockedError{}
52
	}
53
54
	data, err := s.dc.transport.Get(ctx, "/api/sends/"+id, nil)
55
	if err != nil {
56
		return nil, err
57
	}
58
59
	return decryptSend(data, kc)
60
}
61
62
func (s *DirectSendService) Create(ctx context.Context, send Send) (*Send, error) {
63
	kc := s.dc.getKeyChain()
64
	if kc == nil {
65
		return nil, &VaultLockedError{}
66
	}
67
68
	encrypted, err := encryptSend(send, kc)
69
	if err != nil {
70
		return nil, fmt.Errorf("encrypt send: %w", err)
71
	}
72
73
	data, err := s.dc.transport.Post(ctx, "/api/sends", encrypted)
74
	if err != nil {
75
		return nil, err
76
	}
77
78
	created, err := decryptSend(data, kc)
79
	if err != nil {
80
		return nil, err
81
	}
82
	s.dc.cache.upsertSend(*created)
83
	return created, nil
84
}
85
86
func (s *DirectSendService) Update(ctx context.Context, id string, send Send) (*Send, error) {
87
	kc := s.dc.getKeyChain()
88
	if kc == nil {
89
		return nil, &VaultLockedError{}
90
	}
91
92
	encrypted, err := encryptSend(send, kc)
93
	if err != nil {
94
		return nil, fmt.Errorf("encrypt send: %w", err)
95
	}
96
97
	data, err := s.dc.transport.Put(ctx, "/api/sends/"+id, encrypted)
98
	if err != nil {
99
		return nil, err
100
	}
101
102
	updated, err := decryptSend(data, kc)
103
	if err != nil {
104
		return nil, err
105
	}
106
	s.dc.cache.upsertSend(*updated)
107
	return updated, nil
108
}
109
110
func (s *DirectSendService) Delete(ctx context.Context, id string) error {
111
	_, err := s.dc.transport.Delete(ctx, "/api/sends/"+id)
112
	if err == nil {
113
		s.dc.cache.removeSend(id)
114
	}
115
	return err
116
}
117
118
func (s *DirectSendService) RemovePassword(ctx context.Context, id string) (*Send, error) {
119
	kc := s.dc.getKeyChain()
120
	if kc == nil {
121
		return nil, &VaultLockedError{}
122
	}
123
124
	data, err := s.dc.transport.Put(ctx, "/api/sends/"+id+"/remove-password", nil)
125
	if err != nil {
126
		return nil, err
127
	}
128
129
	updated, err := decryptSend(data, kc)
130
	if err != nil {
131
		return nil, err
132
	}
133
	s.dc.cache.upsertSend(*updated)
134
	return updated, nil
135
}
136

Source Files