Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion fga/model/automation/assessments.fga
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ type assessment_response
# parent permissions derived based on `crud` permissions or parents
define parent_editor: can_edit from parent
define parent_viewer: can_view from parent
define parent: [assessment, campaign]
define parent: [assessment, campaign, entity]

# campaign, similar to assessments, are viewable by organization admin+, by can_edit_campaign or inherited from the parent objects such as campaigns. They are not viewable by org members (view only) access by default
type campaign
Expand Down
10 changes: 10 additions & 0 deletions fga/tests/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1825,17 +1825,27 @@ tests:
can_view: false
can_edit: false
can_delete: false
- user: user:ulid-of-owner
object: assessment_response:response-entity
assertions:
can_view: true
can_edit: true
can_delete: true
list_objects:
- user: user:ulid-response-owner
type: assessment_response
context:
email_domain: "example.com"
assertions:
can_view:
- assessment_response:response-1
- assessment_response:response-entity
- user: user:ulid-of-owner
type: assessment_response
assertions:
can_delete:
- assessment_response:response-1
- assessment_response:response-entity
- name: campaigns
description: test campaign and campaign_target relationships with various parent types
tuple_file: tuples/campaigns.yaml
Expand Down
7 changes: 7 additions & 0 deletions fga/tests/tuples/assessment_responses.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@
relation: parent
object: assessment_response:response-1

- user: organization:openlane
relation: parent_context
object: entity:entity-1
- user: entity:entity-1
relation: parent
object: assessment_response:response-entity

# response owner
- user: user:ulid-response-owner
relation: response_owner
Expand Down
32 changes: 32 additions & 0 deletions internal/ent/hooks/listeners_questionnaire_transform.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"github.com/theopenlane/core/internal/ent/generated/assessmentresponse"
"github.com/theopenlane/core/internal/ent/generated/customtypeenum"
"github.com/theopenlane/core/internal/ent/generated/entity"
"github.com/theopenlane/core/internal/ent/generated/entitytype"
"github.com/theopenlane/core/internal/ent/generated/group"
"github.com/theopenlane/core/internal/ent/generated/note"
"github.com/theopenlane/core/internal/ent/generated/orgmembership"
Expand Down Expand Up @@ -107,6 +108,7 @@ func handleAssessmentResponse(ctx gala.HandlerContext, payload eventqueue.Mutati
err = transformQuestionnaire(allowCtx, client, questionnaireTransformRequest{
OrganizationID: organizationID,
TemplateID: assessment.TemplateID,
TemplateKind: assessment.Edges.Template.Kind,
AssessmentID: assessment.ID,
AssessmentResponseID: response.ID,
DocumentDataID: response.DocumentDataID,
Expand Down Expand Up @@ -172,6 +174,7 @@ func questionnaireTransformFieldChanged(payload eventqueue.MutationGalaPayload)

const transformMetadataKey = "questionnaire_transform"
const entityTransformFieldNotes = "notes"
const entityTransformFieldEntityTypeID = "entityTypeID"
const questionnaireTransformDefinitionID = "questionnaire_transform"

type questionnaireValidationError struct {
Expand All @@ -188,6 +191,7 @@ func isQuestionnaireValidationError(err error) bool {
type questionnaireTransformRequest struct {
OrganizationID string
TemplateID string
TemplateKind enums.TemplateKind
AssessmentID string
AssessmentResponseID string
DocumentDataID string
Expand Down Expand Up @@ -235,6 +239,10 @@ func handleEntityTransform(ctx context.Context, client *entgen.Client, req quest
return err
}

if err := setVendorEntityType(ctx, client, req, mapped.Payload); err != nil {
return err
}

record, err := persistTransformPayload(ctx, client, req, integrationgenerated.IntegrationMappingSchemaEntity, mapped)
if err != nil {
return err
Expand Down Expand Up @@ -408,6 +416,30 @@ func resolveEnvironment(ctx context.Context, client *entgen.Client, organization
return nil
}

func setVendorEntityType(ctx context.Context, client *entgen.Client, req questionnaireTransformRequest, payload map[string]any) error {
if req.TemplateKind != enums.TemplateKindExternalIntake || payload[entityTransformFieldEntityTypeID] != nil {
return nil
}

id, err := client.EntityType.Query().
Where(
entitytype.OwnerIDEQ(req.OrganizationID),
entitytype.NameEqualFold("vendor"),
).
FirstID(ctx)

if entgen.IsNotFound(err) {
return nil
}

if err != nil {
return fmt.Errorf("resolve external intake entity type: %w", err)
}

payload[entityTransformFieldEntityTypeID] = id
return nil
}

func applyTransform(value any, transform enums.TemplateProjectionTransform) (any, error) {
if transform == "" {
return value, nil
Expand Down