Address PR comments

This commit is contained in:
Carlos Monastyrski
2025-09-19 03:43:22 -03:00
parent 8130be5e2f
commit 27dbe5b013
72 changed files with 2913 additions and 1367 deletions
@@ -1,10 +1,10 @@
import { PkiSyncData } from "@app/hooks/api/pkiSyncs";
import { TPkiSync } from "@app/hooks/api/pkiSyncs";
import { getPkiSyncDestinationColValues } from "../helpers";
import { PkiSyncTableCell } from "../PkiSyncTableCell";
type Props = {
pkiSync: PkiSyncData;
pkiSync: TPkiSync;
};
export const PkiSyncDestinationCol = ({ pkiSync }: Props) => {
@@ -44,18 +44,18 @@ import { ProjectPermissionSub } from "@app/context";
import { ProjectPermissionPkiSyncActions } from "@app/context/ProjectPermissionContext/types";
import { PKI_SYNC_MAP } from "@app/helpers/pkiSyncs";
import { useToggle } from "@app/hooks";
import { PkiSyncData, PkiSyncStatus } from "@app/hooks/api/pkiSyncs";
import { PkiSyncStatus, TPkiSync, usePkiSyncOption } from "@app/hooks/api/pkiSyncs";
import { PkiSyncDestinationCol } from "./PkiSyncDestinationCol";
import { PkiSyncTableCell } from "./PkiSyncTableCell";
type Props = {
pkiSync: PkiSyncData;
onDelete: (pkiSync: PkiSyncData) => void;
onTriggerSyncCertificates: (pkiSync: PkiSyncData) => void;
onTriggerImportCertificates: (pkiSync: PkiSyncData) => void;
onTriggerRemoveCertificates: (pkiSync: PkiSyncData) => void;
onToggleEnable: (pkiSync: PkiSyncData) => void;
pkiSync: TPkiSync;
onDelete: (pkiSync: TPkiSync) => void;
onTriggerSyncCertificates: (pkiSync: TPkiSync) => void;
onTriggerImportCertificates: (pkiSync: TPkiSync) => void;
onTriggerRemoveCertificates: (pkiSync: TPkiSync) => void;
onToggleEnable: (pkiSync: TPkiSync) => void;
};
export const PkiSyncRow = ({
@@ -82,6 +82,8 @@ export const PkiSyncRow = ({
const destinationName = PKI_SYNC_MAP[destination].name;
const { syncOption } = usePkiSyncOption(destination);
const [isIdCopied, setIsIdCopied] = useToggle(false);
const handleCopyId = useCallback(() => {
@@ -227,7 +229,7 @@ export const PkiSyncRow = ({
{!isAutoSyncEnabled && (
<Tooltip
className="text-xs"
content="Auto-Sync is disabled. Changes to the PKI subscriber will not be automatically synced to the destination."
content="Auto-Sync is disabled. Certificate changes in the PKI subscriber will not be automatically synced to the destination."
>
<div>
<Badge className="flex h-5 w-min items-center gap-1.5 whitespace-nowrap bg-mineshaft-400/50 text-bunker-300">
@@ -237,7 +239,7 @@ export const PkiSyncRow = ({
</div>
</Tooltip>
)}
<PkiSyncImportStatusBadge mini pkiSync={pkiSync} />
{syncOption?.canImportCertificates && <PkiSyncImportStatusBadge mini pkiSync={pkiSync} />}
<PkiSyncRemoveStatusBadge mini pkiSync={pkiSync} />
</div>
</Td>
@@ -294,36 +296,38 @@ export const PkiSyncRow = ({
</DropdownMenuItem>
)}
</ProjectPermissionCan>
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.ImportCertificates}
a={permissionSubject}
>
{(isAllowed: boolean) => (
<DropdownMenuItem
icon={<FontAwesomeIcon icon={faDownload} />}
onClick={(e) => {
e.stopPropagation();
onTriggerImportCertificates(pkiSync);
}}
isDisabled={!isAllowed}
>
<Tooltip
position="left"
sideOffset={42}
content={`Import certificates from this ${destinationName} destination into Infisical.`}
{syncOption?.canImportCertificates && (
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.ImportCertificates}
a={permissionSubject}
>
{(isAllowed: boolean) => (
<DropdownMenuItem
icon={<FontAwesomeIcon icon={faDownload} />}
onClick={(e) => {
e.stopPropagation();
onTriggerImportCertificates(pkiSync);
}}
isDisabled={!isAllowed}
>
<div className="flex h-full w-full items-center justify-between gap-1">
<span>Import Certificates</span>
<FontAwesomeIcon
className="text-bunker-300"
size="sm"
icon={faInfoCircle}
/>
</div>
</Tooltip>
</DropdownMenuItem>
)}
</ProjectPermissionCan>
<Tooltip
position="left"
sideOffset={42}
content={`Import certificates from this ${destinationName} destination into Infisical.`}
>
<div className="flex h-full w-full items-center justify-between gap-1">
<span>Import Certificates</span>
<FontAwesomeIcon
className="text-bunker-300"
size="sm"
icon={faInfoCircle}
/>
</div>
</Tooltip>
</DropdownMenuItem>
)}
</ProjectPermissionCan>
)}
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.RemoveCertificates}
a={permissionSubject}
@@ -46,8 +46,8 @@ import { usePagination, usePopUp, useResetPageHelper } from "@app/hooks";
import { OrderByDirection } from "@app/hooks/api/generic/types";
import {
PkiSync,
PkiSyncData,
PkiSyncStatus,
TPkiSync,
useTriggerPkiSyncSyncCertificates,
useUpdatePkiSync
} from "@app/hooks/api/pkiSyncs";
@@ -82,7 +82,7 @@ const getSyncStatusOrderValue = (syncStatus: PkiSyncStatus | null) => {
};
type Props = {
pkiSyncs: PkiSyncData[];
pkiSyncs: TPkiSync[];
};
const STATUS_ICON_MAP = {
@@ -213,15 +213,15 @@ export const PkiSyncsTable = ({ pkiSyncs }: Props) => {
const isTableFiltered = Boolean(filters.destinations.length || filters.status.length);
const handleDelete = (pkiSync: PkiSyncData) => handlePopUpOpen("deleteSync", pkiSync);
const handleDelete = (pkiSync: TPkiSync) => handlePopUpOpen("deleteSync", pkiSync);
const handleTriggerImportCertificates = (pkiSync: PkiSyncData) =>
const handleTriggerImportCertificates = (pkiSync: TPkiSync) =>
handlePopUpOpen("importCertificates", pkiSync);
const handleTriggerRemoveCertificates = (pkiSync: PkiSyncData) =>
const handleTriggerRemoveCertificates = (pkiSync: TPkiSync) =>
handlePopUpOpen("removeCertificates", pkiSync);
const handleToggleEnableSync = async (pkiSync: PkiSyncData) => {
const handleToggleEnableSync = async (pkiSync: TPkiSync) => {
const destinationName = PKI_SYNC_MAP[pkiSync.destination].name;
const isAutoSyncEnabled = !pkiSync.isAutoSyncEnabled;
@@ -246,13 +246,12 @@ export const PkiSyncsTable = ({ pkiSyncs }: Props) => {
}
};
const handleTriggerSync = async (pkiSync: PkiSyncData) => {
const handleTriggerSync = async (pkiSync: TPkiSync) => {
const destinationName = PKI_SYNC_MAP[pkiSync.destination].name;
try {
await triggerSync.mutateAsync({
syncId: pkiSync.id,
projectId: pkiSync.projectId,
destination: pkiSync.destination
});
@@ -462,11 +461,13 @@ export const PkiSyncsTable = ({ pkiSyncs }: Props) => {
isOpen={popUp.deleteSync.isOpen}
pkiSync={popUp.deleteSync.data}
/>
<PkiSyncImportCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("importCertificates", isOpen)}
isOpen={popUp.importCertificates.isOpen}
pkiSync={popUp.importCertificates.data}
/>
{popUp.importCertificates.data && (
<PkiSyncImportCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("importCertificates", isOpen)}
isOpen={popUp.importCertificates.isOpen}
pkiSync={popUp.importCertificates.data}
/>
)}
<PkiSyncRemoveCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("removeCertificates", isOpen)}
isOpen={popUp.removeCertificates.isOpen}
@@ -1,6 +1,6 @@
import { PkiSyncData } from "@app/hooks/api/pkiSyncs";
import { TPkiSync } from "@app/hooks/api/pkiSyncs";
export const getPkiSyncDestinationColValues = (pkiSync: PkiSyncData) => {
export const getPkiSyncDestinationColValues = (pkiSync: TPkiSync) => {
const { destination } = pkiSync;
switch (destination) {
@@ -42,6 +42,7 @@ import { PKI_SYNC_MAP } from "@app/helpers/pkiSyncs";
import { usePopUp, useToggle } from "@app/hooks";
import {
TPkiSync,
usePkiSyncOption,
useTriggerPkiSyncSyncCertificates,
useUpdatePkiSync
} from "@app/hooks/api/pkiSyncs";
@@ -67,6 +68,8 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
const triggerSyncMutation = useTriggerPkiSyncSyncCertificates();
const updatePkiSyncMutation = useUpdatePkiSync();
const { syncOption } = usePkiSyncOption(destination);
const destinationName = PKI_SYNC_MAP[destination].name;
const handleCopyId = useCallback(() => {
@@ -86,7 +89,6 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
try {
await triggerSyncMutation.mutateAsync({
syncId: id,
projectId,
destination
});
createNotification({
@@ -100,7 +102,7 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
type: "error"
});
}
}, [triggerSyncMutation, id, projectId]);
}, [triggerSyncMutation, id, destination]);
const handleToggleAutoSync = useCallback(async () => {
try {
@@ -123,14 +125,14 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
}
}, [updatePkiSyncMutation, id, projectId, pkiSync.isAutoSyncEnabled]);
const permissionSubject = subscriberId
? subject(ProjectPermissionSub.PkiSyncs, { subscriberId })
: ProjectPermissionSub.PkiSyncs;
const permissionSubject = subject(ProjectPermissionSub.PkiSyncs, {
subscriberId: subscriberId || ""
});
return (
<>
<div className="ml-auto mt-4 flex flex-wrap items-center justify-end gap-2">
<PkiSyncImportStatusBadge pkiSync={pkiSync} />
{syncOption?.canImportCertificates && <PkiSyncImportStatusBadge pkiSync={pkiSync} />}
<PkiSyncRemoveStatusBadge pkiSync={pkiSync} />
{pkiSync.isAutoSyncEnabled ? (
<Badge
@@ -143,7 +145,7 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
) : (
<Tooltip
className="text-xs"
content="Auto-Sync is disabled. Changes to the PKI subscriber will not be automatically synced to the destination."
content="Auto-Sync is disabled. Certificate changes in the PKI subscriber will not be automatically synced to the destination."
>
<div>
<Badge className="flex h-5 w-min items-center gap-1.5 whitespace-nowrap bg-mineshaft-400/50 text-bunker-300">
@@ -192,33 +194,35 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
Copy Sync ID
</DropdownMenuItem>
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.ImportCertificates}
a={permissionSubject}
>
{(isAllowed: boolean) => (
<DropdownMenuItem
icon={<FontAwesomeIcon icon={faDownload} />}
onClick={() => handlePopUpOpen("importCertificates")}
isDisabled={!isAllowed}
>
<Tooltip
position="left"
sideOffset={42}
content={`Import certificates from this ${destinationName} destination into Infisical.`}
{syncOption?.canImportCertificates && (
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.ImportCertificates}
a={permissionSubject}
>
{(isAllowed: boolean) => (
<DropdownMenuItem
icon={<FontAwesomeIcon icon={faDownload} />}
onClick={() => handlePopUpOpen("importCertificates")}
isDisabled={!isAllowed}
>
<div className="flex h-full w-full items-center justify-between gap-1">
<span>Import Certificates</span>
<FontAwesomeIcon
className="text-bunker-300"
size="sm"
icon={faInfoCircle}
/>
</div>
</Tooltip>
</DropdownMenuItem>
)}
</ProjectPermissionCan>
<Tooltip
position="left"
sideOffset={42}
content={`Import certificates from this ${destinationName} destination into Infisical.`}
>
<div className="flex h-full w-full items-center justify-between gap-1">
<span>Import Certificates</span>
<FontAwesomeIcon
className="text-bunker-300"
size="sm"
icon={faInfoCircle}
/>
</div>
</Tooltip>
</DropdownMenuItem>
)}
</ProjectPermissionCan>
)}
<ProjectPermissionCan
I={ProjectPermissionPkiSyncActions.RemoveCertificates}
@@ -283,11 +287,13 @@ export const PkiSyncActionTriggers = ({ pkiSync }: Props) => {
</div>
</div>
<PkiSyncImportCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("importCertificates", isOpen)}
isOpen={popUp.importCertificates.isOpen}
pkiSync={pkiSync}
/>
{syncOption?.canImportCertificates && (
<PkiSyncImportCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("importCertificates", isOpen)}
isOpen={popUp.importCertificates.isOpen}
pkiSync={pkiSync}
/>
)}
<PkiSyncRemoveCertificatesModal
onOpenChange={(isOpen) => handlePopUpToggle("removeCertificates", isOpen)}
isOpen={popUp.removeCertificates.isOpen}
@@ -1752,7 +1752,6 @@ const SecretsManagerPermissionSubjects = (enabled = false) => ({
[ProjectPermissionSub.SecretApproval]: enabled,
[ProjectPermissionSub.Integrations]: enabled,
[ProjectPermissionSub.SecretSyncs]: enabled,
[ProjectPermissionSub.PkiSyncs]: enabled,
[ProjectPermissionSub.Kms]: enabled,
[ProjectPermissionSub.Environments]: enabled,
[ProjectPermissionSub.Tags]: enabled,
@@ -1774,6 +1773,7 @@ const CertificateManagerPermissionSubjects = (enabled = false) => ({
[ProjectPermissionSub.PkiCollections]: enabled,
[ProjectPermissionSub.PkiAlerts]: enabled,
[ProjectPermissionSub.PkiSubscribers]: enabled,
[ProjectPermissionSub.PkiSyncs]: enabled,
[ProjectPermissionSub.CertificateAuthorities]: enabled,
[ProjectPermissionSub.CertificateTemplates]: enabled,
[ProjectPermissionSub.Certificates]: enabled
@@ -2021,6 +2021,10 @@ export const RoleTemplates: Record<ProjectType, RoleTemplate[]> = {
ProjectPermissionCertificateActions.Read,
ProjectPermissionCertificateActions.ReadPrivateKey
]
},
{
subject: ProjectPermissionSub.PkiSyncs,
actions: [ProjectPermissionPkiSyncActions.Read]
}
]
},
@@ -2048,6 +2052,10 @@ export const RoleTemplates: Record<ProjectType, RoleTemplate[]> = {
{
subject: ProjectPermissionSub.Certificates,
actions: Object.values(ProjectPermissionCertificateActions)
},
{
subject: ProjectPermissionSub.PkiSyncs,
actions: Object.values(ProjectPermissionPkiSyncActions)
}
]
},
@@ -2148,10 +2156,6 @@ export const RoleTemplates: Record<ProjectType, RoleTemplate[]> = {
subject: ProjectPermissionSub.SecretSyncs,
actions: [ProjectPermissionSecretSyncActions.Read]
},
{
subject: ProjectPermissionSub.PkiSyncs,
actions: [ProjectPermissionPkiSyncActions.Read]
},
{
subject: ProjectPermissionSub.Commits,
actions: [ProjectPermissionCommitsActions.Read]
@@ -2213,10 +2217,6 @@ export const RoleTemplates: Record<ProjectType, RoleTemplate[]> = {
subject: ProjectPermissionSub.SecretSyncs,
actions: Object.values(ProjectPermissionSecretSyncActions)
},
{
subject: ProjectPermissionSub.PkiSyncs,
actions: Object.values(ProjectPermissionPkiSyncActions)
},
{
subject: ProjectPermissionSub.Commits,
actions: Object.values(ProjectPermissionCommitsActions)