@minecraft-docker/mcctl-api 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -0
- package/dist/app.js.map +1 -1
- package/dist/routes/audit-logs.d.ts +10 -0
- package/dist/routes/audit-logs.d.ts.map +1 -0
- package/dist/routes/audit-logs.js +188 -0
- package/dist/routes/audit-logs.js.map +1 -0
- package/dist/schemas/audit-log.d.ts +180 -0
- package/dist/schemas/audit-log.d.ts.map +1 -0
- package/dist/schemas/audit-log.js +152 -0
- package/dist/schemas/audit-log.js.map +1 -0
- package/dist/services/audit-log-service.d.ts +41 -0
- package/dist/services/audit-log-service.d.ts.map +1 -0
- package/dist/services/audit-log-service.js +259 -0
- package/dist/services/audit-log-service.js.map +1 -0
- package/package.json +2 -2
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAgBnD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmFtF;AAED,eAAe,QAAQ,CAAC"}
|
package/dist/app.js
CHANGED
|
@@ -12,6 +12,7 @@ import authRoutes from './routes/auth.js';
|
|
|
12
12
|
import routerRoutes from './routes/router.js';
|
|
13
13
|
import playersRoutes from './routes/players.js';
|
|
14
14
|
import backupRoutes from './routes/backup.js';
|
|
15
|
+
import auditLogsRoutes from './routes/audit-logs.js';
|
|
15
16
|
export async function buildApp(options = {}) {
|
|
16
17
|
const app = Fastify({
|
|
17
18
|
logger: options.logger ?? config.nodeEnv !== 'test' ? {
|
|
@@ -52,6 +53,8 @@ export async function buildApp(options = {}) {
|
|
|
52
53
|
await app.register(backupRoutes);
|
|
53
54
|
// Register world routes
|
|
54
55
|
await app.register(worldsRoutes);
|
|
56
|
+
// Register audit log routes
|
|
57
|
+
await app.register(auditLogsRoutes);
|
|
55
58
|
// Health check endpoint
|
|
56
59
|
app.get('/health', async () => {
|
|
57
60
|
return {
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4B,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,UAAU,MAAM,mBAAmB,CAAC;AAC3C,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,mBAAmB,MAAM,6BAA6B,CAAC;AAC9D,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,YAAY,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FastifyPluginAsync } from 'fastify';
|
|
2
|
+
/**
|
|
3
|
+
* Audit log routes plugin
|
|
4
|
+
* Provides REST API for audit log management
|
|
5
|
+
*/
|
|
6
|
+
declare const auditLogsPlugin: FastifyPluginAsync;
|
|
7
|
+
declare const _default: FastifyPluginAsync;
|
|
8
|
+
export default _default;
|
|
9
|
+
export { auditLogsPlugin };
|
|
10
|
+
//# sourceMappingURL=audit-logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../src/routes/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AAqC5F;;;GAGG;AACH,QAAA,MAAM,eAAe,EAAE,kBAyLtB,CAAC;;AAEF,wBAGG;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import fp from 'fastify-plugin';
|
|
2
|
+
import { AuditLogListQuerySchema, AuditLogIdParamsSchema, AuditLogPurgeRequestSchema, AuditLogListResponseSchema, AuditLogStatsResponseSchema, AuditLogDetailResponseSchema, AuditLogPurgeResponseSchema, ErrorResponseSchema, } from '../schemas/audit-log.js';
|
|
3
|
+
import { getAuditLogs, getAuditLogStats, getAuditLogById, purgeAuditLogs, subscribeAuditLogs, } from '../services/audit-log-service.js';
|
|
4
|
+
/**
|
|
5
|
+
* Audit log routes plugin
|
|
6
|
+
* Provides REST API for audit log management
|
|
7
|
+
*/
|
|
8
|
+
const auditLogsPlugin = async (fastify) => {
|
|
9
|
+
/**
|
|
10
|
+
* GET /api/audit-logs
|
|
11
|
+
* List audit logs with filtering and pagination
|
|
12
|
+
*/
|
|
13
|
+
fastify.get('/api/audit-logs', {
|
|
14
|
+
schema: {
|
|
15
|
+
description: 'List audit logs with filtering and pagination',
|
|
16
|
+
tags: ['audit-logs'],
|
|
17
|
+
querystring: AuditLogListQuerySchema,
|
|
18
|
+
response: {
|
|
19
|
+
200: AuditLogListResponseSchema,
|
|
20
|
+
500: ErrorResponseSchema,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
}, async (request, reply) => {
|
|
24
|
+
try {
|
|
25
|
+
const data = await getAuditLogs(request.query);
|
|
26
|
+
return reply.send(data);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
fastify.log.error(error, 'Failed to list audit logs');
|
|
30
|
+
return reply.code(500).send({
|
|
31
|
+
error: 'InternalServerError',
|
|
32
|
+
message: 'Failed to list audit logs',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* GET /api/audit-logs/stats
|
|
38
|
+
* Get audit log statistics
|
|
39
|
+
*/
|
|
40
|
+
fastify.get('/api/audit-logs/stats', {
|
|
41
|
+
schema: {
|
|
42
|
+
description: 'Get audit log statistics',
|
|
43
|
+
tags: ['audit-logs'],
|
|
44
|
+
response: {
|
|
45
|
+
200: AuditLogStatsResponseSchema,
|
|
46
|
+
500: ErrorResponseSchema,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
}, async (_request, reply) => {
|
|
50
|
+
try {
|
|
51
|
+
const data = await getAuditLogStats();
|
|
52
|
+
return reply.send(data);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
fastify.log.error(error, 'Failed to get audit log stats');
|
|
56
|
+
return reply.code(500).send({
|
|
57
|
+
error: 'InternalServerError',
|
|
58
|
+
message: 'Failed to get audit log statistics',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
/**
|
|
63
|
+
* GET /api/audit-logs/stream
|
|
64
|
+
* Server-Sent Events stream for real-time audit log updates
|
|
65
|
+
*/
|
|
66
|
+
fastify.get('/api/audit-logs/stream', {
|
|
67
|
+
schema: {
|
|
68
|
+
description: 'Real-time audit log stream (SSE)',
|
|
69
|
+
tags: ['audit-logs'],
|
|
70
|
+
response: {
|
|
71
|
+
200: { type: 'string', description: 'SSE event stream' },
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
}, async (request, reply) => {
|
|
75
|
+
// Set SSE headers
|
|
76
|
+
reply.raw.writeHead(200, {
|
|
77
|
+
'Content-Type': 'text/event-stream',
|
|
78
|
+
'Cache-Control': 'no-cache',
|
|
79
|
+
'Connection': 'keep-alive',
|
|
80
|
+
'Access-Control-Allow-Origin': '*',
|
|
81
|
+
});
|
|
82
|
+
// Send initial connected event
|
|
83
|
+
reply.raw.write(`event: connected\ndata: ${JSON.stringify({ timestamp: new Date().toISOString() })}\n\n`);
|
|
84
|
+
// Subscribe to new audit log events
|
|
85
|
+
const unsubscribe = subscribeAuditLogs((log) => {
|
|
86
|
+
reply.raw.write(`event: audit-log\ndata: ${JSON.stringify(log)}\n\n`);
|
|
87
|
+
});
|
|
88
|
+
// Heartbeat to keep connection alive (every 30 seconds)
|
|
89
|
+
const heartbeat = setInterval(() => {
|
|
90
|
+
reply.raw.write(`event: heartbeat\ndata: ${JSON.stringify({ timestamp: new Date().toISOString() })}\n\n`);
|
|
91
|
+
}, 30000);
|
|
92
|
+
// Cleanup on client disconnect
|
|
93
|
+
request.raw.on('close', () => {
|
|
94
|
+
clearInterval(heartbeat);
|
|
95
|
+
unsubscribe();
|
|
96
|
+
reply.raw.end();
|
|
97
|
+
});
|
|
98
|
+
// Don't return - keep connection open for SSE
|
|
99
|
+
return;
|
|
100
|
+
});
|
|
101
|
+
/**
|
|
102
|
+
* GET /api/audit-logs/:id
|
|
103
|
+
* Get single audit log entry with related logs
|
|
104
|
+
*/
|
|
105
|
+
fastify.get('/api/audit-logs/:id', {
|
|
106
|
+
schema: {
|
|
107
|
+
description: 'Get single audit log entry with related logs',
|
|
108
|
+
tags: ['audit-logs'],
|
|
109
|
+
params: AuditLogIdParamsSchema,
|
|
110
|
+
response: {
|
|
111
|
+
200: AuditLogDetailResponseSchema,
|
|
112
|
+
404: ErrorResponseSchema,
|
|
113
|
+
500: ErrorResponseSchema,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
}, async (request, reply) => {
|
|
117
|
+
const { id } = request.params;
|
|
118
|
+
try {
|
|
119
|
+
const data = await getAuditLogById(id);
|
|
120
|
+
if (!data) {
|
|
121
|
+
return reply.code(404).send({
|
|
122
|
+
error: 'NotFound',
|
|
123
|
+
message: `Audit log entry '${id}' not found`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return reply.send(data);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
fastify.log.error(error, 'Failed to get audit log detail');
|
|
130
|
+
return reply.code(500).send({
|
|
131
|
+
error: 'InternalServerError',
|
|
132
|
+
message: 'Failed to get audit log detail',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
/**
|
|
137
|
+
* DELETE /api/audit-logs
|
|
138
|
+
* Purge old audit log entries (admin only)
|
|
139
|
+
*/
|
|
140
|
+
fastify.delete('/api/audit-logs', {
|
|
141
|
+
schema: {
|
|
142
|
+
description: 'Purge old audit log entries (admin only)',
|
|
143
|
+
tags: ['audit-logs'],
|
|
144
|
+
body: AuditLogPurgeRequestSchema,
|
|
145
|
+
response: {
|
|
146
|
+
200: AuditLogPurgeResponseSchema,
|
|
147
|
+
400: ErrorResponseSchema,
|
|
148
|
+
403: ErrorResponseSchema,
|
|
149
|
+
500: ErrorResponseSchema,
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
}, async (request, reply) => {
|
|
153
|
+
try {
|
|
154
|
+
// Check admin role from headers (set by BFF or API key auth)
|
|
155
|
+
const role = request.headers['x-role'];
|
|
156
|
+
if (role && role !== 'admin') {
|
|
157
|
+
return reply.code(403).send({
|
|
158
|
+
error: 'Forbidden',
|
|
159
|
+
message: 'Admin access required for audit log purge',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const { before, dryRun = false } = request.body;
|
|
163
|
+
// Validate date
|
|
164
|
+
const beforeDate = new Date(before);
|
|
165
|
+
if (isNaN(beforeDate.getTime())) {
|
|
166
|
+
return reply.code(400).send({
|
|
167
|
+
error: 'BadRequest',
|
|
168
|
+
message: 'Invalid date format for "before" parameter',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const data = await purgeAuditLogs(before, dryRun);
|
|
172
|
+
return reply.send(data);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
fastify.log.error(error, 'Failed to purge audit logs');
|
|
176
|
+
return reply.code(500).send({
|
|
177
|
+
error: 'InternalServerError',
|
|
178
|
+
message: 'Failed to purge audit logs',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
export default fp(auditLogsPlugin, {
|
|
184
|
+
name: 'audit-logs-routes',
|
|
185
|
+
fastify: '5.x',
|
|
186
|
+
});
|
|
187
|
+
export { auditLogsPlugin };
|
|
188
|
+
//# sourceMappingURL=audit-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sourceRoot":"","sources":["../../src/routes/audit-logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Static } from '@sinclair/typebox';
|
|
2
|
+
/**
|
|
3
|
+
* Audit log action enum values (matches AuditActionEnum from shared)
|
|
4
|
+
*/
|
|
5
|
+
export declare const AuditActionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"server.create">, import("@sinclair/typebox").TLiteral<"server.delete">, import("@sinclair/typebox").TLiteral<"server.start">, import("@sinclair/typebox").TLiteral<"server.stop">, import("@sinclair/typebox").TLiteral<"server.restart">, import("@sinclair/typebox").TLiteral<"player.whitelist.add">, import("@sinclair/typebox").TLiteral<"player.whitelist.remove">, import("@sinclair/typebox").TLiteral<"player.ban">, import("@sinclair/typebox").TLiteral<"player.unban">, import("@sinclair/typebox").TLiteral<"player.op">, import("@sinclair/typebox").TLiteral<"player.deop">, import("@sinclair/typebox").TLiteral<"player.kick">, import("@sinclair/typebox").TLiteral<"audit.purge">]>;
|
|
6
|
+
/**
|
|
7
|
+
* Audit log status
|
|
8
|
+
*/
|
|
9
|
+
export declare const AuditStatusSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"success">, import("@sinclair/typebox").TLiteral<"failure">]>;
|
|
10
|
+
/**
|
|
11
|
+
* Single audit log entry
|
|
12
|
+
*/
|
|
13
|
+
export declare const AuditLogEntrySchema: import("@sinclair/typebox").TObject<{
|
|
14
|
+
id: import("@sinclair/typebox").TString;
|
|
15
|
+
action: import("@sinclair/typebox").TString;
|
|
16
|
+
actor: import("@sinclair/typebox").TString;
|
|
17
|
+
targetType: import("@sinclair/typebox").TString;
|
|
18
|
+
targetName: import("@sinclair/typebox").TString;
|
|
19
|
+
details: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>, import("@sinclair/typebox").TNull]>;
|
|
20
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"success">, import("@sinclair/typebox").TLiteral<"failure">]>;
|
|
21
|
+
errorMessage: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull, import("@sinclair/typebox").TUndefined]>;
|
|
22
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Brief audit log entry (for related logs)
|
|
26
|
+
*/
|
|
27
|
+
export declare const AuditLogBriefSchema: import("@sinclair/typebox").TObject<{
|
|
28
|
+
id: import("@sinclair/typebox").TString;
|
|
29
|
+
action: import("@sinclair/typebox").TString;
|
|
30
|
+
targetName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
31
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* GET /api/audit-logs query parameters
|
|
35
|
+
*/
|
|
36
|
+
export declare const AuditLogListQuerySchema: import("@sinclair/typebox").TObject<{
|
|
37
|
+
action: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
38
|
+
actor: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
39
|
+
targetType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
40
|
+
targetName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
41
|
+
status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
42
|
+
from: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
43
|
+
to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
44
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
45
|
+
offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
46
|
+
sort: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
47
|
+
}>;
|
|
48
|
+
/**
|
|
49
|
+
* GET /api/audit-logs/:id params
|
|
50
|
+
*/
|
|
51
|
+
export declare const AuditLogIdParamsSchema: import("@sinclair/typebox").TObject<{
|
|
52
|
+
id: import("@sinclair/typebox").TString;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* DELETE /api/audit-logs request body
|
|
56
|
+
*/
|
|
57
|
+
export declare const AuditLogPurgeRequestSchema: import("@sinclair/typebox").TObject<{
|
|
58
|
+
before: import("@sinclair/typebox").TString;
|
|
59
|
+
dryRun: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Filters applied in the response
|
|
63
|
+
*/
|
|
64
|
+
export declare const AuditLogFiltersSchema: import("@sinclair/typebox").TObject<{
|
|
65
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
66
|
+
actor: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
67
|
+
targetType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
68
|
+
targetName: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
69
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
70
|
+
from: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
71
|
+
to: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* GET /api/audit-logs response
|
|
75
|
+
*/
|
|
76
|
+
export declare const AuditLogListResponseSchema: import("@sinclair/typebox").TObject<{
|
|
77
|
+
logs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
78
|
+
id: import("@sinclair/typebox").TString;
|
|
79
|
+
action: import("@sinclair/typebox").TString;
|
|
80
|
+
actor: import("@sinclair/typebox").TString;
|
|
81
|
+
targetType: import("@sinclair/typebox").TString;
|
|
82
|
+
targetName: import("@sinclair/typebox").TString;
|
|
83
|
+
details: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>, import("@sinclair/typebox").TNull]>;
|
|
84
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"success">, import("@sinclair/typebox").TLiteral<"failure">]>;
|
|
85
|
+
errorMessage: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull, import("@sinclair/typebox").TUndefined]>;
|
|
86
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
87
|
+
}>>;
|
|
88
|
+
total: import("@sinclair/typebox").TNumber;
|
|
89
|
+
limit: import("@sinclair/typebox").TNumber;
|
|
90
|
+
offset: import("@sinclair/typebox").TNumber;
|
|
91
|
+
filters: import("@sinclair/typebox").TObject<{
|
|
92
|
+
action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
93
|
+
actor: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
94
|
+
targetType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
95
|
+
targetName: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
96
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
97
|
+
from: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
98
|
+
to: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
99
|
+
}>;
|
|
100
|
+
}>;
|
|
101
|
+
/**
|
|
102
|
+
* GET /api/audit-logs/stats response
|
|
103
|
+
*/
|
|
104
|
+
export declare const AuditLogStatsResponseSchema: import("@sinclair/typebox").TObject<{
|
|
105
|
+
total: import("@sinclair/typebox").TNumber;
|
|
106
|
+
byAction: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TNumber>;
|
|
107
|
+
byStatus: import("@sinclair/typebox").TObject<{
|
|
108
|
+
success: import("@sinclair/typebox").TNumber;
|
|
109
|
+
failure: import("@sinclair/typebox").TNumber;
|
|
110
|
+
}>;
|
|
111
|
+
byActor: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TNumber>;
|
|
112
|
+
recentActivity: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
113
|
+
id: import("@sinclair/typebox").TString;
|
|
114
|
+
action: import("@sinclair/typebox").TString;
|
|
115
|
+
actor: import("@sinclair/typebox").TString;
|
|
116
|
+
targetType: import("@sinclair/typebox").TString;
|
|
117
|
+
targetName: import("@sinclair/typebox").TString;
|
|
118
|
+
details: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>, import("@sinclair/typebox").TNull]>;
|
|
119
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"success">, import("@sinclair/typebox").TLiteral<"failure">]>;
|
|
120
|
+
errorMessage: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull, import("@sinclair/typebox").TUndefined]>;
|
|
121
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
122
|
+
}>>;
|
|
123
|
+
oldestEntry: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
124
|
+
newestEntry: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
|
|
125
|
+
}>;
|
|
126
|
+
/**
|
|
127
|
+
* GET /api/audit-logs/:id response
|
|
128
|
+
*/
|
|
129
|
+
export declare const AuditLogDetailResponseSchema: import("@sinclair/typebox").TObject<{
|
|
130
|
+
log: import("@sinclair/typebox").TObject<{
|
|
131
|
+
id: import("@sinclair/typebox").TString;
|
|
132
|
+
action: import("@sinclair/typebox").TString;
|
|
133
|
+
actor: import("@sinclair/typebox").TString;
|
|
134
|
+
targetType: import("@sinclair/typebox").TString;
|
|
135
|
+
targetName: import("@sinclair/typebox").TString;
|
|
136
|
+
details: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>, import("@sinclair/typebox").TNull]>;
|
|
137
|
+
status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"success">, import("@sinclair/typebox").TLiteral<"failure">]>;
|
|
138
|
+
errorMessage: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull, import("@sinclair/typebox").TUndefined]>;
|
|
139
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
140
|
+
}>;
|
|
141
|
+
relatedLogs: import("@sinclair/typebox").TObject<{
|
|
142
|
+
sameTarget: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
143
|
+
id: import("@sinclair/typebox").TString;
|
|
144
|
+
action: import("@sinclair/typebox").TString;
|
|
145
|
+
targetName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
146
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
147
|
+
}>>;
|
|
148
|
+
sameActor: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
149
|
+
id: import("@sinclair/typebox").TString;
|
|
150
|
+
action: import("@sinclair/typebox").TString;
|
|
151
|
+
targetName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
152
|
+
timestamp: import("@sinclair/typebox").TString;
|
|
153
|
+
}>>;
|
|
154
|
+
}>;
|
|
155
|
+
}>;
|
|
156
|
+
/**
|
|
157
|
+
* DELETE /api/audit-logs response
|
|
158
|
+
*/
|
|
159
|
+
export declare const AuditLogPurgeResponseSchema: import("@sinclair/typebox").TObject<{
|
|
160
|
+
deleted: import("@sinclair/typebox").TNumber;
|
|
161
|
+
dryRun: import("@sinclair/typebox").TBoolean;
|
|
162
|
+
message: import("@sinclair/typebox").TString;
|
|
163
|
+
}>;
|
|
164
|
+
/**
|
|
165
|
+
* Error response schema (reused)
|
|
166
|
+
*/
|
|
167
|
+
export declare const ErrorResponseSchema: import("@sinclair/typebox").TObject<{
|
|
168
|
+
error: import("@sinclair/typebox").TString;
|
|
169
|
+
message: import("@sinclair/typebox").TString;
|
|
170
|
+
}>;
|
|
171
|
+
export type AuditLogEntry = Static<typeof AuditLogEntrySchema>;
|
|
172
|
+
export type AuditLogBrief = Static<typeof AuditLogBriefSchema>;
|
|
173
|
+
export type AuditLogListQuery = Static<typeof AuditLogListQuerySchema>;
|
|
174
|
+
export type AuditLogIdParams = Static<typeof AuditLogIdParamsSchema>;
|
|
175
|
+
export type AuditLogPurgeRequest = Static<typeof AuditLogPurgeRequestSchema>;
|
|
176
|
+
export type AuditLogListResponse = Static<typeof AuditLogListResponseSchema>;
|
|
177
|
+
export type AuditLogStatsResponse = Static<typeof AuditLogStatsResponseSchema>;
|
|
178
|
+
export type AuditLogDetailResponse = Static<typeof AuditLogDetailResponseSchema>;
|
|
179
|
+
export type AuditLogPurgeResponse = Static<typeof AuditLogPurgeResponseSchema>;
|
|
180
|
+
//# sourceMappingURL=audit-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/schemas/audit-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAMjD;;GAEG;AACH,eAAO,MAAM,iBAAiB,kvBAc5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,wIAG5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;EAU9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;EAK9B,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;EAWlC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB;;EAEjC,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;EAGrC,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;EAQhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;EAMrC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;EAWtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;EAMvC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;EAItC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;EAG9B,CAAC;AAMH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACvE,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACrE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAC/E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACjF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Audit Log Schemas
|
|
4
|
+
// ============================================================
|
|
5
|
+
/**
|
|
6
|
+
* Audit log action enum values (matches AuditActionEnum from shared)
|
|
7
|
+
*/
|
|
8
|
+
export const AuditActionSchema = Type.Union([
|
|
9
|
+
Type.Literal('server.create'),
|
|
10
|
+
Type.Literal('server.delete'),
|
|
11
|
+
Type.Literal('server.start'),
|
|
12
|
+
Type.Literal('server.stop'),
|
|
13
|
+
Type.Literal('server.restart'),
|
|
14
|
+
Type.Literal('player.whitelist.add'),
|
|
15
|
+
Type.Literal('player.whitelist.remove'),
|
|
16
|
+
Type.Literal('player.ban'),
|
|
17
|
+
Type.Literal('player.unban'),
|
|
18
|
+
Type.Literal('player.op'),
|
|
19
|
+
Type.Literal('player.deop'),
|
|
20
|
+
Type.Literal('player.kick'),
|
|
21
|
+
Type.Literal('audit.purge'),
|
|
22
|
+
]);
|
|
23
|
+
/**
|
|
24
|
+
* Audit log status
|
|
25
|
+
*/
|
|
26
|
+
export const AuditStatusSchema = Type.Union([
|
|
27
|
+
Type.Literal('success'),
|
|
28
|
+
Type.Literal('failure'),
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Single audit log entry
|
|
32
|
+
*/
|
|
33
|
+
export const AuditLogEntrySchema = Type.Object({
|
|
34
|
+
id: Type.String(),
|
|
35
|
+
action: Type.String(),
|
|
36
|
+
actor: Type.String(),
|
|
37
|
+
targetType: Type.String(),
|
|
38
|
+
targetName: Type.String(),
|
|
39
|
+
details: Type.Union([Type.Record(Type.String(), Type.Unknown()), Type.Null()]),
|
|
40
|
+
status: AuditStatusSchema,
|
|
41
|
+
errorMessage: Type.Union([Type.String(), Type.Null(), Type.Undefined()]),
|
|
42
|
+
timestamp: Type.String({ format: 'date-time' }),
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Brief audit log entry (for related logs)
|
|
46
|
+
*/
|
|
47
|
+
export const AuditLogBriefSchema = Type.Object({
|
|
48
|
+
id: Type.String(),
|
|
49
|
+
action: Type.String(),
|
|
50
|
+
targetName: Type.Optional(Type.String()),
|
|
51
|
+
timestamp: Type.String({ format: 'date-time' }),
|
|
52
|
+
});
|
|
53
|
+
// ============================================================
|
|
54
|
+
// Query Schemas
|
|
55
|
+
// ============================================================
|
|
56
|
+
/**
|
|
57
|
+
* GET /api/audit-logs query parameters
|
|
58
|
+
*/
|
|
59
|
+
export const AuditLogListQuerySchema = Type.Object({
|
|
60
|
+
action: Type.Optional(Type.String({ description: 'Action filter (comma-separated for multiple)' })),
|
|
61
|
+
actor: Type.Optional(Type.String({ description: 'Actor filter (e.g., cli:local, api:admin)' })),
|
|
62
|
+
targetType: Type.Optional(Type.String({ description: 'Target type filter (server, player)' })),
|
|
63
|
+
targetName: Type.Optional(Type.String({ description: 'Target name filter (partial match)' })),
|
|
64
|
+
status: Type.Optional(Type.String({ description: 'Status filter (success, failure)' })),
|
|
65
|
+
from: Type.Optional(Type.String({ format: 'date-time', description: 'Start date (ISO 8601)' })),
|
|
66
|
+
to: Type.Optional(Type.String({ format: 'date-time', description: 'End date (ISO 8601)' })),
|
|
67
|
+
limit: Type.Optional(Type.Number({ minimum: 1, maximum: 200, default: 50, description: 'Page size (max: 200)' })),
|
|
68
|
+
offset: Type.Optional(Type.Number({ minimum: 0, default: 0, description: 'Offset for pagination' })),
|
|
69
|
+
sort: Type.Optional(Type.String({ default: 'timestamp:desc', description: 'Sort order (timestamp:asc, timestamp:desc)' })),
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* GET /api/audit-logs/:id params
|
|
73
|
+
*/
|
|
74
|
+
export const AuditLogIdParamsSchema = Type.Object({
|
|
75
|
+
id: Type.String({ description: 'Audit log entry ID' }),
|
|
76
|
+
});
|
|
77
|
+
// ============================================================
|
|
78
|
+
// Request Schemas
|
|
79
|
+
// ============================================================
|
|
80
|
+
/**
|
|
81
|
+
* DELETE /api/audit-logs request body
|
|
82
|
+
*/
|
|
83
|
+
export const AuditLogPurgeRequestSchema = Type.Object({
|
|
84
|
+
before: Type.String({ format: 'date-time', description: 'Delete logs before this date (ISO 8601)' }),
|
|
85
|
+
dryRun: Type.Optional(Type.Boolean({ default: false, description: 'If true, only count logs to be deleted' })),
|
|
86
|
+
});
|
|
87
|
+
// ============================================================
|
|
88
|
+
// Response Schemas
|
|
89
|
+
// ============================================================
|
|
90
|
+
/**
|
|
91
|
+
* Filters applied in the response
|
|
92
|
+
*/
|
|
93
|
+
export const AuditLogFiltersSchema = Type.Object({
|
|
94
|
+
action: Type.Union([Type.String(), Type.Null()]),
|
|
95
|
+
actor: Type.Union([Type.String(), Type.Null()]),
|
|
96
|
+
targetType: Type.Union([Type.String(), Type.Null()]),
|
|
97
|
+
targetName: Type.Union([Type.String(), Type.Null()]),
|
|
98
|
+
status: Type.Union([Type.String(), Type.Null()]),
|
|
99
|
+
from: Type.Union([Type.String(), Type.Null()]),
|
|
100
|
+
to: Type.Union([Type.String(), Type.Null()]),
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* GET /api/audit-logs response
|
|
104
|
+
*/
|
|
105
|
+
export const AuditLogListResponseSchema = Type.Object({
|
|
106
|
+
logs: Type.Array(AuditLogEntrySchema),
|
|
107
|
+
total: Type.Number(),
|
|
108
|
+
limit: Type.Number(),
|
|
109
|
+
offset: Type.Number(),
|
|
110
|
+
filters: AuditLogFiltersSchema,
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* GET /api/audit-logs/stats response
|
|
114
|
+
*/
|
|
115
|
+
export const AuditLogStatsResponseSchema = Type.Object({
|
|
116
|
+
total: Type.Number(),
|
|
117
|
+
byAction: Type.Record(Type.String(), Type.Number()),
|
|
118
|
+
byStatus: Type.Object({
|
|
119
|
+
success: Type.Number(),
|
|
120
|
+
failure: Type.Number(),
|
|
121
|
+
}),
|
|
122
|
+
byActor: Type.Record(Type.String(), Type.Number()),
|
|
123
|
+
recentActivity: Type.Array(AuditLogEntrySchema),
|
|
124
|
+
oldestEntry: Type.Union([Type.String({ format: 'date-time' }), Type.Null()]),
|
|
125
|
+
newestEntry: Type.Union([Type.String({ format: 'date-time' }), Type.Null()]),
|
|
126
|
+
});
|
|
127
|
+
/**
|
|
128
|
+
* GET /api/audit-logs/:id response
|
|
129
|
+
*/
|
|
130
|
+
export const AuditLogDetailResponseSchema = Type.Object({
|
|
131
|
+
log: AuditLogEntrySchema,
|
|
132
|
+
relatedLogs: Type.Object({
|
|
133
|
+
sameTarget: Type.Array(AuditLogBriefSchema),
|
|
134
|
+
sameActor: Type.Array(AuditLogBriefSchema),
|
|
135
|
+
}),
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* DELETE /api/audit-logs response
|
|
139
|
+
*/
|
|
140
|
+
export const AuditLogPurgeResponseSchema = Type.Object({
|
|
141
|
+
deleted: Type.Number(),
|
|
142
|
+
dryRun: Type.Boolean(),
|
|
143
|
+
message: Type.String(),
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Error response schema (reused)
|
|
147
|
+
*/
|
|
148
|
+
export const ErrorResponseSchema = Type.Object({
|
|
149
|
+
error: Type.String(),
|
|
150
|
+
message: Type.String(),
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=audit-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../src/schemas/audit-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SqliteAuditLogRepository } from '@minecraft-docker/shared';
|
|
2
|
+
import type { AuditLogEntry, AuditLogListQuery, AuditLogListResponse, AuditLogStatsResponse, AuditLogDetailResponse, AuditLogPurgeResponse } from '../schemas/audit-log.js';
|
|
3
|
+
/**
|
|
4
|
+
* Event listeners for new audit log entries (SSE support)
|
|
5
|
+
*/
|
|
6
|
+
type AuditLogListener = (log: AuditLogEntry) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Get or create the audit log repository singleton
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAuditLogRepository(): SqliteAuditLogRepository;
|
|
11
|
+
/**
|
|
12
|
+
* Get audit logs list with filtering and pagination
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAuditLogs(query: AuditLogListQuery): Promise<AuditLogListResponse>;
|
|
15
|
+
/**
|
|
16
|
+
* Get audit log statistics
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAuditLogStats(): Promise<AuditLogStatsResponse>;
|
|
19
|
+
/**
|
|
20
|
+
* Get single audit log with related logs
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAuditLogById(id: string): Promise<AuditLogDetailResponse | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Purge audit logs older than a given date
|
|
25
|
+
*/
|
|
26
|
+
export declare function purgeAuditLogs(before: string, dryRun?: boolean): Promise<AuditLogPurgeResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Subscribe to new audit log events
|
|
29
|
+
*/
|
|
30
|
+
export declare function subscribeAuditLogs(listener: AuditLogListener): () => void;
|
|
31
|
+
/**
|
|
32
|
+
* Notify all listeners of a new audit log entry
|
|
33
|
+
* Called by routes that create audit log entries
|
|
34
|
+
*/
|
|
35
|
+
export declare function notifyNewAuditLog(entry: AuditLogEntry): void;
|
|
36
|
+
/**
|
|
37
|
+
* Close the repository (for graceful shutdown)
|
|
38
|
+
*/
|
|
39
|
+
export declare function closeAuditLogRepository(): void;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=audit-log-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log-service.d.ts","sourceRoot":"","sources":["../../src/services/audit-log-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EAKzB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,aAAa,EAEb,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAOjC;;GAEG;AACH,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;AAGrD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,wBAAwB,CAMhE;AAyFD;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B1F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAoDvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA8BxF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,qBAAqB,CAAC,CAsBhC;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAKzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQ5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { SqliteAuditLogRepository, AuditActionEnum, } from '@minecraft-docker/shared';
|
|
3
|
+
import { config } from '../config/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Singleton instance of the audit log repository
|
|
6
|
+
*/
|
|
7
|
+
let repository = null;
|
|
8
|
+
const listeners = new Set();
|
|
9
|
+
/**
|
|
10
|
+
* Get or create the audit log repository singleton
|
|
11
|
+
*/
|
|
12
|
+
export function getAuditLogRepository() {
|
|
13
|
+
if (!repository) {
|
|
14
|
+
const dbPath = join(config.mcctlRoot, 'audit.db');
|
|
15
|
+
repository = new SqliteAuditLogRepository(dbPath);
|
|
16
|
+
}
|
|
17
|
+
return repository;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert AuditLog entity to API response entry
|
|
21
|
+
*/
|
|
22
|
+
function toEntry(log) {
|
|
23
|
+
const json = log.toJSON();
|
|
24
|
+
return {
|
|
25
|
+
id: json.id,
|
|
26
|
+
action: json.action,
|
|
27
|
+
actor: json.actor,
|
|
28
|
+
targetType: json.targetType,
|
|
29
|
+
targetName: json.targetName,
|
|
30
|
+
details: json.details,
|
|
31
|
+
status: json.status,
|
|
32
|
+
errorMessage: json.errorMessage ?? null,
|
|
33
|
+
timestamp: json.timestamp,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert AuditLog entity to brief entry
|
|
38
|
+
*/
|
|
39
|
+
function toBrief(log) {
|
|
40
|
+
const json = log.toJSON();
|
|
41
|
+
return {
|
|
42
|
+
id: json.id,
|
|
43
|
+
action: json.action,
|
|
44
|
+
targetName: json.targetName,
|
|
45
|
+
timestamp: json.timestamp,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse sort parameter
|
|
50
|
+
*/
|
|
51
|
+
function parseSortOrder(sort) {
|
|
52
|
+
if (sort === 'timestamp:asc')
|
|
53
|
+
return 'asc';
|
|
54
|
+
return 'desc';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build query options from request query parameters
|
|
58
|
+
*/
|
|
59
|
+
function buildQueryOptions(query) {
|
|
60
|
+
const options = {};
|
|
61
|
+
if (query.action) {
|
|
62
|
+
// Take first action for now (port interface only supports single action)
|
|
63
|
+
const firstAction = query.action.split(',')[0]?.trim();
|
|
64
|
+
if (firstAction && Object.values(AuditActionEnum).includes(firstAction)) {
|
|
65
|
+
options.action = firstAction;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (query.actor) {
|
|
69
|
+
options.actor = query.actor;
|
|
70
|
+
}
|
|
71
|
+
if (query.targetType) {
|
|
72
|
+
options.targetType = query.targetType;
|
|
73
|
+
}
|
|
74
|
+
if (query.targetName) {
|
|
75
|
+
options.targetName = query.targetName;
|
|
76
|
+
}
|
|
77
|
+
if (query.status === 'success' || query.status === 'failure') {
|
|
78
|
+
options.status = query.status;
|
|
79
|
+
}
|
|
80
|
+
if (query.from) {
|
|
81
|
+
options.from = new Date(query.from);
|
|
82
|
+
}
|
|
83
|
+
if (query.to) {
|
|
84
|
+
options.to = new Date(query.to);
|
|
85
|
+
}
|
|
86
|
+
options.limit = query.limit ?? 50;
|
|
87
|
+
options.offset = query.offset ?? 0;
|
|
88
|
+
return options;
|
|
89
|
+
}
|
|
90
|
+
// ============================================================
|
|
91
|
+
// Service Functions
|
|
92
|
+
// ============================================================
|
|
93
|
+
/**
|
|
94
|
+
* Get audit logs list with filtering and pagination
|
|
95
|
+
*/
|
|
96
|
+
export async function getAuditLogs(query) {
|
|
97
|
+
const repo = getAuditLogRepository();
|
|
98
|
+
const options = buildQueryOptions(query);
|
|
99
|
+
// Get logs and total count
|
|
100
|
+
const [logs, total] = await Promise.all([
|
|
101
|
+
repo.findAll(options),
|
|
102
|
+
repo.count(options),
|
|
103
|
+
]);
|
|
104
|
+
// If sort is ascending, reverse the default DESC results
|
|
105
|
+
const sortOrder = parseSortOrder(query.sort);
|
|
106
|
+
const sortedLogs = sortOrder === 'asc' ? [...logs].reverse() : logs;
|
|
107
|
+
return {
|
|
108
|
+
logs: sortedLogs.map(toEntry),
|
|
109
|
+
total,
|
|
110
|
+
limit: options.limit ?? 50,
|
|
111
|
+
offset: options.offset ?? 0,
|
|
112
|
+
filters: {
|
|
113
|
+
action: query.action ?? null,
|
|
114
|
+
actor: query.actor ?? null,
|
|
115
|
+
targetType: query.targetType ?? null,
|
|
116
|
+
targetName: query.targetName ?? null,
|
|
117
|
+
status: query.status ?? null,
|
|
118
|
+
from: query.from ?? null,
|
|
119
|
+
to: query.to ?? null,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get audit log statistics
|
|
125
|
+
*/
|
|
126
|
+
export async function getAuditLogStats() {
|
|
127
|
+
const repo = getAuditLogRepository();
|
|
128
|
+
// Get total count
|
|
129
|
+
const total = await repo.count();
|
|
130
|
+
// Get counts by action
|
|
131
|
+
const byAction = {};
|
|
132
|
+
for (const action of Object.values(AuditActionEnum)) {
|
|
133
|
+
const count = await repo.count({ action });
|
|
134
|
+
if (count > 0) {
|
|
135
|
+
byAction[action] = count;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Get counts by status
|
|
139
|
+
const [successCount, failureCount] = await Promise.all([
|
|
140
|
+
repo.count({ status: 'success' }),
|
|
141
|
+
repo.count({ status: 'failure' }),
|
|
142
|
+
]);
|
|
143
|
+
// Get all logs for actor aggregation (limited to recent)
|
|
144
|
+
const recentLogs = await repo.findAll({ limit: 1000 });
|
|
145
|
+
// Aggregate by actor
|
|
146
|
+
const byActor = {};
|
|
147
|
+
for (const log of recentLogs) {
|
|
148
|
+
const actor = log.actor;
|
|
149
|
+
byActor[actor] = (byActor[actor] ?? 0) + 1;
|
|
150
|
+
}
|
|
151
|
+
// Get recent activity (last 10)
|
|
152
|
+
const recentActivity = await repo.findAll({ limit: 10 });
|
|
153
|
+
// Get oldest and newest entries
|
|
154
|
+
const allLogs = await repo.findAll({ limit: 1 });
|
|
155
|
+
const oldestLogs = await repo.findAll({});
|
|
156
|
+
const newestEntry = allLogs.length > 0 ? allLogs[0].timestamp.toISOString() : null;
|
|
157
|
+
const oldestEntry = oldestLogs.length > 0 ? oldestLogs[oldestLogs.length - 1].timestamp.toISOString() : null;
|
|
158
|
+
return {
|
|
159
|
+
total,
|
|
160
|
+
byAction,
|
|
161
|
+
byStatus: {
|
|
162
|
+
success: successCount,
|
|
163
|
+
failure: failureCount,
|
|
164
|
+
},
|
|
165
|
+
byActor,
|
|
166
|
+
recentActivity: recentActivity.map(toEntry),
|
|
167
|
+
oldestEntry,
|
|
168
|
+
newestEntry,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get single audit log with related logs
|
|
173
|
+
*/
|
|
174
|
+
export async function getAuditLogById(id) {
|
|
175
|
+
const repo = getAuditLogRepository();
|
|
176
|
+
// Find the log by ID
|
|
177
|
+
const allLogs = await repo.findAll({});
|
|
178
|
+
const log = allLogs.find(l => l.id === id);
|
|
179
|
+
if (!log) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
// Get related logs (same target, same actor)
|
|
183
|
+
const [sameTarget, sameActor] = await Promise.all([
|
|
184
|
+
repo.findByTarget(log.targetType, log.targetName),
|
|
185
|
+
repo.findByActor(log.actor),
|
|
186
|
+
]);
|
|
187
|
+
return {
|
|
188
|
+
log: toEntry(log),
|
|
189
|
+
relatedLogs: {
|
|
190
|
+
sameTarget: sameTarget
|
|
191
|
+
.filter(l => l.id !== id)
|
|
192
|
+
.slice(0, 10)
|
|
193
|
+
.map(toBrief),
|
|
194
|
+
sameActor: sameActor
|
|
195
|
+
.filter(l => l.id !== id)
|
|
196
|
+
.slice(0, 10)
|
|
197
|
+
.map(toBrief),
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Purge audit logs older than a given date
|
|
203
|
+
*/
|
|
204
|
+
export async function purgeAuditLogs(before, dryRun = false) {
|
|
205
|
+
const repo = getAuditLogRepository();
|
|
206
|
+
const beforeDate = new Date(before);
|
|
207
|
+
if (dryRun) {
|
|
208
|
+
// Count logs that would be deleted
|
|
209
|
+
const count = await repo.count({ to: beforeDate });
|
|
210
|
+
return {
|
|
211
|
+
deleted: count,
|
|
212
|
+
dryRun: true,
|
|
213
|
+
message: `${count} audit log entries would be deleted before ${before}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// Actually delete
|
|
217
|
+
const deleted = await repo.deleteOlderThan(beforeDate);
|
|
218
|
+
return {
|
|
219
|
+
deleted,
|
|
220
|
+
dryRun: false,
|
|
221
|
+
message: `${deleted} audit log entries deleted before ${before}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// ============================================================
|
|
225
|
+
// SSE Support
|
|
226
|
+
// ============================================================
|
|
227
|
+
/**
|
|
228
|
+
* Subscribe to new audit log events
|
|
229
|
+
*/
|
|
230
|
+
export function subscribeAuditLogs(listener) {
|
|
231
|
+
listeners.add(listener);
|
|
232
|
+
return () => {
|
|
233
|
+
listeners.delete(listener);
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Notify all listeners of a new audit log entry
|
|
238
|
+
* Called by routes that create audit log entries
|
|
239
|
+
*/
|
|
240
|
+
export function notifyNewAuditLog(entry) {
|
|
241
|
+
for (const listener of listeners) {
|
|
242
|
+
try {
|
|
243
|
+
listener(entry);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Ignore listener errors
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Close the repository (for graceful shutdown)
|
|
252
|
+
*/
|
|
253
|
+
export function closeAuditLogRepository() {
|
|
254
|
+
if (repository) {
|
|
255
|
+
repository.close();
|
|
256
|
+
repository = null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=audit-log-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log-service.js","sourceRoot":"","sources":["../../src/services/audit-log-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minecraft-docker/mcctl-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "REST API server for managing Docker Minecraft servers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@fastify/helmet": "^12.0.1",
|
|
52
52
|
"@fastify/swagger": "^9.6.1",
|
|
53
53
|
"@fastify/swagger-ui": "^5.2.4",
|
|
54
|
-
"@minecraft-docker/shared": "^1.
|
|
54
|
+
"@minecraft-docker/shared": "^1.10.0",
|
|
55
55
|
"@sinclair/typebox": "^0.34.48",
|
|
56
56
|
"bcrypt": "^6.0.0",
|
|
57
57
|
"dotenv": "^16.4.7",
|