mirror of
https://dev.azure.com/schwarzit/schwarzit.stackit-public/_git/audit-go
synced 2026-02-08 00:57:24 +00:00
91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"google.golang.org/protobuf/encoding/protojson"
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
pkgAuditCommon "dev.azure.com/schwarzit/schwarzit.stackit-public/audit-go.git/pkg/audit/common"
|
|
)
|
|
|
|
var objectTypeIdPattern = regexp.MustCompile(".*/(projects|folders|organizations)/([0-9a-fA-F-]{36})(?:/.*)?")
|
|
|
|
// GetCalledServiceNameFromRequest extracts the called service name from subdomain name
|
|
func GetCalledServiceNameFromRequest(request *pkgAuditCommon.ApiRequest, fallbackName string) string {
|
|
if request == nil {
|
|
return fallbackName
|
|
}
|
|
|
|
var calledServiceName = fallbackName
|
|
host := request.Host
|
|
ip := net.ParseIP(host)
|
|
if ip == nil && !strings.Contains(host, "localhost") {
|
|
dotIdx := strings.Index(host, ".")
|
|
if dotIdx != -1 {
|
|
calledServiceName = host[0:dotIdx]
|
|
}
|
|
}
|
|
return calledServiceName
|
|
}
|
|
|
|
func GetObjectIdAndTypeFromUrlPath(path string) (
|
|
string,
|
|
*pkgAuditCommon.ObjectType,
|
|
error,
|
|
) {
|
|
|
|
// Extract object id and type from request url
|
|
objectTypeIdMatches := objectTypeIdPattern.FindStringSubmatch(path)
|
|
if len(objectTypeIdMatches) > 0 {
|
|
objectType := pkgAuditCommon.ObjectTypeFromPluralString(objectTypeIdMatches[1])
|
|
err := objectType.IsSupportedType()
|
|
if err != nil {
|
|
return "", nil, err
|
|
}
|
|
|
|
objectId := objectTypeIdMatches[2]
|
|
|
|
return objectId, &objectType, nil
|
|
}
|
|
|
|
return "", nil, nil
|
|
}
|
|
|
|
// ResponseBodyToBytes converts a JSON or Protobuf response into a byte array
|
|
func ResponseBodyToBytes(response any) ([]byte, error) {
|
|
if response == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
responseBytes, isBytes := response.([]byte)
|
|
if isBytes {
|
|
return responseBytes, nil
|
|
}
|
|
|
|
responseProtoMessage, isProtoMessage := response.(proto.Message)
|
|
if isProtoMessage {
|
|
responseJson, err := protojson.Marshal(responseProtoMessage)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return responseJson, nil
|
|
}
|
|
|
|
responseJson, err := json.Marshal(response)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return responseJson, nil
|
|
}
|
|
|
|
func ToArrayMap(input map[string]string) map[string][]string {
|
|
output := map[string][]string{}
|
|
for key, value := range input {
|
|
output[key] = []string{value}
|
|
}
|
|
return output
|
|
}
|