diff --git a/Library/Sources/Internal/Controllers/ArchiveController.swift b/Library/Sources/Internal/Controllers/ArchiveController.swift index bc36951..bee4191 100644 --- a/Library/Sources/Internal/Controllers/ArchiveController.swift +++ b/Library/Sources/Internal/Controllers/ArchiveController.swift @@ -58,7 +58,7 @@ private extension ArchiveController { defer { logger.debug( - "The codable response returned: \(String(describing: archiveList))", + "A codable response returned: \(String(describing: archiveList))", metadata: .metadata( context: context, request: request, @@ -86,7 +86,7 @@ private extension ArchiveController { } catch .folderPathEmpty, .folderNotDirectory { defer { logger.error( - "The folder for the resource has not been located.", + "The folder of the resource has not been located.", metadata: .metadata( context: context, request: request, @@ -126,14 +126,12 @@ private extension Logger.Metadata { context: Context, request: Request, statusCode: HTTPResponse.Status - ) -> Logger.Metadata { - return [ + ) -> Logger.Metadata {[ "hb.request.id": "\(context.id)", "hb.request.method": "\(request.method.rawValue)", "hb.request.path": "\(request.uri.path)", "hb.request.status": "\(statusCode.code)" - ] - } + ]} } diff --git a/Library/Sources/Internal/Middlewares/DocCMiddleware.swift b/Library/Sources/Internal/Middlewares/DocCMiddleware.swift index db9d8fb..81b35d5 100644 --- a/Library/Sources/Internal/Middlewares/DocCMiddleware.swift +++ b/Library/Sources/Internal/Middlewares/DocCMiddleware.swift @@ -19,6 +19,7 @@ struct DocCMiddleware< // MARK: Properties private let assetProvider: AssetProvider + private let logger: Logger // MARK: Initialisers @@ -26,23 +27,30 @@ struct DocCMiddleware< /// - Parameters: /// - rootFolder: A root folder in the local file system where the *DocC* archive containers are located. /// - threadPool: A thread pool used when loading archives from the file system. - /// - logger: A Logger that outputs information about the root folder requests. + /// - logger: A service that interacts with the logging system, init( _ rootFolder: String, threadPool: NIOThreadPool = .singleton, - logger: Logger = .init(label: "DocCMiddleware") + logger: Logger ) where AssetProvider == LocalFileSystem { self.assetProvider = LocalFileSystem( rootFolder: rootFolder, threadPool: threadPool, logger: logger ) + self.logger = logger } /// Initialises this middleware with an asset provider, that conforms to the `FileProvider` protocol. - /// - Parameter assetProvider: An asset provider to use with the middleware. - init(assetProvider: AssetProvider) { + /// - Parameters: + /// - assetProvider: An asset provider to use with the middleware. + /// - logger: A service that interacts with the logging system, + init( + assetProvider: AssetProvider, + logger: Logger + ) { self.assetProvider = assetProvider + self.logger = logger } // MARK: Functions @@ -57,6 +65,18 @@ struct DocCMiddleware< !uriPath.contains(.previousFolder), uriPath.hasPrefix(.forwardSlash) else { + defer { + logger.error( + "The request has issues.", + metadata: .metadata( + context: context, + request: input, + statusCode: .badRequest + ), + source: .source + ) + } + throw HTTPError(.badRequest) } @@ -85,6 +105,7 @@ struct DocCMiddleware< return try await serveFile( String(format: .Format.Path.documentationJSON, nameArchive), at: pathArchive, + input: input, context: context ) } else { @@ -93,6 +114,7 @@ struct DocCMiddleware< return try await serveFile( uriResource, at: pathArchive, + input: input, context: context ) } @@ -106,6 +128,7 @@ struct DocCMiddleware< return try await serveFile( uriResource, at: pathArchive, + input: input, context: context ) } @@ -118,6 +141,7 @@ struct DocCMiddleware< return try await serveFile( String(format: .Format.Path.index, indexPrefix.path, nameArchive), at: pathArchive, + input: input, context: context ) } else { @@ -127,6 +151,18 @@ struct DocCMiddleware< } } } + + defer { + logger.error( + "The request has not been implemented yet.", + metadata: .metadata( + context: context, + request: input, + statusCode: .notImplemented + ), + source: .source + ) + } throw HTTPError(.notImplemented) } @@ -149,13 +185,38 @@ private extension DocCMiddleware { func serveFile( _ path: String, at folder: String, + input: Request, context: Context ) async throws -> Response { guard let fileIdentifier = assetProvider.getFileIdentifier(folder + path) else { + defer { + logger.error( + "The resource has not been found.", + metadata: .metadata( + context: context, + request: input, + statusCode: .notFound + ), + source: .source + ) + } + throw HTTPError(.notFound) } let body = try await assetProvider.loadFile(id: fileIdentifier, context: context) + + defer { + logger.debug( + "The body of the response returned: \(body.contentLength ?? 0) bytes.", + metadata: .metadata( + context: context, + request: input, + statusCode: .ok + ), + source: .source + ) + } return .init( status: .ok, @@ -165,3 +226,28 @@ private extension DocCMiddleware { } } + +// MARK: - Logger,Metadata+Functions + +private extension Logger.Metadata { + + // MARK: Functions + + static func metadata( + context: Context, + request: Request, + statusCode: HTTPResponse.Status + ) -> Logger.Metadata {[ + "hb.request.id": "\(context.id)", + "hb.request.method": "\(request.method.rawValue)", + "hb.request.path": "\(request.uri.path)", + "hb.request.status": "\(statusCode.code)" + ]} + +} + +// MARK: - String+Constants + +private extension String { + static let source = "DocCMiddleware" +} diff --git a/Library/Sources/Public/Builders/AppBuilder.swift b/Library/Sources/Public/Builders/AppBuilder.swift index 0a99d8a..80fff0e 100644 --- a/Library/Sources/Public/Builders/AppBuilder.swift +++ b/Library/Sources/Public/Builders/AppBuilder.swift @@ -79,7 +79,7 @@ private extension AppBuilder { router.addMiddleware { LogRequestsMiddleware(logger.logLevel) - DocCMiddleware(archivesPath) + DocCMiddleware(archivesPath, logger: logger) } ArchiveController(