Remove start and end service date

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-05-01 09:13:07 -07:00
parent 25614d5ea1
commit 83aee67419
14 changed files with 137 additions and 424 deletions

View File

@@ -13,6 +13,10 @@ All notable changes to this project will be documented in this file.
- Fix not aligned button on policy list view
### Removed
- Remove start and end service date of vendor
## [0.19.2] - 2025-05-01
### Fixed

View File

@@ -414,7 +414,6 @@ function ListVendorContent({
trustPageUrl: vendor.trustPageUrl,
statusPageUrl: vendor.statusPageUrl,
termsOfServiceUrl: vendor.termsOfServiceUrl,
serviceStartAt: new Date().toISOString(),
},
},
onCompleted() {
@@ -455,7 +454,6 @@ function ListVendorContent({
organizationId: data.organization.id,
name: searchTerm.trim(),
description: "",
serviceStartAt: new Date().toISOString(),
},
},
onCompleted() {

View File

@@ -36,8 +36,6 @@ const vendorViewQuery = graphql`
id
name
description
serviceStartAt
serviceTerminationAt
statusPageUrl
termsOfServiceUrl
privacyPolicyUrl
@@ -113,8 +111,6 @@ const updateVendorMutation = graphql`
id
name
description
serviceStartAt
serviceTerminationAt
statusPageUrl
termsOfServiceUrl
privacyPolicyUrl
@@ -949,8 +945,6 @@ function VendorViewContent({
const [formData, setFormData] = useState({
name: data.node.name || "",
description: data.node.description || "",
serviceStartAt: formatDateForInput(data.node.serviceStartAt),
serviceTerminationAt: formatDateForInput(data.node.serviceTerminationAt),
statusPageUrl: data.node.statusPageUrl || "",
termsOfServiceUrl: data.node.termsOfServiceUrl || "",
privacyPolicyUrl: data.node.privacyPolicyUrl || "",
@@ -987,10 +981,6 @@ function VendorViewContent({
const handleSave = useCallback(() => {
const formattedData = {
...formData,
serviceStartAt: formatDateForAPI(formData.serviceStartAt),
serviceTerminationAt: formData.serviceTerminationAt
? formatDateForAPI(formData.serviceTerminationAt)
: null,
businessOwnerId: formData.businessOwnerId || undefined,
securityOwnerId: formData.securityOwnerId || undefined,
};
@@ -1083,8 +1073,6 @@ function VendorViewContent({
setFormData({
name: data.node.name || "",
description: data.node.description || "",
serviceStartAt: formatDateForInput(data.node.serviceStartAt),
serviceTerminationAt: formatDateForInput(data.node.serviceTerminationAt),
statusPageUrl: data.node.statusPageUrl || "",
termsOfServiceUrl: data.node.termsOfServiceUrl || "",
privacyPolicyUrl: data.node.privacyPolicyUrl || "",
@@ -1417,39 +1405,6 @@ function VendorViewContent({
</div>
</div>
{/* Risk & Service Information card */}
<div className="rounded-xl border border-border bg-white p-0 overflow-hidden">
<div className="px-5 py-4 border-b border-[rgba(2,42,2,0.08)]">
<h3 className="text-base font-medium">Risk & Service Information</h3>
</div>
<div className="p-5 space-y-4">
<div className="space-y-1">
<p className="text-sm font-medium text-[#6B716A]">Start date</p>
<div className="inline-block bg-[rgba(5,77,5,0.03)] rounded-lg px-3 py-2">
<Input
type="datetime-local"
value={formData.serviceStartAt}
onChange={(e) => handleFieldChange("serviceStartAt", e.target.value)}
className="border-0 bg-transparent p-0 shadow-none focus-visible:ring-0 w-auto"
/>
</div>
</div>
<div className="space-y-1">
<p className="text-sm font-medium text-[#6B716A]">End date</p>
<div className="inline-block bg-[rgba(5,77,5,0.03)] rounded-lg px-3 py-2">
<Input
type="datetime-local"
value={formData.serviceTerminationAt}
onChange={(e) => handleFieldChange("serviceTerminationAt", e.target.value)}
className="border-0 bg-transparent p-0 shadow-none focus-visible:ring-0 w-auto"
placeholder="Select"
/>
</div>
</div>
</div>
</div>
{/* Links card */}
<div className="rounded-xl border border-border bg-white p-0 overflow-hidden">
<div className="px-5 py-4 border-b border-[rgba(2,42,2,0.08)]">

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<55ac3df9e65daff882c0d44f7b4904c2>>
* @generated SignedSource<<c911b01b560dfe4143e7ffd06650ff58>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -23,8 +23,6 @@ export type CreateVendorInput = {
securityOwnerId?: string | null | undefined;
securityPageUrl?: string | null | undefined;
serviceLevelAgreementUrl?: string | null | undefined;
serviceStartAt: string;
serviceTerminationAt?: string | null | undefined;
statusPageUrl?: string | null | undefined;
termsOfServiceUrl?: string | null | undefined;
trustPageUrl?: string | null | undefined;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<c189e0079d6d90c845d93a6a108a0b76>>
* @generated SignedSource<<2a33eeb4651f6afe0a8f06f44c0f2711>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -67,8 +67,6 @@ export type VendorViewQuery$data = {
} | null | undefined;
readonly securityPageUrl?: string | null | undefined;
readonly serviceLevelAgreementUrl?: string | null | undefined;
readonly serviceStartAt?: string;
readonly serviceTerminationAt?: string | null | undefined;
readonly statusPageUrl?: string | null | undefined;
readonly termsOfServiceUrl?: string | null | undefined;
readonly trustPageUrl?: string | null | undefined;
@@ -134,153 +132,139 @@ v6 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceStartAt",
"name": "statusPageUrl",
"storageKey": null
},
v7 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceTerminationAt",
"name": "termsOfServiceUrl",
"storageKey": null
},
v8 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "statusPageUrl",
"name": "privacyPolicyUrl",
"storageKey": null
},
v9 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "termsOfServiceUrl",
"name": "serviceLevelAgreementUrl",
"storageKey": null
},
v10 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "privacyPolicyUrl",
"name": "dataProcessingAgreementUrl",
"storageKey": null
},
v11 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceLevelAgreementUrl",
"name": "securityPageUrl",
"storageKey": null
},
v12 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "dataProcessingAgreementUrl",
"name": "trustPageUrl",
"storageKey": null
},
v13 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "securityPageUrl",
"name": "certifications",
"storageKey": null
},
v14 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "trustPageUrl",
"name": "headquarterAddress",
"storageKey": null
},
v15 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "certifications",
"name": "legalName",
"storageKey": null
},
v16 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "headquarterAddress",
"name": "websiteUrl",
"storageKey": null
},
v17 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "legalName",
"storageKey": null
},
v18 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "websiteUrl",
"storageKey": null
},
v19 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
v20 = [
v18 = [
(v3/*: any*/),
(v19/*: any*/)
(v17/*: any*/)
],
v21 = {
v19 = {
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "businessOwner",
"plural": false,
"selections": (v20/*: any*/),
"selections": (v18/*: any*/),
"storageKey": null
},
v22 = {
v20 = {
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "securityOwner",
"plural": false,
"selections": (v20/*: any*/),
"selections": (v18/*: any*/),
"storageKey": null
},
v23 = {
v21 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
v24 = {
v22 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"storageKey": null
},
v25 = {
v23 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v26 = {
v24 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
},
v27 = {
v25 = {
"alias": null,
"args": null,
"concreteType": "PageInfo",
@@ -305,7 +289,7 @@ v27 = {
],
"storageKey": null
},
v28 = [
v26 = [
{
"alias": null,
"args": null,
@@ -358,18 +342,18 @@ v28 = [
"name": "fileSize",
"storageKey": null
},
(v23/*: any*/),
(v25/*: any*/)
(v21/*: any*/),
(v23/*: any*/)
],
"storageKey": null
},
(v26/*: any*/)
(v24/*: any*/)
],
"storageKey": null
},
(v27/*: any*/)
(v25/*: any*/)
],
v29 = [
v27 = [
{
"alias": null,
"args": null,
@@ -429,28 +413,28 @@ v29 = [
"kind": "LinkedField",
"name": "assessedBy",
"plural": false,
"selections": (v20/*: any*/),
"selections": (v18/*: any*/),
"storageKey": null
},
(v23/*: any*/),
(v25/*: any*/)
(v21/*: any*/),
(v23/*: any*/)
],
"storageKey": null
},
(v26/*: any*/)
(v24/*: any*/)
],
"storageKey": null
},
(v27/*: any*/)
(v25/*: any*/)
],
v30 = [
v28 = [
{
"kind": "Variable",
"name": "id",
"variableName": "organizationId"
}
],
v31 = {
v29 = {
"alias": null,
"args": [
{
@@ -468,16 +452,16 @@ v31 = {
],
"storageKey": null
},
v32 = {
v30 = {
"kind": "Literal",
"name": "first",
"value": 100
},
v33 = [
(v32/*: any*/)
v31 = [
(v30/*: any*/)
],
v34 = [
(v32/*: any*/),
v32 = [
(v30/*: any*/),
{
"kind": "Literal",
"name": "orderBy",
@@ -522,12 +506,10 @@ return {
(v14/*: any*/),
(v15/*: any*/),
(v16/*: any*/),
(v17/*: any*/),
(v18/*: any*/),
(v19/*: any*/),
(v20/*: any*/),
(v21/*: any*/),
(v22/*: any*/),
(v23/*: any*/),
(v24/*: any*/),
{
"alias": "complianceReports",
"args": null,
@@ -535,7 +517,7 @@ return {
"kind": "LinkedField",
"name": "__VendorView_complianceReports_connection",
"plural": false,
"selections": (v28/*: any*/),
"selections": (v26/*: any*/),
"storageKey": null
},
{
@@ -545,7 +527,7 @@ return {
"kind": "LinkedField",
"name": "__VendorView_riskAssessments_connection",
"plural": false,
"selections": (v29/*: any*/),
"selections": (v27/*: any*/),
"storageKey": null
}
],
@@ -557,7 +539,7 @@ return {
},
{
"alias": "organization",
"args": (v30/*: any*/),
"args": (v28/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
@@ -587,7 +569,7 @@ return {
"name": "user",
"plural": false,
"selections": [
(v31/*: any*/)
(v29/*: any*/)
],
"storageKey": null
}
@@ -615,7 +597,7 @@ return {
"name": "node",
"plural": false,
"selections": [
(v25/*: any*/),
(v23/*: any*/),
(v3/*: any*/),
{
"kind": "InlineFragment",
@@ -633,25 +615,23 @@ return {
(v14/*: any*/),
(v15/*: any*/),
(v16/*: any*/),
(v17/*: any*/),
(v18/*: any*/),
(v19/*: any*/),
(v20/*: any*/),
(v21/*: any*/),
(v22/*: any*/),
(v23/*: any*/),
(v24/*: any*/),
{
"alias": null,
"args": (v33/*: any*/),
"args": (v31/*: any*/),
"concreteType": "VendorComplianceReportConnection",
"kind": "LinkedField",
"name": "complianceReports",
"plural": false,
"selections": (v28/*: any*/),
"selections": (v26/*: any*/),
"storageKey": "complianceReports(first:100)"
},
{
"alias": null,
"args": (v33/*: any*/),
"args": (v31/*: any*/),
"filters": null,
"handle": "connection",
"key": "VendorView_complianceReports",
@@ -660,17 +640,17 @@ return {
},
{
"alias": null,
"args": (v33/*: any*/),
"args": (v31/*: any*/),
"concreteType": "VendorRiskAssessmentConnection",
"kind": "LinkedField",
"name": "riskAssessments",
"plural": false,
"selections": (v29/*: any*/),
"selections": (v27/*: any*/),
"storageKey": "riskAssessments(first:100)"
},
{
"alias": null,
"args": (v33/*: any*/),
"args": (v31/*: any*/),
"filters": null,
"handle": "connection",
"key": "VendorView_riskAssessments",
@@ -686,20 +666,20 @@ return {
},
{
"alias": "organization",
"args": (v30/*: any*/),
"args": (v28/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v25/*: any*/),
(v23/*: any*/),
(v3/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v34/*: any*/),
"args": (v32/*: any*/),
"concreteType": "PeopleConnection",
"kind": "LinkedField",
"name": "peoples",
@@ -722,7 +702,7 @@ return {
"plural": false,
"selections": [
(v3/*: any*/),
(v19/*: any*/),
(v17/*: any*/),
{
"alias": null,
"args": null,
@@ -730,21 +710,21 @@ return {
"name": "primaryEmailAddress",
"storageKey": null
},
(v25/*: any*/)
(v23/*: any*/)
],
"storageKey": null
},
(v26/*: any*/)
(v24/*: any*/)
],
"storageKey": null
},
(v27/*: any*/)
(v25/*: any*/)
],
"storageKey": "peoples(first:100,orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})"
},
{
"alias": null,
"args": (v34/*: any*/),
"args": (v32/*: any*/),
"filters": [
"orderBy"
],
@@ -776,7 +756,7 @@ return {
"name": "user",
"plural": false,
"selections": [
(v31/*: any*/),
(v29/*: any*/),
(v3/*: any*/)
],
"storageKey": null
@@ -788,7 +768,7 @@ return {
]
},
"params": {
"cacheID": "9b2a625a96210e0168dceed7e4b98ed0",
"cacheID": "d80a66271806001a76348db9398ae760",
"id": null,
"metadata": {
"connection": [
@@ -814,11 +794,11 @@ return {
},
"name": "VendorViewQuery",
"operationKind": "query",
"text": "query VendorViewQuery(\n $vendorId: ID!\n $organizationId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n businessOwner {\n id\n fullName\n }\n securityOwner {\n id\n fullName\n }\n createdAt\n updatedAt\n complianceReports(first: 100) {\n edges {\n node {\n id\n reportName\n reportDate\n validUntil\n fileUrl\n fileSize\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n riskAssessments(first: 100) {\n edges {\n node {\n id\n assessedAt\n expiresAt\n dataSensitivity\n businessImpact\n notes\n assessedBy {\n id\n fullName\n }\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n organization: node(id: $organizationId) {\n __typename\n ...PeopleSelector_organization\n id\n }\n viewer {\n user {\n people(organizationId: $organizationId) {\n id\n }\n id\n }\n id\n }\n}\n\nfragment PeopleSelector_organization on Organization {\n id\n peoples(first: 100, orderBy: {direction: ASC, field: FULL_NAME}) {\n edges {\n node {\n id\n fullName\n primaryEmailAddress\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n"
"text": "query VendorViewQuery(\n $vendorId: ID!\n $organizationId: ID!\n) {\n node(id: $vendorId) {\n __typename\n ... on Vendor {\n id\n name\n description\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n businessOwner {\n id\n fullName\n }\n securityOwner {\n id\n fullName\n }\n createdAt\n updatedAt\n complianceReports(first: 100) {\n edges {\n node {\n id\n reportName\n reportDate\n validUntil\n fileUrl\n fileSize\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n riskAssessments(first: 100) {\n edges {\n node {\n id\n assessedAt\n expiresAt\n dataSensitivity\n businessImpact\n notes\n assessedBy {\n id\n fullName\n }\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n organization: node(id: $organizationId) {\n __typename\n ...PeopleSelector_organization\n id\n }\n viewer {\n user {\n people(organizationId: $organizationId) {\n id\n }\n id\n }\n id\n }\n}\n\nfragment PeopleSelector_organization on Organization {\n id\n peoples(first: 100, orderBy: {direction: ASC, field: FULL_NAME}) {\n edges {\n node {\n id\n fullName\n primaryEmailAddress\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n"
}
};
})();
(node as any).hash = "7f9a178bd20cefd76440ea8d71c3b2fa";
(node as any).hash = "97cacb4f4410588114fc82abc78d9140";
export default node;

View File

@@ -1,5 +1,5 @@
/**
* @generated SignedSource<<574565aac89550e684dc54b21327b565>>
* @generated SignedSource<<9089536ddf16d713cfc68bd20f8f8caf>>
* @lightSyntaxTransform
* @nogrep
*/
@@ -23,8 +23,6 @@ export type UpdateVendorInput = {
securityOwnerId?: string | null | undefined;
securityPageUrl?: string | null | undefined;
serviceLevelAgreementUrl?: string | null | undefined;
serviceStartAt?: string | null | undefined;
serviceTerminationAt?: string | null | undefined;
statusPageUrl?: string | null | undefined;
termsOfServiceUrl?: string | null | undefined;
trustPageUrl?: string | null | undefined;
@@ -54,8 +52,6 @@ export type VendorViewUpdateVendorMutation$data = {
} | null | undefined;
readonly securityPageUrl: string | null | undefined;
readonly serviceLevelAgreementUrl: string | null | undefined;
readonly serviceStartAt: string;
readonly serviceTerminationAt: string | null | undefined;
readonly statusPageUrl: string | null | undefined;
readonly termsOfServiceUrl: string | null | undefined;
readonly trustPageUrl: string | null | undefined;
@@ -132,20 +128,6 @@ v3 = [
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceStartAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "serviceTerminationAt",
"storageKey": null
},
{
"alias": null,
"args": null,
@@ -275,16 +257,16 @@ return {
"selections": (v3/*: any*/)
},
"params": {
"cacheID": "9e2c4c33246b4aa469cdd737be1e690a",
"cacheID": "c539b8cd35be693bea445fa86c473bfd",
"id": null,
"metadata": {},
"name": "VendorViewUpdateVendorMutation",
"operationKind": "mutation",
"text": "mutation VendorViewUpdateVendorMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n id\n name\n description\n serviceStartAt\n serviceTerminationAt\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n businessOwner {\n id\n fullName\n }\n securityOwner {\n id\n fullName\n }\n updatedAt\n }\n }\n}\n"
"text": "mutation VendorViewUpdateVendorMutation(\n $input: UpdateVendorInput!\n) {\n updateVendor(input: $input) {\n vendor {\n id\n name\n description\n statusPageUrl\n termsOfServiceUrl\n privacyPolicyUrl\n serviceLevelAgreementUrl\n dataProcessingAgreementUrl\n securityPageUrl\n trustPageUrl\n certifications\n headquarterAddress\n legalName\n websiteUrl\n businessOwner {\n id\n fullName\n }\n securityOwner {\n id\n fullName\n }\n updatedAt\n }\n }\n}\n"
}
};
})();
(node as any).hash = "58c28ca0307e1b27f2ebb72c3c2e7535";
(node as any).hash = "478f755b8d9a6b7f7deec1b3a1c71d07";
export default node;

View File

@@ -0,0 +1,2 @@
ALTER TABLE vendors DROP COLUMN service_start_at;
ALTER TABLE vendors DROP COLUMN service_termination_at;

View File

@@ -28,28 +28,26 @@ import (
type (
Vendor struct {
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
Name string `db:"name"`
Description *string `db:"description"`
Category string `db:"category"`
ServiceStartAt time.Time `db:"service_start_at"`
ServiceTerminationAt *time.Time `db:"service_termination_at"`
HeadquarterAddress *string `db:"headquarter_address"`
LegalName *string `db:"legal_name"`
WebsiteURL *string `db:"website_url"`
PrivacyPolicyURL *string `db:"privacy_policy_url"`
ServiceLevelAgreementURL *string `db:"service_level_agreement_url"`
DataProcessingAgreementURL *string `db:"data_processing_agreement_url"`
Certifications []string `db:"certifications"`
BusinessOwnerID *gid.GID `db:"business_owner_id"`
SecurityOwnerID *gid.GID `db:"security_owner_id"`
StatusPageURL *string `db:"status_page_url"`
TermsOfServiceURL *string `db:"terms_of_service_url"`
SecurityPageURL *string `db:"security_page_url"`
TrustPageURL *string `db:"trust_page_url"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
Name string `db:"name"`
Description *string `db:"description"`
Category string `db:"category"`
HeadquarterAddress *string `db:"headquarter_address"`
LegalName *string `db:"legal_name"`
WebsiteURL *string `db:"website_url"`
PrivacyPolicyURL *string `db:"privacy_policy_url"`
ServiceLevelAgreementURL *string `db:"service_level_agreement_url"`
DataProcessingAgreementURL *string `db:"data_processing_agreement_url"`
Certifications []string `db:"certifications"`
BusinessOwnerID *gid.GID `db:"business_owner_id"`
SecurityOwnerID *gid.GID `db:"security_owner_id"`
StatusPageURL *string `db:"status_page_url"`
TermsOfServiceURL *string `db:"terms_of_service_url"`
SecurityPageURL *string `db:"security_page_url"`
TrustPageURL *string `db:"trust_page_url"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
Vendors []*Vendor
@@ -82,8 +80,6 @@ SELECT
headquarter_address,
legal_name,
website_url,
service_start_at,
service_termination_at,
privacy_policy_url,
service_level_agreement_url,
data_processing_agreement_url,
@@ -146,8 +142,6 @@ INSERT INTO
service_level_agreement_url,
data_processing_agreement_url,
certifications,
service_start_at,
service_termination_at,
business_owner_id,
security_owner_id,
status_page_url,
@@ -171,8 +165,6 @@ VALUES (
@service_level_agreement_url,
@data_processing_agreement_url,
@certifications,
@service_start_at,
@service_termination_at,
@business_owner_id,
@security_owner_id,
@status_page_url,
@@ -198,8 +190,6 @@ VALUES (
"service_level_agreement_url": v.ServiceLevelAgreementURL,
"data_processing_agreement_url": v.DataProcessingAgreementURL,
"certifications": v.Certifications,
"service_start_at": v.ServiceStartAt,
"service_termination_at": v.ServiceTerminationAt,
"business_owner_id": v.BusinessOwnerID,
"security_owner_id": v.SecurityOwnerID,
"status_page_url": v.StatusPageURL,
@@ -252,8 +242,6 @@ SELECT
service_level_agreement_url,
data_processing_agreement_url,
certifications,
service_start_at,
service_termination_at,
business_owner_id,
security_owner_id,
status_page_url,
@@ -300,8 +288,6 @@ UPDATE vendors
SET
name = @name,
description = @description,
service_start_at = @service_start_at,
service_termination_at = @service_termination_at,
category = @category,
headquarter_address = @headquarter_address,
legal_name = @legal_name,
@@ -327,8 +313,6 @@ WHERE %s
"updated_at": time.Now(),
"name": v.Name,
"description": v.Description,
"service_start_at": v.ServiceStartAt,
"service_termination_at": v.ServiceTerminationAt,
"category": v.Category,
"headquarter_address": v.HeadquarterAddress,
"legal_name": v.LegalName,

View File

@@ -46,8 +46,6 @@ type (
TrustPageURL *string
TermsOfServiceURL *string
StatusPageURL *string
ServiceStartAt time.Time
ServiceTerminationAt *time.Time
BusinessOwnerID *gid.GID
SecurityOwnerID *gid.GID
}
@@ -68,8 +66,6 @@ type (
SecurityPageURL *string
TrustPageURL *string
StatusPageURL *string
ServiceStartAt *time.Time
ServiceTerminationAt *time.Time
BusinessOwnerID *gid.GID
SecurityOwnerID *gid.GID
}
@@ -132,14 +128,6 @@ func (s VendorService) Update(
vendor.Description = req.Description
}
if req.ServiceStartAt != nil {
vendor.ServiceStartAt = *req.ServiceStartAt
}
if req.ServiceTerminationAt != nil {
vendor.ServiceTerminationAt = req.ServiceTerminationAt
}
if req.StatusPageURL != nil {
vendor.StatusPageURL = req.StatusPageURL
}
@@ -277,8 +265,6 @@ func (s VendorService) Create(
CreatedAt: now,
UpdatedAt: now,
Description: req.Description,
ServiceStartAt: req.ServiceStartAt,
ServiceTerminationAt: req.ServiceTerminationAt,
HeadquarterAddress: req.HeadquarterAddress,
LegalName: req.LegalName,
WebsiteURL: req.WebsiteURL,

View File

@@ -517,8 +517,6 @@ type Vendor implements Node {
businessOwner: People @goField(forceResolver: true)
securityOwner: People @goField(forceResolver: true)
serviceStartAt: Datetime!
serviceTerminationAt: Datetime
statusPageUrl: String
termsOfServiceUrl: String
privacyPolicyUrl: String
@@ -1043,8 +1041,6 @@ input CreateVendorInput {
trustPageUrl: String
statusPageUrl: String
termsOfServiceUrl: String
serviceStartAt: Datetime!
serviceTerminationAt: Datetime
businessOwnerId: ID
securityOwnerId: ID
}
@@ -1053,8 +1049,6 @@ input UpdateVendorInput {
id: ID!
name: String
description: String
serviceStartAt: Datetime
serviceTerminationAt: Datetime
statusPageUrl: String
termsOfServiceUrl: String
privacyPolicyUrl: String

View File

@@ -648,8 +648,6 @@ type ComplexityRoot struct {
SecurityOwner func(childComplexity int) int
SecurityPageURL func(childComplexity int) int
ServiceLevelAgreementURL func(childComplexity int) int
ServiceStartAt func(childComplexity int) int
ServiceTerminationAt func(childComplexity int) int
StatusPageURL func(childComplexity int) int
TermsOfServiceURL func(childComplexity int) int
TrustPageURL func(childComplexity int) int
@@ -3346,20 +3344,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Vendor.ServiceLevelAgreementURL(childComplexity), true
case "Vendor.serviceStartAt":
if e.complexity.Vendor.ServiceStartAt == nil {
break
}
return e.complexity.Vendor.ServiceStartAt(childComplexity), true
case "Vendor.serviceTerminationAt":
if e.complexity.Vendor.ServiceTerminationAt == nil {
break
}
return e.complexity.Vendor.ServiceTerminationAt(childComplexity), true
case "Vendor.statusPageUrl":
if e.complexity.Vendor.StatusPageURL == nil {
break
@@ -4330,8 +4314,6 @@ type Vendor implements Node {
businessOwner: People @goField(forceResolver: true)
securityOwner: People @goField(forceResolver: true)
serviceStartAt: Datetime!
serviceTerminationAt: Datetime
statusPageUrl: String
termsOfServiceUrl: String
privacyPolicyUrl: String
@@ -4856,8 +4838,6 @@ input CreateVendorInput {
trustPageUrl: String
statusPageUrl: String
termsOfServiceUrl: String
serviceStartAt: Datetime!
serviceTerminationAt: Datetime
businessOwnerId: ID
securityOwnerId: ID
}
@@ -4866,8 +4846,6 @@ input UpdateVendorInput {
id: ID!
name: String
description: String
serviceStartAt: Datetime
serviceTerminationAt: Datetime
statusPageUrl: String
termsOfServiceUrl: String
privacyPolicyUrl: String
@@ -23341,10 +23319,6 @@ func (ec *executionContext) fieldContext_UpdateVendorPayload_vendor(_ context.Co
return ec.fieldContext_Vendor_businessOwner(ctx, field)
case "securityOwner":
return ec.fieldContext_Vendor_securityOwner(ctx, field)
case "serviceStartAt":
return ec.fieldContext_Vendor_serviceStartAt(ctx, field)
case "serviceTerminationAt":
return ec.fieldContext_Vendor_serviceTerminationAt(ctx, field)
case "statusPageUrl":
return ec.fieldContext_Vendor_statusPageUrl(ctx, field)
case "termsOfServiceUrl":
@@ -24287,91 +24261,6 @@ func (ec *executionContext) fieldContext_Vendor_securityOwner(_ context.Context,
return fc, nil
}
func (ec *executionContext) _Vendor_serviceStartAt(ctx context.Context, field graphql.CollectedField, obj *types.Vendor) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Vendor_serviceStartAt(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.ServiceStartAt, 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_Vendor_serviceStartAt(_ 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 Datetime does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _Vendor_serviceTerminationAt(ctx context.Context, field graphql.CollectedField, obj *types.Vendor) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Vendor_serviceTerminationAt(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.ServiceTerminationAt, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*time.Time)
fc.Result = res
return ec.marshalODatetime2ᚖtimeᚐTime(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_Vendor_serviceTerminationAt(_ 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 Datetime does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _Vendor_statusPageUrl(ctx context.Context, field graphql.CollectedField, obj *types.Vendor) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Vendor_statusPageUrl(ctx, field)
if err != nil {
@@ -25011,10 +24900,6 @@ func (ec *executionContext) fieldContext_VendorComplianceReport_vendor(_ context
return ec.fieldContext_Vendor_businessOwner(ctx, field)
case "securityOwner":
return ec.fieldContext_Vendor_securityOwner(ctx, field)
case "serviceStartAt":
return ec.fieldContext_Vendor_serviceStartAt(ctx, field)
case "serviceTerminationAt":
return ec.fieldContext_Vendor_serviceTerminationAt(ctx, field)
case "statusPageUrl":
return ec.fieldContext_Vendor_statusPageUrl(ctx, field)
case "termsOfServiceUrl":
@@ -25766,10 +25651,6 @@ func (ec *executionContext) fieldContext_VendorEdge_node(_ context.Context, fiel
return ec.fieldContext_Vendor_businessOwner(ctx, field)
case "securityOwner":
return ec.fieldContext_Vendor_securityOwner(ctx, field)
case "serviceStartAt":
return ec.fieldContext_Vendor_serviceStartAt(ctx, field)
case "serviceTerminationAt":
return ec.fieldContext_Vendor_serviceTerminationAt(ctx, field)
case "statusPageUrl":
return ec.fieldContext_Vendor_statusPageUrl(ctx, field)
case "termsOfServiceUrl":
@@ -25900,10 +25781,6 @@ func (ec *executionContext) fieldContext_VendorRiskAssessment_vendor(_ context.C
return ec.fieldContext_Vendor_businessOwner(ctx, field)
case "securityOwner":
return ec.fieldContext_Vendor_securityOwner(ctx, field)
case "serviceStartAt":
return ec.fieldContext_Vendor_serviceStartAt(ctx, field)
case "serviceTerminationAt":
return ec.fieldContext_Vendor_serviceTerminationAt(ctx, field)
case "statusPageUrl":
return ec.fieldContext_Vendor_statusPageUrl(ctx, field)
case "termsOfServiceUrl":
@@ -29362,7 +29239,7 @@ func (ec *executionContext) unmarshalInputCreateVendorInput(ctx context.Context,
asMap[k] = v
}
fieldsInOrder := [...]string{"organizationId", "name", "description", "headquarterAddress", "legalName", "websiteUrl", "privacyPolicyUrl", "category", "serviceLevelAgreementUrl", "dataProcessingAgreementUrl", "certifications", "securityPageUrl", "trustPageUrl", "statusPageUrl", "termsOfServiceUrl", "serviceStartAt", "serviceTerminationAt", "businessOwnerId", "securityOwnerId"}
fieldsInOrder := [...]string{"organizationId", "name", "description", "headquarterAddress", "legalName", "websiteUrl", "privacyPolicyUrl", "category", "serviceLevelAgreementUrl", "dataProcessingAgreementUrl", "certifications", "securityPageUrl", "trustPageUrl", "statusPageUrl", "termsOfServiceUrl", "businessOwnerId", "securityOwnerId"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -29474,20 +29351,6 @@ func (ec *executionContext) unmarshalInputCreateVendorInput(ctx context.Context,
return it, err
}
it.TermsOfServiceURL = data
case "serviceStartAt":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("serviceStartAt"))
data, err := ec.unmarshalNDatetime2timeᚐTime(ctx, v)
if err != nil {
return it, err
}
it.ServiceStartAt = data
case "serviceTerminationAt":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("serviceTerminationAt"))
data, err := ec.unmarshalODatetime2ᚖtimeᚐTime(ctx, v)
if err != nil {
return it, err
}
it.ServiceTerminationAt = data
case "businessOwnerId":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("businessOwnerId"))
data, err := ec.unmarshalOID2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋgidᚐGID(ctx, v)
@@ -31137,7 +31000,7 @@ func (ec *executionContext) unmarshalInputUpdateVendorInput(ctx context.Context,
asMap[k] = v
}
fieldsInOrder := [...]string{"id", "name", "description", "serviceStartAt", "serviceTerminationAt", "statusPageUrl", "termsOfServiceUrl", "privacyPolicyUrl", "serviceLevelAgreementUrl", "dataProcessingAgreementUrl", "websiteUrl", "legalName", "headquarterAddress", "category", "certifications", "securityPageUrl", "trustPageUrl", "businessOwnerId", "securityOwnerId"}
fieldsInOrder := [...]string{"id", "name", "description", "statusPageUrl", "termsOfServiceUrl", "privacyPolicyUrl", "serviceLevelAgreementUrl", "dataProcessingAgreementUrl", "websiteUrl", "legalName", "headquarterAddress", "category", "certifications", "securityPageUrl", "trustPageUrl", "businessOwnerId", "securityOwnerId"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -31165,20 +31028,6 @@ func (ec *executionContext) unmarshalInputUpdateVendorInput(ctx context.Context,
return it, err
}
it.Description = data
case "serviceStartAt":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("serviceStartAt"))
data, err := ec.unmarshalODatetime2ᚖtimeᚐTime(ctx, v)
if err != nil {
return it, err
}
it.ServiceStartAt = data
case "serviceTerminationAt":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("serviceTerminationAt"))
data, err := ec.unmarshalODatetime2ᚖtimeᚐTime(ctx, v)
if err != nil {
return it, err
}
it.ServiceTerminationAt = data
case "statusPageUrl":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("statusPageUrl"))
data, err := ec.unmarshalOString2ᚖstring(ctx, v)
@@ -37496,13 +37345,6 @@ func (ec *executionContext) _Vendor(ctx context.Context, sel ast.SelectionSet, o
}
out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) })
case "serviceStartAt":
out.Values[i] = ec._Vendor_serviceStartAt(ctx, field, obj)
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "serviceTerminationAt":
out.Values[i] = ec._Vendor_serviceTerminationAt(ctx, field, obj)
case "statusPageUrl":
out.Values[i] = ec._Vendor_statusPageUrl(ctx, field, obj)
case "termsOfServiceUrl":

View File

@@ -227,25 +227,23 @@ type CreateTaskPayload struct {
}
type CreateVendorInput struct {
OrganizationID gid.GID `json:"organizationId"`
Name string `json:"name"`
Description *string `json:"description,omitempty"`
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`
LegalName *string `json:"legalName,omitempty"`
WebsiteURL *string `json:"websiteUrl,omitempty"`
PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"`
Category *string `json:"category,omitempty"`
ServiceLevelAgreementURL *string `json:"serviceLevelAgreementUrl,omitempty"`
DataProcessingAgreementURL *string `json:"dataProcessingAgreementUrl,omitempty"`
Certifications []string `json:"certifications,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"`
ServiceStartAt time.Time `json:"serviceStartAt"`
ServiceTerminationAt *time.Time `json:"serviceTerminationAt,omitempty"`
BusinessOwnerID *gid.GID `json:"businessOwnerId,omitempty"`
SecurityOwnerID *gid.GID `json:"securityOwnerId,omitempty"`
OrganizationID gid.GID `json:"organizationId"`
Name string `json:"name"`
Description *string `json:"description,omitempty"`
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`
LegalName *string `json:"legalName,omitempty"`
WebsiteURL *string `json:"websiteUrl,omitempty"`
PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"`
Category *string `json:"category,omitempty"`
ServiceLevelAgreementURL *string `json:"serviceLevelAgreementUrl,omitempty"`
DataProcessingAgreementURL *string `json:"dataProcessingAgreementUrl,omitempty"`
Certifications []string `json:"certifications,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"`
BusinessOwnerID *gid.GID `json:"businessOwnerId,omitempty"`
SecurityOwnerID *gid.GID `json:"securityOwnerId,omitempty"`
}
type CreateVendorPayload struct {
@@ -865,25 +863,23 @@ type UpdateTaskPayload struct {
}
type UpdateVendorInput struct {
ID gid.GID `json:"id"`
Name *string `json:"name,omitempty"`
Description *string `json:"description,omitempty"`
ServiceStartAt *time.Time `json:"serviceStartAt,omitempty"`
ServiceTerminationAt *time.Time `json:"serviceTerminationAt,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"`
PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"`
ServiceLevelAgreementURL *string `json:"serviceLevelAgreementUrl,omitempty"`
DataProcessingAgreementURL *string `json:"dataProcessingAgreementUrl,omitempty"`
WebsiteURL *string `json:"websiteUrl,omitempty"`
LegalName *string `json:"legalName,omitempty"`
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`
Category *string `json:"category,omitempty"`
Certifications []string `json:"certifications,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
BusinessOwnerID *gid.GID `json:"businessOwnerId,omitempty"`
SecurityOwnerID *gid.GID `json:"securityOwnerId,omitempty"`
ID gid.GID `json:"id"`
Name *string `json:"name,omitempty"`
Description *string `json:"description,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"`
PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"`
ServiceLevelAgreementURL *string `json:"serviceLevelAgreementUrl,omitempty"`
DataProcessingAgreementURL *string `json:"dataProcessingAgreementUrl,omitempty"`
WebsiteURL *string `json:"websiteUrl,omitempty"`
LegalName *string `json:"legalName,omitempty"`
HeadquarterAddress *string `json:"headquarterAddress,omitempty"`
Category *string `json:"category,omitempty"`
Certifications []string `json:"certifications,omitempty"`
SecurityPageURL *string `json:"securityPageUrl,omitempty"`
TrustPageURL *string `json:"trustPageUrl,omitempty"`
BusinessOwnerID *gid.GID `json:"businessOwnerId,omitempty"`
SecurityOwnerID *gid.GID `json:"securityOwnerId,omitempty"`
}
type UpdateVendorPayload struct {
@@ -932,8 +928,6 @@ type Vendor struct {
RiskAssessments *VendorRiskAssessmentConnection `json:"riskAssessments"`
BusinessOwner *People `json:"businessOwner,omitempty"`
SecurityOwner *People `json:"securityOwner,omitempty"`
ServiceStartAt time.Time `json:"serviceStartAt"`
ServiceTerminationAt *time.Time `json:"serviceTerminationAt,omitempty"`
StatusPageURL *string `json:"statusPageUrl,omitempty"`
TermsOfServiceURL *string `json:"termsOfServiceUrl,omitempty"`
PrivacyPolicyURL *string `json:"privacyPolicyUrl,omitempty"`

View File

@@ -48,10 +48,6 @@ func NewVendor(v *coredata.Vendor) *Vendor {
ID: v.ID,
Name: v.Name,
Description: v.Description,
CreatedAt: v.CreatedAt,
UpdatedAt: v.UpdatedAt,
ServiceStartAt: v.ServiceStartAt,
ServiceTerminationAt: v.ServiceTerminationAt,
StatusPageURL: v.StatusPageURL,
TermsOfServiceURL: v.TermsOfServiceURL,
PrivacyPolicyURL: v.PrivacyPolicyURL,
@@ -63,5 +59,7 @@ func NewVendor(v *coredata.Vendor) *Vendor {
HeadquarterAddress: v.HeadquarterAddress,
LegalName: v.LegalName,
WebsiteURL: v.WebsiteURL,
UpdatedAt: v.UpdatedAt,
CreatedAt: v.CreatedAt,
}
}

View File

@@ -377,8 +377,6 @@ func (r *mutationResolver) CreateVendor(ctx context.Context, input types.CreateV
OrganizationID: input.OrganizationID,
Name: input.Name,
Description: input.Description,
ServiceStartAt: input.ServiceStartAt,
ServiceTerminationAt: input.ServiceTerminationAt,
StatusPageURL: input.StatusPageURL,
TermsOfServiceURL: input.TermsOfServiceURL,
PrivacyPolicyURL: input.PrivacyPolicyURL,
@@ -411,8 +409,6 @@ func (r *mutationResolver) UpdateVendor(ctx context.Context, input types.UpdateV
ID: input.ID,
Name: input.Name,
Description: input.Description,
ServiceStartAt: input.ServiceStartAt,
ServiceTerminationAt: input.ServiceTerminationAt,
StatusPageURL: input.StatusPageURL,
TermsOfServiceURL: input.TermsOfServiceURL,
PrivacyPolicyURL: input.PrivacyPolicyURL,