Skip to content
Open
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
16 changes: 16 additions & 0 deletions FLINT/Data/Sources/DTO/Collection/ReportRequestDTO.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// ReportRequestDTO.swift
// Data
//

import Foundation

public struct ReportRequestDTO: Encodable {
public let reasons: [String]
public let otherDetail: String?

public init(reasons: [String], otherDetail: String?) {
self.reasons = reasons
self.otherDetail = otherDetail
}
}
17 changes: 9 additions & 8 deletions FLINT/Data/Sources/Networking/API/CollectionAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import Foundation
import Moya

import Domain
import DTO

public enum CollectionAPI {
case fetchCollections(cursor: Int64?, size: Int32)
Expand All @@ -18,6 +19,7 @@ public enum CollectionAPI {
case deleteCollection(collectionId: Int64)
case fetchCollectionDetail(collectionId: Int64)
case fetchRecentViewedCollections
case reportCollection(collectionId: Int64, reasons: [String], otherDetail: String?)
}

extension CollectionAPI: TargetType {
Expand All @@ -33,14 +35,16 @@ extension CollectionAPI: TargetType {
return "/api/v1/collections/\(collectionId)"
case .fetchRecentViewedCollections:
return "/api/v1/collections/recent"
case let .reportCollection(collectionId, _, _):
return "/api/v1/collections/\(collectionId)/reports"
}
}

public var method: Moya.Method {
switch self {
case .fetchCollections, .fetchCollectionDetail, .fetchRecentViewedCollections:
return .get
case .createCollection:
case .createCollection, .reportCollection:
return .post
case .updateCollection:
return .put
Expand All @@ -52,22 +56,19 @@ extension CollectionAPI: TargetType {
public var task: Moya.Task {
switch self {
case let .fetchCollections(cursor, size):
var parameters: [String: Any] = [
"size": size,
]
var parameters: [String: Any] = ["size": size]
if let cursor {
parameters["cursor"] = cursor
}
return .requestParameters(
parameters: parameters,
encoding: URLEncoding.queryString
)
return .requestParameters(parameters: parameters, encoding: URLEncoding.queryString)
case let .createCollection(collectionInfo):
return .requestJSONEncodable(collectionInfo)
case let .updateCollection(_, collectionInfo):
return .requestJSONEncodable(collectionInfo)
case .deleteCollection, .fetchCollectionDetail, .fetchRecentViewedCollections:
return .requestPlain
case let .reportCollection(_, reasons, otherDetail):
return .requestJSONEncodable(ReportRequestDTO(reasons: reasons, otherDetail: otherDetail))
}
}
}
6 changes: 6 additions & 0 deletions FLINT/Data/Sources/Networking/Service/CollectionService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public protocol CollectionService {
func deleteCollection(collectionId: Int64) -> AnyPublisher<Void, Error>
func fetchCollectionDetail(collectionId: Int64) -> AnyPublisher<CollectionDetailDTO, Error>
func fetchRecentViewedCollections() -> AnyPublisher<CollectionsDTO, Error>
func reportCollection(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error>
}

public final class DefaultCollectionService: CollectionService {
Expand Down Expand Up @@ -60,4 +61,9 @@ public final class DefaultCollectionService: CollectionService {
return collectionAPIProvider.requestPublisher(.fetchRecentViewedCollections)
.mapBaseResponseData(CollectionsDTO.self)
}

public func reportCollection(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error> {
return collectionAPIProvider.requestPublisher(.reportCollection(collectionId: collectionId, reasons: reasons, otherDetail: otherDetail))
.mapBaseResponseEmpty()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,8 @@ public final class DefaultCollectionRepository: CollectionRepository {
.tryMap { try $0.entities }
.eraseToAnyPublisher()
}

public func reportCollection(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error> {
return collectionService.reportCollection(collectionId: collectionId, reasons: reasons, otherDetail: otherDetail)
}
}
1 change: 1 addition & 0 deletions FLINT/Domain/Sources/Repository/CollectionRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ public protocol CollectionRepository {
func deleteCollection(collectionId: Int64) -> AnyPublisher<Void, Error>
func fetchCollectionDetail(collectionId: Int64) -> AnyPublisher<CollectionDetailEntity, Error>
func fetchRecentViewedCollections() -> AnyPublisher<[CollectionEntity], Error>
func reportCollection(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// ReportCollectionUseCase.swift
// Domain
//
// Created by 소은 on 6/21/26.
//

import Combine
import Foundation

import Repository

public protocol ReportCollectionUseCase {
func callAsFunction(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error>
}

public final class DefaultReportCollectionUseCase: ReportCollectionUseCase {

private let collectionRepository: CollectionRepository

public init(collectionRepository: CollectionRepository) {
self.collectionRepository = collectionRepository
}

public func callAsFunction(collectionId: Int64, reasons: [String], otherDetail: String?) -> AnyPublisher<Void, Error> {
return collectionRepository.reportCollection(collectionId: collectionId, reasons: reasons, otherDetail: otherDetail)
}
}
2 changes: 2 additions & 0 deletions FLINT/FLINT/Dependency/DIContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ typealias DependencyFactory = ViewControllerFactory &
ExploreViewModelFactory &
ProfileViewModelFactory &

ReportViewModelFactory &

CreateCollectionViewModelFactory &
AddContentSelectViewModelFactory &
CollectionFolderListViewModelFactory &
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// ReportCollectionUseCaseFactory.swift
// FLINT
//
// Created by 소은 on 6/21/26.
//

import Foundation

import Domain

protocol ReportCollectionUseCaseFactory: CollectionRepositoryFactory {
func makeReportCollectionUseCase() -> ReportCollectionUseCase
}

extension ReportCollectionUseCaseFactory {
func makeReportCollectionUseCase() -> ReportCollectionUseCase {
return DefaultReportCollectionUseCase(collectionRepository: makeCollectionRepository())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ import Presentation

extension CollectionDetailViewControllerFactory where Self: CollectionDetailViewModelFactory & ViewControllerFactory {
func makeCollectionDetailViewController(collectionId: Int64) -> CollectionDetailViewController {
return CollectionDetailViewController(viewModel: makeCollectionDetailViewModel(collectionId: collectionId), viewControllerFactory: self)
let vc = CollectionDetailViewController(viewModel: makeCollectionDetailViewModel(collectionId: collectionId), viewControllerFactory: self)
vc.onTapReport = { collectionId in
let reportVC = vc.viewControllerFactory?.makeReportViewController(collectionId: collectionId)
}
return vc
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// ReportViewControllerFactory+.swift
// FLINT
//

import Foundation

import Presentation

extension ReportViewControllerFactory where Self: ReportViewModelFactory & ViewControllerFactory {
func makeReportViewController(collectionId: Int64) -> ReportViewController {
return ReportViewController(
viewModel: makeReportViewModel(collectionId: collectionId),
viewControllerFactory: self
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// ReportViewModelFactory.swift
// FLINT
//
// Created by 소은 on 6/21/26.
//

import Foundation

import Presentation

protocol ReportViewModelFactory: ReportCollectionUseCaseFactory {
func makeReportViewModel(collectionId: Int64) -> ReportViewModel
}

extension ReportViewModelFactory {
func makeReportViewModel(collectionId: Int64) -> ReportViewModel {
return ReportViewModel(reportCollectionUseCase: makeReportCollectionUseCase(), collectionId: collectionId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ public typealias ViewControllerFactory =

// MARK: - Onboarding

TermsAgreementViewControllerFactory &
NicknameViewControllerFactory &
ContentSelectViewControllerFactory &
// OttSelectViewControllerFactory &
OnboardingDoneViewControllerFactory &
TermsAgreementViewControllerFactory &

// MARK: - Main

Expand All @@ -37,4 +37,5 @@ public typealias ViewControllerFactory =
CollectionDetailViewControllerFactory &
SavedCollectionListViewControllerFactory &
AddContentSelectViewControllerFactory &
CreateCollectionViewControllerFactory
CreateCollectionViewControllerFactory &
ReportViewControllerFactory
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ import Combine
import View
import ViewModel

// MARK: - ReportViewControllerFactory

public protocol ReportViewControllerFactory {
func makeReportViewController(collectionId: Int64) -> ReportViewController
}

// MARK: - ReportViewController

public final class ReportViewController: BaseViewController<ReportView> {

// MARK: - Property
Expand All @@ -29,10 +37,9 @@ public final class ReportViewController: BaseViewController<ReportView> {

// MARK: - Init

public init(viewModel: ReportViewModel) {
public init(viewModel: ReportViewModel, viewControllerFactory: (any ViewControllerFactory)?) {
self.viewModel = viewModel
// FIXME: viewControllerFactor 주입
super.init(viewControllerFactory: nil)
super.init(viewControllerFactory: viewControllerFactory)
}

required init?(coder: NSCoder) {
Expand Down Expand Up @@ -74,8 +81,8 @@ public final class ReportViewController: BaseViewController<ReportView> {
output.submitSuccess
.receive(on: DispatchQueue.main)
.sink { [weak self] _ in
print("신고 성공")
self?.navigationController?.popViewController(animated: true)
Toast.text("신고가 접수되었어요").show()
}
.store(in: &cancellables)

Expand All @@ -98,13 +105,13 @@ public final class ReportViewController: BaseViewController<ReportView> {
}

private func setupTextViewObserver() {
NotificationCenter.default.addObserver(
self,
selector: #selector(textViewDidBeginEditing),
name: UITextView.textDidBeginEditingNotification,
object: rootView.textView
)
}
NotificationCenter.default.addObserver(
self,
selector: #selector(textViewDidBeginEditing),
name: UITextView.textDidBeginEditingNotification,
object: rootView.textView
)
}

private func setupActions() {
for (index, button) in rootView.radioButtons.enumerated() {
Expand Down Expand Up @@ -150,7 +157,6 @@ public final class ReportViewController: BaseViewController<ReportView> {
selectedRadioIndex = 4
radioSelectionSubject.send(4)
}


// MARK: - Custom Method

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,9 @@ public final class CollectionDetailViewController: BaseViewController<Collection

private func didTapReport() {
guard let entity, let collectionId = Int64(entity.id) else { return }
onTapReport?(collectionId)
guard let factory = viewControllerFactory else { return }
let reportVC = factory.makeReportViewController(collectionId: collectionId)
navigationController?.pushViewController(reportVC, animated: true)
}

private func presentSavedUsersBottomSheet(users: [SavedUserRowItem]) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public final class HomeViewController: BaseViewController<HomeView> {
) {
self.viewModel = viewModel
self.fetchOTTPlatformsForContentUseCase = fetchOTTPlatformsForContentUseCase
super.init(nibName: nil, bundle: nil)
super.init(viewControllerFactory: viewControllerFactory)
self.viewControllerFactory = viewControllerFactory
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public final class TermsAgreementViewController: BaseViewController<TermsAgreeme

// MARK: - Basic

//TODO: - 오류떠서 우선 수정
public init(onboardingViewModel: OnboardingViewModel, viewControllerFactory: ViewControllerFactory) {
self.onboardingViewModel = onboardingViewModel
super.init(viewControllerFactory: viewControllerFactory)
Expand Down
Loading