-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature] 화이트 보드 오브젝트/도구 관리 유즈케이스 추가 #86
Changes from 7 commits
1dfcd14
3a6df84
777ba4a
3b67a1b
7f68b91
6988dc4
e260731
cfbc91f
3651910
692d764
18aa284
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// | ||
// ManageWhiteboardObjectUseCaseInterface.swift | ||
// Domain | ||
// | ||
// Created by 이동현 on 11/16/24. | ||
// | ||
|
||
import Combine | ||
|
||
public protocol ManageWhiteboardObjectUseCaseInterface { | ||
/// 화이트보드 객체가 추가될 때 이벤트를 방출합니다. | ||
var addedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> { get } | ||
|
||
/// 화이트보드 객체가 수정될 때 이벤트를 방출합니다. | ||
var updatedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> { get } | ||
|
||
/// 화이트보드 객체가 제거될 때 이벤트를 방출합니다. | ||
var removedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> { get } | ||
|
||
/// 현재 존재하는 모든 화이트보드 객체들을 가져옵니다. | ||
/// - Returns: 화이트보드 위에 존재하는 화이트보드 객체들 | ||
func fetchObjects() -> [WhiteboardObject] | ||
|
||
/// 화이트보드 객체를 추가하는 메서드 | ||
/// - Parameter whiteboardObject: 추가할 화이트보드 객체 | ||
/// - Returns: 추가 성공 여부 | ||
func addObject(whiteboardObject: WhiteboardObject) -> Bool | ||
|
||
/// 화이트보드 객체를 수정하는 메서드 | ||
/// - Parameter whiteboardObject: 수정할 화이트보드 객체 | ||
/// - Returns: 추가 성공 여부 | ||
func updateObject(whiteboardObject: WhiteboardObject) -> Bool | ||
|
||
/// 화이트보드를 제거하는 메서드 | ||
/// - Returns: 추가 성공 여부 | ||
func removeObject(whiteboardObject: WhiteboardObject) -> Bool | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// | ||
// ManageWhiteboardToolUseCaseInterface.swift | ||
// Domain | ||
// | ||
// Created by 이동현 on 11/16/24. | ||
// | ||
|
||
import Combine | ||
|
||
public protocol ManageWhiteboardToolUseCaseInterface { | ||
/// 화이트보드 도구 선택/선택 해제 시 이벤트를 방출합니다. | ||
var currentToolPublisher: AnyPublisher<WhiteboardTool?, Never> { get } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ManageWhiteboardObjectUseCaseInterface 와 공통으로 코멘트 남깁니다! 목요일에 나눴던 얘기와 이어서 진행이 될 것 같은데요, 메소드의 반환 값으로 Publisher를 반환하는 방법이 생각나는데, 해당 방법 말고 따로 인터페이스에 추가해주신 이유가 있을까요?? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 하나의 퍼블리셔를 단발성으로 사용하지 않고 지속적으로 사용하게 되지 않을까 하여 위와 같이 구현했습니다. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 설명 감사합니다!! |
||
|
||
/// 현재 사용중인 화이트보드 도구를 반환합니다. | ||
/// - Returns: 사용중인 화이트보드 도구 | ||
func currentTool() -> WhiteboardTool? | ||
|
||
/// 화이트보드 도구를 선택합니다. | ||
/// - Parameter tool: 선택할 화이트보드 도구 | ||
func selectTool(tool: WhiteboardTool) | ||
|
||
/// 화이트보드 도구 사용을 완료합니다. | ||
func finishUsingTool() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
// | ||
// WhiteboardTool.swift | ||
// Domain | ||
// | ||
// Created by 이동현 on 11/16/24. | ||
// | ||
|
||
@frozen | ||
public enum WhiteboardTool: CaseIterable { | ||
case drawing | ||
case text | ||
case photo | ||
case game | ||
case chat | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// | ||
// ManageWhiteboardObjectUseCase.swift | ||
// Domain | ||
// | ||
// Created by 이동현 on 11/16/24. | ||
// | ||
|
||
import Combine | ||
|
||
public final class ManageWhiteboardObjectUseCase: ManageWhiteboardObjectUseCaseInterface { | ||
public var addedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> | ||
public var updatedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> | ||
public var removedWhiteboardObject: AnyPublisher<WhiteboardObject, Never> | ||
private var whiteboardObjects: [WhiteboardObject] | ||
|
||
private let addedWhiteboardSubject: PassthroughSubject<WhiteboardObject, Never> | ||
private let updatedWhiteboardSubject: PassthroughSubject<WhiteboardObject, Never> | ||
private let removedWhiteboardSubject: PassthroughSubject<WhiteboardObject, Never> | ||
|
||
public init() { | ||
addedWhiteboardSubject = PassthroughSubject<WhiteboardObject, Never>() | ||
updatedWhiteboardSubject = PassthroughSubject<WhiteboardObject, Never>() | ||
removedWhiteboardSubject = PassthroughSubject<WhiteboardObject, Never>() | ||
|
||
whiteboardObjects = [] | ||
|
||
addedWhiteboardObject = addedWhiteboardSubject.eraseToAnyPublisher() | ||
updatedWhiteboardObject = updatedWhiteboardSubject.eraseToAnyPublisher() | ||
removedWhiteboardObject = removedWhiteboardSubject.eraseToAnyPublisher() | ||
} | ||
|
||
public func fetchObjects() -> [WhiteboardObject] { | ||
return whiteboardObjects | ||
} | ||
|
||
public func addObject(whiteboardObject: WhiteboardObject) -> Bool { | ||
guard !whiteboardObjects.contains(whiteboardObject) else { return false } | ||
whiteboardObjects.append(whiteboardObject) | ||
addedWhiteboardSubject.send(whiteboardObject) | ||
return true | ||
} | ||
|
||
public func updateObject(whiteboardObject: WhiteboardObject) -> Bool { | ||
guard let index = whiteboardObjects.firstIndex(where: { $0 == whiteboardObject }) else { return false } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 업데이트 한 whiteboardObject를 비교해야하기 때문에, |
||
whiteboardObjects[index] = whiteboardObject | ||
updatedWhiteboardSubject.send(whiteboardObject) | ||
return true | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 넵 맞습니다! 아직 해당 에픽까지 진행하지 않아 뼈대만 구현한 상태입니다. Result 타입이 아닌 Bool을 반환한 이유는 subject를 send하는 방식은 유즈케이스를 사용하는 쪽에게 '업데이트 된 객체' 라는 이벤트를 발행하기 위함입니다! |
||
|
||
public func removeObject(whiteboardObject: WhiteboardObject) -> Bool { | ||
guard whiteboardObjects.contains(whiteboardObject) else { return false } | ||
whiteboardObjects.removeAll { $0 == whiteboardObject } | ||
removedWhiteboardSubject.send(whiteboardObject) | ||
return true | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// | ||
// ManageWhiteboardToolUseCase.swift | ||
// Domain | ||
// | ||
// Created by 이동현 on 11/16/24. | ||
// | ||
|
||
import Combine | ||
|
||
public final class ManageWhiteboardToolUseCase: ManageWhiteboardToolUseCaseInterface { | ||
public var currentToolPublisher: AnyPublisher<WhiteboardTool?, Never> | ||
private let currentToolSubject: CurrentValueSubject<WhiteboardTool?, Never> | ||
|
||
public init() { | ||
currentToolSubject = CurrentValueSubject<WhiteboardTool?, Never>(nil) | ||
currentToolPublisher = currentToolSubject.eraseToAnyPublisher() | ||
} | ||
|
||
public func currentTool() -> WhiteboardTool? { | ||
return currentToolSubject.value | ||
} | ||
|
||
public func selectTool(tool: WhiteboardTool) { | ||
currentToolSubject.send(tool) | ||
} | ||
|
||
public func finishUsingTool() { | ||
currentToolSubject.send(nil) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
구현체와 주석을 같이 본 바로는 본인이 갖고 있는 화이트보드 오브젝트들을 가져오는 메소드로 보이는데요,
혹시 언제 어떻게 사용될지 알 수 있을까요?
어떻게 사용될지, 필요한지 예상이 되지 않아서 코멘트 남깁니다 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
앗 이 부분 사용될 일이 없을것 같습니다!! 삭제하도록 하겠습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
692d764 에서 반영하였습니다.