From 1ef8468d0ef568b8a2cca07e4aca0af06333de60 Mon Sep 17 00:00:00 2001 From: gearnode Date: Tue, 18 Feb 2025 11:39:21 +0100 Subject: [PATCH] Add vendor privacy page Signed-off-by: gearnode --- apps/console/src/pages/VendorOverviewPage.tsx | 19 ++++++ .../VendorOverviewPageQuery.graphql.ts | 24 +++++--- pkg/api/console/v1/schema.graphql | 2 + pkg/api/console/v1/schema/schema.go | 60 ++++++++++++++++++- pkg/api/console/v1/types/types.go | 2 + pkg/api/console/v1/types/vendor.go | 1 + .../coredata/migrations/20250218T113800Z.sql | 1 + pkg/probo/coredata/vendor.go | 7 +++ 8 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 pkg/probo/coredata/migrations/20250218T113800Z.sql diff --git a/apps/console/src/pages/VendorOverviewPage.tsx b/apps/console/src/pages/VendorOverviewPage.tsx index 319b5a655..4b0c2303c 100644 --- a/apps/console/src/pages/VendorOverviewPage.tsx +++ b/apps/console/src/pages/VendorOverviewPage.tsx @@ -29,6 +29,7 @@ const vendorOverviewPageQuery = graphql` riskTier statusPageUrl termsOfServiceUrl + privacyPolicyUrl createdAt updatedAt } @@ -229,6 +230,24 @@ function VendorOverviewPageContent({ )} + + {data.node.privacyPolicyUrl && ( +
+
+ + +
+ + View Privacy Policy + + +
+ )} diff --git a/apps/console/src/pages/__generated__/VendorOverviewPageQuery.graphql.ts b/apps/console/src/pages/__generated__/VendorOverviewPageQuery.graphql.ts index f6bb182db..d142901cb 100644 --- a/apps/console/src/pages/__generated__/VendorOverviewPageQuery.graphql.ts +++ b/apps/console/src/pages/__generated__/VendorOverviewPageQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<7a271eaf4694d17694f97b2326dd865f>> * @lightSyntaxTransform * @nogrep */ @@ -20,6 +20,7 @@ export type VendorOverviewPageQuery$data = { readonly description?: string; readonly id?: string; readonly name?: string; + readonly privacyPolicyUrl?: string | null | undefined; readonly riskTier?: RiskTier; readonly serviceCriticality?: ServiceCriticality; readonly serviceStartDate?: any; @@ -116,10 +117,17 @@ v11 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "createdAt", + "name": "privacyPolicyUrl", "storageKey": null }, v12 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "createdAt", + "storageKey": null +}, +v13 = { "alias": null, "args": null, "kind": "ScalarField", @@ -154,7 +162,8 @@ return { (v9/*: any*/), (v10/*: any*/), (v11/*: any*/), - (v12/*: any*/) + (v12/*: any*/), + (v13/*: any*/) ], "type": "Vendor", "abstractKey": null @@ -200,7 +209,8 @@ return { (v9/*: any*/), (v10/*: any*/), (v11/*: any*/), - (v12/*: any*/) + (v12/*: any*/), + (v13/*: any*/) ], "type": "Vendor", "abstractKey": null @@ -211,16 +221,16 @@ return { ] }, "params": { - "cacheID": "37f7dba24b43c13a4e5467dd58fdfcd6", + "cacheID": "ad3e9f79ffd96f45f653bc45311f162e", "id": null, "metadata": {}, "name": "VendorOverviewPageQuery", "operationKind": "query", - "text": "query VendorOverviewPageQuery(\n $vendorId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n serviceStartDate\n serviceTerminationDate\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n createdAt\n updatedAt\n }\n id\n }\n}\n" + "text": "query VendorOverviewPageQuery(\n $vendorId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n serviceStartDate\n serviceTerminationDate\n serviceCriticality\n riskTier\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n createdAt\n updatedAt\n }\n id\n }\n}\n" } }; })(); -(node as any).hash = "86f10af28dac38699127a302a42aca12"; +(node as any).hash = "8fe48d1033182deff812f17769927ef2"; export default node; diff --git a/pkg/api/console/v1/schema.graphql b/pkg/api/console/v1/schema.graphql index c39c7f5b2..b1733abc3 100644 --- a/pkg/api/console/v1/schema.graphql +++ b/pkg/api/console/v1/schema.graphql @@ -124,6 +124,7 @@ type Vendor implements Node { riskTier: RiskTier! statusPageUrl: String termsOfServiceUrl: String + privacyPolicyUrl: String } type FrameworkConnection { @@ -360,4 +361,5 @@ input UpdateVendorInput { riskTier: RiskTier statusPageUrl: String termsOfServiceUrl: String + privacyPolicyUrl: String } \ No newline at end of file diff --git a/pkg/api/console/v1/schema/schema.go b/pkg/api/console/v1/schema/schema.go index e47d7f2c8..63672d5fa 100644 --- a/pkg/api/console/v1/schema/schema.go +++ b/pkg/api/console/v1/schema/schema.go @@ -249,6 +249,7 @@ type ComplexityRoot struct { Description func(childComplexity int) int ID func(childComplexity int) int Name func(childComplexity int) int + PrivacyPolicyURL func(childComplexity int) int RiskTier func(childComplexity int) int ServiceCriticality func(childComplexity int) int ServiceStartDate func(childComplexity int) int @@ -1150,6 +1151,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Vendor.Name(childComplexity), true + case "Vendor.privacyPolicyUrl": + if e.complexity.Vendor.PrivacyPolicyURL == nil { + break + } + + return e.complexity.Vendor.PrivacyPolicyURL(childComplexity), true + case "Vendor.riskTier": if e.complexity.Vendor.RiskTier == nil { break @@ -1463,6 +1471,7 @@ type Vendor implements Node { riskTier: RiskTier! statusPageUrl: String termsOfServiceUrl: String + privacyPolicyUrl: String } type FrameworkConnection { @@ -1699,6 +1708,7 @@ input UpdateVendorInput { riskTier: RiskTier statusPageUrl: String termsOfServiceUrl: String + privacyPolicyUrl: String }`, BuiltIn: false}, } var parsedSchema = gqlparser.MustLoadSchema(sources...) @@ -4929,6 +4939,8 @@ func (ec *executionContext) fieldContext_Mutation_createVendor(ctx context.Conte return ec.fieldContext_Vendor_statusPageUrl(ctx, field) case "termsOfServiceUrl": return ec.fieldContext_Vendor_termsOfServiceUrl(ctx, field) + case "privacyPolicyUrl": + return ec.fieldContext_Vendor_privacyPolicyUrl(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Vendor", field.Name) }, @@ -7498,6 +7510,41 @@ func (ec *executionContext) fieldContext_Vendor_termsOfServiceUrl(_ context.Cont return fc, nil } +func (ec *executionContext) _Vendor_privacyPolicyUrl(ctx context.Context, field graphql.CollectedField, obj *types.Vendor) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Vendor_privacyPolicyUrl(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.PrivacyPolicyURL, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2áš–string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Vendor_privacyPolicyUrl(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Vendor", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _VendorConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.VendorConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_VendorConnection_edges(ctx, field) if err != nil { @@ -7683,6 +7730,8 @@ func (ec *executionContext) fieldContext_VendorEdge_node(_ context.Context, fiel return ec.fieldContext_Vendor_statusPageUrl(ctx, field) case "termsOfServiceUrl": return ec.fieldContext_Vendor_termsOfServiceUrl(ctx, field) + case "privacyPolicyUrl": + return ec.fieldContext_Vendor_privacyPolicyUrl(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Vendor", field.Name) }, @@ -9391,7 +9440,7 @@ func (ec *executionContext) unmarshalInputUpdateVendorInput(ctx context.Context, asMap[k] = v } - fieldsInOrder := [...]string{"id", "name", "description", "serviceStartDate", "serviceTerminationDate", "serviceCriticality", "riskTier", "statusPageUrl", "termsOfServiceUrl"} + fieldsInOrder := [...]string{"id", "name", "description", "serviceStartDate", "serviceTerminationDate", "serviceCriticality", "riskTier", "statusPageUrl", "termsOfServiceUrl", "privacyPolicyUrl"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -9461,6 +9510,13 @@ func (ec *executionContext) unmarshalInputUpdateVendorInput(ctx context.Context, return it, err } it.TermsOfServiceURL = data + case "privacyPolicyUrl": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("privacyPolicyUrl")) + data, err := ec.unmarshalOString2áš–string(ctx, v) + if err != nil { + return it, err + } + it.PrivacyPolicyURL = data } } @@ -11321,6 +11377,8 @@ func (ec *executionContext) _Vendor(ctx context.Context, sel ast.SelectionSet, o out.Values[i] = ec._Vendor_statusPageUrl(ctx, field, obj) case "termsOfServiceUrl": out.Values[i] = ec._Vendor_termsOfServiceUrl(ctx, field, obj) + case "privacyPolicyUrl": + out.Values[i] = ec._Vendor_privacyPolicyUrl(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } diff --git a/pkg/api/console/v1/types/types.go b/pkg/api/console/v1/types/types.go index 94b696d50..a5369a21f 100644 --- a/pkg/api/console/v1/types/types.go +++ b/pkg/api/console/v1/types/types.go @@ -248,6 +248,7 @@ type UpdateVendorInput struct { RiskTier *coredata.RiskTier `json:"riskTier,omitempty"` StatusPageURL *string `json:"statusPageUrl,omitempty"` TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"` + PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"` } type Vendor struct { @@ -262,6 +263,7 @@ type Vendor struct { RiskTier coredata.RiskTier `json:"riskTier"` StatusPageURL *string `json:"statusPageUrl,omitempty"` TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"` + PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"` } func (Vendor) IsNode() {} diff --git a/pkg/api/console/v1/types/vendor.go b/pkg/api/console/v1/types/vendor.go index 1d2669fa8..2a9610948 100644 --- a/pkg/api/console/v1/types/vendor.go +++ b/pkg/api/console/v1/types/vendor.go @@ -52,5 +52,6 @@ func NewVendor(v *coredata.Vendor) *Vendor { RiskTier: v.RiskTier, StatusPageURL: v.StatusPageURL, TermsOfServiceURL: v.TermsOfServiceURL, + PrivacyPolicyURL: v.PrivacyPolicyURL, } } diff --git a/pkg/probo/coredata/migrations/20250218T113800Z.sql b/pkg/probo/coredata/migrations/20250218T113800Z.sql new file mode 100644 index 000000000..b57a01897 --- /dev/null +++ b/pkg/probo/coredata/migrations/20250218T113800Z.sql @@ -0,0 +1 @@ +ALTER TABLE vendors ADD COLUMN privacy_policy_url TEXT; \ No newline at end of file diff --git a/pkg/probo/coredata/vendor.go b/pkg/probo/coredata/vendor.go index 5d86c0c52..21e16e169 100644 --- a/pkg/probo/coredata/vendor.go +++ b/pkg/probo/coredata/vendor.go @@ -38,6 +38,7 @@ type ( RiskTier RiskTier StatusPageURL *string TermsOfServiceURL *string + PrivacyPolicyURL *string CreatedAt time.Time UpdatedAt time.Time } @@ -61,6 +62,7 @@ func (v *Vendor) scan(r pgx.Row) error { &v.RiskTier, &v.StatusPageURL, &v.TermsOfServiceURL, + &v.PrivacyPolicyURL, &v.CreatedAt, &v.UpdatedAt, ) @@ -84,6 +86,7 @@ SELECT risk_tier, status_page_url, terms_of_service_url, + privacy_policy_url, created_at, updated_at FROM @@ -128,6 +131,7 @@ INSERT INTO risk_tier, status_page_url, terms_of_service_url, + privacy_policy_url, created_at, updated_at ) @@ -142,6 +146,7 @@ VALUES ( @risk_tier, @status_page_url, @terms_of_service_url, + @privacy_policy_url, @created_at, @updated_at ) @@ -158,6 +163,7 @@ VALUES ( "risk_tier": v.RiskTier, "status_page_url": v.StatusPageURL, "terms_of_service_url": v.TermsOfServiceURL, + "privacy_policy_url": v.PrivacyPolicyURL, "created_at": v.CreatedAt, "updated_at": v.UpdatedAt, } @@ -202,6 +208,7 @@ SELECT risk_tier, status_page_url, terms_of_service_url, + privacy_policy_url, created_at, updated_at FROM