From 9d0b01bd259cf0ed78c31cc2a897ff2c89e2d56d Mon Sep 17 00:00:00 2001 From: Sylwester Piskozub Date: Mon, 2 Feb 2026 13:29:20 +0100 Subject: [PATCH 1/2] add project version updated event Signed-off-by: Sylwester Piskozub --- .../pkg/auditor/events/project.go | 39 +++++++++++++++++++ .../pkg/auditor/events/project_test.go | 19 +++++++++ .../projects/project_version_updated.json | 19 +++++++++ 3 files changed, 77 insertions(+) create mode 100644 app/controlplane/pkg/auditor/events/testdata/projects/project_version_updated.json diff --git a/app/controlplane/pkg/auditor/events/project.go b/app/controlplane/pkg/auditor/events/project.go index 4e0f69cf1..3a7d4145f 100644 --- a/app/controlplane/pkg/auditor/events/project.go +++ b/app/controlplane/pkg/auditor/events/project.go @@ -29,6 +29,7 @@ import ( var ( _ auditor.LogEntry = (*ProjectCreated)(nil) _ auditor.LogEntry = (*ProjectVersionCreated)(nil) + _ auditor.LogEntry = (*ProjectVersionUpdated)(nil) _ auditor.LogEntry = (*ProjectVersionDeleted)(nil) _ auditor.LogEntry = (*ProjectMembershipAdded)(nil) _ auditor.LogEntry = (*ProjectMembershipRemoved)(nil) @@ -39,6 +40,7 @@ const ( ProjectType auditor.TargetType = "Project" ProjectCreatedActionType string = "ProjectCreated" ProjectVersionCreatedActionType string = "ProjectVersionCreated" + ProjectVersionUpdatedActionType string = "ProjectVersionUpdated" ProjectVersionDeletedActionType string = "ProjectVersionDeleted" ProjectMembershipAddedActionType string = "ProjectMembershipAdded" ProjectMembershipRemovedActionType string = "ProjectMembershipRemoved" @@ -156,6 +158,43 @@ func (p *ProjectVersionDeleted) Description() string { return fmt.Sprintf("%s has deleted %s version '%s' for project '%s'", auditor.GetActorIdentifier(), releaseType, p.Version, p.ProjectName) } +// ProjectVersionUpdated represents the update of a project version +type ProjectVersionUpdated struct { + *ProjectBase + VersionID *uuid.UUID `json:"version_id,omitempty"` + Version string `json:"version,omitempty"` + NewVersion *string `json:"new_version,omitempty"` + Prerelease *bool `json:"prerelease,omitempty"` +} + +func (p *ProjectVersionUpdated) ActionType() string { + return ProjectVersionUpdatedActionType +} + +func (p *ProjectVersionUpdated) ActionInfo() (json.RawMessage, error) { + if _, err := p.ProjectBase.ActionInfo(); err != nil { + return nil, err + } + + if p.VersionID == nil || p.Version == "" { + return nil, errors.New("version id and version are required") + } + + return json.Marshal(&p) +} + +func (p *ProjectVersionUpdated) Description() string { + desc := fmt.Sprintf("%s has updated version '%s' for project '%s'", + auditor.GetActorIdentifier(), p.Version, p.ProjectName) + + if p.NewVersion != nil { + desc = fmt.Sprintf("%s has renamed version '%s' to '%s' for project '%s'", + auditor.GetActorIdentifier(), p.Version, *p.NewVersion, p.ProjectName) + } + + return desc +} + // Helper function to make role names more user-friendly func prettyRole(role string) string { // Convert the role to a prettier format diff --git a/app/controlplane/pkg/auditor/events/project_test.go b/app/controlplane/pkg/auditor/events/project_test.go index 45db2c0cd..4527e4b1b 100644 --- a/app/controlplane/pkg/auditor/events/project_test.go +++ b/app/controlplane/pkg/auditor/events/project_test.go @@ -78,6 +78,21 @@ func TestProjectEvents(t *testing.T) { actor: auditor.ActorTypeUser, actorID: userUUID, }, + { + name: "ProjectVersionUpdated", + event: &events.ProjectVersionUpdated{ + ProjectBase: &events.ProjectBase{ + ProjectID: &projectUUID, + ProjectName: projectName, + }, + VersionID: &versionUUID, + Version: "v1.0.0", + NewVersion: stringPtr("v1.0.1"), + }, + expected: "testdata/projects/project_version_updated.json", + actor: auditor.ActorTypeUser, + actorID: userUUID, + }, { name: "ProjectMembershipAdded", event: &events.ProjectMembershipAdded{ @@ -353,3 +368,7 @@ func TestProjectEventsFailed(t *testing.T) { }) } } + +func stringPtr(s string) *string { + return &s +} diff --git a/app/controlplane/pkg/auditor/events/testdata/projects/project_version_updated.json b/app/controlplane/pkg/auditor/events/testdata/projects/project_version_updated.json new file mode 100644 index 000000000..e0d5bb454 --- /dev/null +++ b/app/controlplane/pkg/auditor/events/testdata/projects/project_version_updated.json @@ -0,0 +1,19 @@ +{ + "ActionType": "ProjectVersionUpdated", + "TargetType": "Project", + "TargetID": "3089bb36-e27b-428b-8009-d015c8737c56", + "ActorType": "USER", + "ActorID": "1089bb36-e27b-428b-8009-d015c8737c54", + "ActorEmail": "john@cyberdyne.io", + "ActorName": "John Connor", + "OrgID": "1089bb36-e27b-428b-8009-d015c8737c54", + "Description": "John Connor has renamed version 'v1.0.0' to 'v1.0.1' for project 'test-project'", + "Info": { + "project_id": "3089bb36-e27b-428b-8009-d015c8737c56", + "project_name": "test-project", + "version_id": "5089bb36-e27b-428b-8009-d015c8737c58", + "version": "v1.0.0", + "new_version": "v1.0.1" + }, + "Digest": "sha256:f86470cccd6d88b274433350b0ff3958b9f081a12bffcbcd20b6648d28182c1f" +} \ No newline at end of file From 36abc846c0815540a926352e7e5096761e9cd655 Mon Sep 17 00:00:00 2001 From: Sylwester Piskozub Date: Mon, 2 Feb 2026 14:01:57 +0100 Subject: [PATCH 2/2] remove leftover prerelease field Signed-off-by: Sylwester Piskozub --- app/controlplane/pkg/auditor/events/project.go | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controlplane/pkg/auditor/events/project.go b/app/controlplane/pkg/auditor/events/project.go index 3a7d4145f..01338a085 100644 --- a/app/controlplane/pkg/auditor/events/project.go +++ b/app/controlplane/pkg/auditor/events/project.go @@ -164,7 +164,6 @@ type ProjectVersionUpdated struct { VersionID *uuid.UUID `json:"version_id,omitempty"` Version string `json:"version,omitempty"` NewVersion *string `json:"new_version,omitempty"` - Prerelease *bool `json:"prerelease,omitempty"` } func (p *ProjectVersionUpdated) ActionType() string {