1package engine
2
3import (
4	"fmt"
5
6	"github.com/keybase/client/go/libkb"
7	keybase1 "github.com/keybase/client/go/protocol/keybase1"
8)
9
10type UserBlocksSet struct {
11	keybase1.SetUserBlocksArg
12	libkb.Contextified
13
14	uids []keybase1.UID
15}
16
17func NewUserBlocksSet(g *libkb.GlobalContext, args keybase1.SetUserBlocksArg) *UserBlocksSet {
18	return &UserBlocksSet{
19		SetUserBlocksArg: args,
20		Contextified:     libkb.NewContextified(g),
21	}
22}
23
24// Name is the unique engine name.
25func (e *UserBlocksSet) Name() string {
26	return "UserBlocksSet"
27}
28
29// GetPrereqs returns the engine prereqs.
30func (e *UserBlocksSet) Prereqs() Prereqs {
31	return Prereqs{}
32}
33
34// RequiredUIs returns the required UIs.
35func (e *UserBlocksSet) RequiredUIs() []libkb.UIKind {
36	return []libkb.UIKind{}
37}
38
39// SubConsumers returns the other UI consumers for this engine.
40func (e *UserBlocksSet) SubConsumers() []libkb.UIConsumer {
41	return nil
42}
43
44// Run starts the engine.
45func (e *UserBlocksSet) Run(mctx libkb.MetaContext) (err error) {
46	defer mctx.Trace(
47		fmt.Sprintf("UserBlocksSet#Run(len=%d)", len(e.Blocks)),
48		&err)()
49
50	type setBlockArg struct {
51		BlockUID string `json:"block_uid"`
52		Chat     *bool  `json:"chat,omitempty"`
53		Follow   *bool  `json:"follow,omitempty"`
54	}
55
56	for _, block := range e.Blocks {
57		mctx.Debug("SetUserBlocks: adding block: %+v", block)
58	}
59	payloadBlocks := make([]setBlockArg, len(e.Blocks))
60	e.uids = make([]keybase1.UID, len(e.Blocks))
61	for i, v := range e.Blocks {
62		uid := libkb.GetUIDByUsername(mctx.G(), v.Username)
63		payloadBlocks[i] = setBlockArg{
64			BlockUID: uid.String(),
65			Chat:     v.SetChatBlock,
66			Follow:   v.SetFollowBlock,
67		}
68		e.uids[i] = uid
69	}
70
71	payload := make(libkb.JSONPayload)
72	payload["blocks"] = payloadBlocks
73
74	apiArg := libkb.APIArg{
75		Endpoint:    "user/set_blocks",
76		JSONPayload: payload,
77		SessionType: libkb.APISessionTypeREQUIRED,
78	}
79
80	_, err = mctx.G().API.Post(mctx, apiArg)
81	return err
82}
83
84func (e *UserBlocksSet) UIDs() []keybase1.UID {
85	return e.uids
86}
87