Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 31 additions & 20 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"@types/express": "^4.17.21",
"@types/jest": "^30.0.0",
"@types/jsonwebtoken": "9.0.5",
"@types/mongodb-memory-server": "^1.8.0",
"@types/mongoose": "5.11.97",
"@types/multer": "^2.2.0",
"@types/node": "^20.10.0",
Expand All @@ -61,7 +62,7 @@
"husky": "8.0.3",
"jest": "^30.4.2",
"lint-staged": "15.2.0",
"mongodb-memory-server": "9.1.6",
"mongodb-memory-server": "^9.1.6",
"nodemon": "^3.0.2",
"prettier": "3.1.1",
"supertest": "^7.2.2",
Expand Down
4 changes: 2 additions & 2 deletions src/config/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ interface EnvConfig {
RATE_LIMIT_WINDOW_MS: number;
RATE_LIMIT_MAX_REQUESTS: number;
DISPUTE_NOTIFICATION_WEBHOOK_URL: string;
UPLOAD_STORAGE_DRIVER?: string;
AWS_S3_BUCKET?: string;
UPLOAD_STORAGE_DRIVER?: string; // Add this
AWS_S3_BUCKET?: string; // Add this
}

const envSchema = z.object({
Expand Down
118 changes: 118 additions & 0 deletions src/controllers/eventLogController.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { Request, Response } from 'express';
import { StatusCodes } from 'http-status-codes';
import eventLogService from '../services/eventLogService';
import logger from '../config/logger';

export class EventLogController {
/**
* Get the last processed ledger sequence
* GET /api/v1/eventlog/last-processed
*/
async getLastProcessedLedger(req: Request, res: Response): Promise<Response> {
try {
const { eventType } = req.query;
const lastLedger = await eventLogService.getLastProcessedLedger(
eventType as string | undefined
);
return res.status(StatusCodes.OK).json({
success: true,
data: { lastProcessedLedger: lastLedger },
message: 'Last processed ledger sequence retrieved successfully',
});
} catch (error) {
logger.error('Error in getLastProcessedLedger:', error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
success: false,
message: 'Failed to retrieve last processed ledger',
});
}
}

/**
* Get unprocessed events
* GET /api/v1/eventlog/unprocessed
*/
async getUnprocessedEvents(req: Request, res: Response): Promise<Response> {
try {
const events = await eventLogService.getUnprocessedEvents();
return res.status(StatusCodes.OK).json({
success: true,
data: events,
message: 'Unprocessed events retrieved successfully',
});
} catch (error) {
logger.error('Error in getUnprocessedEvents:', error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
success: false,
message: 'Failed to retrieve unprocessed events',
});
}
}

/**
* Get events by ledger sequence range
* GET /api/v1/eventlog/range
*/
async getEventsByLedgerRange(req: Request, res: Response): Promise<Response> {
try {
const { startLedger, endLedger, eventType } = req.query;

if (!startLedger || !endLedger) {
return res.status(StatusCodes.BAD_REQUEST).json({
success: false,
message: 'startLedger and endLedger are required',
});
}

const events = await eventLogService.getEventsByLedgerRange(
parseInt(startLedger as string),
parseInt(endLedger as string),
eventType as string | undefined
);

return res.status(StatusCodes.OK).json({
success: true,
data: events,
message: 'Events retrieved successfully',
});
} catch (error) {
logger.error('Error in getEventsByLedgerRange:', error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
success: false,
message: 'Failed to retrieve events',
});
}
}

/**
* Get event by transaction hash
* GET /api/v1/eventlog/transaction/:hash
*/
async getEventByTransactionHash(req: Request, res: Response): Promise<Response> {
try {
const { hash } = req.params;
const event = await eventLogService.getEventByTransactionHash(hash);

if (!event) {
return res.status(StatusCodes.NOT_FOUND).json({
success: false,
message: 'Event not found',
});
}

return res.status(StatusCodes.OK).json({
success: true,
data: event,
message: 'Event retrieved successfully',
});
} catch (error) {
logger.error('Error in getEventByTransactionHash:', error);
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
success: false,
message: 'Failed to retrieve event',
});
}
}
}

export default new EventLogController();
Loading