common/privilege/controller/privilege.go

99 lines
2.4 KiB
Go
Raw Normal View History

2023-12-01 18:33:41 +00:00
package privilege
2023-12-01 16:46:02 +00:00
import (
2023-12-01 18:33:41 +00:00
"bytes"
"context"
"encoding/json"
"errors"
2023-12-01 16:46:02 +00:00
"github.com/sirupsen/logrus"
2023-12-01 18:33:41 +00:00
"io"
2023-12-01 16:46:02 +00:00
"net/http"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/privilege/config"
)
2023-12-01 18:33:41 +00:00
type Deps struct {
Logger *logrus.Logger
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
type Handler struct {
logger *logrus.Logger
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
func NewPrivilegeHandler(deps *Deps) *Handler {
return &Handler{
logger: deps.Logger,
}
}
2023-12-01 16:46:02 +00:00
2023-12-01 18:33:41 +00:00
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
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
return handler.doRequest(req)
}
func (handler *Handler) PostPrivilege(ctx context.Context, data []config.Privilege, url string) ([]config.Privilege, error) {
payload, err := json.Marshal(data)
2023-12-01 16:46:02 +00:00
if err != nil {
2023-12-01 18:33:41 +00:00
handler.logger.Errorf("failed to marshal request body: %v", err)
return nil, err
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
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
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
req.Header.Set("Content-Type", "application/json")
2023-12-01 16:46:02 +00:00
2023-12-01 18:33:41 +00:00
return handler.doRequest(req)
}
func (handler *Handler) doRequest(req *http.Request) ([]config.Privilege, error) {
response, err := http.DefaultClient.Do(req)
2023-12-01 16:46:02 +00:00
if err != nil {
2023-12-01 18:33:41 +00:00
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
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
return privileges, nil
2023-12-01 16:46:02 +00:00
}
2023-12-01 18:33:41 +00:00
// return this list must be posted to Hubadmin.
func ComparePrivileges(existing []config.Privilege, incoming []config.Privilege) []config.Privilege {
2023-12-01 16:46:02 +00:00
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
}