diff --git a/Package.resolved b/Package.resolved index c03b96352..a93d3dbf1 100644 --- a/Package.resolved +++ b/Package.resolved @@ -198,15 +198,6 @@ "version" : "1.1.1" } }, - { - "identity" : "spisearchresult", - "kind" : "remoteSourceControl", - "location" : "https://github.com/heckj/SPISearchResult.git", - "state" : { - "revision" : "29381418b804b43494ab8689e07f31aa66d66349", - "version" : "0.5.1" - } - }, { "identity" : "sql-kit", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index d92a35e4d..c7f861517 100644 --- a/Package.swift +++ b/Package.swift @@ -46,7 +46,6 @@ let package = Package( .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"), .package(url: "https://github.com/vapor/jwt-kit", from: "4.13.0"), .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), - .package(url: "https://github.com/heckj/SPISearchResult.git", from: "0.5.1"), ], targets: [ .executableTarget(name: "Run", dependencies: ["App"]), @@ -71,7 +70,6 @@ let package = Package( .product(name: "SwiftPMPackageCollections", package: "swift-package-manager"), .product(name: "Vapor", package: "vapor"), .product(name: "VaporToOpenAPI", package: "VaporToOpenAPI"), - .product(name: "SPISearchResult", package: "SPISearchResult"), ], linkerSettings: [.unsafeFlags(["-Xlinker", "-interposable"], .when(platforms: [.macOS], diff --git a/Sources/App/Core/Search.swift b/Sources/App/Core/Search.swift index c13107be1..ddfc61ca4 100644 --- a/Sources/App/Core/Search.swift +++ b/Sources/App/Core/Search.swift @@ -391,6 +391,7 @@ enum Search { .mapEachCompact(Result.init) .map { results in SearchLogger.log(query: sanitizedTerms.joined(separator: " "), results: results) + let hasMoreResults = results.filter(\.isPackage).count > pageSize // first page has non-package results prepended, extend prefix for them let keep = (page == 1) diff --git a/Sources/App/Core/SearchLogger.swift b/Sources/App/Core/SearchLogger.swift index e9cbd2112..48cc332d1 100644 --- a/Sources/App/Core/SearchLogger.swift +++ b/Sources/App/Core/SearchLogger.swift @@ -13,90 +13,59 @@ // limitations under the License. import Foundation -import SPISearchResult enum SearchLogger { - static var storedSearchesFileURL: URL? { - #if os(macOS) - let local = Foundation.FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("searches", conformingTo: .plainText) - return local - #endif - #if os(Linux) - return URL(fileURLWithPath: "/var/log/searches.txt") - #endif - } +// static var storedSearchesFileURL: URL? { +// #if os(macOS) +// let local = Foundation.FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent("searches", conformingTo: .plainText) +// return local +// #endif +// #if os(Linux) +// return URL(fileURLWithPath: "/var/log/searches.txt") +// #endif +// } static func log(query: String, results: [Search.Result]) { - var authors: [String] = [] - var keywords: [String] = [] - var packages: [SearchResult.Package] = [] - - for result in results { - switch result { - case let .author(authorResult): - authors.append(authorResult.name) - case let .keyword(keywordResult): - keywords.append(keywordResult.keyword) - case let .package(pkgResult): - let pkg = SearchResult.Package( - id: .init(owner: pkgResult.repositoryOwner, repository: pkgResult.repositoryName), - name: pkgResult.packageName, - package_keywords: pkgResult.keywords ?? [], - summary: pkgResult.summary, - stars: pkgResult.stars ?? 0, - has_docs: pkgResult.hasDocs, - last_activity: pkgResult.lastActivityAt - ) - packages.append(pkg) - } + struct SearchFragment { + let searchID: UUID + let query: String + let result: Search.Result } - let combinedResult = SearchResult(timestamp: Date.now, query: query, keywords: keywords, authors: authors, packages: packages) + + let uniqueSearchID = UUID() - let jsonEncoder = JSONEncoder() - jsonEncoder.dateEncodingStrategy = .iso8601 - jsonEncoder.outputFormatting = .sortedKeys - - guard let storedSearchesFileURL else { - return - } - let path = storedSearchesFileURL.path() - if !Foundation.FileManager.default.fileExists(atPath: path) { - // file doesn't exist - create it and write to it - if !Foundation.FileManager.default.createFile( - atPath: path, - contents: Data("# Search Requests\n".utf8), attributes: nil - ) { - fatalError("Failed to create file at \(path)") - } + for result in results { + let fragment = SearchFragment(searchID: uniqueSearchID, query: query, result: result) + AppEnvironment.logger.info("searchfragment: \(fragment)") } - let fileHandle: FileHandle? - do { - fileHandle = try FileHandle(forWritingTo: storedSearchesFileURL) - } catch { - // couldn't open file handle - print("Error: \(error.localizedDescription)") - fileHandle = nil - } - guard let fileHandle else { - print("Unable to access fileHandle for \(storedSearchesFileURL)") - return - } - fileHandle.seekToEndOfFile() +// var authors: [String] = [] +// var keywords: [String] = [] +// var packages: [SearchResult.Package] = [] +// +// for result in results { +// switch result { +// case let .author(authorResult): +// authors.append(authorResult.name) +// case let .keyword(keywordResult): +// keywords.append(keywordResult.keyword) +// case let .package(pkgResult): +// let pkg = SearchResult.Package( +// id: .init(owner: pkgResult.repositoryOwner, repository: pkgResult.repositoryName), +// name: pkgResult.packageName, +// package_keywords: pkgResult.keywords ?? [], +// summary: pkgResult.summary, +// stars: pkgResult.stars ?? 0, +// has_docs: pkgResult.hasDocs, +// last_activity: pkgResult.lastActivityAt +// ) +// packages.append(pkg) +// } +// } +// let combinedResult = SearchResult(timestamp: Date.now, query: query, keywords: keywords, authors: authors, packages: packages) - let encodedSearchResult: Data? - do { - encodedSearchResult = try jsonEncoder.encode(combinedResult) - } catch { - print("Failed to encode search result: \(error.localizedDescription)") - encodedSearchResult = nil - } - if let encodedSearchResult, - let newlineAsData = "\n".data(using: .utf8) - { - fileHandle.write(encodedSearchResult) - fileHandle.write(newlineAsData) - } - fileHandle.closeFile() +// let jsonEncoder = JSONEncoder() +// jsonEncoder.dateEncodingStrategy = .iso8601 +// jsonEncoder.outputFormatting = .sortedKeys } }