From 770a795cd3ba431da356b8d8f1d0c5d5978f9ef0 Mon Sep 17 00:00:00 2001 From: Sacha Al Himdani Date: Thu, 25 Sep 2025 14:48:40 +0200 Subject: [PATCH] Add granular trust center access Signed-off-by: Sacha Al Himdani --- .../src/hooks/graph/TrustCenterAccessGraph.ts | 183 +- ...CenterAccessGraphCreateMutation.graphql.ts | 380 +++- ...enterAccessGraphPaginationQuery.graphql.ts | 418 +++++ .../TrustCenterAccessGraphQuery.graphql.ts | 502 ++++-- ...CenterAccessGraphUpdateMutation.graphql.ts | 428 ++++- ...TrustCenterAccessGraph_accesses.graphql.ts | 398 ++++ .../trustCenter/TrustCenterAccessTab.tsx | 379 +++- .../src/components/RequestAccessDialog.tsx | 4 +- .../RequestAccessDialogMutation.graphql.ts | 22 +- pkg/coredata/audit.go | 95 + pkg/coredata/document.go | 49 + pkg/coredata/entity_type_reg.go | 1 + pkg/coredata/migrations/20250924T111957Z.sql | 16 + pkg/coredata/trust_center_document_access.go | 616 +++++++ ...rust_center_document_access_order_field.go | 47 + pkg/probo/audit_service.go | 20 + pkg/probo/trust_center_access_service.go | 221 ++- pkg/server/api/console/v1/schema.graphql | 51 + pkg/server/api/console/v1/schema/schema.go | 1595 ++++++++++++++++- .../v1/types/trust_center_document_access.go | 80 + pkg/server/api/console/v1/types/types.go | 42 +- pkg/server/api/console/v1/v1_resolver.go | 124 +- pkg/server/api/trust/v1/schema.graphql | 42 +- pkg/server/api/trust/v1/schema/schema.go | 1236 ++++++++++--- pkg/server/api/trust/v1/types/types.go | 48 +- pkg/server/api/trust/v1/v1_resolver.go | 243 ++- pkg/trust/trust_center_access_service.go | 216 ++- 27 files changed, 6650 insertions(+), 806 deletions(-) create mode 100644 apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphPaginationQuery.graphql.ts create mode 100644 apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraph_accesses.graphql.ts create mode 100644 pkg/coredata/migrations/20250924T111957Z.sql create mode 100644 pkg/coredata/trust_center_document_access.go create mode 100644 pkg/coredata/trust_center_document_access_order_field.go create mode 100644 pkg/server/api/console/v1/types/trust_center_document_access.go diff --git a/apps/console/src/hooks/graph/TrustCenterAccessGraph.ts b/apps/console/src/hooks/graph/TrustCenterAccessGraph.ts index 6845d497c..d5dd2d622 100644 --- a/apps/console/src/hooks/graph/TrustCenterAccessGraph.ts +++ b/apps/console/src/hooks/graph/TrustCenterAccessGraph.ts @@ -1,33 +1,53 @@ import { graphql } from 'react-relay'; -import { useLazyLoadQuery } from 'react-relay'; +import { useLazyLoadQuery, usePaginationFragment } from 'react-relay'; import type { - TrustCenterAccessGraphQuery, - TrustCenterAccessGraphQuery$data + TrustCenterAccessGraphQuery } from "./__generated__/TrustCenterAccessGraphQuery.graphql"; -export const trustCenterAccessesQuery = graphql` - query TrustCenterAccessGraphQuery($trustCenterId: ID!) { - node(id: $trustCenterId) { - ... on TrustCenter { - id - accesses(first: 100, orderBy: { field: CREATED_AT, direction: DESC }) - @connection(key: "TrustCenterAccessTab_accesses") { - __id - pageInfo { - hasNextPage - hasPreviousPage - startCursor - endCursor - } - edges { - cursor - node { - id - email - name - active - hasAcceptedNonDisclosureAgreement - createdAt +export const trustCenterAccessesPaginationFragment = graphql` + fragment TrustCenterAccessGraph_accesses on TrustCenter + @refetchable(queryName: "TrustCenterAccessGraphPaginationQuery") { + accesses(first: $count, after: $cursor, orderBy: { field: CREATED_AT, direction: DESC }) + @connection(key: "TrustCenterAccessGraph_accesses") { + __id + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + edges { + cursor + node { + id + email + name + active + hasAcceptedNonDisclosureAgreement + createdAt + documentAccesses(first: 100, orderBy: { field: CREATED_AT, direction: DESC }) { + edges { + node { + id + active + createdAt + updatedAt + document { + id + title + documentType + } + report { + id + filename + audit { + id + framework { + name + } + } + } + } } } } @@ -36,6 +56,17 @@ export const trustCenterAccessesQuery = graphql` } `; +export const trustCenterAccessesQuery = graphql` + query TrustCenterAccessGraphQuery($trustCenterId: ID!, $count: Int!, $cursor: CursorKey) { + node(id: $trustCenterId) { + ... on TrustCenter { + id + ...TrustCenterAccessGraph_accesses + } + } + } +`; + export const createTrustCenterAccessMutation = graphql` mutation TrustCenterAccessGraphCreateMutation( $input: CreateTrustCenterAccessInput! @@ -51,6 +82,31 @@ export const createTrustCenterAccessMutation = graphql` active hasAcceptedNonDisclosureAgreement createdAt + documentAccesses(first: 100, orderBy: { field: CREATED_AT, direction: DESC }) { + edges { + node { + id + active + createdAt + updatedAt + document { + id + title + documentType + } + report { + id + filename + audit { + id + framework { + name + } + } + } + } + } + } } } } @@ -70,6 +126,31 @@ export const updateTrustCenterAccessMutation = graphql` hasAcceptedNonDisclosureAgreement createdAt updatedAt + documentAccesses(first: 100, orderBy: { field: CREATED_AT, direction: DESC }) { + edges { + node { + id + active + createdAt + updatedAt + document { + id + title + documentType + } + report { + id + filename + audit { + id + framework { + name + } + } + } + } + } + } } } } @@ -86,15 +167,53 @@ export const deleteTrustCenterAccessMutation = graphql` } `; -export function useTrustCenterAccesses(trustCenterId: string): TrustCenterAccessGraphQuery$data | null { - // Always call useLazyLoadQuery to maintain consistent hook order - // Use a placeholder value when trustCenterId is empty +interface PaginatedData { + data: { node: any } | null; + hasNext: boolean; + loadMore: () => void; + isLoadingNext: boolean; +} + +export function useTrustCenterAccesses(trustCenterId: string): PaginatedData { const data = useLazyLoadQuery( trustCenterAccessesQuery, - { trustCenterId: trustCenterId || "" }, + { + trustCenterId: trustCenterId || "", + count: 10, + cursor: null + }, { fetchPolicy: 'network-only' } ); - // Return null if trustCenterId was empty, otherwise return the data - return trustCenterId ? data : null; + if (!trustCenterId) { + return { + data: null, + hasNext: false, + loadMore: () => {}, + isLoadingNext: false, + }; + } + + const trustCenter = data?.node as any; + + const { + data: paginationData, + loadNext, + hasNext, + isLoadingNext, + } = usePaginationFragment( + trustCenterAccessesPaginationFragment, + trustCenter + ); + + const loadMore = () => { + loadNext(10); + }; + + return { + data: { node: paginationData }, + hasNext, + loadMore, + isLoadingNext, + }; } diff --git a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphCreateMutation.graphql.ts b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphCreateMutation.graphql.ts index 3e3f0e813..4256cd003 100644 --- a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphCreateMutation.graphql.ts +++ b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphCreateMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<5ccaab70e4cb8c4b5bee7fbe6ba2c0b6>> + * @generated SignedSource<<2ff966b9632595cece04e7a5ef3f7dd7>> * @lightSyntaxTransform * @nogrep */ @@ -9,6 +9,7 @@ // @ts-nocheck import { ConcreteRequest } from 'relay-runtime'; +export type DocumentType = "ISMS" | "OTHER" | "POLICY"; export type CreateTrustCenterAccessInput = { active: boolean; email: string; @@ -26,6 +27,31 @@ export type TrustCenterAccessGraphCreateMutation$data = { readonly node: { readonly active: boolean; readonly createdAt: any; + readonly documentAccesses: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly active: boolean; + readonly createdAt: any; + readonly document: { + readonly documentType: DocumentType; + readonly id: string; + readonly title: string; + } | null | undefined; + readonly id: string; + readonly report: { + readonly audit: { + readonly framework: { + readonly name: string; + }; + readonly id: string; + } | null | undefined; + readonly filename: string; + readonly id: string; + } | null | undefined; + readonly updatedAt: any; + }; + }>; + }; readonly email: string; readonly hasAcceptedNonDisclosureAgreement: boolean; readonly id: string; @@ -60,73 +86,106 @@ v2 = [ v3 = { "alias": null, "args": null, - "concreteType": "TrustCenterAccessEdge", + "kind": "ScalarField", + "name": "cursor", + "storageKey": null +}, +v4 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v5 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "email", + "storageKey": null +}, +v6 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null +}, +v7 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "active", + "storageKey": null +}, +v8 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasAcceptedNonDisclosureAgreement", + "storageKey": null +}, +v9 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}, +v10 = [ + { + "kind": "Literal", + "name": "first", + "value": 100 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } + } +], +v11 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null +}, +v12 = { + "alias": null, + "args": null, + "concreteType": "Document", "kind": "LinkedField", - "name": "trustCenterAccessEdge", + "name": "document", "plural": false, "selections": [ + (v4/*: any*/), { "alias": null, "args": null, "kind": "ScalarField", - "name": "cursor", + "name": "title", "storageKey": null }, { "alias": null, "args": null, - "concreteType": "TrustCenterAccess", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "email", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "active", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasAcceptedNonDisclosureAgreement", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - } - ], + "kind": "ScalarField", + "name": "documentType", "storageKey": null } ], "storageKey": null +}, +v13 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "filename", + "storageKey": null }; return { "fragment": { @@ -146,7 +205,110 @@ return { "name": "createTrustCenterAccess", "plural": false, "selections": [ - (v3/*: any*/) + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccessEdge", + "kind": "LinkedField", + "name": "trustCenterAccessEdge", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + (v9/*: any*/), + { + "alias": null, + "args": (v10/*: any*/), + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + (v7/*: any*/), + (v9/*: any*/), + (v11/*: any*/), + (v12/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v4/*: any*/), + (v13/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v6/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "storageKey": null + } + ], + "storageKey": null + } ], "storageKey": null } @@ -171,7 +333,111 @@ return { "name": "createTrustCenterAccess", "plural": false, "selections": [ - (v3/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccessEdge", + "kind": "LinkedField", + "name": "trustCenterAccessEdge", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + (v9/*: any*/), + { + "alias": null, + "args": (v10/*: any*/), + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + (v7/*: any*/), + (v9/*: any*/), + (v11/*: any*/), + (v12/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v4/*: any*/), + (v13/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v6/*: any*/), + (v4/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "storageKey": null + } + ], + "storageKey": null + }, { "alias": null, "args": null, @@ -194,16 +460,16 @@ return { ] }, "params": { - "cacheID": "fa88b100be7598cf46159cf79199c398", + "cacheID": "a27b7cdf2a4cadf8cc22a95f39c3c6b0", "id": null, "metadata": {}, "name": "TrustCenterAccessGraphCreateMutation", "operationKind": "mutation", - "text": "mutation TrustCenterAccessGraphCreateMutation(\n $input: CreateTrustCenterAccessInput!\n) {\n createTrustCenterAccess(input: $input) {\n trustCenterAccessEdge {\n cursor\n node {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n }\n }\n }\n}\n" + "text": "mutation TrustCenterAccessGraphCreateMutation(\n $input: CreateTrustCenterAccessInput!\n) {\n createTrustCenterAccess(input: $input) {\n trustCenterAccessEdge {\n cursor\n node {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n documentAccesses(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n active\n createdAt\n updatedAt\n document {\n id\n title\n documentType\n }\n report {\n id\n filename\n audit {\n id\n framework {\n name\n id\n }\n }\n }\n }\n }\n }\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "6c6c1344730e7d908a5c6392f578ca81"; +(node as any).hash = "091432e335b8fe3a97ac06d3765f172b"; export default node; diff --git a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphPaginationQuery.graphql.ts b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphPaginationQuery.graphql.ts new file mode 100644 index 000000000..b30bdb636 --- /dev/null +++ b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphPaginationQuery.graphql.ts @@ -0,0 +1,418 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type TrustCenterAccessGraphPaginationQuery$variables = { + count?: number | null | undefined; + cursor?: any | null | undefined; + id: string; +}; +export type TrustCenterAccessGraphPaginationQuery$data = { + readonly node: { + readonly " $fragmentSpreads": FragmentRefs<"TrustCenterAccessGraph_accesses">; + }; +}; +export type TrustCenterAccessGraphPaginationQuery = { + response: TrustCenterAccessGraphPaginationQuery$data; + variables: TrustCenterAccessGraphPaginationQuery$variables; +}; + +const node: ConcreteRequest = (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "count" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "cursor" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "id" + } +], +v1 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "id" + } +], +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v4 = { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } +}, +v5 = [ + { + "kind": "Variable", + "name": "after", + "variableName": "cursor" + }, + { + "kind": "Variable", + "name": "first", + "variableName": "count" + }, + (v4/*: any*/) +], +v6 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null +}, +v7 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "active", + "storageKey": null +}, +v8 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "TrustCenterAccessGraphPaginationQuery", + "selections": [ + { + "alias": null, + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "TrustCenterAccessGraph_accesses" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "TrustCenterAccessGraphPaginationQuery", + "selections": [ + { + "alias": null, + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v3/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": null, + "args": (v5/*: any*/), + "concreteType": "TrustCenterAccessConnection", + "kind": "LinkedField", + "name": "accesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasPreviousPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "startCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "email", + "storageKey": null + }, + (v6/*: any*/), + (v7/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasAcceptedNonDisclosureAgreement", + "storageKey": null + }, + (v8/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 100 + }, + (v4/*: any*/) + ], + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v3/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Document", + "kind": "LinkedField", + "name": "document", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "documentType", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "filename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v6/*: any*/), + (v3/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + }, + (v2/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + }, + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__id", + "storageKey": null + } + ] + } + ], + "storageKey": null + }, + { + "alias": null, + "args": (v5/*: any*/), + "filters": [ + "orderBy" + ], + "handle": "connection", + "key": "TrustCenterAccessGraph_accesses", + "kind": "LinkedHandle", + "name": "accesses" + } + ], + "type": "TrustCenter", + "abstractKey": null + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "96e9906815501bb22bca79bb63a4a149", + "id": null, + "metadata": {}, + "name": "TrustCenterAccessGraphPaginationQuery", + "operationKind": "query", + "text": "query TrustCenterAccessGraphPaginationQuery(\n $count: Int\n $cursor: CursorKey\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TrustCenterAccessGraph_accesses\n id\n }\n}\n\nfragment TrustCenterAccessGraph_accesses on TrustCenter {\n accesses(first: $count, after: $cursor, orderBy: {field: CREATED_AT, direction: DESC}) {\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n documentAccesses(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n active\n createdAt\n updatedAt\n document {\n id\n title\n documentType\n }\n report {\n id\n filename\n audit {\n id\n framework {\n name\n id\n }\n }\n }\n }\n }\n }\n __typename\n }\n }\n }\n id\n}\n" + } +}; +})(); + +(node as any).hash = "9e29aa4a382ca2d4bb9d1b014d8d81fd"; + +export default node; diff --git a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphQuery.graphql.ts b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphQuery.graphql.ts index 9b8e8e52c..c27287233 100644 --- a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphQuery.graphql.ts +++ b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<4fcca19ac1edb0d607a9682090e0cc3e>> * @lightSyntaxTransform * @nogrep */ @@ -9,32 +9,16 @@ // @ts-nocheck import { ConcreteRequest } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; export type TrustCenterAccessGraphQuery$variables = { + count: number; + cursor?: any | null | undefined; trustCenterId: string; }; export type TrustCenterAccessGraphQuery$data = { readonly node: { - readonly accesses?: { - readonly __id: string; - readonly edges: ReadonlyArray<{ - readonly cursor: any; - readonly node: { - readonly active: boolean; - readonly createdAt: any; - readonly email: string; - readonly hasAcceptedNonDisclosureAgreement: boolean; - readonly id: string; - readonly name: string; - }; - }>; - readonly pageInfo: { - readonly endCursor: any | null | undefined; - readonly hasNextPage: boolean; - readonly hasPreviousPage: boolean; - readonly startCursor: any | null | undefined; - }; - }; readonly id?: string; + readonly " $fragmentSpreads": FragmentRefs<"TrustCenterAccessGraph_accesses">; }; }; export type TrustCenterAccessGraphQuery = { @@ -43,28 +27,43 @@ export type TrustCenterAccessGraphQuery = { }; const node: ConcreteRequest = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "trustCenterId" - } -], -v1 = [ +var v0 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "count" +}, +v1 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "cursor" +}, +v2 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "trustCenterId" +}, +v3 = [ { "kind": "Variable", "name": "id", "variableName": "trustCenterId" } ], -v2 = { +v4 = { "alias": null, "args": null, "kind": "ScalarField", "name": "id", "storageKey": null }, -v3 = { +v5 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v6 = { "kind": "Literal", "name": "orderBy", "value": { @@ -72,150 +71,54 @@ v3 = { "field": "CREATED_AT" } }, -v4 = { +v7 = [ + { + "kind": "Variable", + "name": "after", + "variableName": "cursor" + }, + { + "kind": "Variable", + "name": "first", + "variableName": "count" + }, + (v6/*: any*/) +], +v8 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "__typename", + "name": "name", "storageKey": null }, -v5 = [ - { - "alias": null, - "args": null, - "concreteType": "PageInfo", - "kind": "LinkedField", - "name": "pageInfo", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasPreviousPage", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "startCursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "TrustCenterAccessEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "TrustCenterAccess", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "email", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "active", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasAcceptedNonDisclosureAgreement", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - }, - (v4/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "kind": "ClientExtension", - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "__id", - "storageKey": null - } - ] - } -], -v6 = [ - { - "kind": "Literal", - "name": "first", - "value": 100 - }, - (v3/*: any*/) -]; +v9 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "active", + "storageKey": null +}, +v10 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}; return { "fragment": { - "argumentDefinitions": (v0/*: any*/), + "argumentDefinitions": [ + (v0/*: any*/), + (v1/*: any*/), + (v2/*: any*/) + ], "kind": "Fragment", "metadata": null, "name": "TrustCenterAccessGraphQuery", "selections": [ { "alias": null, - "args": (v1/*: any*/), + "args": (v3/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", @@ -224,18 +127,11 @@ return { { "kind": "InlineFragment", "selections": [ - (v2/*: any*/), + (v4/*: any*/), { - "alias": "accesses", - "args": [ - (v3/*: any*/) - ], - "concreteType": "TrustCenterAccessConnection", - "kind": "LinkedField", - "name": "__TrustCenterAccessTab_accesses_connection", - "plural": false, - "selections": (v5/*: any*/), - "storageKey": "__TrustCenterAccessTab_accesses_connection(orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + "args": null, + "kind": "FragmentSpread", + "name": "TrustCenterAccessGraph_accesses" } ], "type": "TrustCenter", @@ -250,41 +146,265 @@ return { }, "kind": "Request", "operation": { - "argumentDefinitions": (v0/*: any*/), + "argumentDefinitions": [ + (v2/*: any*/), + (v0/*: any*/), + (v1/*: any*/) + ], "kind": "Operation", "name": "TrustCenterAccessGraphQuery", "selections": [ { "alias": null, - "args": (v1/*: any*/), + "args": (v3/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", "plural": false, "selections": [ + (v5/*: any*/), (v4/*: any*/), - (v2/*: any*/), { "kind": "InlineFragment", "selections": [ { "alias": null, - "args": (v6/*: any*/), + "args": (v7/*: any*/), "concreteType": "TrustCenterAccessConnection", "kind": "LinkedField", "name": "accesses", "plural": false, - "selections": (v5/*: any*/), - "storageKey": "accesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasPreviousPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "startCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "email", + "storageKey": null + }, + (v8/*: any*/), + (v9/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasAcceptedNonDisclosureAgreement", + "storageKey": null + }, + (v10/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 100 + }, + (v6/*: any*/) + ], + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v4/*: any*/), + (v9/*: any*/), + (v10/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Document", + "kind": "LinkedField", + "name": "document", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "documentType", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "filename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v8/*: any*/), + (v4/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + }, + (v5/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + }, + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__id", + "storageKey": null + } + ] + } + ], + "storageKey": null }, { "alias": null, - "args": (v6/*: any*/), + "args": (v7/*: any*/), "filters": [ "orderBy" ], "handle": "connection", - "key": "TrustCenterAccessTab_accesses", + "key": "TrustCenterAccessGraph_accesses", "kind": "LinkedHandle", "name": "accesses" } @@ -298,28 +418,16 @@ return { ] }, "params": { - "cacheID": "0286ec03fb4ae012ada7bae8a2234152", + "cacheID": "4ca52668a68c0789aa73c0d680ec0abe", "id": null, - "metadata": { - "connection": [ - { - "count": null, - "cursor": null, - "direction": "forward", - "path": [ - "node", - "accesses" - ] - } - ] - }, + "metadata": {}, "name": "TrustCenterAccessGraphQuery", "operationKind": "query", - "text": "query TrustCenterAccessGraphQuery(\n $trustCenterId: ID!\n) {\n node(id: $trustCenterId) {\n __typename\n ... on TrustCenter {\n id\n accesses(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n __typename\n }\n }\n }\n }\n id\n }\n}\n" + "text": "query TrustCenterAccessGraphQuery(\n $trustCenterId: ID!\n $count: Int!\n $cursor: CursorKey\n) {\n node(id: $trustCenterId) {\n __typename\n ... on TrustCenter {\n id\n ...TrustCenterAccessGraph_accesses\n }\n id\n }\n}\n\nfragment TrustCenterAccessGraph_accesses on TrustCenter {\n accesses(first: $count, after: $cursor, orderBy: {field: CREATED_AT, direction: DESC}) {\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n documentAccesses(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n active\n createdAt\n updatedAt\n document {\n id\n title\n documentType\n }\n report {\n id\n filename\n audit {\n id\n framework {\n name\n id\n }\n }\n }\n }\n }\n }\n __typename\n }\n }\n }\n id\n}\n" } }; })(); -(node as any).hash = "f837b96937f1397ac1a3065f58386e4d"; +(node as any).hash = "da875d7c80a605898a30cf634d033380"; export default node; diff --git a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphUpdateMutation.graphql.ts b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphUpdateMutation.graphql.ts index 99ae2288f..1cc6bad17 100644 --- a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphUpdateMutation.graphql.ts +++ b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraphUpdateMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<4aef541df2f5673dd3694ca275f3164d>> * @lightSyntaxTransform * @nogrep */ @@ -9,10 +9,13 @@ // @ts-nocheck import { ConcreteRequest } from 'relay-runtime'; +export type DocumentType = "ISMS" | "OTHER" | "POLICY"; export type UpdateTrustCenterAccessInput = { active?: boolean | null | undefined; + documentIds?: ReadonlyArray | null | undefined; id: string; name?: string | null | undefined; + reportIds?: ReadonlyArray | null | undefined; }; export type TrustCenterAccessGraphUpdateMutation$variables = { input: UpdateTrustCenterAccessInput; @@ -22,6 +25,31 @@ export type TrustCenterAccessGraphUpdateMutation$data = { readonly trustCenterAccess: { readonly active: boolean; readonly createdAt: any; + readonly documentAccesses: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly active: boolean; + readonly createdAt: any; + readonly document: { + readonly documentType: DocumentType; + readonly id: string; + readonly title: string; + } | null | undefined; + readonly id: string; + readonly report: { + readonly audit: { + readonly framework: { + readonly name: string; + }; + readonly id: string; + } | null | undefined; + readonly filename: string; + readonly id: string; + } | null | undefined; + readonly updatedAt: any; + }; + }>; + }; readonly email: string; readonly hasAcceptedNonDisclosureAgreement: boolean; readonly id: string; @@ -45,90 +73,220 @@ var v0 = [ ], v1 = [ { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "input", - "variableName": "input" - } - ], - "concreteType": "UpdateTrustCenterAccessPayload", - "kind": "LinkedField", - "name": "updateTrustCenterAccess", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "TrustCenterAccess", - "kind": "LinkedField", - "name": "trustCenterAccess", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "email", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "active", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasAcceptedNonDisclosureAgreement", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updatedAt", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null + "kind": "Variable", + "name": "input", + "variableName": "input" } -]; +], +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "email", + "storageKey": null +}, +v4 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null +}, +v5 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "active", + "storageKey": null +}, +v6 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasAcceptedNonDisclosureAgreement", + "storageKey": null +}, +v7 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}, +v8 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null +}, +v9 = [ + { + "kind": "Literal", + "name": "first", + "value": 100 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } + } +], +v10 = { + "alias": null, + "args": null, + "concreteType": "Document", + "kind": "LinkedField", + "name": "document", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "documentType", + "storageKey": null + } + ], + "storageKey": null +}, +v11 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "filename", + "storageKey": null +}; return { "fragment": { "argumentDefinitions": (v0/*: any*/), "kind": "Fragment", "metadata": null, "name": "TrustCenterAccessGraphUpdateMutation", - "selections": (v1/*: any*/), + "selections": [ + { + "alias": null, + "args": (v1/*: any*/), + "concreteType": "UpdateTrustCenterAccessPayload", + "kind": "LinkedField", + "name": "updateTrustCenterAccess", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "trustCenterAccess", + "plural": false, + "selections": [ + (v2/*: any*/), + (v3/*: any*/), + (v4/*: any*/), + (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + { + "alias": null, + "args": (v9/*: any*/), + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v5/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + (v10/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v2/*: any*/), + (v11/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v4/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], "type": "Mutation", "abstractKey": null }, @@ -137,19 +295,125 @@ return { "argumentDefinitions": (v0/*: any*/), "kind": "Operation", "name": "TrustCenterAccessGraphUpdateMutation", - "selections": (v1/*: any*/) + "selections": [ + { + "alias": null, + "args": (v1/*: any*/), + "concreteType": "UpdateTrustCenterAccessPayload", + "kind": "LinkedField", + "name": "updateTrustCenterAccess", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "trustCenterAccess", + "plural": false, + "selections": [ + (v2/*: any*/), + (v3/*: any*/), + (v4/*: any*/), + (v5/*: any*/), + (v6/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + { + "alias": null, + "args": (v9/*: any*/), + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v5/*: any*/), + (v7/*: any*/), + (v8/*: any*/), + (v10/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v2/*: any*/), + (v11/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v4/*: any*/), + (v2/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ] }, "params": { - "cacheID": "223169ee8a4f65008047097ecff68fc5", + "cacheID": "de3ddd0058b8881667e47e2bf32c8b73", "id": null, "metadata": {}, "name": "TrustCenterAccessGraphUpdateMutation", "operationKind": "mutation", - "text": "mutation TrustCenterAccessGraphUpdateMutation(\n $input: UpdateTrustCenterAccessInput!\n) {\n updateTrustCenterAccess(input: $input) {\n trustCenterAccess {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n updatedAt\n }\n }\n}\n" + "text": "mutation TrustCenterAccessGraphUpdateMutation(\n $input: UpdateTrustCenterAccessInput!\n) {\n updateTrustCenterAccess(input: $input) {\n trustCenterAccess {\n id\n email\n name\n active\n hasAcceptedNonDisclosureAgreement\n createdAt\n updatedAt\n documentAccesses(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n active\n createdAt\n updatedAt\n document {\n id\n title\n documentType\n }\n report {\n id\n filename\n audit {\n id\n framework {\n name\n id\n }\n }\n }\n }\n }\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "0da1f737e6ea1db7a1b9930c4b6cc545"; +(node as any).hash = "723058aacc2e04bd2df4cf04c6df0a3c"; export default node; diff --git a/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraph_accesses.graphql.ts b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraph_accesses.graphql.ts new file mode 100644 index 000000000..63128d54d --- /dev/null +++ b/apps/console/src/hooks/graph/__generated__/TrustCenterAccessGraph_accesses.graphql.ts @@ -0,0 +1,398 @@ +/** + * @generated SignedSource<<3717625e10534aaff2d7967a1824405b>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +export type DocumentType = "ISMS" | "OTHER" | "POLICY"; +import { FragmentRefs } from "relay-runtime"; +export type TrustCenterAccessGraph_accesses$data = { + readonly accesses: { + readonly __id: string; + readonly edges: ReadonlyArray<{ + readonly cursor: any; + readonly node: { + readonly active: boolean; + readonly createdAt: any; + readonly documentAccesses: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly active: boolean; + readonly createdAt: any; + readonly document: { + readonly documentType: DocumentType; + readonly id: string; + readonly title: string; + } | null | undefined; + readonly id: string; + readonly report: { + readonly audit: { + readonly framework: { + readonly name: string; + }; + readonly id: string; + } | null | undefined; + readonly filename: string; + readonly id: string; + } | null | undefined; + readonly updatedAt: any; + }; + }>; + }; + readonly email: string; + readonly hasAcceptedNonDisclosureAgreement: boolean; + readonly id: string; + readonly name: string; + }; + }>; + readonly pageInfo: { + readonly endCursor: any | null | undefined; + readonly hasNextPage: boolean; + readonly hasPreviousPage: boolean; + readonly startCursor: any | null | undefined; + }; + }; + readonly id: string; + readonly " $fragmentType": "TrustCenterAccessGraph_accesses"; +}; +export type TrustCenterAccessGraph_accesses$key = { + readonly " $data"?: TrustCenterAccessGraph_accesses$data; + readonly " $fragmentSpreads": FragmentRefs<"TrustCenterAccessGraph_accesses">; +}; + +import TrustCenterAccessGraphPaginationQuery_graphql from './TrustCenterAccessGraphPaginationQuery.graphql'; + +const node: ReaderFragment = (function(){ +var v0 = [ + "accesses" +], +v1 = { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } +}, +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null +}, +v4 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "active", + "storageKey": null +}, +v5 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}; +return { + "argumentDefinitions": [ + { + "kind": "RootArgument", + "name": "count" + }, + { + "kind": "RootArgument", + "name": "cursor" + } + ], + "kind": "Fragment", + "metadata": { + "connection": [ + { + "count": "count", + "cursor": "cursor", + "direction": "forward", + "path": (v0/*: any*/) + } + ], + "refetch": { + "connection": { + "forward": { + "count": "count", + "cursor": "cursor" + }, + "backward": null, + "path": (v0/*: any*/) + }, + "fragmentPathInResult": [ + "node" + ], + "operation": TrustCenterAccessGraphPaginationQuery_graphql, + "identifierInfo": { + "identifierField": "id", + "identifierQueryVariableName": "id" + } + } + }, + "name": "TrustCenterAccessGraph_accesses", + "selections": [ + { + "alias": "accesses", + "args": [ + (v1/*: any*/) + ], + "concreteType": "TrustCenterAccessConnection", + "kind": "LinkedField", + "name": "__TrustCenterAccessGraph_accesses_connection", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasPreviousPage", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "startCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "TrustCenterAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "email", + "storageKey": null + }, + (v3/*: any*/), + (v4/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasAcceptedNonDisclosureAgreement", + "storageKey": null + }, + (v5/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 100 + }, + (v1/*: any*/) + ], + "concreteType": "TrustCenterDocumentAccessConnection", + "kind": "LinkedField", + "name": "documentAccesses", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccessEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "TrustCenterDocumentAccess", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v4/*: any*/), + (v5/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Document", + "kind": "LinkedField", + "name": "document", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "documentType", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Report", + "kind": "LinkedField", + "name": "report", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "filename", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "Audit", + "kind": "LinkedField", + "name": "audit", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "Framework", + "kind": "LinkedField", + "name": "framework", + "plural": false, + "selections": [ + (v3/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documentAccesses(first:100,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + }, + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__id", + "storageKey": null + } + ] + } + ], + "storageKey": "__TrustCenterAccessGraph_accesses_connection(orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + }, + (v2/*: any*/) + ], + "type": "TrustCenter", + "abstractKey": null +}; +})(); + +(node as any).hash = "9e29aa4a382ca2d4bb9d1b014d8d81fd"; + +export default node; diff --git a/apps/console/src/pages/organizations/trustCenter/TrustCenterAccessTab.tsx b/apps/console/src/pages/organizations/trustCenter/TrustCenterAccessTab.tsx index ee1ac8f94..2700db900 100644 --- a/apps/console/src/pages/organizations/trustCenter/TrustCenterAccessTab.tsx +++ b/apps/console/src/pages/organizations/trustCenter/TrustCenterAccessTab.tsx @@ -17,11 +17,13 @@ import { IconTrashCan, IconPencil, IconCheckmark1, + IconCrossLargeX, + IconChevronDown, } from "@probo/ui"; import { useTranslate } from "@probo/i18n"; import { formatDate } from "@probo/helpers"; import { useOutletContext } from "react-router"; -import { useState, useCallback } from "react"; +import { useState, useCallback, useEffect } from "react"; import z from "zod"; import { useTrustCenterAccesses, @@ -52,11 +54,12 @@ export default function TrustCenterAccessTab() { const editSchema = z.object({ name: z.string().min(1, __("Name is required")).min(2, __("Name must be at least 2 characters long")), + active: z.boolean(), }); const [createInvitation, isCreating] = useMutationWithToasts(createTrustCenterAccessMutation, { - successMessage: __("Access invitation sent successfully"), - errorMessage: __("Failed to send invitation. Please try again."), + successMessage: __("Access created successfully"), + errorMessage: __("Failed to create access. Please try again."), }); const [updateInvitation, isUpdating] = useMutationWithToasts(updateTrustCenterAccessMutation, { successMessage: __("Access updated successfully"), @@ -69,19 +72,38 @@ export default function TrustCenterAccessTab() { const dialogRef = useDialogRef(); const editDialogRef = useDialogRef(); - const [editingAccess, setEditingAccess] = useState<{ - id: string; - name: string; - } | null>(null); + const [editingAccess, setEditingAccess] = useState(null); + const [selectedDocumentAccesses, setSelectedDocumentAccesses] = useState>(new Set()); + const [pendingEditEmail, setPendingEditEmail] = useState(null); const inviteForm = useFormWithSchema(inviteSchema, { defaultValues: { name: "", email: "" }, }); const editForm = useFormWithSchema(editSchema, { - defaultValues: { name: "" }, + defaultValues: { name: "", active: false }, }); + type DocumentAccessType = { + id: string; + active: boolean; + document?: { + id: string; + title: string; + documentType: string; + } | null; + report?: { + id: string; + filename: string; + audit: { + id: string; + framework: { + name: string; + }; + }; + } | null; + }; + type AccessType = { id: string; email: string; @@ -89,39 +111,49 @@ export default function TrustCenterAccessTab() { active: boolean; hasAcceptedNonDisclosureAgreement: boolean; createdAt: string; + documentAccesses: DocumentAccessType[]; }; - const trustCenterData = useTrustCenterAccesses(organization.trustCenter?.id || ""); + const { data: trustCenterData, loadMore, hasNext, isLoadingNext } = useTrustCenterAccesses(organization.trustCenter?.id || ""); - const accesses: AccessType[] = trustCenterData?.node?.accesses?.edges?.map(edge => ({ + const accesses: AccessType[] = trustCenterData?.node?.accesses?.edges?.map((edge: any) => ({ id: edge.node.id, email: edge.node.email, name: edge.node.name, active: edge.node.active, hasAcceptedNonDisclosureAgreement: edge.node.hasAcceptedNonDisclosureAgreement, - createdAt: edge.node.createdAt + createdAt: edge.node.createdAt, + documentAccesses: edge.node.documentAccesses?.edges?.map((docEdge: any) => ({ + id: docEdge.node.id, + active: docEdge.node.active, + document: docEdge.node.document, + report: docEdge.node.report + })) ?? [] })) ?? []; + const handleInvite = inviteForm.handleSubmit(async (data) => { if (!organization.trustCenter?.id) { return; } const connectionId = trustCenterData?.node?.accesses?.__id; + const email = data.email.trim(); await createInvitation({ variables: { input: { trustCenterId: organization.trustCenter.id, - email: data.email.trim(), + email: email, name: data.name.trim(), - active: true, + active: false, }, connections: connectionId ? [connectionId] : [], }, onSuccess: () => { dialogRef.current?.close(); inviteForm.reset(); + setPendingEditEmail(email); }, }); }); @@ -137,36 +169,79 @@ export default function TrustCenterAccessTab() { }); }, [deleteInvitation, trustCenterData]); - const handleToggleActive = useCallback(async (id: string, active: boolean) => { - await updateInvitation({ - variables: { - input: { id, active }, - }, - successMessage: active ? __("Access activated") : __("Access deactivated"), - }); - }, [updateInvitation, __]); + + const getActiveDocumentIds = useCallback((access: AccessType) => { + return access.documentAccesses + .filter(docAccess => docAccess.active) + .map(docAccess => docAccess.document?.id || docAccess.report?.id) + .filter((id): id is string => id !== undefined); + }, []); const handleEditAccess = useCallback((access: AccessType) => { - setEditingAccess({ id: access.id, name: access.name }); - editForm.reset({ name: access.name }); + setEditingAccess(access); + editForm.reset({ name: access.name, active: access.active }); + setSelectedDocumentAccesses(new Set(getActiveDocumentIds(access))); editDialogRef.current?.open(); - }, [editDialogRef, editForm]); + }, [editDialogRef, editForm, getActiveDocumentIds]); + + useEffect(() => { + if (pendingEditEmail && accesses.length > 0) { + const newAccess = accesses.find(access => access.email === pendingEditEmail); + if (newAccess) { + setPendingEditEmail(null); + setEditingAccess(newAccess); + editForm.reset({ name: newAccess.name, active: true }); + setSelectedDocumentAccesses(new Set(getActiveDocumentIds(newAccess))); + editDialogRef.current?.open(); + } + } + }, [accesses, pendingEditEmail, editForm, editDialogRef, getActiveDocumentIds]); + + const handleToggleDocumentAccess = useCallback((documentId: string, active: boolean) => { + setSelectedDocumentAccesses(prev => { + const newSet = new Set(prev); + if (active) { + newSet.add(documentId); + } else { + newSet.delete(documentId); + } + return newSet; + }); + }, []); const handleUpdateName = editForm.handleSubmit(async (data) => { if (!editingAccess) return; + const { documentIds, reportIds } = editingAccess.documentAccesses.reduce( + (acc, docAccess) => { + const id = docAccess.document?.id || docAccess.report?.id; + if (id && selectedDocumentAccesses.has(id)) { + if (docAccess.document?.id) { + acc.documentIds.push(docAccess.document.id); + } else if (docAccess.report?.id) { + acc.reportIds.push(docAccess.report.id); + } + } + return acc; + }, + { documentIds: [] as string[], reportIds: [] as string[] } + ); + await updateInvitation({ variables: { input: { id: editingAccess.id, name: data.name.trim(), + active: data.active, + documentIds, + reportIds, }, }, - successMessage: __("Name updated successfully"), onSuccess: () => { editDialogRef.current?.close(); setEditingAccess(null); editForm.reset(); + setSelectedDocumentAccesses(new Set()); }, }); }); @@ -185,7 +260,7 @@ export default function TrustCenterAccessTab() { inviteForm.reset(); dialogRef.current?.open(); }}> - {__("Invite")} + {__("Add Access")} )} @@ -200,56 +275,87 @@ export default function TrustCenterAccessTab() { {__("No external access granted yet")} ) : ( - - - - - - - - - - - - - {accesses.map((access) => ( - - - - - - - + <> +
{__("Name")}{__("Email")}{__("Date")}{__("Active")}{__("NDA")}
{access.name}{access.email} - {formatDate(access.createdAt)} - - handleToggleActive(access.id, active)} - /> - - {access.hasAcceptedNonDisclosureAgreement && ( - - )} - -
-
-
+ + + + + + + + + - ))} - -
{__("Name")}{__("Email")}{__("Date")}{__("Active")}{__("Documents")}{__("NDA")}
+ + + {accesses.map((access) => { + const activeDocuments = access.documentAccesses.filter(doc => doc.active).length; + const totalDocuments = access.documentAccesses.length; + + return ( + handleEditAccess(access)} + className="cursor-pointer hover:bg-bg-secondary transition-colors" + > + {access.name} + {access.email} + + {formatDate(access.createdAt)} + + + {access.active ? ( + + ) : ( + + )} + + + {totalDocuments > 0 ? `${activeDocuments}/${totalDocuments}` : '0/0'} + + + {access.hasAcceptedNonDisclosureAgreement && ( + + )} + + +
e.stopPropagation()} + > +
+ + + ); + })} + + + {hasNext && ( + + )} + )} @@ -284,7 +390,7 @@ export default function TrustCenterAccessTab() { @@ -292,27 +398,122 @@ export default function TrustCenterAccessTab() {
- -

- {__("Update the display name for this access invitation")} -

+ +
+

+ {__("Update access settings and document permissions")} +

- + + +
+
+ +

+ {__("Enable or disable access for this user")} +

+
+ editForm.setValue("active", checked)} + /> +
+
+ + {editingAccess && editingAccess.documentAccesses.length > 0 && ( +
+

+ {__("Document Access Permissions")} +

+
+ + + + + + + + + + + {editingAccess.documentAccesses.map((docAccess) => { + const getDocumentInfo = () => { + const isDocument = !!docAccess.document; + return { + isDocument, + name: docAccess.document?.title || docAccess.report?.filename || __("Unknown Item"), + type: isDocument ? __("Document") : __("Report"), + category: isDocument + ? docAccess.document?.documentType + : docAccess.report?.audit?.framework?.name || __("Compliance Report"), + id: docAccess.document?.id || docAccess.report?.id || '' + }; + }; + + const { isDocument, name, type, category, id } = getDocumentInfo(); + + return ( + + + + + + + ); + })} + +
{__("Name")}{__("Type")}{__("Category")} +
+ {__("Access")} +
+
+
+ {name} +
+
+
+
+ {type} +
+
+
+
+ {category || "-"} +
+
+
+ { + if (id) handleToggleDocumentAccess(id, active); + }} + /> +
+
+
+
+ )}
diff --git a/apps/trust/src/components/RequestAccessDialog.tsx b/apps/trust/src/components/RequestAccessDialog.tsx index f5e317a5e..4fcd58d2a 100644 --- a/apps/trust/src/components/RequestAccessDialog.tsx +++ b/apps/trust/src/components/RequestAccessDialog.tsx @@ -26,8 +26,8 @@ const schema = z.object({ }); const requestAccessMutation = graphql` - mutation RequestAccessDialogMutation($input: CreateTrustCenterAccessInput!) { - createTrustCenterAccess(input: $input) { + mutation RequestAccessDialogMutation($input: RequestAllAccessesInput!) { + requestAllAccesses(input: $input) { trustCenterAccess { id } diff --git a/apps/trust/src/components/__generated__/RequestAccessDialogMutation.graphql.ts b/apps/trust/src/components/__generated__/RequestAccessDialogMutation.graphql.ts index 4a6a65f37..7065fa65a 100644 --- a/apps/trust/src/components/__generated__/RequestAccessDialogMutation.graphql.ts +++ b/apps/trust/src/components/__generated__/RequestAccessDialogMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<843902dd4fb6e2a5ee4d2d175ddcab03>> + * @generated SignedSource<<898167474e2680273ad8b588a63a47c5>> * @lightSyntaxTransform * @nogrep */ @@ -9,16 +9,16 @@ // @ts-nocheck import { ConcreteRequest } from 'relay-runtime'; -export type CreateTrustCenterAccessInput = { - email: string; - name: string; +export type RequestAllAccessesInput = { + email?: string | null | undefined; + name?: string | null | undefined; trustCenterId: string; }; export type RequestAccessDialogMutation$variables = { - input: CreateTrustCenterAccessInput; + input: RequestAllAccessesInput; }; export type RequestAccessDialogMutation$data = { - readonly createTrustCenterAccess: { + readonly requestAllAccesses: { readonly trustCenterAccess: { readonly id: string; }; @@ -47,9 +47,9 @@ v1 = [ "variableName": "input" } ], - "concreteType": "CreateTrustCenterAccessPayload", + "concreteType": "RequestAccessesPayload", "kind": "LinkedField", - "name": "createTrustCenterAccess", + "name": "requestAllAccesses", "plural": false, "selections": [ { @@ -92,16 +92,16 @@ return { "selections": (v1/*: any*/) }, "params": { - "cacheID": "13fedcfe7c72292417b76b3624c5434f", + "cacheID": "99eb2902ce5a921515d68db30f8a2189", "id": null, "metadata": {}, "name": "RequestAccessDialogMutation", "operationKind": "mutation", - "text": "mutation RequestAccessDialogMutation(\n $input: CreateTrustCenterAccessInput!\n) {\n createTrustCenterAccess(input: $input) {\n trustCenterAccess {\n id\n }\n }\n}\n" + "text": "mutation RequestAccessDialogMutation(\n $input: RequestAllAccessesInput!\n) {\n requestAllAccesses(input: $input) {\n trustCenterAccess {\n id\n }\n }\n}\n" } }; })(); -(node as any).hash = "18075ac4298dd3ca05bbcf8fb1717a9d"; +(node as any).hash = "cc4d5c8753438eff23833b4182dd485d"; export default node; diff --git a/pkg/coredata/audit.go b/pkg/coredata/audit.go index 1119b3ba1..04a03d447 100644 --- a/pkg/coredata/audit.go +++ b/pkg/coredata/audit.go @@ -190,6 +190,56 @@ WHERE return nil } +func (a *Audits) LoadAllByOrganizationID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + organizationID gid.GID, + filter *AuditFilter, +) error { + q := ` +SELECT + id, + name, + organization_id, + framework_id, + report_id, + valid_from, + valid_until, + state, + show_on_trust_center, + created_at, + updated_at +FROM + audits +WHERE + %s + AND organization_id = @organization_id + AND %s +ORDER BY valid_from DESC +` + + q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment()) + + args := pgx.StrictNamedArgs{"organization_id": organizationID} + maps.Copy(args, scope.SQLArguments()) + maps.Copy(args, filter.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query audits: %w", err) + } + + audits, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Audit]) + if err != nil { + return fmt.Errorf("cannot collect audits: %w", err) + } + + *a = audits + + return nil +} + func (a *Audit) Insert( ctx context.Context, conn pg.Conn, @@ -420,3 +470,48 @@ WHERE %s return nil } + +func (a *Audit) LoadByReportID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + reportID gid.GID, +) error { + q := ` +SELECT + id, + name, + organization_id, + framework_id, + report_id, + valid_from, + valid_until, + state, + show_on_trust_center, + created_at, + updated_at +FROM + audits +WHERE %s + AND report_id = @report_id +LIMIT 1; +` + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{"report_id": reportID} + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query audit: %w", err) + } + + audit, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Audit]) + if err != nil { + return fmt.Errorf("cannot collect audit: %w", err) + } + + *a = audit + + return nil +} diff --git a/pkg/coredata/document.go b/pkg/coredata/document.go index bcdcb2717..b4867ebc1 100644 --- a/pkg/coredata/document.go +++ b/pkg/coredata/document.go @@ -186,6 +186,55 @@ WHERE return nil } +func (p *Documents) LoadAllByOrganizationID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + organizationID gid.GID, + filter *DocumentFilter, +) error { + q := ` +SELECT + id, + organization_id, + owner_id, + title, + document_type, + current_published_version, + show_on_trust_center, + created_at, + updated_at +FROM + documents +WHERE + %s + AND deleted_at IS NULL + AND organization_id = @organization_id + AND %s +ORDER BY title ASC +` + + q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment()) + + args := pgx.NamedArgs{"organization_id": organizationID} + maps.Copy(args, scope.SQLArguments()) + maps.Copy(args, filter.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query documents: %w", err) + } + + documents, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Document]) + if err != nil { + return fmt.Errorf("cannot collect documents: %w", err) + } + + *p = documents + + return nil +} + func (p Document) Insert( ctx context.Context, conn pg.Conn, diff --git a/pkg/coredata/entity_type_reg.go b/pkg/coredata/entity_type_reg.go index 8cf135e70..09428f247 100644 --- a/pkg/coredata/entity_type_reg.go +++ b/pkg/coredata/entity_type_reg.go @@ -57,4 +57,5 @@ const ( ProcessingActivityEntityType ExportJobEntityType TrustCenterReferenceEntityType + TrustCenterDocumentAccessEntityType ) diff --git a/pkg/coredata/migrations/20250924T111957Z.sql b/pkg/coredata/migrations/20250924T111957Z.sql new file mode 100644 index 000000000..57d36be59 --- /dev/null +++ b/pkg/coredata/migrations/20250924T111957Z.sql @@ -0,0 +1,16 @@ +CREATE TABLE trust_center_document_accesses( + id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL, + trust_center_access_id TEXT NOT NULL REFERENCES trust_center_accesses(id) + ON UPDATE CASCADE ON DELETE CASCADE, + document_id TEXT REFERENCES documents(id) + ON UPDATE CASCADE ON DELETE CASCADE, + report_id TEXT REFERENCES reports(id) + ON UPDATE CASCADE ON DELETE CASCADE, + active BOOLEAN NOT NULL, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL, + UNIQUE (trust_center_access_id, document_id), + UNIQUE (trust_center_access_id, report_id), + CHECK ((document_id IS NOT NULL) != (report_id IS NOT NULL)) +); diff --git a/pkg/coredata/trust_center_document_access.go b/pkg/coredata/trust_center_document_access.go new file mode 100644 index 000000000..63c5f0476 --- /dev/null +++ b/pkg/coredata/trust_center_document_access.go @@ -0,0 +1,616 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package coredata + +import ( + "context" + "fmt" + "maps" + "time" + + "github.com/getprobo/probo/pkg/gid" + "github.com/getprobo/probo/pkg/page" + "github.com/jackc/pgx/v5" + "go.gearno.de/kit/pg" +) + +type ( + TrustCenterDocumentAccess struct { + ID gid.GID `db:"id"` + TrustCenterAccessID gid.GID `db:"trust_center_access_id"` + DocumentID *gid.GID `db:"document_id"` + ReportID *gid.GID `db:"report_id"` + Active bool `db:"active"` + CreatedAt time.Time `db:"created_at"` + UpdatedAt time.Time `db:"updated_at"` + } + + TrustCenterDocumentAccesses []*TrustCenterDocumentAccess +) + +func (tcda *TrustCenterDocumentAccess) CursorKey(orderBy TrustCenterDocumentAccessOrderField) page.CursorKey { + switch orderBy { + case TrustCenterDocumentAccessOrderFieldCreatedAt: + return page.NewCursorKey(tcda.ID, tcda.CreatedAt) + } + + panic(fmt.Sprintf("unsupported order by: %s", orderBy)) +} + +func (tcda *TrustCenterDocumentAccess) LoadByID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + accessID gid.GID, +) error { + q := ` +SELECT + id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +FROM + trust_center_document_accesses +WHERE + %s + AND id = @access_id +LIMIT 1; +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{"access_id": accessID} + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query trust center document access: %w", err) + } + + access, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[TrustCenterDocumentAccess]) + if err != nil { + return fmt.Errorf("cannot collect trust center document access: %w", err) + } + + *tcda = access + + return nil +} + +func (tcda *TrustCenterDocumentAccess) LoadByTrustCenterAccessIDAndDocumentID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + documentID gid.GID, +) error { + q := ` +SELECT + id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +FROM + trust_center_document_accesses +WHERE + %s + AND trust_center_access_id = @trust_center_access_id + AND document_id = @document_id +LIMIT 1; +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + "document_id": documentID, + } + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query trust center document access: %w", err) + } + + access, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[TrustCenterDocumentAccess]) + if err != nil { + return fmt.Errorf("cannot collect trust center document access: %w", err) + } + + *tcda = access + + return nil +} + +func (tcda *TrustCenterDocumentAccess) LoadByTrustCenterAccessIDAndReportID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + reportID gid.GID, +) error { + q := ` +SELECT + id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +FROM + trust_center_document_accesses +WHERE + %s + AND trust_center_access_id = @trust_center_access_id + AND report_id = @report_id +LIMIT 1; +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + "report_id": reportID, + } + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query trust center document access: %w", err) + } + + access, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[TrustCenterDocumentAccess]) + if err != nil { + return fmt.Errorf("cannot collect trust center document access: %w", err) + } + + *tcda = access + + return nil +} + +func (tcda *TrustCenterDocumentAccess) Insert( + ctx context.Context, + conn pg.Conn, + scope Scoper, +) error { + q := ` +INSERT INTO trust_center_document_accesses ( + id, + tenant_id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +) VALUES ( + @id, + @tenant_id, + @trust_center_access_id, + @document_id, + @report_id, + @active, + @created_at, + @updated_at +) +` + + args := pgx.StrictNamedArgs{ + "id": tcda.ID, + "tenant_id": scope.GetTenantID(), + "trust_center_access_id": tcda.TrustCenterAccessID, + "document_id": tcda.DocumentID, + "report_id": tcda.ReportID, + "active": tcda.Active, + "created_at": tcda.CreatedAt, + "updated_at": tcda.UpdatedAt, + } + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot insert trust center document access: %w", err) + } + + return nil +} + +func (tcda *TrustCenterDocumentAccess) Update( + ctx context.Context, + conn pg.Conn, + scope Scoper, +) error { + q := ` +UPDATE trust_center_document_accesses SET + active = @active, + updated_at = @updated_at +WHERE + %s + AND id = @id +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "id": tcda.ID, + "active": tcda.Active, + "updated_at": tcda.UpdatedAt, + } + maps.Copy(args, scope.SQLArguments()) + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot update trust center document access: %w", err) + } + + return nil +} + +func (tcda *TrustCenterDocumentAccess) Delete( + ctx context.Context, + conn pg.Conn, + scope Scoper, +) error { + q := ` +DELETE FROM trust_center_document_accesses +WHERE + %s + AND id = @id +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "id": tcda.ID, + } + maps.Copy(args, scope.SQLArguments()) + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot delete trust center document access: %w", err) + } + + return nil +} + +func (tcdas *TrustCenterDocumentAccesses) CountByTrustCenterAccessID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, +) (int, error) { + q := ` +SELECT + COUNT(id) +FROM + trust_center_document_accesses +WHERE + %s + AND trust_center_access_id = @trust_center_access_id +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + } + maps.Copy(args, scope.SQLArguments()) + + row := conn.QueryRow(ctx, q, args) + + var count int + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("cannot scan count: %w", err) + } + + return count, nil +} + +func (tcdas *TrustCenterDocumentAccesses) LoadByTrustCenterAccessID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + cursor *page.Cursor[TrustCenterDocumentAccessOrderField], +) error { + q := ` +SELECT + id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +FROM + trust_center_document_accesses +WHERE + %s + AND trust_center_access_id = @trust_center_access_id + AND %s +` + + q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + } + maps.Copy(args, scope.SQLArguments()) + maps.Copy(args, cursor.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query trust center document accesses: %w", err) + } + + accesses, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[TrustCenterDocumentAccess]) + if err != nil { + return fmt.Errorf("cannot collect trust center document accesses: %w", err) + } + + *tcdas = accesses + + return nil +} + +func (tcdas *TrustCenterDocumentAccesses) LoadAllByTrustCenterAccessID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, +) error { + q := ` +SELECT + id, + trust_center_access_id, + document_id, + report_id, + active, + created_at, + updated_at +FROM + trust_center_document_accesses +WHERE + %s + AND trust_center_access_id = @trust_center_access_id +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + } + maps.Copy(args, scope.SQLArguments()) + + rows, err := conn.Query(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot query trust center document accesses: %w", err) + } + + accesses, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[TrustCenterDocumentAccess]) + if err != nil { + return fmt.Errorf("cannot collect trust center document accesses: %w", err) + } + + *tcdas = accesses + + return nil +} + +func DeactivateByTrustCenterAccessID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + updatedAt time.Time, +) error { + q := ` +UPDATE trust_center_document_accesses +SET active = false, updated_at = @updated_at +WHERE + %s + AND trust_center_access_id = @trust_center_access_id +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + "updated_at": updatedAt, + } + maps.Copy(args, scope.SQLArguments()) + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot deactivate trust center document accesses: %w", err) + } + + return nil +} + +func ActivateByDocumentIDs( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + documentIDs []gid.GID, + updatedAt time.Time, +) error { + if len(documentIDs) == 0 { + return nil + } + + q := ` +UPDATE trust_center_document_accesses +SET active = true, updated_at = @updated_at +WHERE + %s + AND trust_center_access_id = @trust_center_access_id + AND document_id = ANY(@document_ids) +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + "document_ids": documentIDs, + "updated_at": updatedAt, + } + maps.Copy(args, scope.SQLArguments()) + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot activate trust center document accesses by document IDs: %w", err) + } + + return nil +} + +func ActivateByReportIDs( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + reportIDs []gid.GID, + updatedAt time.Time, +) error { + if len(reportIDs) == 0 { + return nil + } + + q := ` +UPDATE trust_center_document_accesses +SET active = true, updated_at = @updated_at +WHERE + %s + AND trust_center_access_id = @trust_center_access_id + AND report_id = ANY(@report_ids) +` + + q = fmt.Sprintf(q, scope.SQLFragment()) + + args := pgx.StrictNamedArgs{ + "trust_center_access_id": trustCenterAccessID, + "report_ids": reportIDs, + "updated_at": updatedAt, + } + maps.Copy(args, scope.SQLArguments()) + + _, err := conn.Exec(ctx, q, args) + if err != nil { + return fmt.Errorf("cannot activate trust center document accesses by report IDs: %w", err) + } + + return nil +} + +func (tcdas TrustCenterDocumentAccesses) BulkInsertDocumentAccesses( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + documentIDs []gid.GID, + createdAt time.Time, +) error { + if len(documentIDs) == 0 { + return nil + } + + q := ` +WITH document_access_data AS ( + SELECT + generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id, + @tenant_id AS tenant_id, + @trust_center_access_id AS trust_center_access_id, + unnest(@document_ids::text[]) AS document_id, + null::text AS report_id, + false AS active, + @created_at::timestamptz AS created_at, + @updated_at::timestamptz AS updated_at +) +INSERT INTO trust_center_document_accesses ( + id, tenant_id, trust_center_access_id, document_id, report_id, active, created_at, updated_at +) +SELECT * FROM document_access_data +` + + args := pgx.StrictNamedArgs{ + "tenant_id": scope.GetTenantID(), + "trust_center_access_id": trustCenterAccessID, + "document_ids": documentIDs, + "trust_center_document_access_entity_type": TrustCenterDocumentAccessEntityType, + "created_at": createdAt, + "updated_at": createdAt, + } + + if _, err := conn.Exec(ctx, q, args); err != nil { + return fmt.Errorf("cannot bulk insert trust center document accesses: %w", err) + } + + return nil +} + +func (tcdas TrustCenterDocumentAccesses) BulkInsertReportAccesses( + ctx context.Context, + conn pg.Conn, + scope Scoper, + trustCenterAccessID gid.GID, + reportIDs []gid.GID, + createdAt time.Time, +) error { + if len(reportIDs) == 0 { + return nil + } + + q := ` +WITH report_access_data AS ( + SELECT + generate_gid(decode_base64_unpadded(@tenant_id), @trust_center_document_access_entity_type) AS id, + @tenant_id AS tenant_id, + @trust_center_access_id AS trust_center_access_id, + null::text AS document_id, + unnest(@report_ids::text[]) AS report_id, + false AS active, + @created_at::timestamptz AS created_at, + @updated_at::timestamptz AS updated_at +) +INSERT INTO trust_center_document_accesses ( + id, tenant_id, trust_center_access_id, document_id, report_id, active, created_at, updated_at +) +SELECT * FROM report_access_data +` + + args := pgx.StrictNamedArgs{ + "tenant_id": scope.GetTenantID(), + "trust_center_document_access_entity_type": TrustCenterDocumentAccessEntityType, + "trust_center_access_id": trustCenterAccessID, + "report_ids": reportIDs, + "created_at": createdAt, + "updated_at": createdAt, + } + + if _, err := conn.Exec(ctx, q, args); err != nil { + return fmt.Errorf("cannot bulk insert trust center report accesses: %w", err) + } + + return nil +} diff --git a/pkg/coredata/trust_center_document_access_order_field.go b/pkg/coredata/trust_center_document_access_order_field.go new file mode 100644 index 000000000..5fee72ec2 --- /dev/null +++ b/pkg/coredata/trust_center_document_access_order_field.go @@ -0,0 +1,47 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package coredata + +import ( + "fmt" +) + +type TrustCenterDocumentAccessOrderField string + +const ( + TrustCenterDocumentAccessOrderFieldCreatedAt TrustCenterDocumentAccessOrderField = "CREATED_AT" +) + +func (tcdaof TrustCenterDocumentAccessOrderField) Column() string { + return string(tcdaof) +} + +func (tcdaof TrustCenterDocumentAccessOrderField) String() string { + return string(tcdaof) +} + +func (tcdaof TrustCenterDocumentAccessOrderField) MarshalText() ([]byte, error) { + return []byte(tcdaof.String()), nil +} + +func (tcdaof *TrustCenterDocumentAccessOrderField) UnmarshalText(text []byte) error { + val := string(text) + switch val { + case string(TrustCenterDocumentAccessOrderFieldCreatedAt): + *tcdaof = TrustCenterDocumentAccessOrderField(val) + return nil + } + return fmt.Errorf("invalid TrustCenterDocumentAccessOrderField value: %q", val) +} diff --git a/pkg/probo/audit_service.go b/pkg/probo/audit_service.go index 0f28c1a66..2dd8fda83 100644 --- a/pkg/probo/audit_service.go +++ b/pkg/probo/audit_service.go @@ -83,6 +83,26 @@ func (s AuditService) Get( return audit, nil } +func (s AuditService) GetByReportID( + ctx context.Context, + reportID gid.GID, +) (*coredata.Audit, error) { + audit := &coredata.Audit{} + + err := s.svc.pg.WithConn( + ctx, + func(conn pg.Conn) error { + return audit.LoadByReportID(ctx, conn, s.svc.scope, reportID) + }, + ) + + if err != nil { + return nil, err + } + + return audit, nil +} + func (s *AuditService) Create( ctx context.Context, req *CreateAuditRequest, diff --git a/pkg/probo/trust_center_access_service.go b/pkg/probo/trust_center_access_service.go index ca4332ae8..c47819f24 100644 --- a/pkg/probo/trust_center_access_service.go +++ b/pkg/probo/trust_center_access_service.go @@ -16,7 +16,6 @@ package probo import ( "context" - "errors" "fmt" "net/mail" "net/url" @@ -40,13 +39,14 @@ type ( TrustCenterID gid.GID Email string Name string - Active bool } UpdateTrustCenterAccessRequest struct { - ID gid.GID - Name *string - Active *bool + ID gid.GID + Name *string + Active *bool + DocumentIDs []gid.GID + ReportIDs []gid.GID } DeleteTrustCenterAccessRequest struct { @@ -92,6 +92,77 @@ func (s TrustCenterAccessService) ListForTrustCenterID( return page.NewPage(accesses, cursor), nil } +func (s TrustCenterAccessService) ListDocumentAccesses( + ctx context.Context, + trustCenterAccessID gid.GID, + cursor *page.Cursor[coredata.TrustCenterDocumentAccessOrderField], +) (*page.Page[*coredata.TrustCenterDocumentAccess, coredata.TrustCenterDocumentAccessOrderField], error) { + var documentAccesses coredata.TrustCenterDocumentAccesses + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + return documentAccesses.LoadByTrustCenterAccessID(ctx, conn, s.svc.scope, trustCenterAccessID, cursor) + }) + + if err != nil { + return nil, err + } + + return page.NewPage(documentAccesses, cursor), nil +} + +func (s TrustCenterAccessService) Get( + ctx context.Context, + accessID gid.GID, +) (*coredata.TrustCenterAccess, error) { + var access coredata.TrustCenterAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + return access.LoadByID(ctx, conn, s.svc.scope, accessID) + }) + + if err != nil { + return nil, err + } + + return &access, nil +} + +func (s TrustCenterAccessService) GetDocumentAccess( + ctx context.Context, + documentAccessID gid.GID, +) (*coredata.TrustCenterDocumentAccess, error) { + var documentAccess coredata.TrustCenterDocumentAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + return documentAccess.LoadByID(ctx, conn, s.svc.scope, documentAccessID) + }) + + if err != nil { + return nil, err + } + + return &documentAccess, nil +} + +func (s TrustCenterAccessService) CountDocumentAccesses( + ctx context.Context, + trustCenterAccessID gid.GID, +) (int, error) { + var count int + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + var documentAccesses coredata.TrustCenterDocumentAccesses + var err error + count, err = documentAccesses.CountByTrustCenterAccessID(ctx, conn, s.svc.scope, trustCenterAccessID) + return err + }) + + if err != nil { + return 0, err + } + + return count, nil +} + func (s TrustCenterAccessService) ValidateToken( ctx context.Context, tokenString string, @@ -134,17 +205,36 @@ func (s TrustCenterAccessService) Create( var access *coredata.TrustCenterAccess err := s.svc.pg.WithTx(ctx, func(tx pg.Conn) error { - existingAccess := &coredata.TrustCenterAccess{} - err := existingAccess.LoadByTrustCenterIDAndEmail(ctx, tx, s.svc.scope, req.TrustCenterID, req.Email) + trustCenter := &coredata.TrustCenter{} + if err := trustCenter.LoadByID(ctx, tx, s.svc.scope, req.TrustCenterID); err != nil { + return fmt.Errorf("cannot load trust center: %w", err) + } + organizationID := trustCenter.OrganizationID - if err == nil { - if err := existingAccess.Delete(ctx, tx, s.svc.scope); err != nil { - return fmt.Errorf("cannot delete existing trust center access: %w", err) - } - } else { - var notFoundErr *coredata.ErrTrustCenterAccessNotFound - if !errors.As(err, ¬FoundErr) { - return fmt.Errorf("cannot load trust center access: %w", err) + documentIDs := []gid.GID{} + reportIDs := []gid.GID{} + + var allDocuments coredata.Documents + filter := coredata.NewDocumentTrustCenterFilter() + + if err := allDocuments.LoadAllByOrganizationID(ctx, tx, s.svc.scope, organizationID, filter); err != nil { + return fmt.Errorf("cannot list documents: %w", err) + } + + for _, doc := range allDocuments { + documentIDs = append(documentIDs, doc.ID) + } + + var allAudits coredata.Audits + auditFilter := coredata.NewAuditTrustCenterFilter() + + if err := allAudits.LoadAllByOrganizationID(ctx, tx, s.svc.scope, organizationID, auditFilter); err != nil { + return fmt.Errorf("cannot list audits: %w", err) + } + + for _, audit := range allAudits { + if audit.ReportID != nil { + reportIDs = append(reportIDs, *audit.ReportID) } } @@ -154,7 +244,7 @@ func (s TrustCenterAccessService) Create( TrustCenterID: req.TrustCenterID, Email: req.Email, Name: req.Name, - Active: req.Active, + Active: false, HasAcceptedNonDisclosureAgreement: false, CreatedAt: now, UpdatedAt: now, @@ -164,10 +254,13 @@ func (s TrustCenterAccessService) Create( return fmt.Errorf("cannot insert trust center access: %w", err) } - if req.Active { - if err := s.sendAccessEmail(ctx, tx, access); err != nil { - return fmt.Errorf("failed to send access email: %w", err) - } + var documentAccesses coredata.TrustCenterDocumentAccesses + if err := documentAccesses.BulkInsertDocumentAccesses(ctx, tx, s.svc.scope, access.ID, documentIDs, now); err != nil { + return fmt.Errorf("cannot bulk insert trust center document accesses: %w", err) + } + + if err := documentAccesses.BulkInsertReportAccesses(ctx, tx, s.svc.scope, access.ID, reportIDs, now); err != nil { + return fmt.Errorf("cannot bulk insert trust center report accesses: %w", err) } return nil @@ -212,6 +305,24 @@ func (s TrustCenterAccessService) Update( return fmt.Errorf("cannot update trust center access: %w", err) } + if req.DocumentIDs != nil || req.ReportIDs != nil { + if err := coredata.DeactivateByTrustCenterAccessID(ctx, tx, s.svc.scope, access.ID, now); err != nil { + return fmt.Errorf("cannot deactivate existing document accesses: %w", err) + } + + if req.DocumentIDs != nil { + if err := coredata.ActivateByDocumentIDs(ctx, tx, s.svc.scope, access.ID, req.DocumentIDs, now); err != nil { + return fmt.Errorf("cannot activate document accesses: %w", err) + } + } + + if req.ReportIDs != nil { + if err := coredata.ActivateByReportIDs(ctx, tx, s.svc.scope, access.ID, req.ReportIDs, now); err != nil { + return fmt.Errorf("cannot activate report accesses: %w", err) + } + } + } + if shouldSendEmail { if err := s.sendAccessEmail(ctx, tx, access); err != nil { return fmt.Errorf("failed to send access email: %w", err) @@ -307,3 +418,73 @@ func (s TrustCenterAccessService) sendTrustCenterAccessEmail( } return nil } + +func (s TrustCenterAccessService) LoadDocumentAccess( + ctx context.Context, + trustCenterID gid.GID, + email string, + documentID gid.GID, +) (*coredata.TrustCenterDocumentAccess, error) { + var documentAccess *coredata.TrustCenterDocumentAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + access := &coredata.TrustCenterAccess{} + err := access.LoadByTrustCenterIDAndEmail(ctx, conn, s.svc.scope, trustCenterID, email) + if err != nil { + return fmt.Errorf("cannot load trust center access: %w", err) + } + + if !access.Active { + return fmt.Errorf("trust center access is not active") + } + + documentAccess = &coredata.TrustCenterDocumentAccess{} + err = documentAccess.LoadByTrustCenterAccessIDAndDocumentID(ctx, conn, s.svc.scope, access.ID, documentID) + if err != nil { + return fmt.Errorf("cannot load document access: %w", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return documentAccess, nil +} + +func (s TrustCenterAccessService) LoadReportAccess( + ctx context.Context, + trustCenterID gid.GID, + email string, + reportID gid.GID, +) (*coredata.TrustCenterDocumentAccess, error) { + var reportAccess *coredata.TrustCenterDocumentAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + access := &coredata.TrustCenterAccess{} + err := access.LoadByTrustCenterIDAndEmail(ctx, conn, s.svc.scope, trustCenterID, email) + if err != nil { + return fmt.Errorf("cannot load trust center access: %w", err) + } + + if !access.Active { + return fmt.Errorf("trust center access is not active") + } + + reportAccess = &coredata.TrustCenterDocumentAccess{} + err = reportAccess.LoadByTrustCenterAccessIDAndReportID(ctx, conn, s.svc.scope, access.ID, reportID) + if err != nil { + return fmt.Errorf("cannot load report access: %w", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return reportAccess, nil +} diff --git a/pkg/server/api/console/v1/schema.graphql b/pkg/server/api/console/v1/schema.graphql index 1cfdebc7d..333735522 100644 --- a/pkg/server/api/console/v1/schema.graphql +++ b/pkg/server/api/console/v1/schema.graphql @@ -1103,6 +1103,14 @@ enum TrustCenterAccessOrderField ) } +enum TrustCenterDocumentAccessOrderField + @goModel(model: "github.com/getprobo/probo/pkg/coredata.TrustCenterDocumentAccessOrderField") { + CREATED_AT + @goEnum( + value: "github.com/getprobo/probo/pkg/coredata.TrustCenterDocumentAccessOrderFieldCreatedAt" + ) +} + enum TrustCenterReferenceOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.TrustCenterReferenceOrderField") { NAME @@ -1292,6 +1300,14 @@ input TrustCenterAccessOrder field: TrustCenterAccessOrderField! } +input TrustCenterDocumentAccessOrder + @goModel( + model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccessOrderBy" + ) { + direction: OrderDirection! + field: TrustCenterDocumentAccessOrderField! +} + input TrustCenterReferenceOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterReferenceOrderBy" @@ -2143,6 +2159,7 @@ type Report implements Node { downloadUrl: String @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! + audit: Audit @goField(forceResolver: true) } type Session { @@ -2193,6 +2210,38 @@ type TrustCenterAccess implements Node { hasAcceptedNonDisclosureAgreement: Boolean! createdAt: Datetime! updatedAt: Datetime! + + documentAccesses( + first: Int + after: CursorKey + last: Int + before: CursorKey + orderBy: TrustCenterDocumentAccessOrder + ): TrustCenterDocumentAccessConnection! @goField(forceResolver: true) +} + +type TrustCenterDocumentAccess implements Node { + id: ID! + active: Boolean! + createdAt: Datetime! + updatedAt: Datetime! + trustCenterAccess: TrustCenterAccess! @goField(forceResolver: true) + document: Document @goField(forceResolver: true) + report: Report @goField(forceResolver: true) +} + +type TrustCenterDocumentAccessConnection + @goModel( + model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccessConnection" + ) { + totalCount: Int! @goField(forceResolver: true) + edges: [TrustCenterDocumentAccessEdge!]! + pageInfo: PageInfo! +} + +type TrustCenterDocumentAccessEdge { + cursor: CursorKey! + node: TrustCenterDocumentAccess! } type TrustCenterAccessConnection { @@ -2887,6 +2936,8 @@ input UpdateTrustCenterAccessInput { id: ID! name: String active: Boolean + documentIds: [ID!] + reportIds: [ID!] } input DeleteTrustCenterAccessInput { diff --git a/pkg/server/api/console/v1/schema/schema.go b/pkg/server/api/console/v1/schema/schema.go index 6eadaad2a..475fdcf4c 100644 --- a/pkg/server/api/console/v1/schema/schema.go +++ b/pkg/server/api/console/v1/schema/schema.go @@ -83,6 +83,9 @@ type ResolverRoot interface { Task() TaskResolver TaskConnection() TaskConnectionResolver TrustCenter() TrustCenterResolver + TrustCenterAccess() TrustCenterAccessResolver + TrustCenterDocumentAccess() TrustCenterDocumentAccessResolver + TrustCenterDocumentAccessConnection() TrustCenterDocumentAccessConnectionResolver TrustCenterReference() TrustCenterReferenceResolver TrustCenterReferenceConnection() TrustCenterReferenceConnectionResolver User() UserResolver @@ -1039,6 +1042,7 @@ type ComplexityRoot struct { } Report struct { + Audit func(childComplexity int) int CreatedAt func(childComplexity int) int DownloadURL func(childComplexity int) int Filename func(childComplexity int) int @@ -1164,6 +1168,7 @@ type ComplexityRoot struct { TrustCenterAccess struct { Active func(childComplexity int) int CreatedAt func(childComplexity int) int + DocumentAccesses func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterDocumentAccessOrderField]) int Email func(childComplexity int) int HasAcceptedNonDisclosureAgreement func(childComplexity int) int ID func(childComplexity int) int @@ -1186,6 +1191,27 @@ type ComplexityRoot struct { PageInfo func(childComplexity int) int } + TrustCenterDocumentAccess struct { + Active func(childComplexity int) int + CreatedAt func(childComplexity int) int + Document func(childComplexity int) int + ID func(childComplexity int) int + Report func(childComplexity int) int + TrustCenterAccess func(childComplexity int) int + UpdatedAt func(childComplexity int) int + } + + TrustCenterDocumentAccessConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + TotalCount func(childComplexity int) int + } + + TrustCenterDocumentAccessEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + TrustCenterEdge struct { Cursor func(childComplexity int) int Node func(childComplexity int) int @@ -1788,6 +1814,8 @@ type QueryResolver interface { } type ReportResolver interface { DownloadURL(ctx context.Context, obj *types.Report) (*string, error) + + Audit(ctx context.Context, obj *types.Report) (*types.Audit, error) } type RiskResolver interface { Owner(ctx context.Context, obj *types.Risk) (*types.People, error) @@ -1824,6 +1852,17 @@ type TrustCenterResolver interface { Accesses(ctx context.Context, obj *types.TrustCenter, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterAccessOrderField]) (*types.TrustCenterAccessConnection, error) References(ctx context.Context, obj *types.TrustCenter, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterReferenceOrderField]) (*types.TrustCenterReferenceConnection, error) } +type TrustCenterAccessResolver interface { + DocumentAccesses(ctx context.Context, obj *types.TrustCenterAccess, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterDocumentAccessOrderField]) (*types.TrustCenterDocumentAccessConnection, error) +} +type TrustCenterDocumentAccessResolver interface { + TrustCenterAccess(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.TrustCenterAccess, error) + Document(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Document, error) + Report(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Report, error) +} +type TrustCenterDocumentAccessConnectionResolver interface { + TotalCount(ctx context.Context, obj *types.TrustCenterDocumentAccessConnection) (int, error) +} type TrustCenterReferenceResolver interface { LogoURL(ctx context.Context, obj *types.TrustCenterReference) (string, error) } @@ -6315,6 +6354,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.RemoveUserPayload.Success(childComplexity), true + case "Report.audit": + if e.complexity.Report.Audit == nil { + break + } + + return e.complexity.Report.Audit(childComplexity), true + case "Report.createdAt": if e.complexity.Report.CreatedAt == nil { break @@ -6915,6 +6961,18 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.TrustCenterAccess.CreatedAt(childComplexity), true + case "TrustCenterAccess.documentAccesses": + if e.complexity.TrustCenterAccess.DocumentAccesses == nil { + break + } + + args, err := ec.field_TrustCenterAccess_documentAccesses_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.TrustCenterAccess.DocumentAccesses(childComplexity, args["first"].(*int), args["after"].(*page.CursorKey), args["last"].(*int), args["before"].(*page.CursorKey), args["orderBy"].(*types.OrderBy[coredata.TrustCenterDocumentAccessOrderField])), true + case "TrustCenterAccess.email": if e.complexity.TrustCenterAccess.Email == nil { break @@ -6992,6 +7050,90 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.TrustCenterConnection.PageInfo(childComplexity), true + case "TrustCenterDocumentAccess.active": + if e.complexity.TrustCenterDocumentAccess.Active == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.Active(childComplexity), true + + case "TrustCenterDocumentAccess.createdAt": + if e.complexity.TrustCenterDocumentAccess.CreatedAt == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.CreatedAt(childComplexity), true + + case "TrustCenterDocumentAccess.document": + if e.complexity.TrustCenterDocumentAccess.Document == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.Document(childComplexity), true + + case "TrustCenterDocumentAccess.id": + if e.complexity.TrustCenterDocumentAccess.ID == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.ID(childComplexity), true + + case "TrustCenterDocumentAccess.report": + if e.complexity.TrustCenterDocumentAccess.Report == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.Report(childComplexity), true + + case "TrustCenterDocumentAccess.trustCenterAccess": + if e.complexity.TrustCenterDocumentAccess.TrustCenterAccess == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.TrustCenterAccess(childComplexity), true + + case "TrustCenterDocumentAccess.updatedAt": + if e.complexity.TrustCenterDocumentAccess.UpdatedAt == nil { + break + } + + return e.complexity.TrustCenterDocumentAccess.UpdatedAt(childComplexity), true + + case "TrustCenterDocumentAccessConnection.edges": + if e.complexity.TrustCenterDocumentAccessConnection.Edges == nil { + break + } + + return e.complexity.TrustCenterDocumentAccessConnection.Edges(childComplexity), true + + case "TrustCenterDocumentAccessConnection.pageInfo": + if e.complexity.TrustCenterDocumentAccessConnection.PageInfo == nil { + break + } + + return e.complexity.TrustCenterDocumentAccessConnection.PageInfo(childComplexity), true + + case "TrustCenterDocumentAccessConnection.totalCount": + if e.complexity.TrustCenterDocumentAccessConnection.TotalCount == nil { + break + } + + return e.complexity.TrustCenterDocumentAccessConnection.TotalCount(childComplexity), true + + case "TrustCenterDocumentAccessEdge.cursor": + if e.complexity.TrustCenterDocumentAccessEdge.Cursor == nil { + break + } + + return e.complexity.TrustCenterDocumentAccessEdge.Cursor(childComplexity), true + + case "TrustCenterDocumentAccessEdge.node": + if e.complexity.TrustCenterDocumentAccessEdge.Node == nil { + break + } + + return e.complexity.TrustCenterDocumentAccessEdge.Node(childComplexity), true + case "TrustCenterEdge.cursor": if e.complexity.TrustCenterEdge.Cursor == nil { break @@ -8271,6 +8413,7 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec.unmarshalInputSnapshotOrder, ec.unmarshalInputTaskOrder, ec.unmarshalInputTrustCenterAccessOrder, + ec.unmarshalInputTrustCenterDocumentAccessOrder, ec.unmarshalInputTrustCenterReferenceOrder, ec.unmarshalInputUnassignTaskInput, ec.unmarshalInputUpdateAssetInput, @@ -9513,6 +9656,14 @@ enum TrustCenterAccessOrderField ) } +enum TrustCenterDocumentAccessOrderField + @goModel(model: "github.com/getprobo/probo/pkg/coredata.TrustCenterDocumentAccessOrderField") { + CREATED_AT + @goEnum( + value: "github.com/getprobo/probo/pkg/coredata.TrustCenterDocumentAccessOrderFieldCreatedAt" + ) +} + enum TrustCenterReferenceOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.TrustCenterReferenceOrderField") { NAME @@ -9702,6 +9853,14 @@ input TrustCenterAccessOrder field: TrustCenterAccessOrderField! } +input TrustCenterDocumentAccessOrder + @goModel( + model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccessOrderBy" + ) { + direction: OrderDirection! + field: TrustCenterDocumentAccessOrderField! +} + input TrustCenterReferenceOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterReferenceOrderBy" @@ -10553,6 +10712,7 @@ type Report implements Node { downloadUrl: String @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! + audit: Audit @goField(forceResolver: true) } type Session { @@ -10603,6 +10763,38 @@ type TrustCenterAccess implements Node { hasAcceptedNonDisclosureAgreement: Boolean! createdAt: Datetime! updatedAt: Datetime! + + documentAccesses( + first: Int + after: CursorKey + last: Int + before: CursorKey + orderBy: TrustCenterDocumentAccessOrder + ): TrustCenterDocumentAccessConnection! @goField(forceResolver: true) +} + +type TrustCenterDocumentAccess implements Node { + id: ID! + active: Boolean! + createdAt: Datetime! + updatedAt: Datetime! + trustCenterAccess: TrustCenterAccess! @goField(forceResolver: true) + document: Document @goField(forceResolver: true) + report: Report @goField(forceResolver: true) +} + +type TrustCenterDocumentAccessConnection + @goModel( + model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TrustCenterDocumentAccessConnection" + ) { + totalCount: Int! @goField(forceResolver: true) + edges: [TrustCenterDocumentAccessEdge!]! + pageInfo: PageInfo! +} + +type TrustCenterDocumentAccessEdge { + cursor: CursorKey! + node: TrustCenterDocumentAccess! } type TrustCenterAccessConnection { @@ -11297,6 +11489,8 @@ input UpdateTrustCenterAccessInput { id: ID! name: String active: Boolean + documentIds: [ID!] + reportIds: [ID!] } input DeleteTrustCenterAccessInput { @@ -19652,6 +19846,101 @@ func (ec *executionContext) field_Task_evidences_argsOrderBy( return zeroVal, nil } +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_TrustCenterAccess_documentAccesses_argsFirst(ctx, rawArgs) + if err != nil { + return nil, err + } + args["first"] = arg0 + arg1, err := ec.field_TrustCenterAccess_documentAccesses_argsAfter(ctx, rawArgs) + if err != nil { + return nil, err + } + args["after"] = arg1 + arg2, err := ec.field_TrustCenterAccess_documentAccesses_argsLast(ctx, rawArgs) + if err != nil { + return nil, err + } + args["last"] = arg2 + arg3, err := ec.field_TrustCenterAccess_documentAccesses_argsBefore(ctx, rawArgs) + if err != nil { + return nil, err + } + args["before"] = arg3 + arg4, err := ec.field_TrustCenterAccess_documentAccesses_argsOrderBy(ctx, rawArgs) + if err != nil { + return nil, err + } + args["orderBy"] = arg4 + return args, nil +} +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_argsFirst( + ctx context.Context, + rawArgs map[string]any, +) (*int, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("first")) + if tmp, ok := rawArgs["first"]; ok { + return ec.unmarshalOInt2ᚖint(ctx, tmp) + } + + var zeroVal *int + return zeroVal, nil +} + +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_argsAfter( + ctx context.Context, + rawArgs map[string]any, +) (*page.CursorKey, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("after")) + if tmp, ok := rawArgs["after"]; ok { + return ec.unmarshalOCursorKey2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋpageᚐCursorKey(ctx, tmp) + } + + var zeroVal *page.CursorKey + return zeroVal, nil +} + +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_argsLast( + ctx context.Context, + rawArgs map[string]any, +) (*int, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("last")) + if tmp, ok := rawArgs["last"]; ok { + return ec.unmarshalOInt2ᚖint(ctx, tmp) + } + + var zeroVal *int + return zeroVal, nil +} + +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_argsBefore( + ctx context.Context, + rawArgs map[string]any, +) (*page.CursorKey, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("before")) + if tmp, ok := rawArgs["before"]; ok { + return ec.unmarshalOCursorKey2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋpageᚐCursorKey(ctx, tmp) + } + + var zeroVal *page.CursorKey + return zeroVal, nil +} + +func (ec *executionContext) field_TrustCenterAccess_documentAccesses_argsOrderBy( + ctx context.Context, + rawArgs map[string]any, +) (*types.OrderBy[coredata.TrustCenterDocumentAccessOrderField], error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("orderBy")) + if tmp, ok := rawArgs["orderBy"]; ok { + return ec.unmarshalOTrustCenterDocumentAccessOrder2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐOrderBy(ctx, tmp) + } + + var zeroVal *types.OrderBy[coredata.TrustCenterDocumentAccessOrderField] + return zeroVal, nil +} + func (ec *executionContext) field_TrustCenter_accesses_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -21903,6 +22192,8 @@ func (ec *executionContext) fieldContext_Audit_report(_ context.Context, field g return ec.fieldContext_Report_createdAt(ctx, field) case "updatedAt": return ec.fieldContext_Report_updatedAt(ctx, field) + case "audit": + return ec.fieldContext_Report_audit(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Report", field.Name) }, @@ -48326,6 +48617,75 @@ func (ec *executionContext) fieldContext_Report_updatedAt(_ context.Context, fie return fc, nil } +func (ec *executionContext) _Report_audit(ctx context.Context, field graphql.CollectedField, obj *types.Report) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Report_audit(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Report().Audit(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*types.Audit) + fc.Result = res + return ec.marshalOAudit2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐAudit(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Report_audit(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Report", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Audit_id(ctx, field) + case "name": + return ec.fieldContext_Audit_name(ctx, field) + case "organization": + return ec.fieldContext_Audit_organization(ctx, field) + case "framework": + return ec.fieldContext_Audit_framework(ctx, field) + case "validFrom": + return ec.fieldContext_Audit_validFrom(ctx, field) + case "validUntil": + return ec.fieldContext_Audit_validUntil(ctx, field) + case "report": + return ec.fieldContext_Audit_report(ctx, field) + case "reportUrl": + return ec.fieldContext_Audit_reportUrl(ctx, field) + case "state": + return ec.fieldContext_Audit_state(ctx, field) + case "controls": + return ec.fieldContext_Audit_controls(ctx, field) + case "showOnTrustCenter": + return ec.fieldContext_Audit_showOnTrustCenter(ctx, field) + case "createdAt": + return ec.fieldContext_Audit_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Audit_updatedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Audit", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _RequestEvidencePayload_evidenceEdge(ctx context.Context, field graphql.CollectedField, obj *types.RequestEvidencePayload) (ret graphql.Marshaler) { fc, err := ec.fieldContext_RequestEvidencePayload_evidenceEdge(ctx, field) if err != nil { @@ -52283,6 +52643,69 @@ func (ec *executionContext) fieldContext_TrustCenterAccess_updatedAt(_ context.C return fc, nil } +func (ec *executionContext) _TrustCenterAccess_documentAccesses(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterAccess_documentAccesses(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TrustCenterAccess().DocumentAccesses(rctx, obj, fc.Args["first"].(*int), fc.Args["after"].(*page.CursorKey), fc.Args["last"].(*int), fc.Args["before"].(*page.CursorKey), fc.Args["orderBy"].(*types.OrderBy[coredata.TrustCenterDocumentAccessOrderField])) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.TrustCenterDocumentAccessConnection) + fc.Result = res + return ec.marshalNTrustCenterDocumentAccessConnection2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterAccess_documentAccesses(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterAccess", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "totalCount": + return ec.fieldContext_TrustCenterDocumentAccessConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_TrustCenterDocumentAccessConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_TrustCenterDocumentAccessConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TrustCenterDocumentAccessConnection", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_TrustCenterAccess_documentAccesses_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _TrustCenterAccessConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterAccessConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_TrustCenterAccessConnection_edges(ctx, field) if err != nil { @@ -52484,6 +52907,8 @@ func (ec *executionContext) fieldContext_TrustCenterAccessEdge_node(_ context.Co return ec.fieldContext_TrustCenterAccess_createdAt(ctx, field) case "updatedAt": return ec.fieldContext_TrustCenterAccess_updatedAt(ctx, field) + case "documentAccesses": + return ec.fieldContext_TrustCenterAccess_documentAccesses(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type TrustCenterAccess", field.Name) }, @@ -52595,6 +53020,624 @@ func (ec *executionContext) fieldContext_TrustCenterConnection_pageInfo(_ contex return fc, nil } +func (ec *executionContext) _TrustCenterDocumentAccess_id(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_id(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(gid.GID) + fc.Result = res + return ec.marshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_id(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_active(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_active(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Active, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_active(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_createdAt(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_createdAt(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.CreatedAt, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(time.Time) + fc.Result = res + return ec.marshalNDatetime2timeᚐTime(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_createdAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Datetime does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_updatedAt(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_updatedAt(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.UpdatedAt, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(time.Time) + fc.Result = res + return ec.marshalNDatetime2timeᚐTime(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_updatedAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Datetime does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_trustCenterAccess(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_trustCenterAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TrustCenterDocumentAccess().TrustCenterAccess(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.TrustCenterAccess) + fc.Result = res + return ec.marshalNTrustCenterAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterAccess(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_trustCenterAccess(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_TrustCenterAccess_id(ctx, field) + case "email": + return ec.fieldContext_TrustCenterAccess_email(ctx, field) + case "name": + return ec.fieldContext_TrustCenterAccess_name(ctx, field) + case "active": + return ec.fieldContext_TrustCenterAccess_active(ctx, field) + case "hasAcceptedNonDisclosureAgreement": + return ec.fieldContext_TrustCenterAccess_hasAcceptedNonDisclosureAgreement(ctx, field) + case "createdAt": + return ec.fieldContext_TrustCenterAccess_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_TrustCenterAccess_updatedAt(ctx, field) + case "documentAccesses": + return ec.fieldContext_TrustCenterAccess_documentAccesses(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TrustCenterAccess", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_document(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_document(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TrustCenterDocumentAccess().Document(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*types.Document) + fc.Result = res + return ec.marshalODocument2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐDocument(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_document(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Document_id(ctx, field) + case "title": + return ec.fieldContext_Document_title(ctx, field) + case "description": + return ec.fieldContext_Document_description(ctx, field) + case "documentType": + return ec.fieldContext_Document_documentType(ctx, field) + case "currentPublishedVersion": + return ec.fieldContext_Document_currentPublishedVersion(ctx, field) + case "showOnTrustCenter": + return ec.fieldContext_Document_showOnTrustCenter(ctx, field) + case "owner": + return ec.fieldContext_Document_owner(ctx, field) + case "organization": + return ec.fieldContext_Document_organization(ctx, field) + case "versions": + return ec.fieldContext_Document_versions(ctx, field) + case "controls": + return ec.fieldContext_Document_controls(ctx, field) + case "createdAt": + return ec.fieldContext_Document_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Document_updatedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Document", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccess_report(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccess) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccess_report(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TrustCenterDocumentAccess().Report(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*types.Report) + fc.Result = res + return ec.marshalOReport2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐReport(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_report(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccess", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Report_id(ctx, field) + case "objectKey": + return ec.fieldContext_Report_objectKey(ctx, field) + case "mimeType": + return ec.fieldContext_Report_mimeType(ctx, field) + case "filename": + return ec.fieldContext_Report_filename(ctx, field) + case "size": + return ec.fieldContext_Report_size(ctx, field) + case "downloadUrl": + return ec.fieldContext_Report_downloadUrl(ctx, field) + case "createdAt": + return ec.fieldContext_Report_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Report_updatedAt(ctx, field) + case "audit": + return ec.fieldContext_Report_audit(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Report", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccessConnection_totalCount(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccessConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccessConnection_totalCount(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TrustCenterDocumentAccessConnection().TotalCount(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccessConnection_totalCount(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccessConnection", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccessConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccessConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccessConnection_edges(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]*types.TrustCenterDocumentAccessEdge) + fc.Result = res + return ec.marshalNTrustCenterDocumentAccessEdge2ᚕᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessEdgeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccessConnection_edges(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccessConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "cursor": + return ec.fieldContext_TrustCenterDocumentAccessEdge_cursor(ctx, field) + case "node": + return ec.fieldContext_TrustCenterDocumentAccessEdge_node(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TrustCenterDocumentAccessEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccessConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccessConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccessConnection_pageInfo(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(types.PageInfo) + fc.Result = res + return ec.marshalNPageInfo2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccessConnection_pageInfo(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccessConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "hasNextPage": + return ec.fieldContext_PageInfo_hasNextPage(ctx, field) + case "hasPreviousPage": + return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) + case "startCursor": + return ec.fieldContext_PageInfo_startCursor(ctx, field) + case "endCursor": + return ec.fieldContext_PageInfo_endCursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccessEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccessEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccessEdge_cursor(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(page.CursorKey) + fc.Result = res + return ec.marshalNCursorKey2githubᚗcomᚋgetproboᚋproboᚋpkgᚋpageᚐCursorKey(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccessEdge_cursor(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccessEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type CursorKey does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TrustCenterDocumentAccessEdge_node(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterDocumentAccessEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TrustCenterDocumentAccessEdge_node(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Node, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.TrustCenterDocumentAccess) + fc.Result = res + return ec.marshalNTrustCenterDocumentAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccess(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TrustCenterDocumentAccessEdge_node(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TrustCenterDocumentAccessEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_TrustCenterDocumentAccess_id(ctx, field) + case "active": + return ec.fieldContext_TrustCenterDocumentAccess_active(ctx, field) + case "createdAt": + return ec.fieldContext_TrustCenterDocumentAccess_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_TrustCenterDocumentAccess_updatedAt(ctx, field) + case "trustCenterAccess": + return ec.fieldContext_TrustCenterDocumentAccess_trustCenterAccess(ctx, field) + case "document": + return ec.fieldContext_TrustCenterDocumentAccess_document(ctx, field) + case "report": + return ec.fieldContext_TrustCenterDocumentAccess_report(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TrustCenterDocumentAccess", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _TrustCenterEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenterEdge) (ret graphql.Marshaler) { fc, err := ec.fieldContext_TrustCenterEdge_cursor(ctx, field) if err != nil { @@ -54572,6 +55615,8 @@ func (ec *executionContext) fieldContext_UpdateTrustCenterAccessPayload_trustCen return ec.fieldContext_TrustCenterAccess_createdAt(ctx, field) case "updatedAt": return ec.fieldContext_TrustCenterAccess_updatedAt(ctx, field) + case "documentAccesses": + return ec.fieldContext_TrustCenterAccess_documentAccesses(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type TrustCenterAccess", field.Name) }, @@ -67927,6 +68972,40 @@ func (ec *executionContext) unmarshalInputTrustCenterAccessOrder(ctx context.Con return it, nil } +func (ec *executionContext) unmarshalInputTrustCenterDocumentAccessOrder(ctx context.Context, obj any) (types.OrderBy[coredata.TrustCenterDocumentAccessOrderField], error) { + var it types.OrderBy[coredata.TrustCenterDocumentAccessOrderField] + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"direction", "field"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "direction": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("direction")) + data, err := ec.unmarshalNOrderDirection2githubᚗcomᚋgetproboᚋproboᚋpkgᚋpageᚐOrderDirection(ctx, v) + if err != nil { + return it, err + } + it.Direction = data + case "field": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("field")) + data, err := ec.unmarshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField(ctx, v) + if err != nil { + return it, err + } + it.Field = data + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputTrustCenterReferenceOrder(ctx context.Context, obj any) (types.OrderBy[coredata.TrustCenterReferenceOrderField], error) { var it types.OrderBy[coredata.TrustCenterReferenceOrderField] asMap := map[string]any{} @@ -69141,7 +70220,7 @@ func (ec *executionContext) unmarshalInputUpdateTrustCenterAccessInput(ctx conte asMap[k] = v } - fieldsInOrder := [...]string{"id", "name", "active"} + fieldsInOrder := [...]string{"id", "name", "active", "documentIds", "reportIds"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -69169,6 +70248,20 @@ func (ec *executionContext) unmarshalInputUpdateTrustCenterAccessInput(ctx conte return it, err } it.Active = data + case "documentIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("documentIds")) + data, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGIDᚄ(ctx, v) + if err != nil { + return it, err + } + it.DocumentIds = data + case "reportIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("reportIds")) + data, err := ec.unmarshalOID2ᚕgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGIDᚄ(ctx, v) + if err != nil { + return it, err + } + it.ReportIds = data } } @@ -70240,6 +71333,13 @@ func (ec *executionContext) _Node(ctx context.Context, sel ast.SelectionSet, obj return graphql.Null } return ec._TrustCenterReference(ctx, sel, obj) + case types.TrustCenterDocumentAccess: + return ec._TrustCenterDocumentAccess(ctx, sel, &obj) + case *types.TrustCenterDocumentAccess: + if obj == nil { + return graphql.Null + } + return ec._TrustCenterDocumentAccess(ctx, sel, obj) case types.TrustCenterAccess: return ec._TrustCenterAccess(ctx, sel, &obj) case *types.TrustCenterAccess: @@ -80278,6 +81378,39 @@ func (ec *executionContext) _Report(ctx context.Context, sel ast.SelectionSet, o if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "audit": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Report_audit(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -81703,38 +82836,74 @@ func (ec *executionContext) _TrustCenterAccess(ctx context.Context, sel ast.Sele case "id": out.Values[i] = ec._TrustCenterAccess_id(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "email": out.Values[i] = ec._TrustCenterAccess_email(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "name": out.Values[i] = ec._TrustCenterAccess_name(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "active": out.Values[i] = ec._TrustCenterAccess_active(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "hasAcceptedNonDisclosureAgreement": out.Values[i] = ec._TrustCenterAccess_hasAcceptedNonDisclosureAgreement(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "createdAt": out.Values[i] = ec._TrustCenterAccess_createdAt(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "updatedAt": out.Values[i] = ec._TrustCenterAccess_updatedAt(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } + case "documentAccesses": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TrustCenterAccess_documentAccesses(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -81890,6 +83059,286 @@ func (ec *executionContext) _TrustCenterConnection(ctx context.Context, sel ast. return out } +var trustCenterDocumentAccessImplementors = []string{"TrustCenterDocumentAccess", "Node"} + +func (ec *executionContext) _TrustCenterDocumentAccess(ctx context.Context, sel ast.SelectionSet, obj *types.TrustCenterDocumentAccess) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, trustCenterDocumentAccessImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TrustCenterDocumentAccess") + case "id": + out.Values[i] = ec._TrustCenterDocumentAccess_id(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "active": + out.Values[i] = ec._TrustCenterDocumentAccess_active(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "createdAt": + out.Values[i] = ec._TrustCenterDocumentAccess_createdAt(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "updatedAt": + out.Values[i] = ec._TrustCenterDocumentAccess_updatedAt(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "trustCenterAccess": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TrustCenterDocumentAccess_trustCenterAccess(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "document": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TrustCenterDocumentAccess_document(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "report": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TrustCenterDocumentAccess_report(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var trustCenterDocumentAccessConnectionImplementors = []string{"TrustCenterDocumentAccessConnection"} + +func (ec *executionContext) _TrustCenterDocumentAccessConnection(ctx context.Context, sel ast.SelectionSet, obj *types.TrustCenterDocumentAccessConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, trustCenterDocumentAccessConnectionImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TrustCenterDocumentAccessConnection") + case "totalCount": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TrustCenterDocumentAccessConnection_totalCount(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "edges": + out.Values[i] = ec._TrustCenterDocumentAccessConnection_edges(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "pageInfo": + out.Values[i] = ec._TrustCenterDocumentAccessConnection_pageInfo(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var trustCenterDocumentAccessEdgeImplementors = []string{"TrustCenterDocumentAccessEdge"} + +func (ec *executionContext) _TrustCenterDocumentAccessEdge(ctx context.Context, sel ast.SelectionSet, obj *types.TrustCenterDocumentAccessEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, trustCenterDocumentAccessEdgeImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TrustCenterDocumentAccessEdge") + case "cursor": + out.Values[i] = ec._TrustCenterDocumentAccessEdge_cursor(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "node": + out.Values[i] = ec._TrustCenterDocumentAccessEdge_node(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var trustCenterEdgeImplementors = []string{"TrustCenterEdge"} func (ec *executionContext) _TrustCenterEdge(ctx context.Context, sel ast.SelectionSet, obj *types.TrustCenterEdge) graphql.Marshaler { @@ -91466,6 +92915,10 @@ func (ec *executionContext) marshalNTrustCenter2ᚖgithubᚗcomᚋgetproboᚋpro return ec._TrustCenter(ctx, sel, v) } +func (ec *executionContext) marshalNTrustCenterAccess2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterAccess(ctx context.Context, sel ast.SelectionSet, v types.TrustCenterAccess) graphql.Marshaler { + return ec._TrustCenterAccess(ctx, sel, &v) +} + func (ec *executionContext) marshalNTrustCenterAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterAccess(ctx context.Context, sel ast.SelectionSet, v *types.TrustCenterAccess) graphql.Marshaler { if v == nil { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { @@ -91570,6 +93023,110 @@ var ( } ) +func (ec *executionContext) marshalNTrustCenterDocumentAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccess(ctx context.Context, sel ast.SelectionSet, v *types.TrustCenterDocumentAccess) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TrustCenterDocumentAccess(ctx, sel, v) +} + +func (ec *executionContext) marshalNTrustCenterDocumentAccessConnection2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessConnection(ctx context.Context, sel ast.SelectionSet, v types.TrustCenterDocumentAccessConnection) graphql.Marshaler { + return ec._TrustCenterDocumentAccessConnection(ctx, sel, &v) +} + +func (ec *executionContext) marshalNTrustCenterDocumentAccessConnection2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessConnection(ctx context.Context, sel ast.SelectionSet, v *types.TrustCenterDocumentAccessConnection) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TrustCenterDocumentAccessConnection(ctx, sel, v) +} + +func (ec *executionContext) marshalNTrustCenterDocumentAccessEdge2ᚕᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*types.TrustCenterDocumentAccessEdge) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalNTrustCenterDocumentAccessEdge2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNTrustCenterDocumentAccessEdge2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterDocumentAccessEdge(ctx context.Context, sel ast.SelectionSet, v *types.TrustCenterDocumentAccessEdge) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TrustCenterDocumentAccessEdge(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField(ctx context.Context, v any) (coredata.TrustCenterDocumentAccessOrderField, error) { + tmp, err := graphql.UnmarshalString(v) + res := unmarshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField[tmp] + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField(ctx context.Context, sel ast.SelectionSet, v coredata.TrustCenterDocumentAccessOrderField) graphql.Marshaler { + _ = sel + res := graphql.MarshalString(marshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField[v]) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +var ( + unmarshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField = map[string]coredata.TrustCenterDocumentAccessOrderField{ + "CREATED_AT": coredata.TrustCenterDocumentAccessOrderFieldCreatedAt, + } + marshalNTrustCenterDocumentAccessOrderField2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterDocumentAccessOrderField = map[coredata.TrustCenterDocumentAccessOrderField]string{ + coredata.TrustCenterDocumentAccessOrderFieldCreatedAt: "CREATED_AT", + } +) + func (ec *executionContext) marshalNTrustCenterEdge2ᚕᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐTrustCenterEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*types.TrustCenterEdge) graphql.Marshaler { ret := make(graphql.Array, len(v)) var wg sync.WaitGroup @@ -93399,6 +94956,13 @@ var ( } ) +func (ec *executionContext) marshalOAudit2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐAudit(ctx context.Context, sel ast.SelectionSet, v *types.Audit) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._Audit(ctx, sel, v) +} + func (ec *executionContext) unmarshalOAuditOrder2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐAuditOrderBy(ctx context.Context, v any) (*types.AuditOrderBy, error) { if v == nil { return nil, nil @@ -94293,6 +95857,13 @@ func (ec *executionContext) unmarshalODatumOrder2ᚖgithubᚗcomᚋgetproboᚋpr return &res, graphql.ErrorOnPath(ctx, err) } +func (ec *executionContext) marshalODocument2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐDocument(ctx context.Context, sel ast.SelectionSet, v *types.Document) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._Document(ctx, sel, v) +} + func (ec *executionContext) unmarshalODocumentFilter2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐDocumentFilter(ctx context.Context, v any) (*types.DocumentFilter, error) { if v == nil { return nil, nil @@ -95088,6 +96659,14 @@ func (ec *executionContext) unmarshalOTrustCenterAccessOrder2ᚖgithubᚗcomᚋg return &res, graphql.ErrorOnPath(ctx, err) } +func (ec *executionContext) unmarshalOTrustCenterDocumentAccessOrder2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐOrderBy(ctx context.Context, v any) (*types.OrderBy[coredata.TrustCenterDocumentAccessOrderField], error) { + if v == nil { + return nil, nil + } + res, err := ec.unmarshalInputTrustCenterDocumentAccessOrder(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) +} + func (ec *executionContext) unmarshalOTrustCenterReferenceOrder2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐOrderBy(ctx context.Context, v any) (*types.OrderBy[coredata.TrustCenterReferenceOrderField], error) { if v == nil { return nil, nil diff --git a/pkg/server/api/console/v1/types/trust_center_document_access.go b/pkg/server/api/console/v1/types/trust_center_document_access.go new file mode 100644 index 000000000..9bddcc4a3 --- /dev/null +++ b/pkg/server/api/console/v1/types/trust_center_document_access.go @@ -0,0 +1,80 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package types + +import ( + "github.com/getprobo/probo/pkg/coredata" + "github.com/getprobo/probo/pkg/gid" + "github.com/getprobo/probo/pkg/page" +) + +type ( + TrustCenterDocumentAccessOrderBy = OrderBy[coredata.TrustCenterDocumentAccessOrderField] + + TrustCenterDocumentAccessConnection struct { + TotalCount int + Edges []*TrustCenterDocumentAccessEdge + PageInfo PageInfo + + Resolver any + ParentID gid.GID + } +) + +func NewTrustCenterDocumentAccess(tcda *coredata.TrustCenterDocumentAccess) *TrustCenterDocumentAccess { + return &TrustCenterDocumentAccess{ + ID: tcda.ID, + Active: tcda.Active, + CreatedAt: tcda.CreatedAt, + UpdatedAt: tcda.UpdatedAt, + } +} + +func NewTrustCenterDocumentAccessConnection( + p *page.Page[*coredata.TrustCenterDocumentAccess, coredata.TrustCenterDocumentAccessOrderField], + parentType any, + parentID gid.GID, +) *TrustCenterDocumentAccessConnection { + var edges = make([]*TrustCenterDocumentAccessEdge, len(p.Data)) + + for i := range edges { + edges[i] = NewTrustCenterDocumentAccessEdge(p.Data[i], p.Cursor.OrderBy.Field) + } + + return &TrustCenterDocumentAccessConnection{ + Edges: edges, + PageInfo: *NewPageInfo(p), + + Resolver: parentType, + ParentID: parentID, + } +} + +func NewTrustCenterDocumentAccessEdges(accesses []*coredata.TrustCenterDocumentAccess, orderBy coredata.TrustCenterDocumentAccessOrderField) []*TrustCenterDocumentAccessEdge { + edges := make([]*TrustCenterDocumentAccessEdge, len(accesses)) + + for i := range edges { + edges[i] = NewTrustCenterDocumentAccessEdge(accesses[i], orderBy) + } + + return edges +} + +func NewTrustCenterDocumentAccessEdge(access *coredata.TrustCenterDocumentAccess, orderBy coredata.TrustCenterDocumentAccessOrderField) *TrustCenterDocumentAccessEdge { + return &TrustCenterDocumentAccessEdge{ + Cursor: access.CursorKey(orderBy), + Node: NewTrustCenterDocumentAccess(access), + } +} diff --git a/pkg/server/api/console/v1/types/types.go b/pkg/server/api/console/v1/types/types.go index 3ab20d20d..8014053e5 100644 --- a/pkg/server/api/console/v1/types/types.go +++ b/pkg/server/api/console/v1/types/types.go @@ -1388,6 +1388,7 @@ type Report struct { DownloadURL *string `json:"downloadUrl,omitempty"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` + Audit *Audit `json:"audit,omitempty"` } func (Report) IsNode() {} @@ -1521,13 +1522,14 @@ func (TrustCenter) IsNode() {} func (this TrustCenter) GetID() gid.GID { return this.ID } type TrustCenterAccess struct { - ID gid.GID `json:"id"` - Email string `json:"email"` - Name string `json:"name"` - Active bool `json:"active"` - HasAcceptedNonDisclosureAgreement bool `json:"hasAcceptedNonDisclosureAgreement"` - CreatedAt time.Time `json:"createdAt"` - UpdatedAt time.Time `json:"updatedAt"` + ID gid.GID `json:"id"` + Email string `json:"email"` + Name string `json:"name"` + Active bool `json:"active"` + HasAcceptedNonDisclosureAgreement bool `json:"hasAcceptedNonDisclosureAgreement"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + DocumentAccesses *TrustCenterDocumentAccessConnection `json:"documentAccesses"` } func (TrustCenterAccess) IsNode() {} @@ -1548,6 +1550,24 @@ type TrustCenterConnection struct { PageInfo *PageInfo `json:"pageInfo"` } +type TrustCenterDocumentAccess struct { + ID gid.GID `json:"id"` + Active bool `json:"active"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + TrustCenterAccess *TrustCenterAccess `json:"trustCenterAccess"` + Document *Document `json:"document,omitempty"` + Report *Report `json:"report,omitempty"` +} + +func (TrustCenterDocumentAccess) IsNode() {} +func (this TrustCenterDocumentAccess) GetID() gid.GID { return this.ID } + +type TrustCenterDocumentAccessEdge struct { + Cursor page.CursorKey `json:"cursor"` + Node *TrustCenterDocumentAccess `json:"node"` +} + type TrustCenterEdge struct { Cursor page.CursorKey `json:"cursor"` Node *TrustCenter `json:"node"` @@ -1810,9 +1830,11 @@ type UpdateTaskPayload struct { } type UpdateTrustCenterAccessInput struct { - ID gid.GID `json:"id"` - Name *string `json:"name,omitempty"` - Active *bool `json:"active,omitempty"` + ID gid.GID `json:"id"` + Name *string `json:"name,omitempty"` + Active *bool `json:"active,omitempty"` + DocumentIds []gid.GID `json:"documentIds,omitempty"` + ReportIds []gid.GID `json:"reportIds,omitempty"` } type UpdateTrustCenterAccessPayload struct { diff --git a/pkg/server/api/console/v1/v1_resolver.go b/pkg/server/api/console/v1/v1_resolver.go index 16d7434f5..dbdedd241 100644 --- a/pkg/server/api/console/v1/v1_resolver.go +++ b/pkg/server/api/console/v1/v1_resolver.go @@ -1167,7 +1167,6 @@ func (r *mutationResolver) CreateTrustCenterAccess(ctx context.Context, input ty TrustCenterID: input.TrustCenterID, Email: input.Email, Name: input.Name, - Active: input.Active, }) if err != nil { return nil, fmt.Errorf("cannot create trust center access: %w", err) @@ -1183,9 +1182,11 @@ func (r *mutationResolver) UpdateTrustCenterAccess(ctx context.Context, input ty prb := r.ProboService(ctx, input.ID.TenantID()) access, err := prb.TrustCenterAccesses.Update(ctx, &probo.UpdateTrustCenterAccessRequest{ - ID: input.ID, - Name: input.Name, - Active: input.Active, + ID: input.ID, + Name: input.Name, + Active: input.Active, + DocumentIDs: input.DocumentIds, + ReportIDs: input.ReportIds, }) if err != nil { panic(fmt.Errorf("cannot update trust center access: %w", err)) @@ -4279,6 +4280,18 @@ func (r *reportResolver) DownloadURL(ctx context.Context, obj *types.Report) (*s return url, nil } +// Audit is the resolver for the audit field. +func (r *reportResolver) Audit(ctx context.Context, obj *types.Report) (*types.Audit, error) { + prb := r.ProboService(ctx, obj.ID.TenantID()) + + audit, err := prb.Audits.GetByReportID(ctx, obj.ID) + if err != nil { + return nil, fmt.Errorf("cannot load audit for report: %w", err) + } + + return types.NewAudit(audit), nil +} + // Owner is the resolver for the owner field. func (r *riskResolver) Owner(ctx context.Context, obj *types.Risk) (*types.People, error) { prb := r.ProboService(ctx, obj.ID.TenantID()) @@ -4696,6 +4709,91 @@ func (r *trustCenterResolver) References(ctx context.Context, obj *types.TrustCe return types.NewTrustCenterReferenceConnection(result, obj.ID), nil } +// DocumentAccesses is the resolver for the documentAccesses field. +func (r *trustCenterAccessResolver) DocumentAccesses(ctx context.Context, obj *types.TrustCenterAccess, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.OrderBy[coredata.TrustCenterDocumentAccessOrderField]) (*types.TrustCenterDocumentAccessConnection, error) { + prb := r.ProboService(ctx, obj.ID.TenantID()) + + pageOrderBy := page.OrderBy[coredata.TrustCenterDocumentAccessOrderField]{ + Field: coredata.TrustCenterDocumentAccessOrderFieldCreatedAt, + Direction: page.OrderDirectionDesc, + } + if orderBy != nil { + pageOrderBy = page.OrderBy[coredata.TrustCenterDocumentAccessOrderField]{ + Field: orderBy.Field, + Direction: orderBy.Direction, + } + } + + cursor := types.NewCursor(first, after, last, before, pageOrderBy) + + result, err := prb.TrustCenterAccesses.ListDocumentAccesses(ctx, obj.ID, cursor) + if err != nil { + panic(fmt.Errorf("cannot list trust center document accesses: %w", err)) + } + + return types.NewTrustCenterDocumentAccessConnection(result, obj, obj.ID), nil +} + +// TrustCenterAccess is the resolver for the trustCenterAccess field. +func (r *trustCenterDocumentAccessResolver) TrustCenterAccess(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.TrustCenterAccess, error) { + // The TrustCenterAccess is already loaded from the connection resolver + return obj.TrustCenterAccess, nil +} + +// Document is the resolver for the document field. +func (r *trustCenterDocumentAccessResolver) Document(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Document, error) { + prb := r.ProboService(ctx, obj.ID.TenantID()) + + documentAccess, err := prb.TrustCenterAccesses.GetDocumentAccess(ctx, obj.ID) + if err != nil { + return nil, fmt.Errorf("cannot load trust center document access: %w", err) + } + + if documentAccess.DocumentID == nil { + return nil, nil + } + + document, err := prb.Documents.Get(ctx, *documentAccess.DocumentID) + if err != nil { + return nil, fmt.Errorf("cannot load document: %w", err) + } + + return types.NewDocument(document), nil +} + +// Report is the resolver for the report field. +func (r *trustCenterDocumentAccessResolver) Report(ctx context.Context, obj *types.TrustCenterDocumentAccess) (*types.Report, error) { + prb := r.ProboService(ctx, obj.ID.TenantID()) + + documentAccess, err := prb.TrustCenterAccesses.GetDocumentAccess(ctx, obj.ID) + if err != nil { + return nil, fmt.Errorf("cannot load trust center document access: %w", err) + } + + if documentAccess.ReportID == nil { + return nil, nil + } + + report, err := prb.Reports.Get(ctx, *documentAccess.ReportID) + if err != nil { + return nil, fmt.Errorf("cannot load report: %w", err) + } + + return types.NewReport(report), nil +} + +// TotalCount is the resolver for the totalCount field. +func (r *trustCenterDocumentAccessConnectionResolver) TotalCount(ctx context.Context, obj *types.TrustCenterDocumentAccessConnection) (int, error) { + prb := r.ProboService(ctx, obj.ParentID.TenantID()) + + count, err := prb.TrustCenterAccesses.CountDocumentAccesses(ctx, obj.ParentID) + if err != nil { + return 0, fmt.Errorf("cannot count trust center document accesses: %w", err) + } + + return count, nil +} + // LogoURL is the resolver for the logoUrl field. func (r *trustCenterReferenceResolver) LogoURL(ctx context.Context, obj *types.TrustCenterReference) (string, error) { prb := r.ProboService(ctx, obj.ID.TenantID()) @@ -5249,6 +5347,21 @@ func (r *Resolver) TaskConnection() schema.TaskConnectionResolver { return &task // TrustCenter returns schema.TrustCenterResolver implementation. func (r *Resolver) TrustCenter() schema.TrustCenterResolver { return &trustCenterResolver{r} } +// TrustCenterAccess returns schema.TrustCenterAccessResolver implementation. +func (r *Resolver) TrustCenterAccess() schema.TrustCenterAccessResolver { + return &trustCenterAccessResolver{r} +} + +// TrustCenterDocumentAccess returns schema.TrustCenterDocumentAccessResolver implementation. +func (r *Resolver) TrustCenterDocumentAccess() schema.TrustCenterDocumentAccessResolver { + return &trustCenterDocumentAccessResolver{r} +} + +// TrustCenterDocumentAccessConnection returns schema.TrustCenterDocumentAccessConnectionResolver implementation. +func (r *Resolver) TrustCenterDocumentAccessConnection() schema.TrustCenterDocumentAccessConnectionResolver { + return &trustCenterDocumentAccessConnectionResolver{r} +} + // TrustCenterReference returns schema.TrustCenterReferenceResolver implementation. func (r *Resolver) TrustCenterReference() schema.TrustCenterReferenceResolver { return &trustCenterReferenceResolver{r} @@ -5337,6 +5450,9 @@ type snapshotConnectionResolver struct{ *Resolver } type taskResolver struct{ *Resolver } type taskConnectionResolver struct{ *Resolver } type trustCenterResolver struct{ *Resolver } +type trustCenterAccessResolver struct{ *Resolver } +type trustCenterDocumentAccessResolver struct{ *Resolver } +type trustCenterDocumentAccessConnectionResolver struct{ *Resolver } type trustCenterReferenceResolver struct{ *Resolver } type trustCenterReferenceConnectionResolver struct{ *Resolver } type userResolver struct{ *Resolver } diff --git a/pkg/server/api/trust/v1/schema.graphql b/pkg/server/api/trust/v1/schema.graphql index 057710656..b72af38cd 100644 --- a/pkg/server/api/trust/v1/schema.graphql +++ b/pkg/server/api/trust/v1/schema.graphql @@ -57,6 +57,8 @@ type Document implements Node { id: ID! title: String! documentType: DocumentType! + isUserAuthorized: Boolean! @goField(forceResolver: true) + hasUserRequestedAccess: Boolean! @goField(forceResolver: true) } type DocumentConnection { @@ -78,6 +80,8 @@ type Framework implements Node { type Report implements Node { id: ID! filename: String! + isUserAuthorized: Boolean! @goField(forceResolver: true) + hasUserRequestedAccess: Boolean! @goField(forceResolver: true) } type Audit implements Node { @@ -517,13 +521,13 @@ type TrustCenterAccess implements Node { updatedAt: Datetime! } -input CreateTrustCenterAccessInput { +input RequestAllAccessesInput { trustCenterId: ID! - email: String! - name: String! + email: String + name: String } -type CreateTrustCenterAccessPayload { +type RequestAccessesPayload { trustCenterAccess: TrustCenterAccess! } @@ -539,6 +543,20 @@ input AcceptNonDisclosureAgreementInput { trustCenterId: ID! } +input RequestDocumentAccessInput { + trustCenterId: ID! + documentId: ID! + email: String + name: String +} + +input RequestReportAccessInput { + trustCenterId: ID! + reportId: ID! + email: String + name: String +} + type ExportDocumentPDFPayload { data: String! } @@ -547,7 +565,7 @@ type ExportReportPDFPayload { data: String! } -type AcceptNonDisclosureAgreementPayload{ +type AcceptNonDisclosureAgreementPayload { success: Boolean! } @@ -557,9 +575,9 @@ type Query { } type Mutation { - createTrustCenterAccess( - input: CreateTrustCenterAccessInput! - ): CreateTrustCenterAccessPayload! @mustBeAuthenticated(role: NONE) + requestAllAccesses( + input: RequestAllAccessesInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) exportDocumentPDF( input: ExportDocumentPDFInput! @@ -572,4 +590,12 @@ type Mutation { acceptNonDisclosureAgreement( input: AcceptNonDisclosureAgreementInput! ): AcceptNonDisclosureAgreementPayload! @mustBeAuthenticated(role: USER) + + requestDocumentAccess( + input: RequestDocumentAccessInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) + + requestReportAccess( + input: RequestReportAccessInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) } diff --git a/pkg/server/api/trust/v1/schema/schema.go b/pkg/server/api/trust/v1/schema/schema.go index a58b3de8a..d42da4f12 100644 --- a/pkg/server/api/trust/v1/schema/schema.go +++ b/pkg/server/api/trust/v1/schema/schema.go @@ -45,9 +45,11 @@ type Config struct { type ResolverRoot interface { Audit() AuditResolver + Document() DocumentResolver Mutation() MutationResolver Organization() OrganizationResolver Query() QueryResolver + Report() ReportResolver TrustCenter() TrustCenterResolver TrustCenterReference() TrustCenterReferenceResolver } @@ -77,14 +79,12 @@ type ComplexityRoot struct { Node func(childComplexity int) int } - CreateTrustCenterAccessPayload struct { - TrustCenterAccess func(childComplexity int) int - } - Document struct { - DocumentType func(childComplexity int) int - ID func(childComplexity int) int - Title func(childComplexity int) int + DocumentType func(childComplexity int) int + HasUserRequestedAccess func(childComplexity int) int + ID func(childComplexity int) int + IsUserAuthorized func(childComplexity int) int + Title func(childComplexity int) int } DocumentConnection struct { @@ -112,9 +112,11 @@ type ComplexityRoot struct { Mutation struct { AcceptNonDisclosureAgreement func(childComplexity int, input types.AcceptNonDisclosureAgreementInput) int - CreateTrustCenterAccess func(childComplexity int, input types.CreateTrustCenterAccessInput) int ExportDocumentPDF func(childComplexity int, input types.ExportDocumentPDFInput) int ExportReportPDF func(childComplexity int, input types.ExportReportPDFInput) int + RequestAllAccesses func(childComplexity int, input types.RequestAllAccessesInput) int + RequestDocumentAccess func(childComplexity int, input types.RequestDocumentAccessInput) int + RequestReportAccess func(childComplexity int, input types.RequestReportAccessInput) int } Organization struct { @@ -140,8 +142,14 @@ type ComplexityRoot struct { } Report struct { - Filename func(childComplexity int) int - ID func(childComplexity int) int + Filename func(childComplexity int) int + HasUserRequestedAccess func(childComplexity int) int + ID func(childComplexity int) int + IsUserAuthorized func(childComplexity int) int + } + + RequestAccessesPayload struct { + TrustCenterAccess func(childComplexity int) int } TrustCenter struct { @@ -209,11 +217,17 @@ type AuditResolver interface { Framework(ctx context.Context, obj *types.Audit) (*types.Framework, error) Report(ctx context.Context, obj *types.Audit) (*types.Report, error) } +type DocumentResolver interface { + IsUserAuthorized(ctx context.Context, obj *types.Document) (bool, error) + HasUserRequestedAccess(ctx context.Context, obj *types.Document) (bool, error) +} type MutationResolver interface { - CreateTrustCenterAccess(ctx context.Context, input types.CreateTrustCenterAccessInput) (*types.CreateTrustCenterAccessPayload, error) + RequestAllAccesses(ctx context.Context, input types.RequestAllAccessesInput) (*types.RequestAccessesPayload, error) ExportDocumentPDF(ctx context.Context, input types.ExportDocumentPDFInput) (*types.ExportDocumentPDFPayload, error) ExportReportPDF(ctx context.Context, input types.ExportReportPDFInput) (*types.ExportReportPDFPayload, error) AcceptNonDisclosureAgreement(ctx context.Context, input types.AcceptNonDisclosureAgreementInput) (*types.AcceptNonDisclosureAgreementPayload, error) + RequestDocumentAccess(ctx context.Context, input types.RequestDocumentAccessInput) (*types.RequestAccessesPayload, error) + RequestReportAccess(ctx context.Context, input types.RequestReportAccessInput) (*types.RequestAccessesPayload, error) } type OrganizationResolver interface { LogoURL(ctx context.Context, obj *types.Organization) (*string, error) @@ -222,6 +236,10 @@ type QueryResolver interface { Node(ctx context.Context, id gid.GID) (types.Node, error) TrustCenterBySlug(ctx context.Context, slug string) (*types.TrustCenter, error) } +type ReportResolver interface { + IsUserAuthorized(ctx context.Context, obj *types.Report) (bool, error) + HasUserRequestedAccess(ctx context.Context, obj *types.Report) (bool, error) +} type TrustCenterResolver interface { NdaFileURL(ctx context.Context, obj *types.TrustCenter) (*string, error) Organization(ctx context.Context, obj *types.TrustCenter) (*types.Organization, error) @@ -311,13 +329,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.AuditEdge.Node(childComplexity), true - case "CreateTrustCenterAccessPayload.trustCenterAccess": - if e.complexity.CreateTrustCenterAccessPayload.TrustCenterAccess == nil { - break - } - - return e.complexity.CreateTrustCenterAccessPayload.TrustCenterAccess(childComplexity), true - case "Document.documentType": if e.complexity.Document.DocumentType == nil { break @@ -325,6 +336,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Document.DocumentType(childComplexity), true + case "Document.hasUserRequestedAccess": + if e.complexity.Document.HasUserRequestedAccess == nil { + break + } + + return e.complexity.Document.HasUserRequestedAccess(childComplexity), true + case "Document.id": if e.complexity.Document.ID == nil { break @@ -332,6 +350,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Document.ID(childComplexity), true + case "Document.isUserAuthorized": + if e.complexity.Document.IsUserAuthorized == nil { + break + } + + return e.complexity.Document.IsUserAuthorized(childComplexity), true + case "Document.title": if e.complexity.Document.Title == nil { break @@ -407,18 +432,6 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Mutation.AcceptNonDisclosureAgreement(childComplexity, args["input"].(types.AcceptNonDisclosureAgreementInput)), true - case "Mutation.createTrustCenterAccess": - if e.complexity.Mutation.CreateTrustCenterAccess == nil { - break - } - - args, err := ec.field_Mutation_createTrustCenterAccess_args(ctx, rawArgs) - if err != nil { - return 0, false - } - - return e.complexity.Mutation.CreateTrustCenterAccess(childComplexity, args["input"].(types.CreateTrustCenterAccessInput)), true - case "Mutation.exportDocumentPDF": if e.complexity.Mutation.ExportDocumentPDF == nil { break @@ -443,6 +456,42 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Mutation.ExportReportPDF(childComplexity, args["input"].(types.ExportReportPDFInput)), true + case "Mutation.requestAllAccesses": + if e.complexity.Mutation.RequestAllAccesses == nil { + break + } + + args, err := ec.field_Mutation_requestAllAccesses_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.RequestAllAccesses(childComplexity, args["input"].(types.RequestAllAccessesInput)), true + + case "Mutation.requestDocumentAccess": + if e.complexity.Mutation.RequestDocumentAccess == nil { + break + } + + args, err := ec.field_Mutation_requestDocumentAccess_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.RequestDocumentAccess(childComplexity, args["input"].(types.RequestDocumentAccessInput)), true + + case "Mutation.requestReportAccess": + if e.complexity.Mutation.RequestReportAccess == nil { + break + } + + args, err := ec.field_Mutation_requestReportAccess_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Mutation.RequestReportAccess(childComplexity, args["input"].(types.RequestReportAccessInput)), true + case "Organization.description": if e.complexity.Organization.Description == nil { break @@ -551,6 +600,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Report.Filename(childComplexity), true + case "Report.hasUserRequestedAccess": + if e.complexity.Report.HasUserRequestedAccess == nil { + break + } + + return e.complexity.Report.HasUserRequestedAccess(childComplexity), true + case "Report.id": if e.complexity.Report.ID == nil { break @@ -558,6 +614,20 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.complexity.Report.ID(childComplexity), true + case "Report.isUserAuthorized": + if e.complexity.Report.IsUserAuthorized == nil { + break + } + + return e.complexity.Report.IsUserAuthorized(childComplexity), true + + case "RequestAccessesPayload.trustCenterAccess": + if e.complexity.RequestAccessesPayload.TrustCenterAccess == nil { + break + } + + return e.complexity.RequestAccessesPayload.TrustCenterAccess(childComplexity), true + case "TrustCenter.active": if e.complexity.TrustCenter.Active == nil { break @@ -839,9 +909,11 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec := executionContext{opCtx, e, 0, 0, make(chan graphql.DeferredResult)} inputUnmarshalMap := graphql.BuildUnmarshalerMap( ec.unmarshalInputAcceptNonDisclosureAgreementInput, - ec.unmarshalInputCreateTrustCenterAccessInput, ec.unmarshalInputExportDocumentPDFInput, ec.unmarshalInputExportReportPDFInput, + ec.unmarshalInputRequestAllAccessesInput, + ec.unmarshalInputRequestDocumentAccessInput, + ec.unmarshalInputRequestReportAccessInput, ) first := true @@ -998,6 +1070,8 @@ type Document implements Node { id: ID! title: String! documentType: DocumentType! + isUserAuthorized: Boolean! @goField(forceResolver: true) + hasUserRequestedAccess: Boolean! @goField(forceResolver: true) } type DocumentConnection { @@ -1019,6 +1093,8 @@ type Framework implements Node { type Report implements Node { id: ID! filename: String! + isUserAuthorized: Boolean! @goField(forceResolver: true) + hasUserRequestedAccess: Boolean! @goField(forceResolver: true) } type Audit implements Node { @@ -1458,13 +1534,13 @@ type TrustCenterAccess implements Node { updatedAt: Datetime! } -input CreateTrustCenterAccessInput { +input RequestAllAccessesInput { trustCenterId: ID! - email: String! - name: String! + email: String + name: String } -type CreateTrustCenterAccessPayload { +type RequestAccessesPayload { trustCenterAccess: TrustCenterAccess! } @@ -1480,6 +1556,20 @@ input AcceptNonDisclosureAgreementInput { trustCenterId: ID! } +input RequestDocumentAccessInput { + trustCenterId: ID! + documentId: ID! + email: String + name: String +} + +input RequestReportAccessInput { + trustCenterId: ID! + reportId: ID! + email: String + name: String +} + type ExportDocumentPDFPayload { data: String! } @@ -1488,7 +1578,7 @@ type ExportReportPDFPayload { data: String! } -type AcceptNonDisclosureAgreementPayload{ +type AcceptNonDisclosureAgreementPayload { success: Boolean! } @@ -1498,9 +1588,9 @@ type Query { } type Mutation { - createTrustCenterAccess( - input: CreateTrustCenterAccessInput! - ): CreateTrustCenterAccessPayload! @mustBeAuthenticated(role: NONE) + requestAllAccesses( + input: RequestAllAccessesInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) exportDocumentPDF( input: ExportDocumentPDFInput! @@ -1513,6 +1603,14 @@ type Mutation { acceptNonDisclosureAgreement( input: AcceptNonDisclosureAgreementInput! ): AcceptNonDisclosureAgreementPayload! @mustBeAuthenticated(role: USER) + + requestDocumentAccess( + input: RequestDocumentAccessInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) + + requestReportAccess( + input: RequestReportAccessInput! + ): RequestAccessesPayload! @mustBeAuthenticated(role: NONE) } `, BuiltIn: false}, } @@ -1573,29 +1671,6 @@ func (ec *executionContext) field_Mutation_acceptNonDisclosureAgreement_argsInpu return zeroVal, nil } -func (ec *executionContext) field_Mutation_createTrustCenterAccess_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { - var err error - args := map[string]any{} - arg0, err := ec.field_Mutation_createTrustCenterAccess_argsInput(ctx, rawArgs) - if err != nil { - return nil, err - } - args["input"] = arg0 - return args, nil -} -func (ec *executionContext) field_Mutation_createTrustCenterAccess_argsInput( - ctx context.Context, - rawArgs map[string]any, -) (types.CreateTrustCenterAccessInput, error) { - ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("input")) - if tmp, ok := rawArgs["input"]; ok { - return ec.unmarshalNCreateTrustCenterAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐCreateTrustCenterAccessInput(ctx, tmp) - } - - var zeroVal types.CreateTrustCenterAccessInput - return zeroVal, nil -} - func (ec *executionContext) field_Mutation_exportDocumentPDF_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -1642,6 +1717,75 @@ func (ec *executionContext) field_Mutation_exportReportPDF_argsInput( return zeroVal, nil } +func (ec *executionContext) field_Mutation_requestAllAccesses_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Mutation_requestAllAccesses_argsInput(ctx, rawArgs) + if err != nil { + return nil, err + } + args["input"] = arg0 + return args, nil +} +func (ec *executionContext) field_Mutation_requestAllAccesses_argsInput( + ctx context.Context, + rawArgs map[string]any, +) (types.RequestAllAccessesInput, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("input")) + if tmp, ok := rawArgs["input"]; ok { + return ec.unmarshalNRequestAllAccessesInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAllAccessesInput(ctx, tmp) + } + + var zeroVal types.RequestAllAccessesInput + return zeroVal, nil +} + +func (ec *executionContext) field_Mutation_requestDocumentAccess_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Mutation_requestDocumentAccess_argsInput(ctx, rawArgs) + if err != nil { + return nil, err + } + args["input"] = arg0 + return args, nil +} +func (ec *executionContext) field_Mutation_requestDocumentAccess_argsInput( + ctx context.Context, + rawArgs map[string]any, +) (types.RequestDocumentAccessInput, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("input")) + if tmp, ok := rawArgs["input"]; ok { + return ec.unmarshalNRequestDocumentAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestDocumentAccessInput(ctx, tmp) + } + + var zeroVal types.RequestDocumentAccessInput + return zeroVal, nil +} + +func (ec *executionContext) field_Mutation_requestReportAccess_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Mutation_requestReportAccess_argsInput(ctx, rawArgs) + if err != nil { + return nil, err + } + args["input"] = arg0 + return args, nil +} +func (ec *executionContext) field_Mutation_requestReportAccess_argsInput( + ctx context.Context, + rawArgs map[string]any, +) (types.RequestReportAccessInput, error) { + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("input")) + if tmp, ok := rawArgs["input"]; ok { + return ec.unmarshalNRequestReportAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestReportAccessInput(ctx, tmp) + } + + var zeroVal types.RequestReportAccessInput + return zeroVal, nil +} + func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -2297,6 +2441,10 @@ func (ec *executionContext) fieldContext_Audit_report(_ context.Context, field g return ec.fieldContext_Report_id(ctx, field) case "filename": return ec.fieldContext_Report_filename(ctx, field) + case "isUserAuthorized": + return ec.fieldContext_Report_isUserAuthorized(ctx, field) + case "hasUserRequestedAccess": + return ec.fieldContext_Report_hasUserRequestedAccess(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Report", field.Name) }, @@ -2504,62 +2652,6 @@ func (ec *executionContext) fieldContext_AuditEdge_node(_ context.Context, field return fc, nil } -func (ec *executionContext) _CreateTrustCenterAccessPayload_trustCenterAccess(ctx context.Context, field graphql.CollectedField, obj *types.CreateTrustCenterAccessPayload) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_CreateTrustCenterAccessPayload_trustCenterAccess(ctx, field) - if err != nil { - return graphql.Null - } - ctx = graphql.WithFieldContext(ctx, fc) - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - ret = graphql.Null - } - }() - resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { - ctx = rctx // use context from middleware stack in children - return obj.TrustCenterAccess, nil - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } - return graphql.Null - } - res := resTmp.(*types.TrustCenterAccess) - fc.Result = res - return ec.marshalNTrustCenterAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐTrustCenterAccess(ctx, field.Selections, res) -} - -func (ec *executionContext) fieldContext_CreateTrustCenterAccessPayload_trustCenterAccess(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "CreateTrustCenterAccessPayload", - Field: field, - IsMethod: false, - IsResolver: false, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_TrustCenterAccess_id(ctx, field) - case "email": - return ec.fieldContext_TrustCenterAccess_email(ctx, field) - case "name": - return ec.fieldContext_TrustCenterAccess_name(ctx, field) - case "createdAt": - return ec.fieldContext_TrustCenterAccess_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_TrustCenterAccess_updatedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type TrustCenterAccess", field.Name) - }, - } - return fc, nil -} - func (ec *executionContext) _Document_id(ctx context.Context, field graphql.CollectedField, obj *types.Document) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Document_id(ctx, field) if err != nil { @@ -2692,6 +2784,94 @@ func (ec *executionContext) fieldContext_Document_documentType(_ context.Context return fc, nil } +func (ec *executionContext) _Document_isUserAuthorized(ctx context.Context, field graphql.CollectedField, obj *types.Document) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Document_isUserAuthorized(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Document().IsUserAuthorized(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Document_isUserAuthorized(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Document", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Document_hasUserRequestedAccess(ctx context.Context, field graphql.CollectedField, obj *types.Document) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Document_hasUserRequestedAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Document().HasUserRequestedAccess(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Document_hasUserRequestedAccess(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Document", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _DocumentConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.DocumentConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_DocumentConnection_edges(ctx, field) if err != nil { @@ -2885,6 +3065,10 @@ func (ec *executionContext) fieldContext_DocumentEdge_node(_ context.Context, fi return ec.fieldContext_Document_title(ctx, field) case "documentType": return ec.fieldContext_Document_documentType(ctx, field) + case "isUserAuthorized": + return ec.fieldContext_Document_isUserAuthorized(ctx, field) + case "hasUserRequestedAccess": + return ec.fieldContext_Document_hasUserRequestedAccess(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Document", field.Name) }, @@ -3068,8 +3252,8 @@ func (ec *executionContext) fieldContext_Framework_name(_ context.Context, field return fc, nil } -func (ec *executionContext) _Mutation_createTrustCenterAccess(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_Mutation_createTrustCenterAccess(ctx, field) +func (ec *executionContext) _Mutation_requestAllAccesses(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_requestAllAccesses(ctx, field) if err != nil { return graphql.Null } @@ -3083,17 +3267,17 @@ func (ec *executionContext) _Mutation_createTrustCenterAccess(ctx context.Contex resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { directive0 := func(rctx context.Context) (any, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Mutation().CreateTrustCenterAccess(rctx, fc.Args["input"].(types.CreateTrustCenterAccessInput)) + return ec.resolvers.Mutation().RequestAllAccesses(rctx, fc.Args["input"].(types.RequestAllAccessesInput)) } directive1 := func(ctx context.Context) (any, error) { role, err := ec.unmarshalORole2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRole(ctx, "NONE") if err != nil { - var zeroVal *types.CreateTrustCenterAccessPayload + var zeroVal *types.RequestAccessesPayload return zeroVal, err } if ec.directives.MustBeAuthenticated == nil { - var zeroVal *types.CreateTrustCenterAccessPayload + var zeroVal *types.RequestAccessesPayload return zeroVal, errors.New("directive mustBeAuthenticated is not implemented") } return ec.directives.MustBeAuthenticated(ctx, nil, directive0, role) @@ -3106,10 +3290,10 @@ func (ec *executionContext) _Mutation_createTrustCenterAccess(ctx context.Contex if tmp == nil { return nil, nil } - if data, ok := tmp.(*types.CreateTrustCenterAccessPayload); ok { + if data, ok := tmp.(*types.RequestAccessesPayload); ok { return data, nil } - return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/getprobo/probo/pkg/server/api/trust/v1/types.CreateTrustCenterAccessPayload`, tmp) + return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/getprobo/probo/pkg/server/api/trust/v1/types.RequestAccessesPayload`, tmp) }) if err != nil { ec.Error(ctx, err) @@ -3121,12 +3305,12 @@ func (ec *executionContext) _Mutation_createTrustCenterAccess(ctx context.Contex } return graphql.Null } - res := resTmp.(*types.CreateTrustCenterAccessPayload) + res := resTmp.(*types.RequestAccessesPayload) fc.Result = res - return ec.marshalNCreateTrustCenterAccessPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐCreateTrustCenterAccessPayload(ctx, field.Selections, res) + return ec.marshalNRequestAccessesPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAccessesPayload(ctx, field.Selections, res) } -func (ec *executionContext) fieldContext_Mutation_createTrustCenterAccess(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Mutation_requestAllAccesses(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Mutation", Field: field, @@ -3135,9 +3319,9 @@ func (ec *executionContext) fieldContext_Mutation_createTrustCenterAccess(ctx co Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "trustCenterAccess": - return ec.fieldContext_CreateTrustCenterAccessPayload_trustCenterAccess(ctx, field) + return ec.fieldContext_RequestAccessesPayload_trustCenterAccess(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type CreateTrustCenterAccessPayload", field.Name) + return nil, fmt.Errorf("no field named %q was found under type RequestAccessesPayload", field.Name) }, } defer func() { @@ -3147,7 +3331,7 @@ func (ec *executionContext) fieldContext_Mutation_createTrustCenterAccess(ctx co } }() ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createTrustCenterAccess_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + if fc.Args, err = ec.field_Mutation_requestAllAccesses_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { ec.Error(ctx, err) return fc, err } @@ -3412,6 +3596,178 @@ func (ec *executionContext) fieldContext_Mutation_acceptNonDisclosureAgreement(c return fc, nil } +func (ec *executionContext) _Mutation_requestDocumentAccess(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_requestDocumentAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + directive0 := func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().RequestDocumentAccess(rctx, fc.Args["input"].(types.RequestDocumentAccessInput)) + } + + directive1 := func(ctx context.Context) (any, error) { + role, err := ec.unmarshalORole2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRole(ctx, "NONE") + if err != nil { + var zeroVal *types.RequestAccessesPayload + return zeroVal, err + } + if ec.directives.MustBeAuthenticated == nil { + var zeroVal *types.RequestAccessesPayload + return zeroVal, errors.New("directive mustBeAuthenticated is not implemented") + } + return ec.directives.MustBeAuthenticated(ctx, nil, directive0, role) + } + + tmp, err := directive1(rctx) + if err != nil { + return nil, graphql.ErrorOnPath(ctx, err) + } + if tmp == nil { + return nil, nil + } + if data, ok := tmp.(*types.RequestAccessesPayload); ok { + return data, nil + } + return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/getprobo/probo/pkg/server/api/trust/v1/types.RequestAccessesPayload`, tmp) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.RequestAccessesPayload) + fc.Result = res + return ec.marshalNRequestAccessesPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAccessesPayload(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Mutation_requestDocumentAccess(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "trustCenterAccess": + return ec.fieldContext_RequestAccessesPayload_trustCenterAccess(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type RequestAccessesPayload", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_requestDocumentAccess_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_requestReportAccess(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Mutation_requestReportAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + directive0 := func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Mutation().RequestReportAccess(rctx, fc.Args["input"].(types.RequestReportAccessInput)) + } + + directive1 := func(ctx context.Context) (any, error) { + role, err := ec.unmarshalORole2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRole(ctx, "NONE") + if err != nil { + var zeroVal *types.RequestAccessesPayload + return zeroVal, err + } + if ec.directives.MustBeAuthenticated == nil { + var zeroVal *types.RequestAccessesPayload + return zeroVal, errors.New("directive mustBeAuthenticated is not implemented") + } + return ec.directives.MustBeAuthenticated(ctx, nil, directive0, role) + } + + tmp, err := directive1(rctx) + if err != nil { + return nil, graphql.ErrorOnPath(ctx, err) + } + if tmp == nil { + return nil, nil + } + if data, ok := tmp.(*types.RequestAccessesPayload); ok { + return data, nil + } + return nil, fmt.Errorf(`unexpected type %T from directive, should be *github.com/getprobo/probo/pkg/server/api/trust/v1/types.RequestAccessesPayload`, tmp) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.RequestAccessesPayload) + fc.Result = res + return ec.marshalNRequestAccessesPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAccessesPayload(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Mutation_requestReportAccess(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "trustCenterAccess": + return ec.fieldContext_RequestAccessesPayload_trustCenterAccess(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type RequestAccessesPayload", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_requestReportAccess_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Organization_id(ctx context.Context, field graphql.CollectedField, obj *types.Organization) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Organization_id(ctx, field) if err != nil { @@ -4254,6 +4610,150 @@ func (ec *executionContext) fieldContext_Report_filename(_ context.Context, fiel return fc, nil } +func (ec *executionContext) _Report_isUserAuthorized(ctx context.Context, field graphql.CollectedField, obj *types.Report) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Report_isUserAuthorized(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Report().IsUserAuthorized(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Report_isUserAuthorized(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Report", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Report_hasUserRequestedAccess(ctx context.Context, field graphql.CollectedField, obj *types.Report) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Report_hasUserRequestedAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Report().HasUserRequestedAccess(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Report_hasUserRequestedAccess(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Report", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _RequestAccessesPayload_trustCenterAccess(ctx context.Context, field graphql.CollectedField, obj *types.RequestAccessesPayload) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_RequestAccessesPayload_trustCenterAccess(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.TrustCenterAccess, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*types.TrustCenterAccess) + fc.Result = res + return ec.marshalNTrustCenterAccess2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐTrustCenterAccess(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_RequestAccessesPayload_trustCenterAccess(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "RequestAccessesPayload", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_TrustCenterAccess_id(ctx, field) + case "email": + return ec.fieldContext_TrustCenterAccess_email(ctx, field) + case "name": + return ec.fieldContext_TrustCenterAccess_name(ctx, field) + case "createdAt": + return ec.fieldContext_TrustCenterAccess_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_TrustCenterAccess_updatedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TrustCenterAccess", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _TrustCenter_id(ctx context.Context, field graphql.CollectedField, obj *types.TrustCenter) (ret graphql.Marshaler) { fc, err := ec.fieldContext_TrustCenter_id(ctx, field) if err != nil { @@ -7946,47 +8446,6 @@ func (ec *executionContext) unmarshalInputAcceptNonDisclosureAgreementInput(ctx return it, nil } -func (ec *executionContext) unmarshalInputCreateTrustCenterAccessInput(ctx context.Context, obj any) (types.CreateTrustCenterAccessInput, error) { - var it types.CreateTrustCenterAccessInput - asMap := map[string]any{} - for k, v := range obj.(map[string]any) { - asMap[k] = v - } - - fieldsInOrder := [...]string{"trustCenterId", "email", "name"} - for _, k := range fieldsInOrder { - v, ok := asMap[k] - if !ok { - continue - } - switch k { - case "trustCenterId": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterId")) - data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) - if err != nil { - return it, err - } - it.TrustCenterID = data - case "email": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Email = data - case "name": - ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) - data, err := ec.unmarshalNString2string(ctx, v) - if err != nil { - return it, err - } - it.Name = data - } - } - - return it, nil -} - func (ec *executionContext) unmarshalInputExportDocumentPDFInput(ctx context.Context, obj any) (types.ExportDocumentPDFInput, error) { var it types.ExportDocumentPDFInput asMap := map[string]any{} @@ -8041,6 +8500,143 @@ func (ec *executionContext) unmarshalInputExportReportPDFInput(ctx context.Conte return it, nil } +func (ec *executionContext) unmarshalInputRequestAllAccessesInput(ctx context.Context, obj any) (types.RequestAllAccessesInput, error) { + var it types.RequestAllAccessesInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"trustCenterId", "email", "name"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "trustCenterId": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterId")) + data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) + if err != nil { + return it, err + } + it.TrustCenterID = data + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Email = data + case "name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Name = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputRequestDocumentAccessInput(ctx context.Context, obj any) (types.RequestDocumentAccessInput, error) { + var it types.RequestDocumentAccessInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"trustCenterId", "documentId", "email", "name"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "trustCenterId": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterId")) + data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) + if err != nil { + return it, err + } + it.TrustCenterID = data + case "documentId": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("documentId")) + data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) + if err != nil { + return it, err + } + it.DocumentID = data + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Email = data + case "name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Name = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputRequestReportAccessInput(ctx context.Context, obj any) (types.RequestReportAccessInput, error) { + var it types.RequestReportAccessInput + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"trustCenterId", "reportId", "email", "name"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "trustCenterId": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterId")) + data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) + if err != nil { + return it, err + } + it.TrustCenterID = data + case "reportId": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("reportId")) + data, err := ec.unmarshalNID2githubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v) + if err != nil { + return it, err + } + it.ReportID = data + case "email": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Email = data + case "name": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + data, err := ec.unmarshalOString2ᚖstring(ctx, v) + if err != nil { + return it, err + } + it.Name = data + } + } + + return it, nil +} + // endregion **************************** input.gotpl ***************************** // region ************************** interface.gotpl *************************** @@ -8356,45 +8952,6 @@ func (ec *executionContext) _AuditEdge(ctx context.Context, sel ast.SelectionSet return out } -var createTrustCenterAccessPayloadImplementors = []string{"CreateTrustCenterAccessPayload"} - -func (ec *executionContext) _CreateTrustCenterAccessPayload(ctx context.Context, sel ast.SelectionSet, obj *types.CreateTrustCenterAccessPayload) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, createTrustCenterAccessPayloadImplementors) - - out := graphql.NewFieldSet(fields) - deferred := make(map[string]*graphql.FieldSet) - for i, field := range fields { - switch field.Name { - case "__typename": - out.Values[i] = graphql.MarshalString("CreateTrustCenterAccessPayload") - case "trustCenterAccess": - out.Values[i] = ec._CreateTrustCenterAccessPayload_trustCenterAccess(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - default: - panic("unknown field " + strconv.Quote(field.Name)) - } - } - out.Dispatch(ctx) - if out.Invalids > 0 { - return graphql.Null - } - - atomic.AddInt32(&ec.deferred, int32(len(deferred))) - - for label, dfs := range deferred { - ec.processDeferredGroup(graphql.DeferredGroup{ - Label: label, - Path: graphql.GetPath(ctx), - FieldSet: dfs, - Context: ctx, - }) - } - - return out -} - var documentImplementors = []string{"Document", "Node"} func (ec *executionContext) _Document(ctx context.Context, sel ast.SelectionSet, obj *types.Document) graphql.Marshaler { @@ -8409,18 +8966,90 @@ func (ec *executionContext) _Document(ctx context.Context, sel ast.SelectionSet, case "id": out.Values[i] = ec._Document_id(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "title": out.Values[i] = ec._Document_title(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "documentType": out.Values[i] = ec._Document_documentType(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } + case "isUserAuthorized": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Document_isUserAuthorized(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "hasUserRequestedAccess": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Document_hasUserRequestedAccess(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -8673,9 +9302,9 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Mutation") - case "createTrustCenterAccess": + case "requestAllAccesses": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createTrustCenterAccess(ctx, field) + return ec._Mutation_requestAllAccesses(ctx, field) }) if out.Values[i] == graphql.Null { out.Invalids++ @@ -8701,6 +9330,20 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } + case "requestDocumentAccess": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_requestDocumentAccess(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "requestReportAccess": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_requestReportAccess(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -8962,10 +9605,121 @@ func (ec *executionContext) _Report(ctx context.Context, sel ast.SelectionSet, o case "id": out.Values[i] = ec._Report_id(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "filename": out.Values[i] = ec._Report_filename(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "isUserAuthorized": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Report_isUserAuthorized(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "hasUserRequestedAccess": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Report_hasUserRequestedAccess(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var requestAccessesPayloadImplementors = []string{"RequestAccessesPayload"} + +func (ec *executionContext) _RequestAccessesPayload(ctx context.Context, sel ast.SelectionSet, obj *types.RequestAccessesPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, requestAccessesPayloadImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("RequestAccessesPayload") + case "trustCenterAccess": + out.Values[i] = ec._RequestAccessesPayload_trustCenterAccess(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -11241,25 +11995,6 @@ var ( } ) -func (ec *executionContext) unmarshalNCreateTrustCenterAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐCreateTrustCenterAccessInput(ctx context.Context, v any) (types.CreateTrustCenterAccessInput, error) { - res, err := ec.unmarshalInputCreateTrustCenterAccessInput(ctx, v) - return res, graphql.ErrorOnPath(ctx, err) -} - -func (ec *executionContext) marshalNCreateTrustCenterAccessPayload2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐCreateTrustCenterAccessPayload(ctx context.Context, sel ast.SelectionSet, v types.CreateTrustCenterAccessPayload) graphql.Marshaler { - return ec._CreateTrustCenterAccessPayload(ctx, sel, &v) -} - -func (ec *executionContext) marshalNCreateTrustCenterAccessPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐCreateTrustCenterAccessPayload(ctx context.Context, sel ast.SelectionSet, v *types.CreateTrustCenterAccessPayload) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._CreateTrustCenterAccessPayload(ctx, sel, v) -} - func (ec *executionContext) unmarshalNCursorKey2githubᚗcomᚋgetproboᚋproboᚋpkgᚋpageᚐCursorKey(ctx context.Context, v any) (page.CursorKey, error) { res, err := cursor.UnmarshalCursorKeyScalar(v) return res, graphql.ErrorOnPath(ctx, err) @@ -11502,6 +12237,35 @@ func (ec *executionContext) marshalNPageInfo2ᚖgithubᚗcomᚋgetproboᚋprobo return ec._PageInfo(ctx, sel, v) } +func (ec *executionContext) marshalNRequestAccessesPayload2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAccessesPayload(ctx context.Context, sel ast.SelectionSet, v types.RequestAccessesPayload) graphql.Marshaler { + return ec._RequestAccessesPayload(ctx, sel, &v) +} + +func (ec *executionContext) marshalNRequestAccessesPayload2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAccessesPayload(ctx context.Context, sel ast.SelectionSet, v *types.RequestAccessesPayload) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._RequestAccessesPayload(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNRequestAllAccessesInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestAllAccessesInput(ctx context.Context, v any) (types.RequestAllAccessesInput, error) { + res, err := ec.unmarshalInputRequestAllAccessesInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) unmarshalNRequestDocumentAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestDocumentAccessInput(ctx context.Context, v any) (types.RequestDocumentAccessInput, error) { + res, err := ec.unmarshalInputRequestDocumentAccessInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) unmarshalNRequestReportAccessInput2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋtrustᚋv1ᚋtypesᚐRequestReportAccessInput(ctx context.Context, v any) (types.RequestReportAccessInput, error) { + res, err := ec.unmarshalInputRequestReportAccessInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + func (ec *executionContext) unmarshalNString2string(ctx context.Context, v any) (string, error) { res, err := graphql.UnmarshalString(v) return res, graphql.ErrorOnPath(ctx, err) diff --git a/pkg/server/api/trust/v1/types/types.go b/pkg/server/api/trust/v1/types/types.go index 0ecd54491..b54546924 100644 --- a/pkg/server/api/trust/v1/types/types.go +++ b/pkg/server/api/trust/v1/types/types.go @@ -46,20 +46,12 @@ type AuditEdge struct { Node *Audit `json:"node"` } -type CreateTrustCenterAccessInput struct { - TrustCenterID gid.GID `json:"trustCenterId"` - Email string `json:"email"` - Name string `json:"name"` -} - -type CreateTrustCenterAccessPayload struct { - TrustCenterAccess *TrustCenterAccess `json:"trustCenterAccess"` -} - type Document struct { - ID gid.GID `json:"id"` - Title string `json:"title"` - DocumentType coredata.DocumentType `json:"documentType"` + ID gid.GID `json:"id"` + Title string `json:"title"` + DocumentType coredata.DocumentType `json:"documentType"` + IsUserAuthorized bool `json:"isUserAuthorized"` + HasUserRequestedAccess bool `json:"hasUserRequestedAccess"` } func (Document) IsNode() {} @@ -126,13 +118,39 @@ type Query struct { } type Report struct { - ID gid.GID `json:"id"` - Filename string `json:"filename"` + ID gid.GID `json:"id"` + Filename string `json:"filename"` + IsUserAuthorized bool `json:"isUserAuthorized"` + HasUserRequestedAccess bool `json:"hasUserRequestedAccess"` } func (Report) IsNode() {} func (this Report) GetID() gid.GID { return this.ID } +type RequestAccessesPayload struct { + TrustCenterAccess *TrustCenterAccess `json:"trustCenterAccess"` +} + +type RequestAllAccessesInput struct { + TrustCenterID gid.GID `json:"trustCenterId"` + Email *string `json:"email,omitempty"` + Name *string `json:"name,omitempty"` +} + +type RequestDocumentAccessInput struct { + TrustCenterID gid.GID `json:"trustCenterId"` + DocumentID gid.GID `json:"documentId"` + Email *string `json:"email,omitempty"` + Name *string `json:"name,omitempty"` +} + +type RequestReportAccessInput struct { + TrustCenterID gid.GID `json:"trustCenterId"` + ReportID gid.GID `json:"reportId"` + Email *string `json:"email,omitempty"` + Name *string `json:"name,omitempty"` +} + type TrustCenter struct { ID gid.GID `json:"id"` Active bool `json:"active"` diff --git a/pkg/server/api/trust/v1/v1_resolver.go b/pkg/server/api/trust/v1/v1_resolver.go index 63cfb3242..e300bc434 100644 --- a/pkg/server/api/trust/v1/v1_resolver.go +++ b/pkg/server/api/trust/v1/v1_resolver.go @@ -57,20 +57,90 @@ func (r *auditResolver) Report(ctx context.Context, obj *types.Audit) (*types.Re return types.NewReport(report), nil } -// CreateTrustCenterAccess is the resolver for the createTrustCenterAccess field. -func (r *mutationResolver) CreateTrustCenterAccess(ctx context.Context, input types.CreateTrustCenterAccessInput) (*types.CreateTrustCenterAccessPayload, error) { +// IsUserAuthorized is the resolver for the isUserAuthorized field. +func (r *documentResolver) IsUserAuthorized(ctx context.Context, obj *types.Document) (bool, error) { + privateTrustService, err := r.PrivateTrustService(ctx, obj.ID.TenantID()) + if err != nil { + return false, nil + } + + userData := r.UserFromContext(ctx) + if userData != nil { + return true, nil + } + + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + documentAccess, err := privateTrustService.TrustCenterAccesses.LoadDocumentAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), obj.ID) + if err != nil { + return false, nil + } + + return documentAccess.Active, nil + } + + panic(fmt.Errorf("no user or token data found")) +} + +// HasUserRequestedAccess is the resolver for the hasUserRequestedAccess field. +func (r *documentResolver) HasUserRequestedAccess(ctx context.Context, obj *types.Document) (bool, error) { + privateTrustService, err := r.PrivateTrustService(ctx, obj.ID.TenantID()) + if err != nil { + return false, nil + } + + userData := r.UserFromContext(ctx) + if userData != nil { + return false, nil + } + + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + // Try to load document access - if it exists (regardless of active status), user has requested it + _, err := privateTrustService.TrustCenterAccesses.LoadDocumentAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), obj.ID) + if err != nil { + return false, nil // No access requested or error + } + return true, nil // Access exists (requested) + } + + return false, nil +} + +// RequestAllAccesses is the resolver for the requestAllAccesses field. +func (r *mutationResolver) RequestAllAccesses(ctx context.Context, input types.RequestAllAccessesInput) (*types.RequestAccessesPayload, error) { publicTrustService := r.PublicTrustService(ctx, input.TrustCenterID.TenantID()) - access, err := publicTrustService.TrustCenterAccesses.Create(ctx, &trust.CreateTrustCenterAccessRequest{ + userData := r.UserFromContext(ctx) + if userData != nil { + return nil, fmt.Errorf("session users cannot request trust center access") + } + + email := input.Email + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + if email != nil || input.Name != nil { + return nil, fmt.Errorf("email and name are not allowed for authenticated users") + } + emailValue := tokenData.GetEmail() + email = &emailValue + } + if email == nil { + return nil, fmt.Errorf("email is required for unauthenticated users") + } + + access, err := publicTrustService.TrustCenterAccesses.Request(ctx, &trust.RequestTrustCenterAccessRequest{ TrustCenterID: input.TrustCenterID, - Email: input.Email, + Email: *email, Name: input.Name, + DocumentIDs: nil, + ReportIDs: nil, }) if err != nil { panic(fmt.Errorf("cannot create trust center access: %w", err)) } - return &types.CreateTrustCenterAccessPayload{ + return &types.RequestAccessesPayload{ TrustCenterAccess: &types.TrustCenterAccess{ ID: access.ID, Email: access.Email, @@ -101,6 +171,15 @@ func (r *mutationResolver) ExportDocumentPDF(ctx context.Context, input types.Ex if err != nil { panic(fmt.Errorf("cannot check if user has accepted NDA: %w", err)) } + + documentAccess, err := privateTrustService.TrustCenterAccesses.LoadDocumentAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), input.DocumentID) + if err != nil { + panic(fmt.Errorf("cannot check document access: %w", err)) + } + + if !documentAccess.Active { + return nil, fmt.Errorf("access denied: no permission to access this document") + } } if !hasAcceptedNDA { @@ -144,6 +223,15 @@ func (r *mutationResolver) ExportReportPDF(ctx context.Context, input types.Expo if err != nil { panic(fmt.Errorf("cannot check if user has accepted NDA: %w", err)) } + + reportAccess, err := privateTrustService.TrustCenterAccesses.LoadReportAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), input.ReportID) + if err != nil { + panic(fmt.Errorf("cannot check report access: %w", err)) + } + + if !reportAccess.Active { + return nil, fmt.Errorf("access denied: no permission to access this report") + } } if !hasAcceptedNDA { @@ -188,6 +276,94 @@ func (r *mutationResolver) AcceptNonDisclosureAgreement(ctx context.Context, inp return &types.AcceptNonDisclosureAgreementPayload{Success: true}, nil } +// RequestDocumentAccess is the resolver for the requestDocumentAccess field. +func (r *mutationResolver) RequestDocumentAccess(ctx context.Context, input types.RequestDocumentAccessInput) (*types.RequestAccessesPayload, error) { + publicTrustService := r.PublicTrustService(ctx, input.TrustCenterID.TenantID()) + + userData := r.UserFromContext(ctx) + if userData != nil { + return nil, fmt.Errorf("sessions users cannot request trust center access") + } + + email := input.Email + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + if email != nil || input.Name != nil { + return nil, fmt.Errorf("email and name are not allowed for authenticated users") + } + emailValue := tokenData.GetEmail() + email = &emailValue + } + if email == nil { + return nil, fmt.Errorf("email is required for unauthenticated users") + } + + access, err := publicTrustService.TrustCenterAccesses.Request(ctx, &trust.RequestTrustCenterAccessRequest{ + TrustCenterID: input.TrustCenterID, + Email: *email, + Name: input.Name, + DocumentIDs: []gid.GID{input.DocumentID}, + ReportIDs: []gid.GID{}, + }) + if err != nil { + panic(fmt.Errorf("cannot request document access: %w", err)) + } + + return &types.RequestAccessesPayload{ + TrustCenterAccess: &types.TrustCenterAccess{ + ID: access.ID, + Email: access.Email, + Name: access.Name, + CreatedAt: access.CreatedAt, + UpdatedAt: access.UpdatedAt, + }, + }, nil +} + +// RequestReportAccess is the resolver for the requestReportAccess field. +func (r *mutationResolver) RequestReportAccess(ctx context.Context, input types.RequestReportAccessInput) (*types.RequestAccessesPayload, error) { + publicTrustService := r.PublicTrustService(ctx, input.TrustCenterID.TenantID()) + + userData := r.UserFromContext(ctx) + if userData != nil { + return nil, fmt.Errorf("session users cannot request trust center access") + } + + email := input.Email + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + if email != nil || input.Name != nil { + return nil, fmt.Errorf("email and name are not allowed for authenticated users") + } + emailValue := tokenData.GetEmail() + email = &emailValue + } + if email == nil { + return nil, fmt.Errorf("email is required for unauthenticated users") + } + + access, err := publicTrustService.TrustCenterAccesses.Request(ctx, &trust.RequestTrustCenterAccessRequest{ + TrustCenterID: input.TrustCenterID, + Email: *email, + Name: input.Name, + DocumentIDs: []gid.GID{}, + ReportIDs: []gid.GID{input.ReportID}, + }) + if err != nil { + panic(fmt.Errorf("cannot request report access: %w", err)) + } + + return &types.RequestAccessesPayload{ + TrustCenterAccess: &types.TrustCenterAccess{ + ID: access.ID, + Email: access.Email, + Name: access.Name, + CreatedAt: access.CreatedAt, + UpdatedAt: access.UpdatedAt, + }, + }, nil +} + // LogoURL is the resolver for the logoUrl field. func (r *organizationResolver) LogoURL(ctx context.Context, obj *types.Organization) (*string, error) { publicTrustService := r.PublicTrustService(ctx, obj.ID.TenantID()) @@ -290,6 +466,55 @@ func (r *queryResolver) TrustCenterBySlug(ctx context.Context, slug string) (*ty return response, nil } +// IsUserAuthorized is the resolver for the isUserAuthorized field. +func (r *reportResolver) IsUserAuthorized(ctx context.Context, obj *types.Report) (bool, error) { + privateTrustService, err := r.PrivateTrustService(ctx, obj.ID.TenantID()) + if err != nil { + return false, nil + } + + userData := r.UserFromContext(ctx) + if userData != nil { + return true, nil + } + + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + reportAccess, err := privateTrustService.TrustCenterAccesses.LoadReportAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), obj.ID) + if err != nil { + return false, nil + } + + return reportAccess.Active, nil + } + + panic(fmt.Errorf("no user or token data found")) +} + +// HasUserRequestedAccess is the resolver for the hasUserRequestedAccess field. +func (r *reportResolver) HasUserRequestedAccess(ctx context.Context, obj *types.Report) (bool, error) { + privateTrustService, err := r.PrivateTrustService(ctx, obj.ID.TenantID()) + if err != nil { + return false, nil + } + + userData := r.UserFromContext(ctx) + if userData != nil { + return false, nil + } + + tokenData := TokenAccessFromContext(ctx) + if tokenData != nil { + _, err := privateTrustService.TrustCenterAccesses.LoadReportAccess(ctx, tokenData.TrustCenterID, tokenData.GetEmail(), obj.ID) + if err != nil { + return false, nil + } + return true, nil + } + + return false, nil +} + // NdaFileURL is the resolver for the ndaFileUrl field. func (r *trustCenterResolver) NdaFileURL(ctx context.Context, obj *types.TrustCenter) (*string, error) { privateTrustService, err := r.PrivateTrustService(ctx, obj.ID.TenantID()) @@ -432,6 +657,9 @@ func (r *trustCenterReferenceResolver) LogoURL(ctx context.Context, obj *types.T // Audit returns schema.AuditResolver implementation. func (r *Resolver) Audit() schema.AuditResolver { return &auditResolver{r} } +// Document returns schema.DocumentResolver implementation. +func (r *Resolver) Document() schema.DocumentResolver { return &documentResolver{r} } + // Mutation returns schema.MutationResolver implementation. func (r *Resolver) Mutation() schema.MutationResolver { return &mutationResolver{r} } @@ -441,6 +669,9 @@ func (r *Resolver) Organization() schema.OrganizationResolver { return &organiza // Query returns schema.QueryResolver implementation. func (r *Resolver) Query() schema.QueryResolver { return &queryResolver{r} } +// Report returns schema.ReportResolver implementation. +func (r *Resolver) Report() schema.ReportResolver { return &reportResolver{r} } + // TrustCenter returns schema.TrustCenterResolver implementation. func (r *Resolver) TrustCenter() schema.TrustCenterResolver { return &trustCenterResolver{r} } @@ -450,8 +681,10 @@ func (r *Resolver) TrustCenterReference() schema.TrustCenterReferenceResolver { } type auditResolver struct{ *Resolver } +type documentResolver struct{ *Resolver } type mutationResolver struct{ *Resolver } type organizationResolver struct{ *Resolver } type queryResolver struct{ *Resolver } +type reportResolver struct{ *Resolver } type trustCenterResolver struct{ *Resolver } type trustCenterReferenceResolver struct{ *Resolver } diff --git a/pkg/trust/trust_center_access_service.go b/pkg/trust/trust_center_access_service.go index d4c4be191..17ecd8b08 100644 --- a/pkg/trust/trust_center_access_service.go +++ b/pkg/trust/trust_center_access_service.go @@ -34,10 +34,12 @@ type ( usrmgr *usrmgr.Service } - CreateTrustCenterAccessRequest struct { + RequestTrustCenterAccessRequest struct { TrustCenterID gid.GID Email string - Name string + Name *string + DocumentIDs []gid.GID + ReportIDs []gid.GID } ) @@ -65,55 +67,107 @@ func (s TrustCenterAccessService) ValidateToken( }) } -func (s TrustCenterAccessService) Create( +func (s TrustCenterAccessService) Request( ctx context.Context, - req *CreateTrustCenterAccessRequest, + req *RequestTrustCenterAccessRequest, ) (*coredata.TrustCenterAccess, error) { - if _, err := mail.ParseAddress(req.Email); err != nil { - return nil, fmt.Errorf("invalid email address") - } - - if req.Name == "" { - return nil, fmt.Errorf("name is required") - } - now := time.Now() var access *coredata.TrustCenterAccess err := s.svc.pg.WithTx(ctx, func(tx pg.Conn) error { + var trustCenter *coredata.TrustCenter + var organizationID gid.GID + trustCenter = &coredata.TrustCenter{} + if err := trustCenter.LoadByID(ctx, tx, s.svc.scope, req.TrustCenterID); err != nil { + return fmt.Errorf("cannot load trust center: %w", err) + } + organizationID = trustCenter.OrganizationID + + documentIDs := req.DocumentIDs + if req.DocumentIDs == nil { + var allDocuments coredata.Documents + filter := coredata.NewDocumentTrustCenterFilter() + + if err := allDocuments.LoadAllByOrganizationID(ctx, tx, s.svc.scope, organizationID, filter); err != nil { + return fmt.Errorf("cannot list documents: %w", err) + } + + for _, doc := range allDocuments { + documentIDs = append(documentIDs, doc.ID) + } + } + + reportIDs := req.ReportIDs + if req.ReportIDs == nil { + var allAudits coredata.Audits + auditFilter := coredata.NewAuditTrustCenterFilter() + + if err := allAudits.LoadAllByOrganizationID(ctx, tx, s.svc.scope, organizationID, auditFilter); err != nil { + return fmt.Errorf("cannot list audits: %w", err) + } + + for _, audit := range allAudits { + if audit.ReportID != nil { + reportIDs = append(reportIDs, *audit.ReportID) + } + } + } existingAccess := &coredata.TrustCenterAccess{} err := existingAccess.LoadByTrustCenterIDAndEmail(ctx, tx, s.svc.scope, req.TrustCenterID, req.Email) if err == nil { - if existingAccess.Active { - return fmt.Errorf("active trust center access already exists for this email") - } - if err := existingAccess.Delete(ctx, tx, s.svc.scope); err != nil { - return fmt.Errorf("cannot delete existing trust center access: %w", err) - } + access = existingAccess } else { var notFoundErr *coredata.ErrTrustCenterAccessNotFound if !errors.As(err, ¬FoundErr) { return fmt.Errorf("cannot load trust center access: %w", err) } + + if req.Name == nil || *req.Name == "" { + return fmt.Errorf("name is required for new access requests") + } + + if _, err := mail.ParseAddress(req.Email); err != nil { + return fmt.Errorf("invalid email address") + } + + access = &coredata.TrustCenterAccess{ + ID: gid.New(s.svc.scope.GetTenantID(), coredata.TrustCenterAccessEntityType), + TenantID: s.svc.scope.GetTenantID(), + TrustCenterID: req.TrustCenterID, + Email: req.Email, + Name: *req.Name, + Active: false, + HasAcceptedNonDisclosureAgreement: false, + CreatedAt: now, + UpdatedAt: now, + } + + if err := access.Insert(ctx, tx, s.svc.scope); err != nil { + return fmt.Errorf("cannot insert trust center access: %w", err) + } } - access = &coredata.TrustCenterAccess{ - ID: gid.New(s.svc.scope.GetTenantID(), coredata.TrustCenterAccessEntityType), - TenantID: s.svc.scope.GetTenantID(), - TrustCenterID: req.TrustCenterID, - Email: req.Email, - Name: req.Name, - Active: false, - HasAcceptedNonDisclosureAgreement: false, - CreatedAt: now, - UpdatedAt: now, + var existingAccesses coredata.TrustCenterDocumentAccesses + if err := existingAccesses.LoadAllByTrustCenterAccessID(ctx, tx, s.svc.scope, access.ID); err != nil { + return fmt.Errorf("cannot load existing access records: %w", err) } - if err := access.Insert(ctx, tx, s.svc.scope); err != nil { - return fmt.Errorf("cannot insert trust center access: %w", err) + existingDocumentIDs, existingReportIDs := extractExistingIDs(existingAccesses) + newDocumentIDs := filterExistingIDs(documentIDs, existingDocumentIDs) + newReportIDs := filterExistingIDs(reportIDs, existingReportIDs) + + var accesses coredata.TrustCenterDocumentAccesses + + if err := accesses.BulkInsertDocumentAccesses(ctx, tx, s.svc.scope, access.ID, newDocumentIDs, now); err != nil { + return fmt.Errorf("cannot bulk insert trust center document accesses: %w", err) } + + if err := accesses.BulkInsertReportAccesses(ctx, tx, s.svc.scope, access.ID, newReportIDs, now); err != nil { + return fmt.Errorf("cannot bulk insert trust center report accesses: %w", err) + } + return nil }) @@ -168,3 +222,105 @@ func (s TrustCenterAccessService) AcceptNonDisclosureAgreement(ctx context.Conte return nil }) } + +func (s TrustCenterAccessService) LoadDocumentAccess( + ctx context.Context, + trustCenterID gid.GID, + email string, + documentID gid.GID, +) (*coredata.TrustCenterDocumentAccess, error) { + var documentAccess *coredata.TrustCenterDocumentAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + access := &coredata.TrustCenterAccess{} + err := access.LoadByTrustCenterIDAndEmail(ctx, conn, s.svc.scope, trustCenterID, email) + if err != nil { + return fmt.Errorf("cannot load trust center access: %w", err) + } + + if !access.Active { + return fmt.Errorf("trust center access is not active") + } + + documentAccess = &coredata.TrustCenterDocumentAccess{} + err = documentAccess.LoadByTrustCenterAccessIDAndDocumentID(ctx, conn, s.svc.scope, access.ID, documentID) + if err != nil { + return fmt.Errorf("cannot load document access: %w", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return documentAccess, nil +} + +func (s TrustCenterAccessService) LoadReportAccess( + ctx context.Context, + trustCenterID gid.GID, + email string, + reportID gid.GID, +) (*coredata.TrustCenterDocumentAccess, error) { + var reportAccess *coredata.TrustCenterDocumentAccess + + err := s.svc.pg.WithConn(ctx, func(conn pg.Conn) error { + access := &coredata.TrustCenterAccess{} + err := access.LoadByTrustCenterIDAndEmail(ctx, conn, s.svc.scope, trustCenterID, email) + if err != nil { + return fmt.Errorf("cannot load trust center access: %w", err) + } + + if !access.Active { + return fmt.Errorf("trust center access is not active") + } + + reportAccess = &coredata.TrustCenterDocumentAccess{} + err = reportAccess.LoadByTrustCenterAccessIDAndReportID(ctx, conn, s.svc.scope, access.ID, reportID) + if err != nil { + return fmt.Errorf("cannot load report access: %w", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return reportAccess, nil +} + +func extractExistingIDs(accesses coredata.TrustCenterDocumentAccesses) ([]gid.GID, []gid.GID) { + var documentIDs []gid.GID + var reportIDs []gid.GID + + for _, access := range accesses { + if access.DocumentID != nil { + documentIDs = append(documentIDs, *access.DocumentID) + } + if access.ReportID != nil { + reportIDs = append(reportIDs, *access.ReportID) + } + } + + return documentIDs, reportIDs +} + +func filterExistingIDs(allIDs []gid.GID, existingIDs []gid.GID) []gid.GID { + existingMap := make(map[gid.GID]bool) + for _, id := range existingIDs { + existingMap[id] = true + } + + var newIDs []gid.GID + for _, id := range allIDs { + if !existingMap[id] { + newIDs = append(newIDs, id) + } + } + + return newIDs +}