From c370d43bda87848efff2555b0f794c874e73eab3 Mon Sep 17 00:00:00 2001 From: Douglas Harcourt Parsons Date: Tue, 13 May 2025 20:51:39 +0100 Subject: [PATCH] Fix inconsistent team_id in project_deployment_retention resource Closes #322 --- client/project_deployment_retention.go | 44 ++++++++++++------- ...ata_source_project_deployment_retention.go | 2 +- .../resource_project_deployment_retention.go | 12 ++--- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/client/project_deployment_retention.go b/client/project_deployment_retention.go index 6944d6d8..53523d5b 100644 --- a/client/project_deployment_retention.go +++ b/client/project_deployment_retention.go @@ -24,6 +24,11 @@ type UpdateDeploymentRetentionRequest struct { TeamID string } +type DeploymentExpirationResponse struct { + DeploymentExpiration + TeamID string `json:"-"` +} + // DeleteDeploymentRetention will remove any existing deployment retention for a given project. func (c *Client) DeleteDeploymentRetention(ctx context.Context, projectID, teamID string) error { url := fmt.Sprintf("%s/v9/projects/%s/deployment-expiration", c.baseURL, projectID) @@ -77,17 +82,20 @@ var DeploymentRetentionStringToDays = map[string]int{ "unlimited": 36500, } -func (d deploymentExpirationResponse) toDeploymentExpiration() DeploymentExpiration { - return DeploymentExpiration{ - ExpirationPreview: DeploymentRetentionStringToDays[d.DeploymentExpiration.Expiration], - ExpirationProduction: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationProduction], - ExpirationCanceled: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationCanceled], - ExpirationErrored: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationErrored], +func (d deploymentExpirationResponse) toDeploymentExpirationResponse(teamID string) DeploymentExpirationResponse { + return DeploymentExpirationResponse{ + DeploymentExpiration: DeploymentExpiration{ + ExpirationPreview: DeploymentRetentionStringToDays[d.DeploymentExpiration.Expiration], + ExpirationProduction: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationProduction], + ExpirationCanceled: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationCanceled], + ExpirationErrored: DeploymentRetentionStringToDays[d.DeploymentExpiration.ExpirationErrored], + }, + TeamID: teamID, } } // UpdateDeploymentRetention will update an existing deployment retention to the latest information. -func (c *Client) UpdateDeploymentRetention(ctx context.Context, request UpdateDeploymentRetentionRequest) (DeploymentExpiration, error) { +func (c *Client) UpdateDeploymentRetention(ctx context.Context, request UpdateDeploymentRetentionRequest) (DeploymentExpirationResponse, error) { url := fmt.Sprintf("%s/v9/projects/%s/deployment-expiration", c.baseURL, request.ProjectID) if c.teamID(request.TeamID) != "" { url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(request.TeamID)) @@ -105,11 +113,11 @@ func (c *Client) UpdateDeploymentRetention(ctx context.Context, request UpdateDe url: url, body: payload, }, &d) - return d.toDeploymentExpiration(), err + return d.toDeploymentExpirationResponse(c.teamID(request.TeamID)), err } // GetDeploymentRetention returns the deployment retention for a given project. -func (c *Client) GetDeploymentRetention(ctx context.Context, projectID, teamID string) (d DeploymentExpiration, err error) { +func (c *Client) GetDeploymentRetention(ctx context.Context, projectID, teamID string) (d DeploymentExpirationResponse, err error) { url := fmt.Sprintf("%s/v2/projects/%s", c.baseURL, projectID) if c.teamID(teamID) != "" { url = fmt.Sprintf("%s?teamId=%s", url, c.teamID(teamID)) @@ -126,12 +134,18 @@ func (c *Client) GetDeploymentRetention(ctx context.Context, projectID, teamID s body: "", }, &p) if p.DeploymentExpiration == nil { - return DeploymentExpiration{ - ExpirationPreview: 36500, - ExpirationProduction: 36500, - ExpirationCanceled: 36500, - ExpirationErrored: 36500, + return DeploymentExpirationResponse{ + DeploymentExpiration: DeploymentExpiration{ + ExpirationPreview: 36500, + ExpirationProduction: 36500, + ExpirationCanceled: 36500, + ExpirationErrored: 36500, + }, + TeamID: c.teamID(teamID), }, nil } - return *p.DeploymentExpiration, err + return DeploymentExpirationResponse{ + DeploymentExpiration: *p.DeploymentExpiration, + TeamID: c.teamID(teamID), + }, err } diff --git a/vercel/data_source_project_deployment_retention.go b/vercel/data_source_project_deployment_retention.go index 93f64db5..2707c4f3 100644 --- a/vercel/data_source_project_deployment_retention.go +++ b/vercel/data_source_project_deployment_retention.go @@ -122,7 +122,7 @@ func (r *projectDeploymentRetentionDataSource) Read(ctx context.Context, req dat return } - result := convertResponseToProjectDeploymentRetention(out, config.ProjectID, config.TeamID) + result := convertResponseToProjectDeploymentRetention(out, config.ProjectID) tflog.Info(ctx, "read project deployment retention", map[string]any{ "team_id": result.TeamID.ValueString(), "project_id": result.ProjectID.ValueString(), diff --git a/vercel/resource_project_deployment_retention.go b/vercel/resource_project_deployment_retention.go index 1767586e..e7556d70 100644 --- a/vercel/resource_project_deployment_retention.go +++ b/vercel/resource_project_deployment_retention.go @@ -140,13 +140,13 @@ func (e *ProjectDeploymentRetention) toUpdateDeploymentRetentionRequest() client // convertResponseToProjectDeploymentRetention is used to populate terraform state based on an API response. // Where possible, values from the API response are used to populate state. If not possible, // values from plan are used. -func convertResponseToProjectDeploymentRetention(response client.DeploymentExpiration, projectID types.String, teamID types.String) ProjectDeploymentRetention { +func convertResponseToProjectDeploymentRetention(response client.DeploymentExpirationResponse, projectID types.String) ProjectDeploymentRetention { return ProjectDeploymentRetention{ ExpirationPreview: types.StringValue(client.DeploymentRetentionDaysToString[response.ExpirationPreview]), ExpirationProduction: types.StringValue(client.DeploymentRetentionDaysToString[response.ExpirationProduction]), ExpirationCanceled: types.StringValue(client.DeploymentRetentionDaysToString[response.ExpirationCanceled]), ExpirationErrored: types.StringValue(client.DeploymentRetentionDaysToString[response.ExpirationErrored]), - TeamID: teamID, + TeamID: types.StringValue(response.TeamID), ProjectID: projectID, } } @@ -186,7 +186,7 @@ func (r *projectDeploymentRetentionResource) Create(ctx context.Context, req res return } - result := convertResponseToProjectDeploymentRetention(response, plan.ProjectID, plan.TeamID) + result := convertResponseToProjectDeploymentRetention(response, plan.ProjectID) tflog.Info(ctx, "created project deployment retention", map[string]any{ "team_id": result.TeamID.ValueString(), @@ -227,7 +227,7 @@ func (r *projectDeploymentRetentionResource) Read(ctx context.Context, req resou return } - result := convertResponseToProjectDeploymentRetention(out, state.ProjectID, state.TeamID) + result := convertResponseToProjectDeploymentRetention(out, state.ProjectID) tflog.Info(ctx, "read project deployment retention", map[string]any{ "team_id": result.TeamID.ValueString(), "project_id": result.ProjectID.ValueString(), @@ -289,7 +289,7 @@ func (r *projectDeploymentRetentionResource) Update(ctx context.Context, req res return } - result := convertResponseToProjectDeploymentRetention(response, plan.ProjectID, plan.TeamID) + result := convertResponseToProjectDeploymentRetention(response, plan.ProjectID) tflog.Info(ctx, "updated project deployment retention", map[string]any{ "team_id": result.TeamID.ValueString(), @@ -327,7 +327,7 @@ func (r *projectDeploymentRetentionResource) ImportState(ctx context.Context, re return } - result := convertResponseToProjectDeploymentRetention(out, types.StringValue(projectID), types.StringValue(teamID)) + result := convertResponseToProjectDeploymentRetention(out, types.StringValue(projectID)) tflog.Info(ctx, "imported project deployment retention", map[string]any{ "team_id": result.TeamID.ValueString(), "project_id": result.ProjectID.ValueString(),