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
8 changes: 5 additions & 3 deletions B.READ/B.READ/Sources/App/DIContainer/DIContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ extension DIContainer {
userInfoRepository: userInfoRepository,
bookRepository: bookRepository,
recordRepository: recordRepository,
quoteRepository: quoteRepository,
bookService: AladinService()
),
for: LibraryUseCase.self
Expand All @@ -76,7 +75,8 @@ extension DIContainer {
userInfoRepository: userInfoRepository,
bookRepository: bookRepository,
memoRepository: memoRepository,
aiService: AlanService()
aiService: AlanService(),
bookService: AladinService()
),
for: MemoUseCase.self
)
Expand All @@ -86,7 +86,9 @@ extension DIContainer {
QuoteUseCaseImpl(
userInfoRepository: userInfoRepository,
quoteRepository: quoteRepository,
bookRepository: bookRepository),
bookRepository: bookRepository,
bookService: AladinService()
),
for: QuoteUseCase.self
)

Expand Down
2 changes: 0 additions & 2 deletions B.READ/B.READ/Sources/App/RootViewSwitcher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ struct RootViewSwitcher: View {
LaunchScreen()
.task {
await DIContainer.config()
// TODO: - [더미]초기값 적용이라 마지막에 제거하기
// await DummyService.shared.setDummy()
try? await Task.sleep(for: .seconds(2))
await MainActor.run { self.isReady = true }
}
Expand Down
2 changes: 1 addition & 1 deletion B.READ/B.READ/Sources/Domain/Entity/Book.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Foundation
/// - isbn : ISBN
/// - coverImg : 표지
/// - name : 제목
/// - author : 작가 // TODO : 번역가, 옮김이 포함되는지 확인 필요
/// - author : 작가
/// - publisher : 출판사
/// - publishedAt : 출판일
/// - totalPages: 총 페이지
Expand Down
21 changes: 11 additions & 10 deletions B.READ/B.READ/Sources/Domain/UseCaseImpl/LibraryUseCaseImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,17 @@ final class LibraryUseCaseImpl: LibraryUseCase {
private let userInfoRepository: UserInfoRepository
private let bookRepository: BookRepository
private let recordRepository: RecordRepository
// private let memoRepository: MemoRepository
private let quoteRepository: QuoteRepository
// private let noteRepository: NoteRepository
private let bookService: BookService

init(
userInfoRepository: UserInfoRepository,
bookRepository: BookRepository,
recordRepository: RecordRepository,
quoteRepository: QuoteRepository,
bookService: BookService
) {
self.userInfoRepository = userInfoRepository
self.bookRepository = bookRepository
self.recordRepository = recordRepository
self.quoteRepository = quoteRepository
self.bookService = bookService
}

Expand Down Expand Up @@ -97,12 +92,13 @@ final class LibraryUseCaseImpl: LibraryUseCase {
// 3. record 기준으로 각각의 책정보 가져오는 걸 자식 태스크로 지정
group.addTask {
do {
try Task.checkCancellation()
let book = try await self.bookRepository.fetchBook(isbn: record.isbn)
return (record, book)
} catch {
// TODO: - RepositoryError.dataNotFound이면 알라딘에서 책검색, 아니면 nil
print(error.localizedDescription)
return nil
} catch RepositoryError.dataNotFound {
let book = try await self.requestBookDetail(isbn: record.isbn)
return (record, book)
}
}
}
Expand All @@ -122,7 +118,12 @@ final class LibraryUseCaseImpl: LibraryUseCase {
}

func deleteRecord(_ record: Record) async throws {
try await recordRepository.deleteRecord(record.id)
do {
try await recordRepository.deleteRecord(record.id)
} catch RepositoryError.dataNotFound {
// 삭제에서 이미 존재하지 않으면 무시
print("이미 삭제된 독서 기록입니다.")
}
}

func loadRecentUpdatedReadingRecord(maxCount: Int) async throws -> [(Record, Book)] {
Expand Down
35 changes: 33 additions & 2 deletions B.READ/B.READ/Sources/Domain/UseCaseImpl/MemoUseCaseImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,20 @@ final class MemoUseCaseImpl: MemoUseCase {
let bookRepository: BookRepository
let memoRepository: MemoRepository
let aiService: AIService
private let bookService: BookService

init(
userInfoRepository: UserInfoRepository,
bookRepository: BookRepository,
memoRepository: MemoRepository,
aiService: AIService
aiService: AIService,
bookService: BookService
) {
self.userInfoRepository = userInfoRepository
self.bookRepository = bookRepository
self.memoRepository = memoRepository
self.aiService = aiService
self.bookService = bookService
}

func saveMemo(_ memo: Memo, in record: Record) async throws {
Expand Down Expand Up @@ -89,7 +92,35 @@ final class MemoUseCaseImpl: MemoUseCase {
}

func loadBookTitle(_ isbn: String) async throws -> String {
return try await bookRepository.fetchBook(isbn: isbn).name
do {
return try await bookRepository.fetchBook(isbn: isbn).name
} catch {
// 도서 정보가 없다면 알라딘에서 검색 후 정보 생성하고 도서제목을 반환
// 1. 알라딘에서 정보를 패치
let bookDetail = try await bookService.fetchBookDetail(isbn: isbn)

// 2. 패치한 정보로 엔티티 생성
var book = Book(
isbn: bookDetail.isbn,
coverImage: nil,
name: bookDetail.title,
author: bookDetail.author,
publisher: bookDetail.publisher,
publishedAt: bookDetail.publishedDate.toDate() ?? .now,
totalPages: bookDetail.pageCount
)

// 3. 표지정보 업데이트
if let url = URL(string: bookDetail.coverURL) {
let data = try? Data(contentsOf: url)
book.coverImage = data
}

// 4. 책정보 생성
try? await bookRepository.createBook(book)
// 5. 책 생성에 실패하든 성공하든 새로운 책제목을 반환
return book.name
}
}
}

Expand Down
37 changes: 33 additions & 4 deletions B.READ/B.READ/Sources/Domain/UseCaseImpl/QuoteUseCaseImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ final class QuoteUseCaseImpl: QuoteUseCase {
private let userInfoRepository: UserInfoRepository
private let quoteRepository: QuoteRepository
private let bookRepository: BookRepository
private let bookService: BookService

/// 생성자
/// - Parameters:
Expand All @@ -20,11 +21,13 @@ final class QuoteUseCaseImpl: QuoteUseCase {
init(
userInfoRepository: UserInfoRepository,
quoteRepository: QuoteRepository,
bookRepository: BookRepository
bookRepository: BookRepository,
bookService: BookService
) {
self.userInfoRepository = userInfoRepository
self.quoteRepository = quoteRepository
self.bookRepository = bookRepository
self.bookService = bookService
}

func saveQuote(_ quote: Quote, in record: Record) async throws {
Expand Down Expand Up @@ -53,10 +56,36 @@ final class QuoteUseCaseImpl: QuoteUseCase {
return try await quoteRepository.fetchAllQuotes()
}


// TODO: - 조회한 도서가 없을 경우 알라딘 검색 후 도서 저장 -> 도서 제목 반환
func loadBookTitle(_ isbn: String) async throws -> String {
return try await bookRepository.fetchBook(isbn: isbn).name
do {
return try await bookRepository.fetchBook(isbn: isbn).name
} catch RepositoryError.dataNotFound {
// 도서 정보가 없다면 알라딘에서 검색 후 정보 생성하고 도서제목을 반환
// 1. 알라딘에서 정보를 패치
let bookDetail = try await bookService.fetchBookDetail(isbn: isbn)

// 2. 패치한 정보로 엔티티 생성
var book = Book(
isbn: bookDetail.isbn,
coverImage: nil,
name: bookDetail.title,
author: bookDetail.author,
publisher: bookDetail.publisher,
publishedAt: bookDetail.publishedDate.toDate() ?? .now,
totalPages: bookDetail.pageCount
)

// 3. 표지정보 업데이트
if let url = URL(string: bookDetail.coverURL) {
let data = try? Data(contentsOf: url)
book.coverImage = data
}

// 4. 책정보 생성
try? await bookRepository.createBook(book)
// 5. 책 생성에 실패하든 성공하든 새로운 책제목을 반환
return book.name
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,55 +27,55 @@ struct RecordPropertyRow: View {
}
}

//// MARK: - Preview
//#Preview {
// let notStartdata = RecordCellVO(
// id: DummyData.dummyRecords[0].id,
// isbn: DummyData.dummyRecords[0].isbn,
// title: DummyData.dummyBooks[0].name,
// coverImage: Image(.exampleBook),
// readingState: ReadingState.fromEntity(DummyData.dummyRecords[0].state),
// heart: DummyData.dummyRecords[0].heartCount,
// progress: 0,
// star: DummyData.dummyRecords[0].starCount,
// memoCount: DummyData.dummyRecords[0].memos.count,
// quoteCount: DummyData.dummyRecords[0].quotes.count,
// period: DummyData.dummyRecords[0].period,
// isFavorite: DummyData.dummyRecords[0].isFavorite,
// createdAt: DummyData.dummyRecords[0].createdAt
// )
// let readingdata = RecordCellVO(
// id: DummyData.dummyRecords[1].id,
// isbn: DummyData.dummyRecords[1].isbn,
// title: DummyData.dummyBooks[1].name,
// coverImage: Image(.exampleBook),
// readingState: ReadingState.fromEntity(DummyData.dummyRecords[1].state),
// heart: DummyData.dummyRecords[1].heartCount,
// progress: 65,
// star: DummyData.dummyRecords[1].starCount,
// memoCount: DummyData.dummyRecords[1].memos.count,
// quoteCount: DummyData.dummyRecords[1].quotes.count,
// period: DummyData.dummyRecords[1].period,
// isFavorite: DummyData.dummyRecords[1].isFavorite,
// createdAt: DummyData.dummyRecords[1].createdAt
// )
// let finisheddata = RecordCellVO(
// id: DummyData.dummyRecords[2].id,
// isbn: DummyData.dummyRecords[2].isbn,
// title: DummyData.dummyBooks[2].name,
// coverImage: Image(.exampleBook),
// readingState: ReadingState.fromEntity(DummyData.dummyRecords[2].state),
// heart: DummyData.dummyRecords[2].heartCount,
// progress: 65,
// star: DummyData.dummyRecords[2].starCount,
// memoCount: DummyData.dummyRecords[2].memos.count,
// quoteCount: DummyData.dummyRecords[2].quotes.count,
// period: DummyData.dummyRecords[2].period,
// isFavorite: DummyData.dummyRecords[2].isFavorite,
// createdAt: DummyData.dummyRecords[2].createdAt
// )
//
// RecordPropertyRow(data: notStartdata)
// RecordPropertyRow(data: readingdata)
// RecordPropertyRow(data: finisheddata)
//}
// MARK: - Preview
#Preview {
let notStartdata = RecordCellVO(
id: DummyData.dummyRecords[0].id,
isbn: DummyData.dummyRecords[0].isbn,
title: DummyData.dummyBooks[0].name,
coverImage: Image(.exampleCover),
readingState: ReadingState.fromEntity(DummyData.dummyRecords[0].state),
heart: DummyData.dummyRecords[0].heartCount,
progress: 0,
star: DummyData.dummyRecords[0].starCount,
memoCount: DummyData.dummyRecords[0].memos.count,
quoteCount: DummyData.dummyRecords[0].quotes.count,
period: DummyData.dummyRecords[0].period,
isFavorite: DummyData.dummyRecords[0].isFavorite,
createdAt: DummyData.dummyRecords[0].createdAt
)
let readingdata = RecordCellVO(
id: DummyData.dummyRecords[1].id,
isbn: DummyData.dummyRecords[1].isbn,
title: DummyData.dummyBooks[1].name,
coverImage: Image(.exampleCover),
readingState: ReadingState.fromEntity(DummyData.dummyRecords[1].state),
heart: DummyData.dummyRecords[1].heartCount,
progress: 65,
star: DummyData.dummyRecords[1].starCount,
memoCount: DummyData.dummyRecords[1].memos.count,
quoteCount: DummyData.dummyRecords[1].quotes.count,
period: DummyData.dummyRecords[1].period,
isFavorite: DummyData.dummyRecords[1].isFavorite,
createdAt: DummyData.dummyRecords[1].createdAt
)
let finisheddata = RecordCellVO(
id: DummyData.dummyRecords[2].id,
isbn: DummyData.dummyRecords[2].isbn,
title: DummyData.dummyBooks[2].name,
coverImage: Image(.exampleCover),
readingState: ReadingState.fromEntity(DummyData.dummyRecords[2].state),
heart: DummyData.dummyRecords[2].heartCount,
progress: 65,
star: DummyData.dummyRecords[2].starCount,
memoCount: DummyData.dummyRecords[2].memos.count,
quoteCount: DummyData.dummyRecords[2].quotes.count,
period: DummyData.dummyRecords[2].period,
isFavorite: DummyData.dummyRecords[2].isFavorite,
createdAt: DummyData.dummyRecords[2].createdAt
)

RecordPropertyRow(data: notStartdata)
RecordPropertyRow(data: readingdata)
RecordPropertyRow(data: finisheddata)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import Foundation
import SwiftUI

// TODO: - [시르] 메뉴 등장 및 사라질때 애니메이션 추가하기
// MARK: - (S)SortMenuButton
struct SortMenu: View {
@Binding var isOpened: Bool
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ extension RecordDetailVO: Hashable {
}

extension RecordDetailVO {
// TODO: - [시르] 아이디어 필요! VO에 메모, 문장을 넣는방법도 있음
func toEntity(memos: [MemoVO] = [], quotes: [QuoteVO] = []) -> Record {
Record(
id: self.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import SwiftUI

// MARK: - (S)LibraryGridView
// TODO: - [시르] 그리드 뷰 구현
struct LibraryGridView: View {
@EnvironmentObject var coordinator: Coordinator<MainRoute, SheetRoute>
@Binding var records: [RecordCellVO]
Expand All @@ -25,7 +24,6 @@ struct LibraryGridView: View {
ForEach($records) { $record in
LibraryGridCell(record: $record)
.onTapGesture {
// TODO: - [시르] 머지 후, 뷰 연결 수정
coordinator.push(.libraryDetail(id: record.id))
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ struct LibraryListCell: View {
.brStyleFont(.pretendard(.semiBold, size: 18), lineHeight: 1)

// 독서 현황
// TODO: - [시르] Binding으로 만들어야하면, 제작해서 사용
RecordPropertyRow(data: record)
// RecordStatsView(record: $record)

// 독서 기간
periodView(record.period)
Expand Down
Loading