Skip to content

Commit 8c25eb0

Browse files
Mock type fixes
1 parent 82e58ac commit 8c25eb0

File tree

2 files changed

+89
-83
lines changed

2 files changed

+89
-83
lines changed

mock-api/audit-log.ts

Lines changed: 83 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { v4 as uuid } from 'uuid'
1010

1111
import type { AuditLogEntry } from '@oxide/api'
1212

13+
import type { Json } from './json-type'
14+
1315
const mockUserIds = [
1416
'a47ac10b-58cc-4372-a567-0e02b2c3d479',
1517
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
@@ -56,7 +58,7 @@ const mockOperations = [
5658
'ssh_key_delete',
5759
]
5860

59-
const mockAccessMethods = ['session_cookie', 'api_token', null]
61+
const mockAccessMethod = ['session_cookie', 'api_token', null]
6062

6163
const mockHttpStatusCodes = [200, 201, 204, 400, 401, 403, 404, 409, 500, 502, 503]
6264

@@ -70,7 +72,7 @@ const mockSourceIps = [
7072

7173
const mockRequestIds = Array.from({ length: 20 }, () => uuid())
7274

73-
function generateAuditLogEntry(index: number): AuditLogEntry {
75+
function generateAuditLogEntry(index: number): Json<AuditLogEntry> {
7476
const operation = mockOperations[index % mockOperations.length]
7577
const statusCode = mockHttpStatusCodes[index % mockHttpStatusCodes.length]
7678
const isError = statusCode >= 400
@@ -84,105 +86,105 @@ function generateAuditLogEntry(index: number): AuditLogEntry {
8486

8587
return {
8688
id: uuid(),
87-
accessMethod: mockAccessMethods[index % mockAccessMethods.length],
88-
actorId: mockUserIds[index % mockUserIds.length],
89-
actorSiloId: mockSiloIds[index % mockSiloIds.length],
90-
errorCode: isError ? `E${statusCode}` : null,
91-
errorMessage: isError ? `Operation failed with status ${statusCode}` : null,
92-
httpStatusCode: statusCode,
93-
operationId: operation,
94-
requestId: mockRequestIds[index % mockRequestIds.length],
95-
timestamp: baseTime,
96-
timeCompleted: completedTime,
97-
requestUri: `/v1/projects/default/${operation.replace('_', '/')}`,
98-
resourceId: index % 3 === 0 ? uuid() : null,
99-
sourceIp: mockSourceIps[index % mockSourceIps.length],
89+
access_method: mockAccessMethod[index % mockAccessMethod.length],
90+
actor_id: mockUserIds[index % mockUserIds.length],
91+
actor_silo_id: mockSiloIds[index % mockSiloIds.length],
92+
error_code: isError ? `E${statusCode}` : null,
93+
error_message: isError ? `Operation failed with status ${statusCode}` : null,
94+
http_status_code: statusCode,
95+
operation_id: operation,
96+
request_id: mockRequestIds[index % mockRequestIds.length],
97+
timestamp: baseTime.toISOString(),
98+
time_completed: completedTime.toISOString(),
99+
request_uri: `/v1/projects/default/${operation.replace('_', '/')}`,
100+
resource_id: index % 3 === 0 ? uuid() : null,
101+
source_ip: mockSourceIps[index % mockSourceIps.length],
100102
}
101103
}
102104

103-
export const auditLogs: AuditLogEntry[] = [
105+
export const auditLogs: Json<AuditLogEntry[]> = [
104106
// Recent successful operations
105107
{
106108
id: uuid(),
107-
accessMethod: 'session_cookie',
108-
actorId: mockUserIds[0],
109-
actorSiloId: mockSiloIds[0],
110-
errorCode: null,
111-
errorMessage: null,
112-
httpStatusCode: 201,
113-
operationId: 'instance_create',
114-
requestId: mockRequestIds[0],
115-
timestamp: new Date(Date.now() - 1000 * 60 * 5), // 5 minutes ago
116-
timeCompleted: new Date(Date.now() - 1000 * 60 * 5 + 321), // 1 second later
117-
requestUri: '/v1/projects/admin-project/instances',
118-
resourceId: uuid(),
119-
sourceIp: '192.168.1.100',
109+
access_method: 'session_cookie',
110+
actor_id: mockUserIds[0],
111+
actor_silo_id: mockSiloIds[0],
112+
error_code: null,
113+
error_message: null,
114+
http_status_code: 201,
115+
operation_id: 'instance_create',
116+
request_id: mockRequestIds[0],
117+
timestamp: new Date(Date.now() - 1000 * 60 * 5).toISOString(), // 5 minutes ago
118+
time_completed: new Date(Date.now() - 1000 * 60 * 5 + 321).toISOString(), // 1 second later
119+
request_uri: '/v1/projects/admin-project/instances',
120+
resource_id: uuid(),
121+
source_ip: '192.168.1.100',
120122
},
121123
{
122124
id: uuid(),
123-
accessMethod: 'api_token',
124-
actorId: mockUserIds[1],
125-
actorSiloId: mockSiloIds[0],
126-
errorCode: null,
127-
errorMessage: null,
128-
httpStatusCode: 200,
129-
operationId: 'instance_start',
130-
requestId: mockRequestIds[1],
131-
timestamp: new Date(Date.now() - 1000 * 60 * 10), // 10 minutes ago
132-
timeCompleted: new Date(Date.now() - 1000 * 60 * 10 + 126), // 1 second later
133-
requestUri: '/v1/projects/admin-project/instances/web-server-prod/start',
134-
resourceId: uuid(),
135-
sourceIp: '10.0.0.50',
125+
access_method: 'api_token',
126+
actor_id: mockUserIds[1],
127+
actor_silo_id: mockSiloIds[0],
128+
error_code: null,
129+
error_message: null,
130+
http_status_code: 200,
131+
operation_id: 'instance_start',
132+
request_id: mockRequestIds[1],
133+
timestamp: new Date(Date.now() - 1000 * 60 * 10).toISOString(), // 10 minutes ago
134+
time_completed: new Date(Date.now() - 1000 * 60 * 10 + 126).toISOString(), // 1 second later
135+
request_uri: '/v1/projects/admin-project/instances/web-server-prod/start',
136+
resource_id: uuid(),
137+
source_ip: '10.0.0.50',
136138
},
137139
// Failed operations
138140
{
139141
id: uuid(),
140-
accessMethod: 'session_cookie',
141-
actorId: mockUserIds[2],
142-
actorSiloId: mockSiloIds[1],
143-
errorCode: 'E403',
144-
errorMessage: 'Insufficient permissions to delete instance',
145-
httpStatusCode: 403,
146-
operationId: 'instance_delete',
147-
requestId: mockRequestIds[2],
148-
timestamp: new Date(Date.now() - 1000 * 60 * 15), // 15 minutes ago
149-
timeCompleted: new Date(Date.now() - 1000 * 60 * 15 + 147), // 1 second later
150-
requestUri: '/v1/projects/dev-project/instances/test-instance',
151-
resourceId: uuid(),
152-
sourceIp: '172.16.0.25',
142+
access_method: 'session_cookie',
143+
actor_id: mockUserIds[2],
144+
actor_silo_id: mockSiloIds[1],
145+
error_code: 'E403',
146+
error_message: 'Insufficient permissions to delete instance',
147+
http_status_code: 403,
148+
operation_id: 'instance_delete',
149+
request_id: mockRequestIds[2],
150+
timestamp: new Date(Date.now() - 1000 * 60 * 15).toISOString(), // 15 minutes ago
151+
time_completed: new Date(Date.now() - 1000 * 60 * 15 + 147).toISOString(), // 1 second later
152+
request_uri: '/v1/projects/dev-project/instances/test-instance',
153+
resource_id: uuid(),
154+
source_ip: '172.16.0.25',
153155
},
154156
{
155157
id: uuid(),
156-
accessMethod: null,
157-
actorId: null,
158-
actorSiloId: null,
159-
errorCode: 'E401',
160-
errorMessage: 'Authentication required',
161-
httpStatusCode: 401,
162-
operationId: 'user_login',
163-
requestId: mockRequestIds[3],
164-
timestamp: new Date(Date.now() - 1000 * 60 * 20), // 20 minutes ago
165-
timeCompleted: new Date(Date.now() - 1000 * 60 * 20 + 16), // 1 second later
166-
requestUri: '/v1/login',
167-
resourceId: null,
168-
sourceIp: '203.0.113.15',
158+
access_method: null,
159+
actor_id: null,
160+
actor_silo_id: null,
161+
error_code: 'E401',
162+
error_message: 'Authentication required',
163+
http_status_code: 401,
164+
operation_id: 'user_login',
165+
request_id: mockRequestIds[3],
166+
timestamp: new Date(Date.now() - 1000 * 60 * 20).toISOString(), // 20 minutes ago
167+
time_completed: new Date(Date.now() - 1000 * 60 * 20 + 16).toISOString(), // 1 second later
168+
request_uri: '/v1/login',
169+
resource_id: null,
170+
source_ip: '203.0.113.15',
169171
},
170172
// More historical entries
171173
{
172174
id: uuid(),
173-
accessMethod: 'session_cookie',
174-
actorId: mockUserIds[0],
175-
actorSiloId: mockSiloIds[0],
176-
errorCode: null,
177-
errorMessage: null,
178-
httpStatusCode: 201,
179-
operationId: 'project_create',
180-
requestId: mockRequestIds[4],
181-
timestamp: new Date(Date.now() - 1000 * 60 * 60), // 1 hour ago
182-
timeCompleted: new Date(Date.now() - 1000 * 60 * 60 + 36), // 1 second later
183-
requestUri: '/v1/projects',
184-
resourceId: uuid(),
185-
sourceIp: '192.168.1.100',
175+
access_method: 'session_cookie',
176+
actor_id: mockUserIds[0],
177+
actor_silo_id: mockSiloIds[0],
178+
error_code: null,
179+
error_message: null,
180+
http_status_code: 201,
181+
operation_id: 'project_create',
182+
request_id: mockRequestIds[4],
183+
timestamp: new Date(Date.now() - 1000 * 60 * 60).toISOString(), // 1 hour ago
184+
time_completed: new Date(Date.now() - 1000 * 60 * 60 + 36).toISOString(), // 1 second later
185+
request_uri: '/v1/projects',
186+
resource_id: uuid(),
187+
source_ip: '192.168.1.100',
186188
},
187189
// Generate additional entries
188190
...Array.from({ length: 199995 }, (_, i) => generateAuditLogEntry(i + 5)),

mock-api/msw/handlers.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,11 +1803,13 @@ export const handlers = makeHandlers({
18031803
let filteredLogs = db.auditLogs
18041804

18051805
if (query.startTime) {
1806-
filteredLogs = filteredLogs.filter((log) => log.timestamp >= query.startTime!)
1806+
filteredLogs = filteredLogs.filter(
1807+
(log) => new Date(log.timestamp) >= query.startTime!
1808+
)
18071809
}
18081810

18091811
if (query.endTime) {
1810-
filteredLogs = filteredLogs.filter((log) => log.timestamp <= query.endTime!)
1812+
filteredLogs = filteredLogs.filter((log) => new Date(log.timestamp) <= query.endTime!)
18111813
}
18121814

18131815
return paginated(query, filteredLogs)
@@ -1873,6 +1875,8 @@ export const handlers = makeHandlers({
18731875
networkingLoopbackAddressCreate: NotImplemented,
18741876
networkingLoopbackAddressDelete: NotImplemented,
18751877
networkingLoopbackAddressList: NotImplemented,
1878+
networkingInboundIcmpView: NotImplemented,
1879+
networkingInboundIcmpUpdate: NotImplemented,
18761880
networkingSwitchPortApplySettings: NotImplemented,
18771881
networkingSwitchPortClearSettings: NotImplemented,
18781882
networkingSwitchPortList: NotImplemented,

0 commit comments

Comments
 (0)