MCPcopy Create free account
hub / github.com/0xUnixIO/pulse / handleUserGroupByID

Method handleUserGroupByID

internal/serverapi/usergroup.go:126–188  ·  view source on GitHub ↗

handleUserGroupByID 处理单个用户组的 PUT 和 DELETE 请求。

(w http.ResponseWriter, r *http.Request, id string)

Source from the content-addressed store, hash-verified

124
125// handleUserGroupByID 处理单个用户组的 PUT 和 DELETE 请求。
126func (a *userGroupAPI) handleUserGroupByID(w http.ResponseWriter, r *http.Request, id string) {
127 switch r.Method {
128 case http.MethodPut:
129 var req usergroup.UserGroup
130 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
131 writeJSON(w, http.StatusBadRequest, map[string]any{"error": "invalid json body"})
132 return
133 }
134 req.ID = id
135 if req.Name == "" {
136 writeJSON(w, http.StatusBadRequest, map[string]any{"error": "name is required"})
137 return
138 }
139 g, err := a.ugStore.UpsertUserGroup(req)
140 if err != nil {
141 internalError(w, r, err)
142 return
143 }
144 // inbound 列表变更后自动同步给所有成员
145 inboundIDs := parseCommaList(g.InboundIDs)
146 memberIDs, _ := a.ugStore.ListGroupMembers(g.ID)
147 affectedNodeIDs := make(map[string]struct{})
148 for _, uid := range memberIDs {
149 if nodeIDs, err := a.syncGroupForUser(g.ID, uid, inboundIDs); err == nil {
150 for _, nid := range nodeIDs {
151 affectedNodeIDs[nid] = struct{}{}
152 }
153 }
154 }
155 nodes := make([]string, 0, len(affectedNodeIDs))
156 for nid := range affectedNodeIDs {
157 nodes = append(nodes, nid)
158 }
159 go a.applyNodes(nodes)
160 writeJSON(w, http.StatusOK, g)
161
162 case http.MethodDelete:
163 // 删除时先清除所有成员的组 inbound 记录,再删除成员关系,最后删除组
164 memberIDs, err := a.ugStore.ListGroupMembers(id)
165 if err != nil {
166 internalError(w, r, err)
167 return
168 }
169 for _, uid := range memberIDs {
170 if err := a.userStore.DeleteGroupUserInbounds(uid, id); err != nil {
171 internalError(w, r, err)
172 return
173 }
174 }
175 if err := a.userStore.DeleteAllInboundsForGroup(id); err != nil {
176 internalError(w, r, err)
177 return
178 }
179 if err := a.ugStore.DeleteUserGroup(id); err != nil {
180 writeUserGroupError(w, err)
181 return
182 }
183 writeJSON(w, http.StatusOK, map[string]any{"deleted": true})

Callers 1

handleUserGroupRoutesMethod · 0.95

Calls 12

syncGroupForUserMethod · 0.95
internalErrorFunction · 0.85
parseCommaListFunction · 0.85
writeUserGroupErrorFunction · 0.85
writeMethodNotAllowedFunction · 0.85
applyNodesMethod · 0.80
writeJSONFunction · 0.70
UpsertUserGroupMethod · 0.65
ListGroupMembersMethod · 0.65
DeleteUserGroupMethod · 0.65

Tested by

no test coverage detected