forked from textileio/go-textile
-
Notifications
You must be signed in to change notification settings - Fork 0
/
thread_leaves.go
69 lines (57 loc) · 1.64 KB
/
thread_leaves.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package core
import (
"fmt"
mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash"
"github.com/textileio/textile-go/pb"
"github.com/textileio/textile-go/repo"
)
// leave creates an outgoing leave block
func (t *Thread) leave() (mh.Multihash, error) {
t.mux.Lock()
defer t.mux.Unlock()
res, err := t.commitBlock(nil, pb.ThreadBlock_LEAVE, nil)
if err != nil {
return nil, err
}
if err := t.indexBlock(res, repo.LeaveBlock, "", ""); err != nil {
return nil, err
}
if err := t.updateHead(res.hash); err != nil {
return nil, err
}
if err := t.post(res, t.Peers()); err != nil {
return nil, err
}
// cleanup
query := fmt.Sprintf("threadId='%s'", t.Id)
for _, block := range t.datastore.Blocks().List("", -1, query) {
if err := t.ignoreBlockTarget(&block); err != nil {
return nil, err
}
}
if err := t.datastore.Blocks().DeleteByThread(t.Id); err != nil {
return nil, err
}
if err := t.datastore.ThreadPeers().DeleteByThread(t.Id); err != nil {
return nil, err
}
if err := t.datastore.Notifications().DeleteBySubject(t.Id); err != nil {
return nil, err
}
log.Debugf("added LEAVE to %s: %s", t.Id, res.hash.B58String())
return res.hash, nil
}
// handleLeaveBlock handles an incoming leave block
func (t *Thread) handleLeaveBlock(hash mh.Multihash, block *pb.ThreadBlock) error {
// remove peer
if err := t.datastore.ThreadPeers().Delete(block.Header.Author, t.Id); err != nil {
return err
}
if err := t.datastore.Notifications().DeleteByActor(block.Header.Author); err != nil {
return err
}
return t.indexBlock(&commitResult{
hash: hash,
header: block.Header,
}, repo.LeaveBlock, "", "")
}