Skip to content

Commit 73d16fe

Browse files
authored
fix: do not re-set released_at (#2525)
Signed-off-by: Miguel Martinez <miguel@chainloop.dev>
1 parent 6e08b89 commit 73d16fe

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

app/controlplane/pkg/biz/projectversion_integration_test.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// Copyright 2024 The Chainloop Authors.
2+
// Copyright 2024-2025 The Chainloop Authors.
33
//
44
// Licensed under the Apache License, Version 2.0 (the "License");
55
// you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@ package biz_test
1818
import (
1919
"context"
2020
"testing"
21+
"time"
2122

2223
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/biz"
2324
"github.com/chainloop-dev/chainloop/app/controlplane/pkg/biz/testhelpers"
@@ -57,6 +58,48 @@ func (s *ProjectVersionIntegrationTestSuite) TestUpdateReleaseStatus() {
5758
require.Error(t, err)
5859
}
5960

61+
func (s *ProjectVersionIntegrationTestSuite) TestReleasedAtTimestampPreserved() {
62+
t := s.T()
63+
ctx := context.Background()
64+
65+
// Create a prerelease version
66+
version, err := s.ProjectVersion.Create(ctx, s.project.ID.String(), "2.0.0", true)
67+
require.NoError(t, err)
68+
require.True(t, version.Prerelease)
69+
require.Nil(t, version.ReleasedAt, "Prerelease version should not have released_at set")
70+
71+
// Update to release status for the first time
72+
releasedVersion, err := s.ProjectVersion.UpdateReleaseStatus(ctx, version.ID.String(), true)
73+
require.NoError(t, err)
74+
require.False(t, releasedVersion.Prerelease)
75+
require.NotNil(t, releasedVersion.ReleasedAt, "Released version should have released_at set")
76+
firstReleasedAt := releasedVersion.ReleasedAt
77+
78+
// Wait a bit to ensure timestamps would differ if reset
79+
time.Sleep(100 * time.Millisecond)
80+
81+
// Update to release status again (should preserve original timestamp)
82+
reReleasedVersion, err := s.ProjectVersion.UpdateReleaseStatus(ctx, version.ID.String(), true)
83+
require.NoError(t, err)
84+
require.False(t, reReleasedVersion.Prerelease)
85+
require.NotNil(t, reReleasedVersion.ReleasedAt, "Released version should still have released_at set")
86+
require.Equal(t, firstReleasedAt, reReleasedVersion.ReleasedAt, "released_at timestamp should be preserved on subsequent release updates")
87+
88+
// Update back to prerelease (should clear released_at)
89+
preReleaseVersion, err := s.ProjectVersion.UpdateReleaseStatus(ctx, version.ID.String(), false)
90+
require.NoError(t, err)
91+
require.True(t, preReleaseVersion.Prerelease)
92+
require.Nil(t, preReleaseVersion.ReleasedAt, "Prerelease version should have released_at cleared")
93+
94+
// Update to release status again (should set a new timestamp)
95+
time.Sleep(100 * time.Millisecond)
96+
newReleasedVersion, err := s.ProjectVersion.UpdateReleaseStatus(ctx, version.ID.String(), true)
97+
require.NoError(t, err)
98+
require.False(t, newReleasedVersion.Prerelease)
99+
require.NotNil(t, newReleasedVersion.ReleasedAt, "Re-released version should have released_at set")
100+
require.NotEqual(t, firstReleasedAt, newReleasedVersion.ReleasedAt, "released_at should be a new timestamp after toggling through prerelease")
101+
}
102+
60103
// 3 orgs, user belongs to org1 and org2 but not org3
61104
func (s *ProjectVersionIntegrationTestSuite) SetupTest() {
62105
t := s.T()

app/controlplane/pkg/data/projectversion.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,30 @@ func (r *ProjectVersionRepo) Update(ctx context.Context, id uuid.UUID, updates *
5454
if updates == nil {
5555
updates = &biz.ProjectVersionUpdateOpts{}
5656
}
57+
// Only set released_at if it's not already set
58+
existing, err := r.data.DB.ProjectVersion.Query().Where(projectversion.IDEQ(id), projectversion.DeletedAtIsNil()).Only(ctx)
59+
if err != nil {
60+
if ent.IsNotFound(err) {
61+
return nil, biz.NewErrNotFound("Version")
62+
}
63+
64+
return nil, err
65+
}
5766

58-
q := r.data.DB.ProjectVersion.UpdateOneID(id).SetNillablePrerelease(updates.Prerelease).SetUpdatedAt(time.Now())
67+
now := time.Now()
68+
q := existing.Update().SetNillablePrerelease(updates.Prerelease).SetUpdatedAt(now)
5969
// we are setting the value either false or true
6070
if updates.Prerelease != nil {
6171
// We are marking it as a release
6272
if !*updates.Prerelease {
63-
q = q.SetReleasedAt(time.Now())
73+
// if not set
74+
if existing.ReleasedAt.IsZero() {
75+
// Only set released_at if it's not already set
76+
q.SetReleasedAt(now)
77+
}
6478
} else {
6579
// We are resetting it to pre-release
66-
q = q.ClearReleasedAt()
80+
q.ClearReleasedAt()
6781
}
6882
}
6983

0 commit comments

Comments
 (0)