package privilege import ( "bytes" "context" "encoding/json" "errors" "github.com/sirupsen/logrus" "io" "net/http" "penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege/config" ) type Deps struct { Logger *logrus.Logger } type Handler struct { logger *logrus.Logger } func NewPrivilegeHandler(deps *Deps) *Handler { return &Handler{ logger: deps.Logger, } } func (handler *Handler) GetPrivilege(ctx context.Context, url string) ([]config.Privilege, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { handler.logger.Errorf("failed to create GET request: %v", err) return nil, err } return handler.doRequest(req) } func (handler *Handler) PostPrivilege(ctx context.Context, data []config.Privilege, url string) ([]config.Privilege, error) { payload, err := json.Marshal(data) if err != nil { handler.logger.Errorf("failed to marshal request body: %v", err) return nil, err } req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewBuffer(payload)) if err != nil { handler.logger.Errorf("failed to create POST request: %v", err) return nil, err } req.Header.Set("Content-Type", "application/json") return handler.doRequest(req) } func (handler *Handler) doRequest(req *http.Request) ([]config.Privilege, error) { response, err := http.DefaultClient.Do(req) if err != nil { handler.logger.Errorf("failed to perform HTTP request: %v", err) return nil, err } defer response.Body.Close() if response.StatusCode != http.StatusOK { return nil, errors.New("unexpected status code") } var buffer bytes.Buffer if _, err := io.Copy(&buffer, response.Body); err != nil { handler.logger.Errorf("failed to read response body: %v", err) return nil, err } var privileges []config.Privilege if err := json.Unmarshal(buffer.Bytes(), &privileges); err != nil { handler.logger.Errorf("failed to unmarshal response body: %v", err) return nil, err } return privileges, nil } // return this list must be posted to Hubadmin. func ComparePrivileges(existing []config.Privilege, incoming []config.Privilege) []config.Privilege { existingMap := make(map[string]config.Privilege) result := make([]config.Privilege, 0) for _, privilege := range existing { existingMap[privilege.ID] = privilege } for _, privilege := range incoming { if _, found := existingMap[privilege.ID]; !found { result = append(existing, existingMap[privilege.ID]) } } return result }