diff --git a/components/ambient-sdk/go-sdk/client/client.go b/components/ambient-sdk/go-sdk/client/client.go index 2c2d2875d..e4783b318 100644 --- a/components/ambient-sdk/go-sdk/client/client.go +++ b/components/ambient-sdk/go-sdk/client/client.go @@ -64,9 +64,6 @@ func NewClient(baseURL, token, project string, opts ...ClientOption) (*Client, e return nil, fmt.Errorf("placeholder token is not allowed") } - if project == "" { - return nil, fmt.Errorf("project is required") - } if len(project) > 63 { return nil, fmt.Errorf("project name cannot exceed 63 characters") @@ -108,14 +105,15 @@ func NewClientFromEnv(opts ...ClientOption) (*Client, error) { } project := os.Getenv("AMBIENT_PROJECT") - if project == "" { - return nil, fmt.Errorf("AMBIENT_PROJECT environment variable is required") - } return NewClient(baseURL, token, project, opts...) } func (c *Client) do(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}) error { + return c.doForProject(ctx, method, path, body, expectedStatus, result, c.project) +} + +func (c *Client) doForProject(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}, project string) error { url := c.baseURL + "/api/ambient-api-server/v1" + path req, err := http.NewRequestWithContext(ctx, method, url, nil) @@ -130,7 +128,9 @@ func (c *Client) do(ctx context.Context, method, path string, body []byte, expec } req.Header.Set("Authorization", "Bearer "+c.token) - req.Header.Set("X-Ambient-Project", c.project) + if project != "" { + req.Header.Set("X-Ambient-Project", project) + } req.Header.Set("User-Agent", c.userAgent) req.Header.Set("Accept", "application/json") @@ -179,6 +179,10 @@ func (c *Client) do(ctx context.Context, method, path string, body []byte, expec } func (c *Client) doWithQuery(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}, opts *types.ListOptions) error { + return c.doWithQueryForProject(ctx, method, path, body, expectedStatus, result, opts, c.project) +} + +func (c *Client) doWithQueryForProject(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}, opts *types.ListOptions, project string) error { queryPath := path if opts != nil { params := url.Values{} @@ -202,7 +206,7 @@ func (c *Client) doWithQuery(ctx context.Context, method, path string, body []by } } - return c.do(ctx, method, queryPath, body, expectedStatus, result) + return c.doForProject(ctx, method, queryPath, body, expectedStatus, result, project) } func validateURL(rawURL string) error { diff --git a/components/ambient-sdk/go-sdk/client/project_settings_api.go b/components/ambient-sdk/go-sdk/client/project_settings_api.go index fcd7a3bd3..0c2399f78 100644 --- a/components/ambient-sdk/go-sdk/client/project_settings_api.go +++ b/components/ambient-sdk/go-sdk/client/project_settings_api.go @@ -24,12 +24,16 @@ func (c *Client) ProjectSettings() *ProjectSettingsAPI { } func (a *ProjectSettingsAPI) Create(ctx context.Context, resource *types.ProjectSettings) (*types.ProjectSettings, error) { + return a.CreateForProject(ctx, resource, "") +} + +func (a *ProjectSettingsAPI) CreateForProject(ctx context.Context, resource *types.ProjectSettings, project string) (*types.ProjectSettings, error) { body, err := json.Marshal(resource) if err != nil { return nil, fmt.Errorf("marshal project_settings: %w", err) } var result types.ProjectSettings - if err := a.client.do(ctx, http.MethodPost, "/project_settings", body, http.StatusCreated, &result); err != nil { + if err := a.client.doForProject(ctx, http.MethodPost, "/project_settings", body, http.StatusCreated, &result, project); err != nil { return nil, err } return &result, nil @@ -44,8 +48,12 @@ func (a *ProjectSettingsAPI) Get(ctx context.Context, id string) (*types.Project } func (a *ProjectSettingsAPI) List(ctx context.Context, opts *types.ListOptions) (*types.ProjectSettingsList, error) { + return a.ListForProject(ctx, opts, "") +} + +func (a *ProjectSettingsAPI) ListForProject(ctx context.Context, opts *types.ListOptions, project string) (*types.ProjectSettingsList, error) { var result types.ProjectSettingsList - if err := a.client.doWithQuery(ctx, http.MethodGet, "/project_settings", nil, http.StatusOK, &result, opts); err != nil { + if err := a.client.doWithQueryForProject(ctx, http.MethodGet, "/project_settings", nil, http.StatusOK, &result, opts, project); err != nil { return nil, err } return &result, nil diff --git a/components/ambient-sdk/go-sdk/client/session_api.go b/components/ambient-sdk/go-sdk/client/session_api.go index 8aa5f83b4..06150bd27 100644 --- a/components/ambient-sdk/go-sdk/client/session_api.go +++ b/components/ambient-sdk/go-sdk/client/session_api.go @@ -24,12 +24,16 @@ func (c *Client) Sessions() *SessionAPI { } func (a *SessionAPI) Create(ctx context.Context, resource *types.Session) (*types.Session, error) { + return a.CreateForProject(ctx, resource, "") +} + +func (a *SessionAPI) CreateForProject(ctx context.Context, resource *types.Session, project string) (*types.Session, error) { body, err := json.Marshal(resource) if err != nil { return nil, fmt.Errorf("marshal session: %w", err) } var result types.Session - if err := a.client.do(ctx, http.MethodPost, "/sessions", body, http.StatusCreated, &result); err != nil { + if err := a.client.doForProject(ctx, http.MethodPost, "/sessions", body, http.StatusCreated, &result, project); err != nil { return nil, err } return &result, nil @@ -44,8 +48,12 @@ func (a *SessionAPI) Get(ctx context.Context, id string) (*types.Session, error) } func (a *SessionAPI) List(ctx context.Context, opts *types.ListOptions) (*types.SessionList, error) { + return a.ListForProject(ctx, opts, "") +} + +func (a *SessionAPI) ListForProject(ctx context.Context, opts *types.ListOptions, project string) (*types.SessionList, error) { var result types.SessionList - if err := a.client.doWithQuery(ctx, http.MethodGet, "/sessions", nil, http.StatusOK, &result, opts); err != nil { + if err := a.client.doWithQueryForProject(ctx, http.MethodGet, "/sessions", nil, http.StatusOK, &result, opts, project); err != nil { return nil, err } return &result, nil diff --git a/components/ambient-sdk/go-sdk/examples/main.go b/components/ambient-sdk/go-sdk/examples/main.go index b1c858397..581785cbe 100644 --- a/components/ambient-sdk/go-sdk/examples/main.go +++ b/components/ambient-sdk/go-sdk/examples/main.go @@ -33,6 +33,7 @@ func main() { } if projectName == "" { projectName = "sdk-demo" + fmt.Println("Note: No AMBIENT_PROJECT set, using flexible project handling with project:", projectName) } runFullLifecycle(ctx, c, projectName)