@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 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;AAenD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgFtF;AAED,eAAe,QAAQ,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;AAM9C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA2B,EAAE;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;YACpD,KAAK,EAAE,MAAM,CAAC,QAAQ;SACvB,CAAC,CAAC,CAAC,KAAK;KACV,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,wEAAwE;IACxE,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;YACzB,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC7B,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,mFAAmF;IACnF,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,MAAM,EAAE,CAAC;QACjF,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;YAChC,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,gDAAgD;YAC7D,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClC,MAAM,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAExC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAElC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,wBAAwB;IACxB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC5B,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,sBAAsB;IACtB,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAElC,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QAChD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,+BAA+B,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,eAAe,QAAQ,CAAC"}
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;AAC9C,OAAO,eAAe,MAAM,wBAAwB,CAAC;AAMrD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA2B,EAAE;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;YACpD,KAAK,EAAE,MAAM,CAAC,QAAQ;SACvB,CAAC,CAAC,CAAC,KAAK;KACV,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,wEAAwE;IACxE,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACpC,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;YACzB,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;IACjC,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC7B,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC,CAAC;IAEH,mFAAmF;IACnF,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,MAAM,EAAE,CAAC;QACjF,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;YAChC,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,gDAAgD;YAC7D,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClC,MAAM,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAExC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAElC,yBAAyB;IACzB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,wBAAwB;IACxB,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,MAAM,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAEpC,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC5B,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAGH,sBAAsB;IACtB,MAAM,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAElC,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QAChD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,+BAA+B,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,eAAe,QAAQ,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAU,MAAM,mBAAmB,CAAC;AAEjD,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACpC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;CACxB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE;IACzB,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE;IACzB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACxE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC,CAAC;IACnG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC,CAAC;IAC/F,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,CAAC;IAC9F,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC,CAAC;IAC7F,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC,CAAC;IACvF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC/F,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC3F,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACjH,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;IACpG,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC,CAAC;CAC3H,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC;IAChD,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACvD,CAAC,CAAC;AAEH,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;IACpG,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAC;CAC/G,CAAC,CAAC;AAEH,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;CAC7C,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,qBAAqB;CAC/B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC;IACrD,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;KACvB,CAAC;IACF,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAClD,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;IAC/C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;CAC7E,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC,MAAM,CAAC;IACtD,GAAG,EAAE,mBAAmB;IACxB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;QACvB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;KAC3C,CAAC;CACH,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC,MAAM,CAAC;IACrD,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE;IACtB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC"}
@@ -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.8.0",
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.8.0",
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",