/
settings.go
135 lines (119 loc) · 4.05 KB
/
settings.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package git
import (
"context"
"errors"
"github.com/keybase/client/go/chat/globals"
"github.com/keybase/client/go/libkb"
"github.com/keybase/client/go/protocol/chat1"
"github.com/keybase/client/go/protocol/keybase1"
)
type settingsResponse struct {
ChatConvID string `json:"chat_conv_id"`
ChatDisabled bool `json:"chat_disabled"`
Status libkb.AppStatus `json:"status"`
}
func (r *settingsResponse) GetAppStatus() *libkb.AppStatus {
return &r.Status
}
func GetTeamRepoSettings(ctx context.Context, g *libkb.GlobalContext, arg keybase1.GetTeamRepoSettingsArg) (keybase1.GitTeamRepoSettings, error) {
mctx := libkb.NewMetaContext(ctx, g)
if arg.Folder.FolderType != keybase1.FolderType_TEAM {
return keybase1.GitTeamRepoSettings{ChatDisabled: true}, nil
}
apiArg, teamID, err := settingsArg(ctx, g, arg.Folder, arg.RepoID)
if err != nil {
return keybase1.GitTeamRepoSettings{}, err
}
var resp settingsResponse
if err := g.GetAPI().GetDecode(mctx, *apiArg, &resp); err != nil {
return keybase1.GitTeamRepoSettings{}, err
}
return convertTeamRepoSettings(ctx, g, teamID, resp.ChatConvID, resp.ChatDisabled)
}
func convertTeamRepoSettings(ctx context.Context, g *libkb.GlobalContext,
teamID keybase1.TeamID, chatConvID string, chatDisabled bool) (keybase1.GitTeamRepoSettings, error) {
settings := keybase1.GitTeamRepoSettings{
ChatDisabled: chatDisabled,
}
if !settings.ChatDisabled {
if chatConvID == "" {
// chat enabled, so use default team topic (#general)
settings.ChannelName = &globals.DefaultTeamTopic
} else {
// lookup the channel name
convID, err := chat1.MakeConvID(chatConvID)
if err != nil {
return keybase1.GitTeamRepoSettings{}, err
}
channelName, err := g.ChatHelper.GetChannelTopicName(ctx, teamID,
chat1.TopicType_CHAT, convID)
if err != nil {
// This error is non-fatal, show that chat is disabled and let
// the user chose something else.
settings.ChatDisabled = true
settings.ChannelName = nil
g.Log.CDebugf(ctx, "unable to get channel name: %v", err)
} else {
settings.ChannelName = &channelName
}
}
}
return settings, nil
}
func SetTeamRepoSettings(ctx context.Context, g *libkb.GlobalContext, arg keybase1.SetTeamRepoSettingsArg) error {
mctx := libkb.NewMetaContext(ctx, g)
if arg.Folder.FolderType != keybase1.FolderType_TEAM {
return errors.New("SetTeamRepoSettings denied: this repo is not a team repo")
}
apiArg, _, err := settingsArg(ctx, g, arg.Folder, arg.RepoID)
if err != nil {
return err
}
apiArg.Args["chat_disabled"] = libkb.B{Val: arg.ChatDisabled}
if arg.ChannelName != nil && *(arg.ChannelName) != "" {
// lookup the conv id for the channel name
vis := keybase1.TLFVisibility_PRIVATE
if arg.Folder.FolderType == keybase1.FolderType_PUBLIC {
vis = keybase1.TLFVisibility_PUBLIC
}
convs, err := g.ChatHelper.FindConversations(ctx, arg.Folder.Name, arg.ChannelName,
chat1.TopicType_CHAT, chat1.ConversationMembersType_TEAM, vis)
if err != nil {
return err
}
if len(convs) == 0 {
return errors.New("no channel found")
}
if len(convs) > 1 {
return errors.New("multiple channels found")
}
convID := convs[0].Info.Id
apiArg.Args["chat_conv_id"] = libkb.HexArg(convID)
apiArg.AppStatusCodes = []int{libkb.SCOk, libkb.SCTeamWritePermDenied}
}
apiRes, err := g.GetAPI().Post(mctx, *apiArg)
if err != nil {
return err
}
if apiRes.AppStatus.Code == libkb.SCTeamWritePermDenied {
return libkb.TeamWritePermDeniedError{}
}
return nil
}
func settingsArg(ctx context.Context, g *libkb.GlobalContext,
folder keybase1.FolderHandle, repoID keybase1.RepoID) (apiArg *libkb.APIArg, teamID keybase1.TeamID, err error) {
teamer := NewTeamer(g)
teamIDVis, err := teamer.LookupOrCreate(ctx, folder)
if err != nil {
return nil, teamID, err
}
apiArg = &libkb.APIArg{
Endpoint: "kbfs/git/team/settings",
SessionType: libkb.APISessionTypeREQUIRED,
Args: libkb.HTTPArgs{
"team_id": libkb.S{Val: string(teamIDVis.TeamID)},
"repo_id": libkb.S{Val: string(repoID)},
},
}
return apiArg, teamIDVis.TeamID, nil
}