func()

in server/api/raft.go [70:110]


func (handler *RaftHandler) UpdatePeer(c *gin.Context) {
	var req MemberRequest
	if err := c.BindJSON(&req); err != nil {
		helper.ResponseBadRequest(c, err)
		return
	}
	if err := req.validate(); err != nil {
		helper.ResponseBadRequest(c, err)
		return
	}

	raftNode, _ := c.MustGet(consts.ContextKeyRaftNode).(*raft.Node)
	peers := raftNode.ListPeers()

	var err error
	if req.Operation == OperationAdd {
		for _, peer := range peers {
			if peer == req.Peer {
				helper.ResponseError(c, fmt.Errorf("peer '%s' already exists", req.Peer))
				return
			}
		}
		err = raftNode.AddPeer(c, req.ID, req.Peer)
	} else {
		if _, ok := peers[req.ID]; !ok {
			helper.ResponseBadRequest(c, errors.New("peer not exists"))
			return
		}
		if len(peers) == 1 {
			helper.ResponseBadRequest(c, errors.New("can't remove the last peer"))
			return
		}
		err = raftNode.RemovePeer(c, req.ID)
	}
	if err != nil {
		helper.ResponseError(c, err)
	} else {
		logger.Get().With(zap.Any("request", req)).Info("Update peer success")
		helper.ResponseOK(c, nil)
	}
}