diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts-portfolios/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts-portfolios/route.ts index aa642c53..d600e7f9 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts-portfolios/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts-portfolios/route.ts @@ -7,14 +7,15 @@ import { } from '@/core/application/use-cases/accounts-with-portfolios/fetch-accounts-with-portfolios-use-case' import { applyMiddleware } from '@/lib/applymiddleware/apply-middleware' import { loggerMiddleware } from '@/utils/logger-middleware-config' +import { LoggerAggregator } from '@/core/application/logger/logger-aggregator' + +const midazLogger = container.get(LoggerAggregator) export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAccountsWithPortfolios', - method: 'GET', - useCase: 'FetchAccountsWithPortfoliosUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( @@ -41,6 +42,13 @@ export const GET = applyMiddleware( page ) + midazLogger.debug('Accounts with portfolios fetched', { + organizationId, + ledgerId: params.ledgerId, + portfolioId: params.portfolioId, + accountsWithPortfolios + }) + return NextResponse.json(accountsWithPortfolios) } catch (error: any) { const { message, status } = await apiErrorHandler(error) diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/[accountId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/[accountId]/route.ts index badf701e..fa6477c8 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/[accountId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/[accountId]/route.ts @@ -15,14 +15,15 @@ import { import { NextResponse, NextRequest } from 'next/server' import { applyMiddleware } from '@/lib/applymiddleware/apply-middleware' import { loggerMiddleware } from '@/utils/logger-middleware-config' +import { LoggerAggregator } from '@/core/application/logger/logger-aggregator' + +const midazLogger = container.get(LoggerAggregator) export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'getAccountById', - method: 'GET', - useCase: 'FetchAccountByIdUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( @@ -62,9 +63,7 @@ export const PATCH = applyMiddleware( [ loggerMiddleware({ operationName: 'updateAccount', - method: 'PATCH', - useCase: 'UpdateAccountUseCase', - logLevel: 'info' + method: 'PATCH' }) ], async ( @@ -105,9 +104,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deleteAccount', - method: 'DELETE', - useCase: 'DeleteAccountUseCase', - logLevel: 'info' + method: 'DELETE' }) ], async ( @@ -128,7 +125,7 @@ export const DELETE = applyMiddleware( const { id: organizationId, ledgerId, accountId } = params await deleteAccountUseCase.execute(organizationId, ledgerId, accountId) - + midazLogger.audit('Account deleted', { accountId }) return NextResponse.json({}, { status: 200 }) } catch (error: any) { const { message, status } = await apiErrorHandler(error) diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/route.ts index c9975e6b..b540e24a 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/accounts/route.ts @@ -11,14 +11,16 @@ import { import { NextResponse, NextRequest } from 'next/server' import { applyMiddleware } from '@/lib/applymiddleware/apply-middleware' import { loggerMiddleware } from '@/utils/logger-middleware-config' +import { LoggerAggregator } from '@/core/application/logger/logger-aggregator' + + +const midazLogger = container.get(LoggerAggregator) export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllAccounts', - method: 'GET', - useCase: 'FetchAllAccountsUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( @@ -67,9 +69,7 @@ export const POST = applyMiddleware( [ loggerMiddleware({ operationName: 'createAccount', - method: 'POST', - useCase: 'CreateAccountUseCase', - logLevel: 'info' + method: 'POST' }) ], async ( @@ -90,6 +90,8 @@ export const POST = applyMiddleware( body ) + midazLogger.info('Account created', { account }) + return NextResponse.json(account) } catch (error: any) { const { message, status } = await apiErrorHandler(error) diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/[assetId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/[assetId]/route.ts index ed8b3bea..61d7f640 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/[assetId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/[assetId]/route.ts @@ -20,9 +20,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAssetById', - method: 'GET', - useCase: 'FetchAssetByIdUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( @@ -49,9 +47,7 @@ export const PATCH = applyMiddleware( [ loggerMiddleware({ operationName: 'updateAsset', - method: 'PATCH', - useCase: 'UpdateAssetUseCase', - logLevel: 'info' + method: 'PATCH' }) ], async ( @@ -84,9 +80,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deleteAsset', - method: 'DELETE', - useCase: 'DeleteAssetUseCase', - logLevel: 'info' + method: 'DELETE' }) ], async ( diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/route.ts index b944ed8c..f4d051b3 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/assets/route.ts @@ -16,9 +16,7 @@ export const POST = applyMiddleware( [ loggerMiddleware({ operationName: 'createAsset', - method: 'POST', - useCase: 'CreateAssetUseCase', - logLevel: 'info' + method: 'POST' }) ], async ( @@ -51,9 +49,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllAssets', - method: 'GET', - useCase: 'FetchAllAssetsUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios-accounts/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios-accounts/route.ts index 2a97e939..707790e9 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios-accounts/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios-accounts/route.ts @@ -12,9 +12,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchPortfoliosWithAccounts', - method: 'GET', - useCase: 'FetchPortfoliosWithAccountsUseCase', - logLevel: 'info' + method: 'GET' }) ], async ( diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/[portfolioId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/[portfolioId]/route.ts index aa7a63df..237057d7 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/[portfolioId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/[portfolioId]/route.ts @@ -20,9 +20,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deletePortfolio', - method: 'DELETE', - useCase: 'DeletePortfolioUseCase', - logLevel: 'audit' + method: 'DELETE' }) ], async ( @@ -53,9 +51,7 @@ export const PATCH = applyMiddleware( [ loggerMiddleware({ operationName: 'updatePortfolio', - method: 'PATCH', - useCase: 'UpdatePortfolioUseCase', - logLevel: 'audit' + method: 'PATCH' }) ], async ( @@ -89,9 +85,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchPortfolioById', - method: 'GET', - useCase: 'FetchPortfolioByIdUseCase', - logLevel: 'debug' + method: 'GET' }) ], async ( diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/route.ts index 1e802820..fbe33c4a 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/portfolios/route.ts @@ -30,7 +30,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllPortfolios', - method: 'GET', + method: 'GET' }) ], async (request: NextRequest, { params }: { params: PortfolioParams }) => { @@ -49,6 +49,11 @@ export const GET = applyMiddleware( ) + midazLogger.debug('Portfolios fetched', { + organizationId, + ledgerId, + portfolios + }) return NextResponse.json(portfolios) } catch (error: any) { @@ -62,7 +67,7 @@ export const POST = applyMiddleware( [ loggerMiddleware({ operationName: 'createPortfolio', - method: 'POST', + method: 'POST' }) ], async (request: NextRequest, { params }: { params: PortfolioParams }) => { diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts index edf71fa6..52e39ce0 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts @@ -62,9 +62,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deleteProduct', - method: 'DELETE', - useCase: 'DeleteProductUseCase', - logLevel: 'info' + method: 'DELETE' }) ], async (request: Request, { params }: { params: ProductParams }) => { diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts index 6a63e828..72693a54 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts @@ -21,9 +21,7 @@ export const POST = applyMiddleware( [ loggerMiddleware({ operationName: 'createProduct', - method: 'POST', - useCase: 'CreateProductUseCase', - logLevel: 'info' + method: 'POST' }) ], async (request: NextRequest, { params }: { params: ProductParams }) => { @@ -54,9 +52,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllProducts', - method: 'GET', - useCase: 'FetchAllProductsUseCase', - logLevel: 'debug' + method: 'GET' }) ], async (request: NextRequest, { params }: { params: ProductParams }) => { diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/route.ts index b4ab0835..8d73d9ab 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/route.ts @@ -20,9 +20,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchLedgerById', - method: 'GET', - useCase: 'FetchLedgerByIdUseCase', - logLevel: 'info' + method: 'GET' }) ], async (_, { params }: { params: { id: string; ledgerId: string } }) => { @@ -50,9 +48,7 @@ export const PATCH = applyMiddleware( [ loggerMiddleware({ operationName: 'updateLedger', - method: 'PATCH', - useCase: 'UpdateLedgerUseCase', - logLevel: 'info' + method: 'PATCH' }) ], async ( @@ -86,9 +82,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deleteLedger', - method: 'DELETE', - useCase: 'DeleteLedgerUseCase', - logLevel: 'info' + method: 'DELETE' }) ], async (_, { params }: { params: { id: string; ledgerId: string } }) => { diff --git a/src/app/api/organizations/[id]/ledgers/ledgers-assets/route.ts b/src/app/api/organizations/[id]/ledgers/ledgers-assets/route.ts index 308ddc02..322aec79 100644 --- a/src/app/api/organizations/[id]/ledgers/ledgers-assets/route.ts +++ b/src/app/api/organizations/[id]/ledgers/ledgers-assets/route.ts @@ -11,9 +11,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllLedgersAssets', - method: 'GET', - useCase: 'FetchAllLedgersAssetsUseCase', - logLevel: 'info' + method: 'GET' }) ], async (request: Request, { params }: { params: { id: string } }) => { diff --git a/src/app/api/organizations/[id]/route.ts b/src/app/api/organizations/[id]/route.ts index 0cc74384..1632e432 100644 --- a/src/app/api/organizations/[id]/route.ts +++ b/src/app/api/organizations/[id]/route.ts @@ -20,9 +20,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchOrganizationById', - method: 'GET', - useCase: 'FetchOrganizationByIdUseCase', - logLevel: 'info' + method: 'GET' }) ], async (request: Request, { params }: { params: { id: string } }) => { @@ -47,9 +45,7 @@ export const PATCH = applyMiddleware( [ loggerMiddleware({ operationName: 'updateOrganization', - method: 'PATCH', - useCase: 'UpdateOrganizationUseCase', - logLevel: 'info' + method: 'PATCH' }) ], async (request: Request, { params }: { params: { id: string } }) => { @@ -74,9 +70,7 @@ export const DELETE = applyMiddleware( [ loggerMiddleware({ operationName: 'deleteOrganization', - method: 'DELETE', - useCase: 'DeleteOrganizationUseCase', - logLevel: 'info' + method: 'DELETE' }) ], async (_, { params }: { params: { id: string } }) => { diff --git a/src/app/api/organizations/parentOrganizations/route.ts b/src/app/api/organizations/parentOrganizations/route.ts index 34dd1767..7f8ddc9e 100644 --- a/src/app/api/organizations/parentOrganizations/route.ts +++ b/src/app/api/organizations/parentOrganizations/route.ts @@ -11,9 +11,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchParentOrganizations', - method: 'GET', - useCase: 'FetchParentOrganizationsUseCase', - logLevel: 'info' + method: 'GET' }) ], async (request: Request) => { diff --git a/src/app/api/organizations/route.ts b/src/app/api/organizations/route.ts index 93478d4d..fd9d3e29 100644 --- a/src/app/api/organizations/route.ts +++ b/src/app/api/organizations/route.ts @@ -16,9 +16,7 @@ export const GET = applyMiddleware( [ loggerMiddleware({ operationName: 'fetchAllOrganizations', - method: 'GET', - useCase: 'FetchAllOrganizationsUseCase', - logLevel: 'info' + method: 'GET' }) ], async (request: Request) => { @@ -47,9 +45,7 @@ export const POST = applyMiddleware( [ loggerMiddleware({ operationName: 'createOrganization', - method: 'POST', - useCase: 'CreateOrganizationUseCase', - logLevel: 'info' + method: 'POST' }) ], async (request: Request) => { diff --git a/src/app/api/utils/api-error-handler.ts b/src/app/api/utils/api-error-handler.ts index 36a54178..a896fbcb 100644 --- a/src/app/api/utils/api-error-handler.ts +++ b/src/app/api/utils/api-error-handler.ts @@ -11,43 +11,26 @@ export interface ErrorResponse { export async function apiErrorHandler(error: any): Promise { const intl = await getIntl() - const loggerAggregator = container.get(LoggerAggregator) + const midazLogger = container.get(LoggerAggregator) let errorResponse: ErrorResponse const errorMetadata = { errorType: error.constructor.name, originalMessage: error.message } - + switch (error.constructor) { case MidazError: - loggerAggregator.addEvent({ - layer: 'api', - operation: 'api_error_handler', - level: 'error', - message: error.message, - metadata: errorMetadata - }) + midazLogger.error(`Midaz error: ${errorMetadata}`) errorResponse = { message: error.message, status: 400 } break case UnauthorizedException: - loggerAggregator.addEvent({ - layer: 'api', - operation: 'api_error_handler', - level: 'error', - message: error.message, - metadata: errorMetadata - }) + midazLogger.error(`Unauthorized error: ${errorMetadata}`) errorResponse = { message: error.message, status: 401 } break default: - loggerAggregator.addEvent({ - layer: 'api', - operation: 'api_error_handler', - level: 'error', - message: error.message, - metadata: errorMetadata - }) + midazLogger.error(`Unknown error: ${errorMetadata}`) + errorResponse = { message: intl.formatMessage({ id: 'error.midaz.unknowError', diff --git a/src/core/application/decorators/log-operation.ts b/src/core/application/decorators/log-operation.ts index d827b6fd..9b7ebbff 100644 --- a/src/core/application/decorators/log-operation.ts +++ b/src/core/application/decorators/log-operation.ts @@ -30,39 +30,35 @@ export function LogOperation(options: { // Overrides the method descriptor.value = async function (...args: any[]) { - const logger: LoggerAggregator = (this as any).loggerAggregator - const isDebugEnabled = process.env.ENABLE_DEBUG === 'true' + const midazLogger: LoggerAggregator = (this as any).loggerAggregator + // const isDebugEnabled = process.env.ENABLE_DEBUG === 'true' try { - logger.addEvent({ - layer: options.layer, - operation: `${options.operation}_start`, - level: 'info', - message: `Starting ${options.operation}`, - ...(isDebugEnabled && { metadata: { args } }) - }) + // logger.addEvent({ + // layer: options.layer, + // operation: `${options.operation}_start`, + // level: 'info', + // message: `Starting ${options.operation}`, + // ...(isDebugEnabled && { metadata: { args } }) + // }) const result = await originalMethod.apply(this, args) - logger.addEvent({ - layer: options.layer, - operation: `${options.operation}_success`, - level: 'info', - message: `${options.operation} completed successfully`, - // metadata: { result } //comentario aqui para remover o payload - ...(isDebugEnabled && { metadata: { result } }) - }) + // logger.addEvent({ + // layer: options.layer, + // operation: `${options.operation}_success`, + // level: 'info', + // message: `${options.operation} completed successfully`, + // // metadata: { result } //comentario aqui para remover o payload + // ...(isDebugEnabled && { metadata: { result } }) + // }) return result } catch (error) { - logger.addEvent({ - layer: options.layer, - operation: `${options.operation}_error`, - level: 'error', - message: `${options.operation} failed`, + midazLogger.error(`${options.operation} failed`, { error: error as Error }) - + throw error } } diff --git a/src/lib/applymiddleware/apply-middleware.ts b/src/lib/applymiddleware/apply-middleware.ts index d0c71194..b65d6d5e 100644 --- a/src/lib/applymiddleware/apply-middleware.ts +++ b/src/lib/applymiddleware/apply-middleware.ts @@ -1,16 +1,38 @@ import { NextRequest } from 'next/server' import { MiddlewareHandler, NextHandler, RouteHandler } from './types' +/** + * Applies an array of middleware functions to a route handler. + * Implements a middleware chain pattern similar to Express.js middleware system. + * + * @param middlewares - Array of middleware functions to be executed in sequence + * @param action - Final route handler to be executed after all middleware + * @returns A function that handles the request through the middleware chain + * + * @example + * const handler = applyMiddleware([ + * authMiddleware, + * validationMiddleware + * ], finalHandler); + */ export function applyMiddleware( middlewares: MiddlewareHandler[], action: RouteHandler ) { return async (req: NextRequest, ...args: any) => { + // Index to keep track of current middleware let i = 0 + /** + * Internal function that manages the middleware chain execution + * @param err - Optional error object passed from previous middleware + * @returns Promise containing the result of the middleware chain + */ const next: NextHandler = async (err) => { + // Clone request to prevent mutations between middleware const localReq = req.clone() as NextRequest + // If there's an error or we've run all middleware, execute final handler if (err != null) { return await action(req, ...args) } @@ -19,15 +41,19 @@ export function applyMiddleware( return await action(req, ...args) } + // Get next middleware in the chain const layer = middlewares[i++] try { + // Execute current middleware with cloned request and next function return await layer(localReq, next) } catch (error) { + // Log any errors and continue chain with error console.log(error) return await next(error) } } + // Start the middleware chain return await next() } }