Introduce access-review source snapshot and normalize naming

Decouple each campaign from the live access-review sources it was started
with by introducing a per-campaign source snapshot table
(access_review_campaign_sources). The snapshot captures the source name,
category, and connector at start time, so a review remains coherent even
after the underlying source is edited or deleted. Fetch tracking becomes
an append-only log (access_review_campaign_source_fetch_attempts) that
preserves every attempt with its own status and error rather than
overwriting a single row.

Rename the shared access-review tables and enums to use a consistent
access_review_ prefix throughout:

  access_entries          → access_review_entries
  access_sources          → access_review_sources
  access_source_category  → access_review_source_category
  access_entry_*          → access_review_entry_*

The same rename propagates to every coredata type, service, GraphQL
schema, MCP specification, CLI command, frontend component, and e2e test.
The accessreview package gains dedicated actions.go and policies.go files
for its own IAM policy set, mirroring the agentrun package pattern.

Signed-off-by: Bryan Frimin <bryan@probo.com>
This commit is contained in:
Bryan Frimin
2026-06-11 15:58:30 +02:00
parent 8a53e0ec1c
commit 4b64e59da4
146 changed files with 4795 additions and 4069 deletions

View File

@@ -972,7 +972,7 @@ func (b *ProcessingActivityBuilder) Create() string {
return CreateProcessingActivity(b.client, b.attrs)
}
func CreateAccessSource(c *testutil.Client, organizationID string, attrs ...Attrs) string {
func CreateAccessReviewSource(c *testutil.Client, organizationID string, attrs ...Attrs) string {
c.T.Helper()
var a Attrs
@@ -981,9 +981,9 @@ func CreateAccessSource(c *testutil.Client, organizationID string, attrs ...Attr
}
const query = `
mutation($input: CreateAccessSourceInput!) {
createAccessSource(input: $input) {
accessSourceEdge {
mutation($input: CreateAccessReviewSourceInput!) {
createAccessReviewSource(input: $input) {
accessReviewSourceEdge {
node { id }
}
}
@@ -992,7 +992,7 @@ func CreateAccessSource(c *testutil.Client, organizationID string, attrs ...Attr
input := map[string]any{
"organizationId": organizationID,
"name": a.getString("name", SafeName("AccessSource")),
"name": a.getString("name", SafeName("AccessReviewSource")),
}
if csvData := a.getStringPtr("csvData"); csvData != nil {
input["csvData"] = *csvData
@@ -1003,43 +1003,43 @@ func CreateAccessSource(c *testutil.Client, organizationID string, attrs ...Attr
}
var result struct {
CreateAccessSource struct {
AccessSourceEdge struct {
CreateAccessReviewSource struct {
AccessReviewSourceEdge struct {
Node struct {
ID string `json:"id"`
} `json:"node"`
} `json:"accessSourceEdge"`
} `json:"createAccessSource"`
} `json:"accessReviewSourceEdge"`
} `json:"createAccessReviewSource"`
}
err := c.Execute(query, map[string]any{"input": input}, &result)
require.NoError(c.T, err, "createAccessSource mutation failed")
require.NoError(c.T, err, "createAccessReviewSource mutation failed")
return result.CreateAccessSource.AccessSourceEdge.Node.ID
return result.CreateAccessReviewSource.AccessReviewSourceEdge.Node.ID
}
type AccessSourceBuilder struct {
type AccessReviewSourceBuilder struct {
client *testutil.Client
organizationID string
attrs Attrs
}
func NewAccessSource(c *testutil.Client, organizationID string) *AccessSourceBuilder {
return &AccessSourceBuilder{client: c, organizationID: organizationID, attrs: Attrs{}}
func NewAccessReviewSource(c *testutil.Client, organizationID string) *AccessReviewSourceBuilder {
return &AccessReviewSourceBuilder{client: c, organizationID: organizationID, attrs: Attrs{}}
}
func (b *AccessSourceBuilder) WithName(name string) *AccessSourceBuilder {
func (b *AccessReviewSourceBuilder) WithName(name string) *AccessReviewSourceBuilder {
b.attrs["name"] = name
return b
}
func (b *AccessSourceBuilder) WithCsvData(csvData string) *AccessSourceBuilder {
func (b *AccessReviewSourceBuilder) WithCsvData(csvData string) *AccessReviewSourceBuilder {
b.attrs["csvData"] = csvData
return b
}
func (b *AccessSourceBuilder) Create() string {
return CreateAccessSource(b.client, b.organizationID, b.attrs)
func (b *AccessReviewSourceBuilder) Create() string {
return CreateAccessReviewSource(b.client, b.organizationID, b.attrs)
}
func CreateAccessReviewCampaign(c *testutil.Client, organizationID string, attrs ...Attrs) string {
@@ -1065,8 +1065,8 @@ func CreateAccessReviewCampaign(c *testutil.Client, organizationID string, attrs
"name": a.getString("name", SafeName("Campaign")),
}
if v, ok := a["accessSourceIds"]; ok {
input["accessSourceIds"] = v
if v, ok := a["accessReviewSourceIds"]; ok {
input["accessReviewSourceIds"] = v
}
var result struct {
@@ -1100,8 +1100,8 @@ func (b *AccessReviewCampaignBuilder) WithName(name string) *AccessReviewCampaig
return b
}
func (b *AccessReviewCampaignBuilder) WithAccessSourceIDs(ids []string) *AccessReviewCampaignBuilder {
b.attrs["accessSourceIds"] = ids
func (b *AccessReviewCampaignBuilder) WithAccessReviewSourceIDs(ids []string) *AccessReviewCampaignBuilder {
b.attrs["accessReviewSourceIds"] = ids
return b
}