diff --git a/backend/src/db/migrations/20240423070528_audit-log-stream.ts b/backend/src/db/migrations/20240423070528_audit-log-stream.ts index 0fac59be8..c4133fb94 100644 --- a/backend/src/db/migrations/20240423070528_audit-log-stream.ts +++ b/backend/src/db/migrations/20240423070528_audit-log-stream.ts @@ -13,8 +13,8 @@ export async function up(knex: Knex): Promise { t.text("encryptedTokenTag"); t.string("encryptedTokenAlgorithm"); t.string("encryptedTokenKeyEncoding"); - t.string("projectId").notNullable(); - t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE"); + t.uuid("orgId").notNullable(); + t.foreign("orgId").references("id").inTable(TableName.Organization).onDelete("CASCADE"); t.timestamps(true, true, true); }); } diff --git a/backend/src/db/schemas/audit-log-streams.ts b/backend/src/db/schemas/audit-log-streams.ts index 154c865de..bab73d0c5 100644 --- a/backend/src/db/schemas/audit-log-streams.ts +++ b/backend/src/db/schemas/audit-log-streams.ts @@ -15,7 +15,7 @@ export const AuditLogStreamsSchema = z.object({ encryptedTokenTag: z.string().nullable().optional(), encryptedTokenAlgorithm: z.string().nullable().optional(), encryptedTokenKeyEncoding: z.string().nullable().optional(), - projectId: z.string(), + orgId: z.string().uuid(), createdAt: z.date(), updatedAt: z.date() }); diff --git a/backend/src/ee/routes/v1/audit-log-stream-router.ts b/backend/src/ee/routes/v1/audit-log-stream-router.ts index a3dcac78c..d11b74cc3 100644 --- a/backend/src/ee/routes/v1/audit-log-stream-router.ts +++ b/backend/src/ee/routes/v1/audit-log-stream-router.ts @@ -21,7 +21,6 @@ export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) = } ], body: z.object({ - projectSlug: z.string().min(1).describe(AUDIT_LOG_STREAMS.CREATE.projectSlug), url: z.string().min(1).describe(AUDIT_LOG_STREAMS.CREATE.url), token: z.string().optional().describe(AUDIT_LOG_STREAMS.CREATE.token) }), @@ -38,7 +37,6 @@ export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) = actor: req.permission.type, actorOrgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, - projectSlug: req.body.projectSlug, url: req.body.url, token: req.body.token }); @@ -174,9 +172,6 @@ export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) = bearerAuth: [] } ], - querystring: z.object({ - projectSlug: z.string().describe(AUDIT_LOG_STREAMS.LIST.projectSlug) - }), response: { 200: z.object({ auditLogStreams: SanitizedAuditLogStreamSchema.array() @@ -189,8 +184,7 @@ export const registerAuditLogStreamRouter = async (server: FastifyZodProvider) = actorId: req.permission.id, actor: req.permission.type, actorOrgId: req.permission.orgId, - actorAuthMethod: req.permission.authMethod, - projectSlug: req.query.projectSlug + actorAuthMethod: req.permission.authMethod }); return { auditLogStreams }; diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts index 87cb3294a..cff4ed49a 100644 --- a/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-service.ts @@ -4,11 +4,10 @@ import { SecretKeyEncoding } from "@app/db/schemas"; import { infisicalSymmetricDecrypt, infisicalSymmetricEncypt } from "@app/lib/crypto/encryption"; import { BadRequestError } from "@app/lib/errors"; import { validateLocalIps } from "@app/lib/validator"; -import { TProjectDALFactory } from "@app/services/project/project-dal"; import { TLicenseServiceFactory } from "../license/license-service"; +import { OrgPermissionActions, OrgPermissionSubjects } from "../permission/org-permission"; import { TPermissionServiceFactory } from "../permission/permission-service"; -import { ProjectPermissionActions, ProjectPermissionSub } from "../permission/project-permission"; import { TAuditLogStreamDALFactory } from "./audit-log-stream-dal"; import { TCreateAuditLogStreamDTO, @@ -20,8 +19,7 @@ import { type TAuditLogStreamServiceFactoryDep = { auditLogStreamDAL: TAuditLogStreamDALFactory; - permissionService: Pick; - projectDAL: Pick; + permissionService: Pick; licenseService: Pick; }; @@ -30,40 +28,29 @@ export type TAuditLogStreamServiceFactory = ReturnType { - const create = async ({ - projectSlug, - url, - actor, - token, - actorId, - actorOrgId, - actorAuthMethod - }: TCreateAuditLogStreamDTO) => { + const create = async ({ url, actor, token, actorId, actorOrgId, actorAuthMethod }: TCreateAuditLogStreamDTO) => { + if (!actorOrgId) throw new BadRequestError({ message: "Missing org id from token" }); + const plan = await licenseService.getPlan(actorOrgId); if (!plan.auditLogStreams) throw new BadRequestError({ message: "Failed to create audit log streams due to plan restriction. Upgrade plan to create group." }); - const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); - if (!project) throw new BadRequestError({ message: "Project not found" }); - const projectId = project.id; - - const { permission } = await permissionService.getProjectPermission( + const { permission } = await permissionService.getOrgPermission( actor, actorId, - projectId, + actorOrgId, actorAuthMethod, actorOrgId ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Create, ProjectPermissionSub.Settings); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Create, OrgPermissionSubjects.Settings); validateLocalIps(url); - const totalStreams = await auditLogStreamDAL.find({ projectId }); + const totalStreams = await auditLogStreamDAL.find({ orgId: actorOrgId }); if (totalStreams.length >= plan.auditLogStreamLimit) { throw new BadRequestError({ message: @@ -72,7 +59,7 @@ export const auditLogStreamServiceFactory = ({ } const encryptedToken = token ? infisicalSymmetricEncypt(token) : undefined; const logStream = await auditLogStreamDAL.create({ - projectId, + orgId: actorOrgId, url, ...(encryptedToken ? { @@ -96,6 +83,8 @@ export const auditLogStreamServiceFactory = ({ actorOrgId, actorAuthMethod }: TUpdateAuditLogStreamDTO) => { + if (!actorOrgId) throw new BadRequestError({ message: "Missing org id from token" }); + const plan = await licenseService.getPlan(actorOrgId); if (!plan.auditLogStreams) throw new BadRequestError({ @@ -105,20 +94,13 @@ export const auditLogStreamServiceFactory = ({ const logStream = await auditLogStreamDAL.findById(id); if (!logStream) throw new BadRequestError({ message: "Audit log stream not found" }); - const { projectId } = logStream; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Edit, ProjectPermissionSub.Settings); + const { orgId } = logStream; + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); if (url) validateLocalIps(url); const encryptedToken = token ? infisicalSymmetricEncypt(token) : undefined; const updatedLogStream = await auditLogStreamDAL.updateById(id, { - projectId, url, ...(encryptedToken ? { @@ -134,18 +116,14 @@ export const auditLogStreamServiceFactory = ({ }; const deleteById = async ({ id, actor, actorId, actorOrgId, actorAuthMethod }: TDeleteAuditLogStreamDTO) => { + if (!actorOrgId) throw new BadRequestError({ message: "Missing org id from token" }); + const logStream = await auditLogStreamDAL.findById(id); if (!logStream) throw new BadRequestError({ message: "Audit log stream not found" }); - const { projectId } = logStream; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.Settings); + const { orgId } = logStream; + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.Settings); const deletedLogStream = await auditLogStreamDAL.deleteById(id); return deletedLogStream; @@ -155,15 +133,10 @@ export const auditLogStreamServiceFactory = ({ const logStream = await auditLogStreamDAL.findById(id); if (!logStream) throw new BadRequestError({ message: "Audit log stream not found" }); - const { projectId } = logStream; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Settings); + const { orgId } = logStream; + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); + const token = logStream?.encryptedTokenCiphertext && logStream?.encryptedTokenIV && logStream?.encryptedTokenTag ? infisicalSymmetricDecrypt({ @@ -177,21 +150,17 @@ export const auditLogStreamServiceFactory = ({ return { ...logStream, token }; }; - const list = async ({ projectSlug, actor, actorId, actorOrgId, actorAuthMethod }: TListAuditLogStreamDTO) => { - const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); - if (!project) throw new BadRequestError({ message: "Project not found" }); - const projectId = project.id; - - const { permission } = await permissionService.getProjectPermission( + const list = async ({ actor, actorId, actorOrgId, actorAuthMethod }: TListAuditLogStreamDTO) => { + const { permission } = await permissionService.getOrgPermission( actor, actorId, - projectId, + actorOrgId, actorAuthMethod, actorOrgId ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Create, ProjectPermissionSub.Settings); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); - const logStreams = await auditLogStreamDAL.find({ projectId }); + const logStreams = await auditLogStreamDAL.find({ orgId: actorOrgId }); return logStreams; }; diff --git a/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts b/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts index f25c423fa..ec8c14923 100644 --- a/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts +++ b/backend/src/ee/services/audit-log-stream/audit-log-stream-types.ts @@ -1,25 +1,22 @@ -import { TProjectPermission } from "@app/lib/types"; +import { TOrgPermission } from "@app/lib/types"; -export type TCreateAuditLogStreamDTO = Omit & { - projectSlug: string; +export type TCreateAuditLogStreamDTO = Omit & { url: string; token?: string; }; -export type TUpdateAuditLogStreamDTO = Omit & { +export type TUpdateAuditLogStreamDTO = Omit & { id: string; url?: string; token?: string; }; -export type TDeleteAuditLogStreamDTO = Omit & { +export type TDeleteAuditLogStreamDTO = Omit & { id: string; }; -export type TListAuditLogStreamDTO = Omit & { - projectSlug: string; -}; +export type TListAuditLogStreamDTO = Omit; -export type TGetDetailsAuditLogStreamDTO = Omit & { +export type TGetDetailsAuditLogStreamDTO = Omit & { id: string; }; diff --git a/backend/src/ee/services/audit-log/audit-log-queue.ts b/backend/src/ee/services/audit-log/audit-log-queue.ts index 09083eabf..75a733289 100644 --- a/backend/src/ee/services/audit-log/audit-log-queue.ts +++ b/backend/src/ee/services/audit-log/audit-log-queue.ts @@ -71,7 +71,7 @@ export const auditLogQueueServiceFactory = ({ userAgentType }); - const logStreams = projectId ? await auditLogStreamDAL.find({ projectId }) : []; + const logStreams = orgId ? await auditLogStreamDAL.find({ orgId }) : []; await Promise.allSettled( logStreams.map( async ({ url, encryptedTokenTag, encryptedTokenIV, encryptedTokenKeyEncoding, encryptedTokenCiphertext }) => { diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index d8b1c6469..2ede304f2 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -617,7 +617,6 @@ export const INTEGRATION = { export const AUDIT_LOG_STREAMS = { CREATE: { - projectSlug: "The slug of the project to create audit log stream.", url: "The socket URL to push logs to.", token: "Authentication token for the external provider used for identification." }, @@ -629,9 +628,6 @@ export const AUDIT_LOG_STREAMS = { DELETE: { id: "The ID of the audit log stream to delete." }, - LIST: { - projectSlug: "The slug of the project to list audit log streams." - }, GET_BY_ID: { id: "The ID of the audit log stream to get details." } diff --git a/backend/src/lib/types/index.ts b/backend/src/lib/types/index.ts index b3b46e739..2c41f4d23 100644 --- a/backend/src/lib/types/index.ts +++ b/backend/src/lib/types/index.ts @@ -17,7 +17,7 @@ export type TOrgPermission = { actorId: string; orgId: string; actorAuthMethod: ActorAuthMethod; - actorOrgId: string | undefined; + actorOrgId: string; }; export type TProjectPermission = { diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index d53256bc2..25e807cc2 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -251,7 +251,6 @@ export const registerRoutes = async ( }); const auditLogService = auditLogServiceFactory({ auditLogDAL, permissionService, auditLogQueue }); const auditLogStreamService = auditLogStreamServiceFactory({ - projectDAL, licenseService, permissionService, auditLogStreamDAL diff --git a/frontend/src/hooks/api/auditLogStreams/mutations.tsx b/frontend/src/hooks/api/auditLogStreams/mutations.tsx index 902efbb57..2d99f57c4 100644 --- a/frontend/src/hooks/api/auditLogStreams/mutations.tsx +++ b/frontend/src/hooks/api/auditLogStreams/mutations.tsx @@ -21,8 +21,8 @@ export const useCreateAuditLogStream = () => { ); return data; }, - onSuccess: (_, { projectSlug }) => { - queryClient.invalidateQueries(auditLogStreamKeys.list(projectSlug)); + onSuccess: (_, { orgId }) => { + queryClient.invalidateQueries(auditLogStreamKeys.list(orgId)); } }); }; @@ -38,8 +38,8 @@ export const useUpdateAuditLogStream = () => { ); return data; }, - onSuccess: (_, { projectSlug }) => { - queryClient.invalidateQueries(auditLogStreamKeys.list(projectSlug)); + onSuccess: (_, { orgId }) => { + queryClient.invalidateQueries(auditLogStreamKeys.list(orgId)); } }); }; @@ -54,8 +54,8 @@ export const useDeleteAuditLogStream = () => { ); return data; }, - onSuccess: (_, { projectSlug }) => { - queryClient.invalidateQueries(auditLogStreamKeys.list(projectSlug)); + onSuccess: (_, { orgId }) => { + queryClient.invalidateQueries(auditLogStreamKeys.list(orgId)); } }); }; diff --git a/frontend/src/hooks/api/auditLogStreams/queries.tsx b/frontend/src/hooks/api/auditLogStreams/queries.tsx index 4c636ac28..f86ca0dce 100644 --- a/frontend/src/hooks/api/auditLogStreams/queries.tsx +++ b/frontend/src/hooks/api/auditLogStreams/queries.tsx @@ -5,28 +5,23 @@ import { apiRequest } from "@app/config/request"; import { TAuditLogStream } from "./types"; export const auditLogStreamKeys = { - list: (projectSlug: string) => ["audit-log-stream", { projectSlug }], + list: (orgId: string) => ["audit-log-stream", { orgId }], getById: (id: string) => ["audit-log-stream-details", { id }] }; -const fetchAuditLogStreams = async (projectSlug: string) => { +const fetchAuditLogStreams = async () => { const { data } = await apiRequest.get<{ auditLogStreams: TAuditLogStream[] }>( - "/api/v1/audit-log-streams", - { - params: { - projectSlug - } - } + "/api/v1/audit-log-streams" ); return data.auditLogStreams; }; -export const useGetAuditLogStreams = (projectSlug: string) => +export const useGetAuditLogStreams = (orgId: string) => useQuery({ - queryKey: auditLogStreamKeys.list(projectSlug), - queryFn: () => fetchAuditLogStreams(projectSlug), - enabled: Boolean(projectSlug) + queryKey: auditLogStreamKeys.list(orgId), + queryFn: () => fetchAuditLogStreams(), + enabled: Boolean(orgId) }); const fetchAuditLogStreamDetails = async (id: string) => { diff --git a/frontend/src/hooks/api/auditLogStreams/types.ts b/frontend/src/hooks/api/auditLogStreams/types.ts index 3163f96d7..7e73ae301 100644 --- a/frontend/src/hooks/api/auditLogStreams/types.ts +++ b/frontend/src/hooks/api/auditLogStreams/types.ts @@ -5,19 +5,19 @@ export type TAuditLogStream = { }; export type TCreateAuditLogStreamDTO = { - projectSlug: string; url: string; token?: string; + orgId: string; }; export type TUpdateAuditLogStreamDTO = { id: string; - projectSlug: string; url?: string; token?: string; + orgId: string; }; export type TDeleteAuditLogStreamDTO = { id: string; - projectSlug: string; + orgId: string; }; diff --git a/frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx b/frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx similarity index 94% rename from frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx rename to frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx index d5f9c5cfd..a47215f21 100644 --- a/frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx +++ b/frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamForm.tsx @@ -3,7 +3,7 @@ import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Input, Spinner } from "@app/components/v2"; -import { useWorkspace } from "@app/context"; +import { useOrganization } from "@app/context"; import { useCreateAuditLogStream, useGetAuditLogStreamDetails, @@ -23,8 +23,8 @@ type TForm = z.infer; export const AuditLogStreamForm = ({ id = "", onClose }: Props) => { const isEdit = Boolean(id); - const { currentWorkspace } = useWorkspace(); - const projectSlug = currentWorkspace?.slug || ""; + const { currentOrg } = useOrganization(); + const orgId = currentOrg?.id || ""; const auditLogStream = useGetAuditLogStreamDetails(id); const createAuditLogStream = useCreateAuditLogStream(); @@ -43,7 +43,7 @@ export const AuditLogStreamForm = ({ id = "", onClose }: Props) => { try { await updateAuditLogStream.mutateAsync({ id, - projectSlug, + orgId, token, url }); @@ -69,7 +69,7 @@ export const AuditLogStreamForm = ({ id = "", onClose }: Props) => { } try { await createAuditLogStream.mutateAsync({ - projectSlug, + orgId, token, url }); diff --git a/frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx b/frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx similarity index 84% rename from frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx rename to frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx index 2c3234c10..be03b698e 100644 --- a/frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx +++ b/frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/AuditLogStreamTab.tsx @@ -2,7 +2,7 @@ import { faPlug, faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; -import { ProjectPermissionCan } from "@app/components/permissions"; +import { OrgPermissionCan } from "@app/components/permissions"; import { Button, DeleteActionModal, @@ -19,21 +19,21 @@ import { UpgradePlanModal } from "@app/components/v2"; import { - ProjectPermissionActions, - ProjectPermissionSub, - useSubscription, - useWorkspace + OrgPermissionActions, + OrgPermissionSubjects, + useOrganization, + useSubscription } from "@app/context"; -import { withProjectPermission } from "@app/hoc"; +import { withPermission } from "@app/hoc"; import { usePopUp } from "@app/hooks"; import { useDeleteAuditLogStream, useGetAuditLogStreams } from "@app/hooks/api"; import { AuditLogStreamForm } from "./AuditLogStreamForm"; -export const AuditLogStreamsTab = withProjectPermission( +export const AuditLogStreamsTab = withPermission( () => { - const { currentWorkspace } = useWorkspace(); - const projectSlug = currentWorkspace?.slug || ""; + const { currentOrg } = useOrganization(); + const orgId = currentOrg?.id || ""; const { popUp, handlePopUpOpen, handlePopUpToggle, handlePopUpClose } = usePopUp([ "auditLogStreamForm", "deleteAuditLogStream", @@ -42,7 +42,7 @@ export const AuditLogStreamsTab = withProjectPermission( const { subscription } = useSubscription(); const { data: auditLogStreams, isLoading: isAuditLogStreamsLoading } = - useGetAuditLogStreams(projectSlug); + useGetAuditLogStreams(orgId); // mutation const { mutateAsync: deleteAuditLogStream } = useDeleteAuditLogStream(); @@ -52,7 +52,7 @@ export const AuditLogStreamsTab = withProjectPermission( const auditLogStreamId = popUp?.deleteAuditLogStream?.data as string; await deleteAuditLogStream({ id: auditLogStreamId, - projectSlug + orgId }); handlePopUpClose("deleteAuditLogStream"); createNotification({ @@ -72,10 +72,7 @@ export const AuditLogStreamsTab = withProjectPermission(

Audit Log Streams

- + {(isAllowed) => ( )} - +

Manage audit log streams to send audit log to any logging providers with syslog support. @@ -124,9 +121,9 @@ export const AuditLogStreamsTab = withProjectPermission(

- {(isAllowed) => (
@@ -196,5 +193,5 @@ export const AuditLogStreamsTab = withProjectPermission(
); }, - { action: ProjectPermissionActions.Read, subject: ProjectPermissionSub.Settings } + { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.Settings } ); diff --git a/frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/index.tsx b/frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/index.tsx similarity index 100% rename from frontend/src/views/Settings/ProjectSettingsPage/components/AuditLogStreamTab/index.tsx rename to frontend/src/views/Settings/OrgSettingsPage/components/AuditLogStreamTab/index.tsx diff --git a/frontend/src/views/Settings/OrgSettingsPage/components/OrgTabGroup/OrgTabGroup.tsx b/frontend/src/views/Settings/OrgSettingsPage/components/OrgTabGroup/OrgTabGroup.tsx index de6bf0453..fdf541c54 100644 --- a/frontend/src/views/Settings/OrgSettingsPage/components/OrgTabGroup/OrgTabGroup.tsx +++ b/frontend/src/views/Settings/OrgSettingsPage/components/OrgTabGroup/OrgTabGroup.tsx @@ -1,12 +1,14 @@ import { Fragment } from "react"; import { Tab } from "@headlessui/react"; +import { AuditLogStreamsTab } from "../AuditLogStreamTab"; import { OrgAuthTab } from "../OrgAuthTab"; import { OrgGeneralTab } from "../OrgGeneralTab"; const tabs = [ { name: "General", key: "tab-org-general" }, - { name: "Security", key: "tab-org-security" } + { name: "Security", key: "tab-org-security" }, + { name: "Audit Log Streams", key: "tag-audit-log-streams" } ]; export const OrgTabGroup = () => { return ( @@ -17,9 +19,8 @@ export const OrgTabGroup = () => { {({ selected }) => ( @@ -34,6 +35,9 @@ export const OrgTabGroup = () => { + + + ); diff --git a/frontend/src/views/Settings/ProjectSettingsPage/ProjectSettingsPage.tsx b/frontend/src/views/Settings/ProjectSettingsPage/ProjectSettingsPage.tsx index cc521d813..1d453b872 100644 --- a/frontend/src/views/Settings/ProjectSettingsPage/ProjectSettingsPage.tsx +++ b/frontend/src/views/Settings/ProjectSettingsPage/ProjectSettingsPage.tsx @@ -4,12 +4,10 @@ import { Tab } from "@headlessui/react"; import { ProjectGeneralTab } from "./components/ProjectGeneralTab"; import { WebhooksTab } from "./components/WebhooksTab"; -import { AuditLogStreamsTab } from "./components"; const tabs = [ { name: "General", key: "tab-project-general" }, { name: "Webhooks", key: "tab-project-webhooks" }, - { name: "Audit Log Streams", key: "tab-project-audit-log-stream" } ]; export const ProjectSettingsPage = () => { @@ -43,9 +41,6 @@ export const ProjectSettingsPage = () => { - - - diff --git a/frontend/src/views/Settings/ProjectSettingsPage/components/index.tsx b/frontend/src/views/Settings/ProjectSettingsPage/components/index.tsx index a3524152f..72ac106a3 100644 --- a/frontend/src/views/Settings/ProjectSettingsPage/components/index.tsx +++ b/frontend/src/views/Settings/ProjectSettingsPage/components/index.tsx @@ -1,4 +1,3 @@ -export { AuditLogStreamsTab } from "./AuditLogStreamTab"; export { AutoCapitalizationSection } from "./AutoCapitalizationSection"; export { DeleteProjectSection } from "./DeleteProjectSection"; export { E2EESection } from "./E2EESection";