)
@@ -69,7 +69,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/page/dashboard/component/Dashboard.tsx b/frontend/src/page/dashboard/component/Dashboard.tsx
index f337274c..4c83b6a0 100644
--- a/frontend/src/page/dashboard/component/Dashboard.tsx
+++ b/frontend/src/page/dashboard/component/Dashboard.tsx
@@ -3,13 +3,18 @@ import Grid from '@mui/material/Grid';
import Paper from '@mui/material/Paper';
import { ResponsiveBar } from '@nivo/bar';
import { ResponsivePie } from '@nivo/pie';
+import DataTable from 'component/DataTable';
import { AuthContext } from 'context/auth';
-import { ToastContext, useToast } from 'context/toast';
+import { useToast } from 'context/toast';
import moment from 'moment';
import { useContext, useEffect, useState } from 'react';
import { isAPIError } from 'service/error/model';
+import { getAudits } from 'service/model/audit';
import { Stats } from 'service/model/model';
import { getStats } from 'service/model/stats';
+import { AuditColumns } from 'page/dashboard/component/columns';
+import { FilterRequest } from 'service/common/filter';
+import { SortRequest } from 'service/common/sort';
type BarData = BarDataItem[]
type PieData = PieDataItem[]
@@ -42,7 +47,7 @@ export default function Dashboard() {
return;
}
- const fetch = async () => {
+ const fetchStats = async () => {
const response = await getStats(user?.token!);
if (isAPIError(response)) {
@@ -52,7 +57,7 @@ export default function Dashboard() {
}
};
- fetch();
+ fetchStats();
// eslint-disable-next-line
}, [user]);
@@ -83,80 +88,98 @@ export default function Dashboard() {
]);
}, [stats]);
+ const auditColumns = AuditColumns();
+
+ const fetcher = (page?: number, size?: number, filter?: FilterRequest, sort?: SortRequest) => {
+ return getAudits(user?.token!, page, size, filter, sort);
+ };
+
return (
-
-
-
-
- Checks decisions per day
-
-
+
+
+
+
+ Checks decisions per day
+
+
-
+ />
+
+
+
+
+
+
+ Total of check decisions
+
+
+
+
-
-
-
- Total of check decisions
-
-
-
+
+
-
+ >
);
}
\ No newline at end of file
diff --git a/frontend/src/page/dashboard/component/columns.tsx b/frontend/src/page/dashboard/component/columns.tsx
new file mode 100644
index 00000000..50521d24
--- /dev/null
+++ b/frontend/src/page/dashboard/component/columns.tsx
@@ -0,0 +1,107 @@
+import { Chip, List, ListItemButton, ListItemIcon, ListItemText } from "@mui/material";
+import { getGridBooleanOperators, getGridStringOperators, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
+import LinkIcon from '@mui/icons-material/Link';
+import moment from "moment";
+
+export const AuditColumns = (): GridColDef[] => [
+ {
+ field: 'date',
+ headerName: 'Date',
+ width: 200,
+ sortable: true,
+ filterable: false,
+ renderCell: (params: GridRenderCellParams) => {
+ if (params.row.date.startsWith('0001-01-01')) {
+ return (
Unknown);
+ }
+
+ const date = moment(params.row.created_at);
+ return (
+
+ {date.format('L')} at {date.format('LTS')}
+
+ )
+ },
+ },
+ {
+ field: 'is_allowed',
+ headerName: 'Is allowed?',
+ width: 100,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridBooleanOperators(),
+ renderCell: (params: GridRenderCellParams) => {
+ return (
+ <>
+ {params.row.is_allowed ? (
+
+ ) : (
+
+ )}
+ >
+ )
+ },
+ },
+ {
+ field: 'policy_id',
+ headerName: 'Matched policy',
+ width: 250,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridStringOperators().filter(
+ (operator) => operator.value === 'contains',
+ ),
+ renderCell: (params: GridRenderCellParams) => {
+ return (
+
+
+
+
+
+
+
+
+ )
+ },
+ },
+ {
+ field: 'principal',
+ headerName: 'Principal',
+ width: 250,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridStringOperators().filter(
+ (operator) => operator.value === 'contains',
+ ),
+ },
+ {
+ field: 'resource_kind',
+ headerName: 'Resource kind',
+ width: 200,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridStringOperators().filter(
+ (operator) => operator.value === 'contains',
+ ),
+ },
+ {
+ field: 'resource_value',
+ headerName: 'Resource value',
+ width: 200,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridStringOperators().filter(
+ (operator) => operator.value === 'contains',
+ ),
+ },
+ {
+ field: 'action',
+ headerName: 'Action',
+ width: 150,
+ sortable: true,
+ filterable: true,
+ filterOperators: getGridStringOperators().filter(
+ (operator) => operator.value === 'contains',
+ ),
+ },
+];
\ No newline at end of file
diff --git a/frontend/src/page/policies/component/columns.tsx b/frontend/src/page/policies/component/columns.tsx
index ba3e28fe..8ec85728 100644
--- a/frontend/src/page/policies/component/columns.tsx
+++ b/frontend/src/page/policies/component/columns.tsx
@@ -81,7 +81,7 @@ export const ListColumns = ({
const date = moment(params.row.created_at);
return (
-
+
{date.fromNow()}
)
@@ -100,7 +100,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/page/principals/component/columns.tsx b/frontend/src/page/principals/component/columns.tsx
index 593348af..c2454e1e 100644
--- a/frontend/src/page/principals/component/columns.tsx
+++ b/frontend/src/page/principals/component/columns.tsx
@@ -40,7 +40,7 @@ export const ListColumns = ({
const date = moment(params.row.created_at);
return (
-
+
{date.fromNow()}
)
@@ -59,7 +59,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/page/resources/component/columns.tsx b/frontend/src/page/resources/component/columns.tsx
index 6725fd0e..fa579655 100644
--- a/frontend/src/page/resources/component/columns.tsx
+++ b/frontend/src/page/resources/component/columns.tsx
@@ -60,7 +60,7 @@ export const ListColumns = ({
const date = moment(params.row.created_at);
return (
-
+
{date.fromNow()}
)
@@ -79,7 +79,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/page/roles/component/columns.tsx b/frontend/src/page/roles/component/columns.tsx
index 946d1d83..53f4267a 100644
--- a/frontend/src/page/roles/component/columns.tsx
+++ b/frontend/src/page/roles/component/columns.tsx
@@ -63,7 +63,7 @@ export const ListColumns = ({
const date = moment(params.row.created_at);
return (
-
+
{date.fromNow()}
)
@@ -82,7 +82,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/page/users/component/columns.tsx b/frontend/src/page/users/component/columns.tsx
index fee1e105..0588f1c1 100644
--- a/frontend/src/page/users/component/columns.tsx
+++ b/frontend/src/page/users/component/columns.tsx
@@ -39,7 +39,7 @@ export const ListColumns = ({
const date = moment(params.row.created_at);
return (
-
+
{date.fromNow()}
)
@@ -58,7 +58,7 @@ export const ListColumns = ({
const date = moment(params.row.updated_at);
return (
-
+
{date.fromNow()}
)
diff --git a/frontend/src/service/model/audit.ts b/frontend/src/service/model/audit.ts
new file mode 100644
index 00000000..50db1166
--- /dev/null
+++ b/frontend/src/service/model/audit.ts
@@ -0,0 +1,26 @@
+import { baseUrl } from "service/common/api"
+import { FilterRequest } from "service/common/filter";
+import { paginate, Paginated } from "service/common/paginate";
+import { SortRequest } from "service/common/sort";
+import { catchError } from "service/error/catch";
+import { APIError } from "service/error/model";
+import { Audit } from "service/model/model";
+
+export const getAudits = async (
+ token: string,
+ page?: number,
+ size?: number,
+ filter?: FilterRequest,
+ sort?: SortRequest,
+): Promise
| APIError> => {
+ return await catchError>(async () => {
+ return await paginate({
+ url: baseUrl() + '/audits',
+ token: token,
+ page: page,
+ size: size,
+ filter: filter,
+ sort: sort,
+ });
+ });
+}
\ No newline at end of file
diff --git a/frontend/src/service/model/model.ts b/frontend/src/service/model/model.ts
index 6a7f2cb2..a5eaf832 100644
--- a/frontend/src/service/model/model.ts
+++ b/frontend/src/service/model/model.ts
@@ -4,6 +4,17 @@ export type Action = {
updated_at: Date
}
+export type Audit = {
+ id: string
+ date: string
+ principal: string
+ resource_kind: string
+ resource_value: string
+ action: string
+ is_allowed: boolean
+ policy_id: string
+}
+
export type Client = {
client_id: string
client_secret: string