Enable rbac on node query

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-12-23 09:43:45 +01:00
parent e9ac50d91c
commit cc964ecc91
2 changed files with 228 additions and 195 deletions

View File

@@ -5798,282 +5798,309 @@ func (r *processingActivityConnectionResolver) TotalCount(ctx context.Context, o
// Node is the resolver for the node field.
func (r *queryResolver) Node(ctx context.Context, id gid.GID) (types.Node, error) {
// TODO use right action
//r.MustAuthorize(ctx, id, probo.ActionGet)
prb := r.ProboService(ctx, id.TenantID())
var (
loadNode func(ctx context.Context, id gid.GID) (types.Node, error)
action string
prb = r.ProboService(ctx, id.TenantID())
)
switch id.EntityType() {
case coredata.OrganizationEntityType:
organization, err := prb.Organizations.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = iam.ActionIAMOrganizationGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
organization, err := prb.Organizations.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get organization: %w", err))
return types.NewOrganization(organization), nil
}
return types.NewOrganization(organization), nil
case coredata.PeopleEntityType:
people, err := prb.Peoples.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionPeopleGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
people, err := prb.Peoples.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get people: %w", err))
return types.NewPeople(people), nil
}
return types.NewPeople(people), nil
case coredata.VendorEntityType:
vendor, err := prb.Vendors.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionVendorGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
vendor, err := prb.Vendors.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get vendor: %w", err))
return types.NewVendor(vendor), nil
}
return types.NewVendor(vendor), nil
case coredata.FrameworkEntityType:
framework, err := prb.Frameworks.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionFrameworkGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
framework, err := prb.Frameworks.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get framework: %w", err))
return types.NewFramework(framework), nil
}
return types.NewFramework(framework), nil
case coredata.MeasureEntityType:
measure, err := prb.Measures.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionMeasureGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
measure, err := prb.Measures.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get measure: %w", err))
return types.NewMeasure(measure), nil
}
return types.NewMeasure(measure), nil
case coredata.TaskEntityType:
task, err := prb.Tasks.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionTaskGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
task, err := prb.Tasks.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get task: %w", err))
return types.NewTask(task), nil
}
return types.NewTask(task), nil
case coredata.EvidenceEntityType:
evidence, err := prb.Evidences.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get evidence: %w", err))
action = probo.ActionEvidenceList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
evidence, err := prb.Evidences.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewEvidence(evidence), nil
}
return types.NewEvidence(evidence), nil
case coredata.DocumentEntityType:
document, err := prb.Documents.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionDocumentGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
document, err := prb.Documents.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get document: %w", err))
return types.NewDocument(document), nil
}
return types.NewDocument(document), nil
case coredata.ControlEntityType:
control, err := prb.Controls.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionControlList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
control, err := prb.Controls.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get control: %w", err))
return types.NewControl(control), nil
}
return types.NewControl(control), nil
case coredata.RiskEntityType:
risk, err := prb.Risks.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionRiskList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
risk, err := prb.Risks.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get risk: %w", err))
return types.NewRisk(risk), nil
}
return types.NewRisk(risk), nil
case coredata.VendorComplianceReportEntityType:
vendorComplianceReport, err := prb.VendorComplianceReports.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get vendor compliance report: %w", err))
action = probo.ActionVendorComplianceReportGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
vendorComplianceReport, err := prb.VendorComplianceReports.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewVendorComplianceReport(vendorComplianceReport), nil
}
return types.NewVendorComplianceReport(vendorComplianceReport), nil
case coredata.VendorContactEntityType:
vendorContact, err := prb.VendorContacts.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get vendor contact: %w", err))
action = probo.ActionVendorContactGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
vendorContact, err := prb.VendorContacts.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewVendorContact(vendorContact), nil
}
return types.NewVendorContact(vendorContact), nil
case coredata.VendorServiceEntityType:
vendorService, err := prb.VendorServices.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get vendor service: %w", err))
action = probo.ActionVendorServiceGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
vendorService, err := prb.VendorServices.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewVendorService(vendorService), nil
}
return types.NewVendorService(vendorService), nil
case coredata.DocumentVersionEntityType:
documentVersion, err := prb.Documents.GetVersion(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get document version: %w", err))
action = probo.ActionDocumentVersionList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
documentVersion, err := prb.Documents.GetVersion(ctx, id)
if err != nil {
return nil, err
}
return types.NewDocumentVersion(documentVersion), nil
}
return types.NewDocumentVersion(documentVersion), nil
case coredata.DocumentVersionSignatureEntityType:
documentVersionSignature, err := prb.Documents.GetVersionSignature(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get document version signature: %w", err))
action = probo.ActionDocumentVersionSignatureList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
documentVersionSignature, err := prb.Documents.GetVersionSignature(ctx, id)
if err != nil {
return nil, err
}
return types.NewDocumentVersionSignature(documentVersionSignature), nil
}
return types.NewDocumentVersionSignature(documentVersionSignature), nil
case coredata.AssetEntityType:
asset, err := prb.Assets.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionAssetList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
asset, err := prb.Assets.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get asset: %w", err))
return types.NewAsset(asset), nil
}
return types.NewAsset(asset), nil
case coredata.DatumEntityType:
datum, err := prb.Data.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get data: %w", err))
action = probo.ActionDatumList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
datum, err := prb.Data.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewDatum(datum), nil
}
return types.NewDatum(datum), nil
case coredata.AuditEntityType:
audit, err := prb.Audits.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionAuditList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
audit, err := prb.Audits.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get audit: %w", err))
return types.NewAudit(audit), nil
}
return types.NewAudit(audit), nil
case coredata.NonconformityEntityType:
nonconformity, err := prb.Nonconformities.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get nonconformity: %w", err))
action = probo.ActionNonconformityList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
nonconformity, err := prb.Nonconformities.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewNonconformity(nonconformity), nil
}
return types.NewNonconformity(nonconformity), nil
case coredata.ObligationEntityType:
obligation, err := prb.Obligations.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get obligation: %w", err))
action = probo.ActionObligationList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
obligation, err := prb.Obligations.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewObligation(obligation), nil
}
return types.NewObligation(obligation), nil
case coredata.ContinualImprovementEntityType:
continualImprovement, err := prb.ContinualImprovements.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get continual improvement: %w", err))
action = probo.ActionContinualImprovementList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
continualImprovement, err := prb.ContinualImprovements.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewContinualImprovement(continualImprovement), nil
}
return types.NewContinualImprovement(continualImprovement), nil
case coredata.ReportEntityType:
report, err := prb.Reports.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get report: %w", err))
action = probo.ActionReportGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
report, err := prb.Reports.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewReport(report), nil
}
return types.NewReport(report), nil
case coredata.ProcessingActivityEntityType:
processingActivity, err := prb.ProcessingActivities.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get processing activity: %w", err))
action = probo.ActionProcessingActivityList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
processingActivity, err := prb.ProcessingActivities.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewProcessingActivity(processingActivity), nil
}
return types.NewProcessingActivity(processingActivity), nil
case coredata.DataProtectionImpactAssessmentEntityType:
dpia, err := prb.DataProtectionImpactAssessments.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get processing activity dpia: %w", err))
// TODO: add action
// action = probo.ActionDataProtectionImpactAssessmentGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
dpia, err := prb.DataProtectionImpactAssessments.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewDataProtectionImpactAssessment(dpia), nil
}
return types.NewDataProtectionImpactAssessment(dpia), nil
case coredata.TransferImpactAssessmentEntityType:
tia, err := prb.TransferImpactAssessments.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get processing activity tia: %w", err))
// TODO: add action
//action = probo.ActionTransferImpactAssessmentGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
tia, err := prb.TransferImpactAssessments.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewTransferImpactAssessment(tia), nil
}
return types.NewTransferImpactAssessment(tia), nil
case coredata.SnapshotEntityType:
snapshot, err := prb.Snapshots.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get snapshot: %w", err))
action = probo.ActionSnapshotList
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
snapshot, err := prb.Snapshots.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewSnapshot(snapshot), nil
}
return types.NewSnapshot(snapshot), nil
case coredata.TrustCenterEntityType:
trustCenter, file, err := prb.TrustCenters.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get trust center with file: %w", err))
action = probo.ActionTrustCenterGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
trustCenter, file, err := prb.TrustCenters.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewTrustCenter(trustCenter, file), nil
}
return types.NewTrustCenter(trustCenter, file), nil
case coredata.TrustCenterAccessEntityType:
trustCenterAccess, err := prb.TrustCenterAccesses.Get(ctx, id)
if err != nil {
panic(fmt.Errorf("cannot get trust center access: %w", err))
action = probo.ActionTrustCenterAccessGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
trustCenterAccess, err := prb.TrustCenterAccesses.Get(ctx, id)
if err != nil {
return nil, err
}
return types.NewTrustCenterAccess(trustCenterAccess), nil
}
return types.NewTrustCenterAccess(trustCenterAccess), nil
case coredata.MeetingEntityType:
meeting, err := prb.Meetings.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceAlreadyExists) {
return nil, gqlutils.Conflict(err)
action = probo.ActionMeetingGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
meeting, err := prb.Meetings.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get meeting: %w", err))
return types.NewMeeting(meeting), nil
}
return types.NewMeeting(meeting), nil
case coredata.RightsRequestEntityType:
rightsRequest, err := prb.RightsRequests.Get(ctx, id)
if err != nil {
var errNotFound *coredata.ErrRightsRequestNotFound
if errors.As(err, &errNotFound) {
return nil, gqlutils.NotFound(errNotFound)
action = probo.ActionRightsRequestGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
rightsRequest, err := prb.RightsRequests.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get rights request: %w", err))
return types.NewRightsRequest(rightsRequest), nil
}
return types.NewRightsRequest(rightsRequest), nil
case coredata.StateOfApplicabilityEntityType:
stateOfApplicability, err := prb.StatesOfApplicability.Get(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceNotFound) {
return nil, gqlutils.NotFound(err)
action = probo.ActionStateOfApplicabilityGet
loadNode = func(ctx context.Context, id gid.GID) (types.Node, error) {
stateOfApplicability, err := prb.StatesOfApplicability.Get(ctx, id)
if err != nil {
return nil, err
}
panic(fmt.Errorf("cannot get state_of_applicability: %w", err))
return types.NewStateOfApplicability(stateOfApplicability), nil
}
return types.NewStateOfApplicability(stateOfApplicability), nil
default:
}
panic(fmt.Errorf("unknown entity type: %d", id.EntityType()))
r.MustAuthorize(ctx, id, action)
node, err := loadNode(ctx, id)
if err != nil {
if errors.Is(err, coredata.ErrResourceNotFound) {
return nil, gqlutils.NotFound(err)
}
panic(fmt.Errorf("cannot load node: %w", err))
}
return node, nil
}
// Viewer is the resolver for the viewer field.