package console_v1 // This file will be automatically regenerated based on the schema, any resolver // implementations // will be copied through when generating and any unknown code will be moved to the end. // Code generated by github.com/99designs/gqlgen version v0.17.94 import ( "context" "encoding/json" "errors" "go.gearno.de/kit/log" "go.probo.inc/probo/pkg/coredata" "go.probo.inc/probo/pkg/page" "go.probo.inc/probo/pkg/probo" "go.probo.inc/probo/pkg/server/api/console/v1/schema" "go.probo.inc/probo/pkg/server/api/console/v1/types" "go.probo.inc/probo/pkg/server/gqlutils" "go.probo.inc/probo/pkg/validator" ) // Evidences is the resolver for the evidences field. func (r *measureResolver) Evidences(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.EvidenceOrderBy) (*types.EvidenceConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionEvidenceList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.EvidenceOrderField]{ Field: coredata.EvidenceOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.EvidenceOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) page, err := r.probo.Evidences.ListForMeasureID(ctx, scope, obj.ID, cursor) if err != nil { r.logger.ErrorCtx(ctx, "cannot list measure evidences", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewEvidenceConnection(page, r, obj.ID), nil } // Tasks is the resolver for the tasks field. func (r *measureResolver) Tasks(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.TaskOrderBy) (*types.TaskConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionTaskList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.TaskOrderField]{ Field: coredata.TaskOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.TaskOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) page, err := r.probo.Tasks.ListForMeasureID(ctx, scope, obj.ID, cursor) if err != nil { r.logger.ErrorCtx(ctx, "cannot list measure tasks", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewTaskConnection(page, r, obj.ID), nil } // Risks is the resolver for the risks field. func (r *measureResolver) Risks(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.RiskOrderBy, filter *types.RiskFilter) (*types.RiskConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionRiskList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.RiskOrderField]{ Field: coredata.RiskOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.RiskOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) var riskFilter = coredata.NewRiskFilter(nil) if filter != nil { riskFilter = coredata.NewRiskFilter(filter.Query) } page, err := r.probo.Risks.ListForMeasureID(ctx, scope, obj.ID, cursor, riskFilter) if err != nil { r.logger.ErrorCtx(ctx, "cannot list measure risks", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewRiskConnection(page, r, obj.ID, riskFilter), nil } // Controls is the resolver for the controls field. func (r *measureResolver) Controls(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ControlOrderBy, filter *types.ControlFilter) (*types.ControlConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionControlList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.ControlOrderField]{ Field: coredata.ControlOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.ControlOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) var controlFilter = coredata.NewControlFilter(nil) if filter != nil { controlFilter = coredata.NewControlFilter(filter.Query) } page, err := r.probo.Controls.ListForMeasureID(ctx, scope, obj.ID, cursor, controlFilter) if err != nil { r.logger.ErrorCtx(ctx, "cannot list measure controls", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewControlConnection(page, r, obj.ID, controlFilter), nil } // Documents is the resolver for the documents field. func (r *measureResolver) Documents(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentOrderBy, filter *types.DocumentFilter) (*types.DocumentConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionDocumentList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.DocumentOrderField]{ Field: coredata.DocumentOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.DocumentOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) var documentFilter = coredata.NewDocumentFilter(nil) if filter != nil { documentFilter = coredata.NewDocumentFilter(filter.Query). WithWriteModes(filter.WriteModes). WithDocumentTypes(filter.DocumentTypes). WithClassifications(filter.Classifications) } pg, err := r.probo.Documents.ListForMeasureID(ctx, scope, obj.ID, cursor, documentFilter) if err != nil { r.logger.ErrorCtx(ctx, "cannot list documents", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewDocumentConnection(pg, r, obj.ID, documentFilter), nil } // ThirdParties is the resolver for the thirdParties field. func (r *measureResolver) ThirdParties(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ThirdPartyOrderBy) (*types.ThirdPartyConnection, error) { scope, err := r.authorize(ctx, obj.ID, probo.ActionThirdPartyList) if err != nil { return nil, err } pageOrderBy := page.OrderBy[coredata.ThirdPartyOrderField]{ Field: coredata.ThirdPartyOrderFieldCreatedAt, Direction: page.OrderDirectionDesc, } if orderBy != nil { pageOrderBy = page.OrderBy[coredata.ThirdPartyOrderField]{ Field: orderBy.Field, Direction: orderBy.Direction, } } cursor := types.NewCursor(first, after, last, before, pageOrderBy) page, err := r.probo.ThirdParties.ListForMeasureID(ctx, scope, obj.ID, cursor) if err != nil { r.logger.ErrorCtx(ctx, "cannot list measure third parties", log.Error(err)) return nil, gqlutils.Internal(ctx) } return types.NewThirdPartyConnection(page, r, obj.ID, nil), nil } // Permission is the resolver for the permission field. func (r *measureResolver) Permission(ctx context.Context, obj *types.Measure, action string) (bool, error) { return r.Resolver.Permission(ctx, obj, action) } // TotalCount is the resolver for the totalCount field. func (r *measureConnectionResolver) TotalCount(ctx context.Context, obj *types.MeasureConnection) (int, error) { scope, err := r.authorize(ctx, obj.ParentID, probo.ActionMeasureList) if err != nil { return 0, err } switch obj.Resolver.(type) { case *organizationResolver: count, err := r.probo.Measures.CountForOrganizationID(ctx, scope, obj.ParentID, obj.Filters) if err != nil { r.logger.ErrorCtx(ctx, "cannot count measures", log.Error(err)) return 0, gqlutils.Internal(ctx) } return count, nil case *controlResolver: count, err := r.probo.Measures.CountForControlID(ctx, scope, obj.ParentID, obj.Filters) if err != nil { r.logger.ErrorCtx(ctx, "cannot count measures", log.Error(err)) return 0, gqlutils.Internal(ctx) } return count, nil case *riskResolver: count, err := r.probo.Measures.CountForRiskID(ctx, scope, obj.ParentID, obj.Filters) if err != nil { r.logger.ErrorCtx(ctx, "cannot count measures", log.Error(err)) return 0, gqlutils.Internal(ctx) } return count, nil case *thirdPartyResolver: count, err := r.probo.Measures.CountForThirdPartyID(ctx, scope, obj.ParentID, obj.Filters) if err != nil { r.logger.ErrorCtx(ctx, "cannot count measures", log.Error(err)) return 0, gqlutils.Internal(ctx) } return count, nil } r.logger.ErrorCtx(ctx, "unsupported resolver") return 0, gqlutils.Internal(ctx) } // // CreateMeasure is the resolver for the createMeasure field. func (r *mutationResolver) CreateMeasure(ctx context.Context, input types.CreateMeasureInput) (*types.CreateMeasurePayload, error) { scope, err := r.authorize(ctx, input.OrganizationID, probo.ActionMeasureCreate) if err != nil { return nil, err } measure, err := r.probo.Measures.Create( ctx, scope, probo.CreateMeasureRequest{ OrganizationID: input.OrganizationID, Name: input.Name, Description: input.Description, Category: input.Category, }, ) if err != nil { if errors.Is(err, coredata.ErrResourceAlreadyExists) { return nil, gqlutils.Conflict(ctx, err) } if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok { return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors) } r.logger.ErrorCtx(ctx, "cannot create measure", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.CreateMeasurePayload{ MeasureEdge: types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt), }, nil } // UpdateMeasure is the resolver for the updateMeasure field. func (r *mutationResolver) UpdateMeasure(ctx context.Context, input types.UpdateMeasureInput) (*types.UpdateMeasurePayload, error) { scope, err := r.authorize(ctx, input.ID, probo.ActionMeasureUpdate) if err != nil { return nil, err } measure, err := r.probo.Measures.Update( ctx, scope, probo.UpdateMeasureRequest{ ID: input.ID, Name: input.Name, Description: gqlutils.UnwrapOmittable(input.Description), Category: input.Category, State: input.State, }, ) if err != nil { if validationErrors, ok := errors.AsType[validator.ValidationErrors](err); ok { return nil, gqlutils.InvalidValidationErrors(ctx, validationErrors) } r.logger.ErrorCtx(ctx, "cannot update measure", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.UpdateMeasurePayload{ Measure: types.NewMeasure(measure), }, nil } // ImportMeasure is the resolver for the importMeasure field. func (r *mutationResolver) ImportMeasure(ctx context.Context, input types.ImportMeasureInput) (*types.ImportMeasurePayload, error) { scope, err := r.authorize(ctx, input.OrganizationID, probo.ActionMeasureImport) if err != nil { return nil, err } var req probo.ImportMeasureRequest if err := json.NewDecoder(input.File.File).Decode(&req.Measures); err != nil { r.logger.ErrorCtx(ctx, "cannot unmarshal measure", log.Error(err)) return nil, gqlutils.Internal(ctx) } measures, err := r.probo.Measures.Import(ctx, scope, input.OrganizationID, req) if err != nil { r.logger.ErrorCtx(ctx, "cannot import measure", log.Error(err)) return nil, gqlutils.Internal(ctx) } measureEdges := make([]*types.MeasureEdge, len(measures.Data)) for i, measure := range measures.Data { measureEdges[i] = types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt) } return &types.ImportMeasurePayload{ MeasureEdges: measureEdges, }, nil } // DeleteMeasure is the resolver for the deleteMeasure field. func (r *mutationResolver) DeleteMeasure(ctx context.Context, input types.DeleteMeasureInput) (*types.DeleteMeasurePayload, error) { scope, err := r.authorize(ctx, input.MeasureID, probo.ActionMeasureDelete) if err != nil { return nil, err } if err := r.probo.Measures.Delete(ctx, scope, input.MeasureID); err != nil { r.logger.ErrorCtx(ctx, "cannot delete measure", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.DeleteMeasurePayload{ DeletedMeasureID: input.MeasureID, }, nil } // CreateMeasureDocumentMapping is the resolver for the createMeasureDocumentMapping field. func (r *mutationResolver) CreateMeasureDocumentMapping(ctx context.Context, input types.CreateMeasureDocumentMappingInput) (*types.CreateMeasureDocumentMappingPayload, error) { scope, err := r.authorize(ctx, input.MeasureID, probo.ActionMeasureDocumentMappingCreate) if err != nil { return nil, err } measure, document, err := r.probo.Measures.CreateDocumentMapping(ctx, scope, input.MeasureID, input.DocumentID) if err != nil { if errors.Is(err, coredata.ErrResourceAlreadyExists) { return nil, gqlutils.Conflict(ctx, err) } r.logger.ErrorCtx(ctx, "cannot create measure document mapping", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.CreateMeasureDocumentMappingPayload{ MeasureEdge: types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt), DocumentEdge: types.NewDocumentEdge(document, coredata.DocumentOrderFieldTitle), }, nil } // DeleteMeasureDocumentMapping is the resolver for the deleteMeasureDocumentMapping field. func (r *mutationResolver) DeleteMeasureDocumentMapping(ctx context.Context, input types.DeleteMeasureDocumentMappingInput) (*types.DeleteMeasureDocumentMappingPayload, error) { scope, err := r.authorize(ctx, input.MeasureID, probo.ActionMeasureDocumentMappingDelete) if err != nil { return nil, err } measure, document, err := r.probo.Measures.DeleteDocumentMapping(ctx, scope, input.MeasureID, input.DocumentID) if err != nil { r.logger.ErrorCtx(ctx, "cannot delete measure document mapping", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.DeleteMeasureDocumentMappingPayload{ DeletedMeasureID: measure.ID, DeletedDocumentID: document.ID, }, nil } // CreateMeasureThirdPartyMapping is the resolver for the createMeasureThirdPartyMapping field. func (r *mutationResolver) CreateMeasureThirdPartyMapping(ctx context.Context, input types.CreateMeasureThirdPartyMappingInput) (*types.CreateMeasureThirdPartyMappingPayload, error) { scope, err := r.authorize(ctx, input.MeasureID, probo.ActionMeasureThirdPartyMappingCreate) if err != nil { return nil, err } measure, thirdParty, err := r.probo.Measures.CreateThirdPartyMapping(ctx, scope, input.MeasureID, input.ThirdPartyID) if err != nil { r.logger.ErrorCtx(ctx, "cannot create measure third party mapping", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.CreateMeasureThirdPartyMappingPayload{ MeasureEdge: types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt), ThirdPartyEdge: types.NewThirdPartyEdge(thirdParty, coredata.ThirdPartyOrderFieldCreatedAt), }, nil } // DeleteMeasureThirdPartyMapping is the resolver for the deleteMeasureThirdPartyMapping field. func (r *mutationResolver) DeleteMeasureThirdPartyMapping(ctx context.Context, input types.DeleteMeasureThirdPartyMappingInput) (*types.DeleteMeasureThirdPartyMappingPayload, error) { scope, err := r.authorize(ctx, input.MeasureID, probo.ActionMeasureThirdPartyMappingDelete) if err != nil { return nil, err } measure, thirdParty, err := r.probo.Measures.DeleteThirdPartyMapping(ctx, scope, input.MeasureID, input.ThirdPartyID) if err != nil { r.logger.ErrorCtx(ctx, "cannot delete measure third party mapping", log.Error(err)) return nil, gqlutils.Internal(ctx) } return &types.DeleteMeasureThirdPartyMappingPayload{ DeletedMeasureID: measure.ID, DeletedThirdPartyID: thirdParty.ID, }, nil } // Measure returns schema.MeasureResolver implementation. func (r *Resolver) Measure() schema.MeasureResolver { return &measureResolver{r} } // MeasureConnection returns schema.MeasureConnectionResolver implementation. func (r *Resolver) MeasureConnection() schema.MeasureConnectionResolver { return &measureConnectionResolver{r} } type ( measureResolver struct{ *Resolver } measureConnectionResolver struct{ *Resolver } )