Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"@nestjs/swagger": "^11.2.0",
"@trycompai/db": "^1.3.4",
"archiver": "^7.0.1",
"axios": "^1.12.2",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.2",
"jose": "^6.0.12",
Expand Down
16 changes: 16 additions & 0 deletions apps/app/public/badges/pci-dss.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
'use server';

import { db } from '@db';
import { revalidatePath, revalidateTag } from 'next/cache';
import { headers } from 'next/headers';
import { authActionClient } from '../safe-action';
import { organizationAdvancedModeSchema } from '../schema';

export const updateOrganizationAdvancedModeAction = authActionClient
.inputSchema(organizationAdvancedModeSchema)
.metadata({
name: 'update-organization-advanced-mode',
track: {
event: 'update-organization-advanced-mode',
channel: 'server',
},
})
.action(async ({ parsedInput, ctx }) => {
const { advancedModeEnabled } = parsedInput;
const { activeOrganizationId } = ctx.session;

if (!activeOrganizationId) {
throw new Error('No active organization');
}

try {
await db.$transaction(async () => {
await db.organization.update({
where: { id: activeOrganizationId },
data: { advancedModeEnabled },
});
});

const headersList = await headers();
let path = headersList.get('x-pathname') || headersList.get('referer') || '';
path = path.replace(/\/[a-z]{2}\//, '/');

revalidatePath(path);
revalidateTag(`organization_${activeOrganizationId}`);

return {
success: true,
};
} catch (error) {
console.error(error);
throw new Error('Failed to update advanced mode setting');
}
});
4 changes: 4 additions & 0 deletions apps/app/src/actions/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ export const organizationWebsiteSchema = z.object({
.max(255, 'Website cannot exceed 255 characters'),
});

export const organizationAdvancedModeSchema = z.object({
advancedModeEnabled: z.boolean(),
});

// Risks
export const createRiskSchema = z.object({
title: z
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ export function mapFrameworkToBadge(framework: FrameworkInstanceWithControls) {
return '/badges/gdpr.svg';
}

if (framework.framework.name === 'PCI DSS') {
return '/badges/pci-dss.svg';
}

return null;
}

Expand Down
5 changes: 5 additions & 0 deletions apps/app/src/app/(app)/[orgId]/settings/page.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { DeleteOrganization } from '@/components/forms/organization/delete-organization';
import { UpdateOrganizationAdvancedMode } from '@/components/forms/organization/update-organization-advanced-mode';
import { UpdateOrganizationName } from '@/components/forms/organization/update-organization-name';
import { UpdateOrganizationWebsite } from '@/components/forms/organization/update-organization-website';
import { auth } from '@/utils/auth';
Expand All @@ -14,6 +15,9 @@ export default async function OrganizationSettings() {
<div className="space-y-4">
<UpdateOrganizationName organizationName={organization?.name ?? ''} />
<UpdateOrganizationWebsite organizationWebsite={organization?.website ?? ''} />
<UpdateOrganizationAdvancedMode
advancedModeEnabled={organization?.advancedModeEnabled ?? false}
/>
<DeleteOrganization organizationId={organization?.id ?? ''} />
</div>
);
Expand All @@ -40,6 +44,7 @@ const organizationDetails = cache(async () => {
name: true,
id: true,
website: true,
advancedModeEnabled: true,
},
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,34 @@ import { headers } from 'next/headers';

interface UpdateTrustPortalFrameworksParams {
orgId: string;
soc2?: boolean;
soc2type1?: boolean;
soc2type2?: boolean;
iso27001?: boolean;
gdpr?: boolean;
hipaa?: boolean;
soc2Status?: 'started' | 'in_progress' | 'compliant';
pcidss?: boolean;
soc2type1Status?: 'started' | 'in_progress' | 'compliant';
soc2type2Status?: 'started' | 'in_progress' | 'compliant';
iso27001Status?: 'started' | 'in_progress' | 'compliant';
gdprStatus?: 'started' | 'in_progress' | 'compliant';
hipaaStatus?: 'started' | 'in_progress' | 'compliant';
pcidssStatus?: 'started' | 'in_progress' | 'compliant';
}

export async function updateTrustPortalFrameworks({
orgId,
soc2,
soc2type1,
soc2type2,
iso27001,
gdpr,
hipaa,
soc2Status,
pcidss,
soc2type1Status,
soc2type2Status,
iso27001Status,
gdprStatus,
hipaaStatus,
pcidssStatus,
}: UpdateTrustPortalFrameworksParams) {
const session = await auth.api.getSession({
headers: await headers(),
Expand All @@ -51,14 +59,20 @@ export async function updateTrustPortalFrameworks({
organizationId: orgId,
},
data: {
soc2: soc2 ?? trustPortal.soc2,
soc2: soc2type2 ?? trustPortal.soc2,
soc2type1: soc2type1 ?? trustPortal.soc2type1,
soc2type2: soc2type2 ?? trustPortal.soc2type2,
iso27001: iso27001 ?? trustPortal.iso27001,
gdpr: gdpr ?? trustPortal.gdpr,
hipaa: hipaa ?? trustPortal.hipaa,
soc2_status: soc2Status ?? trustPortal.soc2_status,
pci_dss: pcidss ?? trustPortal.pci_dss,
soc2_status: soc2type2Status ?? trustPortal.soc2_status,
soc2type1_status: soc2type1Status ?? trustPortal.soc2type1_status,
soc2type2_status: soc2type2Status ?? trustPortal.soc2type2_status,
iso27001_status: iso27001Status ?? trustPortal.iso27001_status,
gdpr_status: gdprStatus ?? trustPortal.gdpr_status,
hipaa_status: hipaaStatus ?? trustPortal.hipaa_status,
pci_dss_status: pcidssStatus ?? trustPortal.pci_dss_status,
},
});

Expand Down
Loading
Loading