Skip to content
Merged
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
52 changes: 49 additions & 3 deletions DevLog/Data/Repository/WebPageRepositoryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
// Created by 최윤진 on 2/8/26.
//

import Foundation

final class WebPageRepositoryImpl: WebPageRepository {
private let webPageService: WebPageService
private let metadataService: WebPageMetadataService
Expand All @@ -18,9 +20,21 @@ final class WebPageRepositoryImpl: WebPageRepository {
}

func fetch(_ query: String) async throws -> [WebPage] {
try await webPageService
.fetchWebPages(query)
.compactMap { try? $0.toDomain() }
let responses = try await webPageService.fetchWebPages(query)
var pages: [WebPage] = []
pages.reserveCapacity(responses.count)

for response in responses {
if needsImageRestore(response), let restored = try? await restoreWebPage(response) {
pages.append(restored)
continue
}
if let page = try? response.toDomain() {
pages.append(page)
}
}
Comment on lines +27 to +35
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

fetch 메소드의 for 루프 로직은 올바르게 동작하지만, if, continue, 그리고 또 다른 if 문으로 구성된 현재 구조는 코드의 흐름을 파악하기에 다소 혼란스러울 수 있습니다. 가독성을 높이기 위해 보다 선형적인 구조로 리팩토링하는 것을 제안합니다.

        for response in responses {
            var pageToAppend: WebPage?
            if needsImageRestore(response) {
                pageToAppend = try? await restoreWebPage(response)
            }

            if pageToAppend == nil {
                pageToAppend = try? response.toDomain()
            }

            if let page = pageToAppend {
                pages.append(page)
            }
        }


return pages
}

func upsert(_ urlString: String) async throws {
Expand All @@ -38,3 +52,35 @@ final class WebPageRepositoryImpl: WebPageRepository {
try await webPageService.deleteWebPage(urlString)
}
}

private extension WebPageRepositoryImpl {
func needsImageRestore(_ response: WebPageResponse) -> Bool {
guard !response.imageURL.isEmpty,
let url = URL(string: response.imageURL),
url.isFileURL else {
return false
}
return !FileManager.default.fileExists(atPath: url.path)
}

func restoreWebPage(_ response: WebPageResponse) async throws -> WebPage? {
let metadata = try await metadataService.fetchMetadata(from: response.url)
let request = WebPageRequest(
title: metadata.title,
url: response.url,
displayURL: metadata.displayURL,
imageURL: metadata.imageURL
)
try await webPageService.upsertWebPage(request)

let newResponse = WebPageResponse(
id: response.id,
title: metadata.title,
url: response.url,
displayURL: metadata.displayURL,
imageURL: metadata.imageURL
)

return try? newResponse.toDomain()
}
}