From 03b7d3a5ce4cc8e54a588e6aa99d25f1129afb33 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 2 Jan 2023 09:57:02 -0800 Subject: [PATCH] Wired frontend for logs --- .../ee/controllers/v1/workspaceController.ts | 1 + frontend/components/basic/EventFilter.tsx | 5 +-- frontend/ee/api/secrets/GetProjectLogs.ts | 41 +++++++++++++++---- frontend/pages/activity/[id].tsx | 35 ++++++++++++---- 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/backend/src/ee/controllers/v1/workspaceController.ts b/backend/src/ee/controllers/v1/workspaceController.ts index 838a3253d..4fe040122 100644 --- a/backend/src/ee/controllers/v1/workspaceController.ts +++ b/backend/src/ee/controllers/v1/workspaceController.ts @@ -59,6 +59,7 @@ export const getWorkspaceLogs = async (req: Request, res: Response) => { } : {} ) }) + .sort({ createdAt: -1 }) .skip(offset) .limit(limit) .populate('actions') diff --git a/frontend/components/basic/EventFilter.tsx b/frontend/components/basic/EventFilter.tsx index d4fe36193..fc0c4e1e1 100644 --- a/frontend/components/basic/EventFilter.tsx +++ b/frontend/components/basic/EventFilter.tsx @@ -48,7 +48,7 @@ export default function EventFilter({
{selected != '' ? ( -

{selected}

+

{t("activity:event." + selected)}

) : (

Select an event

)} @@ -76,7 +76,7 @@ export default function EventFilter({ className={`px-4 h-10 flex items-center text-sm cursor-pointer hover:bg-mineshaft-700 text-bunker-200 rounded-md ${ selected == t("activity:event." + event.name) && 'bg-mineshaft-700' }`} - value={t("activity:event." + event.name)} + value={event.name} > {({ selected }) => ( <> @@ -90,7 +90,6 @@ export default function EventFilter({ )} - {/* {event.name} */} ); })} diff --git a/frontend/ee/api/secrets/GetProjectLogs.ts b/frontend/ee/api/secrets/GetProjectLogs.ts index d5324355c..277205f2f 100644 --- a/frontend/ee/api/secrets/GetProjectLogs.ts +++ b/frontend/ee/api/secrets/GetProjectLogs.ts @@ -5,7 +5,8 @@ interface workspaceProps { workspaceId: string; offset: number; limit: number; - filters: object; + userId: string; + actionNames: string; } /** @@ -14,17 +15,41 @@ interface workspaceProps { * @param {string} obj.workspaceId - workspace id for which we are trying to get project log * @param {object} obj.offset - teh starting point of logs that we want to pull * @param {object} obj.limit - how many logs will we output - * @param {object} obj.filters + * @param {object} obj.userId - optional userId filter - will only query logs for that user + * @param {string} obj.actionNames - optional actionNames filter - will only query logs for those actions * @returns */ -const getProjectLogs = async ({ workspaceId, offset, limit, filters }: workspaceProps) => { +const getProjectLogs = async ({ workspaceId, offset, limit, userId, actionNames }: workspaceProps) => { + let payload; + if (userId != "" && actionNames != '') { + payload = { + offset: String(offset), + limit: String(limit), + userId: JSON.stringify(userId), + actionNames: actionNames + } + } else if (userId != "") { + payload = { + offset: String(offset), + limit: String(limit), + userId: JSON.stringify(userId) + } + } else if (actionNames != "") { + payload = { + offset: String(offset), + limit: String(limit), + actionNames: actionNames + } + } else { + payload = { + offset: String(offset), + limit: String(limit) + } + } + return SecurityClient.fetchCall( '/api/v1/workspace/' + workspaceId + '/logs?' + - new URLSearchParams({ - offset: String(offset), - limit: String(limit), - filters: JSON.stringify(filters) - }), + new URLSearchParams(payload), { method: 'GET', headers: { diff --git a/frontend/pages/activity/[id].tsx b/frontend/pages/activity/[id].tsx index f384ae69f..ed5a6def0 100644 --- a/frontend/pages/activity/[id].tsx +++ b/frontend/pages/activity/[id].tsx @@ -55,9 +55,34 @@ export default function Activity() { const [currentEvent, setCurrentEvent] = useState(""); const { t } = useTranslation(); + // this use effect updates the data in case of a new filter being added + useEffect(() => { + setCurrentOffset(0); + const getLogData = async () => { + const tempLogsData = await getProjectLogs({ workspaceId: String(router.query.id), offset: 0, limit: currentLimit, userId: "", actionNames: eventChosen }) + setLogsData(tempLogsData.map((log: logData) => { + return { + _id: log._id, + channel: log.channel, + createdAt: log.createdAt, + ipAddress: log.ipAddress, + user: log.user.email, + payload: log.actions.map(action => { + return { + name: action.name, + secretVersions: action.payload.secretVersions + } + }) + } + })) + } + getLogData(); + }, [eventChosen]); + + // this use effect adds more data in case 'View More' button is clicked useEffect(() => { const getLogData = async () => { - const tempLogsData = await getProjectLogs({ workspaceId: String(router.query.id), offset: currentOffset, limit: currentLimit, filters: {} }) + const tempLogsData = await getProjectLogs({ workspaceId: String(router.query.id), offset: currentOffset, limit: currentLimit, userId: "", actionNames: eventChosen }) setLogsData(logsData.concat(tempLogsData.map((log: logData) => { return { _id: log._id, @@ -97,16 +122,10 @@ export default function Activity() {
b.createdAt.localeCompare(a.createdAt)) - .filter((log) => - eventChosen != '' ? log.payload?.map(action => t("activity:event." + action.name)).includes(eventChosen) : true - ) - } + data={logsData} toggleSidebar={toggleSidebar} setCurrentEvent={setCurrentEvent} />