Merged in jmathison/v2-upload-batch (pull request #224)

Implement v2 upload batch cleanup

* Implement v2 upload batch cleanup

* Merge remote-tracking branch 'origin/main' into jmathison/v2-upload-batch

* Address upload batch review feedback

* Raise batch worker coverage

* Fix batch cleanup review issues


Approved-by: Jay Brown
This commit is contained in:
Jacob Mathison
2026-05-08 21:42:46 +00:00
parent 7b820b18c2
commit a080ca59d8
35 changed files with 2587 additions and 108 deletions
+22 -21
View File
@@ -9,6 +9,7 @@ import (
"fmt"
"io"
"net/http"
"net/url"
"strings"
)
@@ -32,7 +33,7 @@ func CreatePermitUser(client *http.Client, config *PermitConfig, cognitoUser *Co
return fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/users", config.BaseURL, projectID, envID)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/users", config.BaseURL, projectID, envID)
attrs := map[string]interface{}{
"cognito_username": cognitoUser.Username,
@@ -55,7 +56,7 @@ func CreatePermitUser(client *http.Client, config *PermitConfig, cognitoUser *Co
return fmt.Errorf("error marshaling user data: %w", err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("error creating request: %w", err)
}
@@ -121,9 +122,9 @@ func GetPermitUser(client *http.Client, config *PermitConfig, userKey string) (*
return nil, fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/users/%s", config.BaseURL, projectID, envID, userKey)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/users/%s", config.BaseURL, projectID, envID, userKey)
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
@@ -172,9 +173,9 @@ func DeletePermitUser(client *http.Client, config *PermitConfig, userKey string)
return fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/users/%s", config.BaseURL, projectID, envID, userKey)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/users/%s", config.BaseURL, projectID, envID, userKey)
req, err := http.NewRequest("DELETE", url, nil)
req, err := http.NewRequest("DELETE", endpoint, nil)
if err != nil {
return fmt.Errorf("error creating request: %w", err)
}
@@ -226,9 +227,9 @@ func FindPermitUserByEmail(client *http.Client, config *PermitConfig, email stri
}
// Search for user by email
url := fmt.Sprintf("%s/v2/facts/%s/%s/users?search=%s", config.BaseURL, projectID, envID, email)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/users?search=%s", config.BaseURL, projectID, envID, email)
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return "", fmt.Errorf("error creating request: %w", err)
}
@@ -328,7 +329,7 @@ func AssignRole(client *http.Client, config *PermitConfig, userID, role string)
return fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments", config.BaseURL, projectID, envID)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments", config.BaseURL, projectID, envID)
tenant := config.DefaultTenant
if tenant == "" {
@@ -346,7 +347,7 @@ func AssignRole(client *http.Client, config *PermitConfig, userID, role string)
return fmt.Errorf("error marshaling role assignment: %w", err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("error creating request: %w", err)
}
@@ -402,7 +403,7 @@ func UnassignRole(client *http.Client, config *PermitConfig, userID, role string
return fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments", config.BaseURL, projectID, envID)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments", config.BaseURL, projectID, envID)
tenant := config.DefaultTenant
if tenant == "" {
@@ -420,7 +421,7 @@ func UnassignRole(client *http.Client, config *PermitConfig, userID, role string
return fmt.Errorf("error marshaling role assignment: %w", err)
}
req, err := http.NewRequest("DELETE", url, bytes.NewBuffer(jsonData))
req, err := http.NewRequest("DELETE", endpoint, bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("error creating request: %w", err)
}
@@ -476,10 +477,10 @@ func GetPermitUserRoles(client *http.Client, config *PermitConfig, userKey strin
return nil, fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments?user=%s",
config.BaseURL, projectID, envID, userKey)
endpoint := fmt.Sprintf("%s/v2/facts/%s/%s/role_assignments?user=%s",
config.BaseURL, projectID, envID, url.QueryEscape(userKey))
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
@@ -559,10 +560,10 @@ func GetExistingRoles(client *http.Client, config *PermitConfig) ([]string, erro
}
// Construct API URL for roles endpoint
url := fmt.Sprintf("%s/v2/schema/%s/%s/roles", config.BaseURL, projectID, envID)
endpoint := fmt.Sprintf("%s/v2/schema/%s/%s/roles", config.BaseURL, projectID, envID)
// Create HTTP request
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
@@ -714,9 +715,9 @@ type RoleDetails struct {
// - *APIKeyScope: The scope containing organization, project, and environment IDs
// - error: Error if the API call fails or response cannot be parsed
func GetAPIKeyScope(client *http.Client, apiKey, baseURL string) (*APIKeyScope, error) {
url := fmt.Sprintf("%s/v2/api-key/scope", baseURL)
endpoint := fmt.Sprintf("%s/v2/api-key/scope", baseURL)
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
@@ -767,10 +768,10 @@ func GetRoleDetails(client *http.Client, config *PermitConfig, roleKey string) (
return nil, fmt.Errorf("failed to get environment ID: %w", err)
}
url := fmt.Sprintf("%s/v2/schema/%s/%s/roles/%s",
endpoint := fmt.Sprintf("%s/v2/schema/%s/%s/roles/%s",
config.BaseURL, projectID, envID, roleKey)
req, err := http.NewRequest("GET", url, nil)
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("error creating request: %w", err)
}
+18
View File
@@ -71,6 +71,24 @@ func TestGetAPIKeyScope_Success(t *testing.T) {
assert.Equal(t, "env-789", scope.EnvironmentID)
}
func TestGetPermitUserRolesEscapesUserKey(t *testing.T) {
server, config := createMockPermitServer(t, map[string]http.HandlerFunc{
"/v2/facts/test-project/test-env/role_assignments": func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, "jacob+2@mathisonprojects.com", r.URL.Query().Get("user"))
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, err := w.Write([]byte(`[{"role":"super_admin","user":"jacob+2@mathisonprojects.com","tenant":"default"}]`))
require.NoError(t, err)
},
})
defer server.Close()
roles, err := GetPermitUserRoles(server.Client(), config, "jacob+2@mathisonprojects.com")
require.NoError(t, err)
assert.Equal(t, []string{"super_admin"}, roles)
}
// TestGetAPIKeyScope_OrgLevelKey tests API key with only organization scope
func TestGetAPIKeyScope_OrgLevelKey(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {