Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/suyeon'
Browse files Browse the repository at this point in the history
Conflicts:
	KkuMulKum.xcodeproj/project.pbxproj
  • Loading branch information
youz2me committed Aug 26, 2024
2 parents 15c78cb + 34af275 commit 0248303
Show file tree
Hide file tree
Showing 109 changed files with 2,271 additions and 682 deletions.
105 changes: 99 additions & 6 deletions KkuMulKum.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{
"originHash" : "721ecb39754e4327f8a42df5d3133483e3b169f04fe160c0434ea4970a6ebd57",
"pins" : [
{
"identity" : "abseil-cpp-binary",
Expand Down Expand Up @@ -193,7 +192,7 @@
{
"identity" : "rxswift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/ReactiveX/RxSwift.git",
"location" : "https://github.com/ReactiveX/RxSwift",
"state" : {
"revision" : "b06a8c8596e4c3e8e7788e08e720e3248563ce6a",
"version" : "6.7.1"
Expand Down Expand Up @@ -245,5 +244,5 @@
}
}
],
"version" : 3
"version" : 2
}
7 changes: 5 additions & 2 deletions KkuMulKum/Application/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
loginViewModel.autoLogin { [weak self] success in
DispatchQueue.main.async {
if success {
self?.showMainScreen()
self?.showLoginScreen()
} else {
self?.showLoginScreen()
}
Expand Down Expand Up @@ -59,7 +59,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {

private func showMainScreen() {
let mainTabBarController = MainTabBarController()
let navigationController = UINavigationController(rootViewController: mainTabBarController)
let navigationController = UINavigationController(
rootViewController: mainTabBarController,
isBorderNeeded: true
)
navigationController.isNavigationBarHidden = true

animateRootViewControllerChange(to: navigationController)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,13 @@ struct MeetingPromise: Codable {
let promiseID: Int
let name: String
let dDay: Int
let date: String
let time: String
let placeName: String

enum CodingKeys: String, CodingKey {
case promiseID = "promiseId"
case name
case dDay
case date
case time
case placeName
}
Expand Down
2 changes: 1 addition & 1 deletion KkuMulKum/Network/Service/AuthService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ enum NetworkErrorMapper {
}
}

class AuthService: AuthServiceType {
class AuthService: AuthServiceProtocol {
private var keychainService: KeychainService
private var provider = MoyaProvider<AuthTargetType>()

Expand Down
240 changes: 240 additions & 0 deletions KkuMulKum/Network/Service/MeetingService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import Foundation

import Moya
import RxSwift
import RxMoya

final class MeetingService {
let provider: MoyaProvider<MeetingTargetType>
Expand Down Expand Up @@ -40,6 +42,30 @@ final class MeetingService {
}
}

extension MeetingService: MeetingInfoServiceProtocol {
func fetchMeetingInfo(with meetingID: Int) async throws -> ResponseBodyDTO<MeetingInfoModel>? {
return try await request(with: .fetchMeetingInfo(meetingID: meetingID))
}

func fetchMeetingMemberList(with meetingID: Int) async throws -> ResponseBodyDTO<MeetingMembersModel>? {
return try await request(with: .fetchMeetingMember(meetingID: meetingID))
}

func fetchMeetingPromiseList(with meetingID: Int) async throws -> ResponseBodyDTO<MeetingPromisesModel>? {
return try await request(with: .fetchMeetingPromiseList(meetingID: meetingID))
}

func exitMeeting(with meetingID: Int) -> Single<ResponseBodyDTO<EmptyModel>> {
return provider.rx.request(.exitMeeting(meetingID: meetingID))
.filterSuccessfulStatusCodes()
.map(ResponseBodyDTO<EmptyModel>.self)
.catch { error in
print("에러 발생: \(error.localizedDescription)")
throw error
}
}
}

extension MeetingService: CreateMeetingServiceProtocol {
func createMeeting(
request: MakeMeetingsRequestModel
Expand All @@ -56,6 +82,220 @@ extension MeetingService: InviteCodeServiceProtocol {
}
}

final class MockMeetingInfoService: MeetingInfoServiceProtocol {
func fetchMeetingInfo(with meetingID: Int) -> ResponseBodyDTO<MeetingInfoModel>? {
let mockData = MeetingInfoModel(
meetingID: 1,
name: "웅웅난진웅",
createdAt: "2024.06.08",
metCount: 3,
invitationCode: "WD56CQ"
)

return ResponseBodyDTO(success: true, data: mockData, error: nil)
}

func fetchMeetingMemberList(with meetingID: Int) -> ResponseBodyDTO<MeetingMembersModel>? {
let mockData = MeetingMembersModel(
memberCount: 14,
members: [
Member(
memberID: 1,
name: "김진웅",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 2,
name: "김수연",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 3,
name: "이지훈",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 4,
name: "이유진",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 5,
name: "이승현",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 6,
name: "허준혁",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 7,
name: "배차은우",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 8,
name: "김윤서",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 9,
name: "정혜진",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 10,
name: "주효은",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 11,
name: "박상준",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 12,
name: "김채원",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 13,
name: "류희재",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
),
Member(
memberID: 14,
name: "김민지",
profileImageURL: "https://reqres.in/img/faces/\(Int.random(in: 1...10))-image.jpg"
)
]
)

return ResponseBodyDTO(success: true, data: mockData, error: nil)
}

func fetchMeetingPromiseList(with meetingID: Int) -> ResponseBodyDTO<MeetingPromisesModel>? {
let mockData = MeetingPromisesModel(
promises: [
MeetingPromise(
promiseID: 1,
name: "꾸물 리프레시 데이",
dDay: 0,
time: "PM 2:00",
placeName: "DMC역"
),
MeetingPromise(
promiseID: 2,
name: "꾸물 잼얘 나이트",
dDay: 10,
time: "PM 6:00",
placeName: "홍대입구"
),
MeetingPromise(
promiseID: 3,
name: "친구 생일 파티",
dDay: 5,
time: "PM 7:00",
placeName: "강남역"
),
MeetingPromise(
promiseID: 4,
name: "주말 산책",
dDay: 3,
time: "AM 10:00",
placeName: "서울숲"
),
MeetingPromise(
promiseID: 5,
name: "프로젝트 미팅",
dDay: 1,
time: "AM 9:00",
placeName: "삼성역"
),
MeetingPromise(
promiseID: 6,
name: "독서 모임",
dDay: 7,
time: "PM 3:00",
placeName: "합정역"
),
MeetingPromise(
promiseID: 7,
name: "헬스클럽 모임",
dDay: 2,
time: "AM 8:00",
placeName: "신촌역"
),
MeetingPromise(
promiseID: 8,
name: "영화 관람",
dDay: 4,
time: "PM 8:00",
placeName: "잠실역"
),
MeetingPromise(
promiseID: 9,
name: "저녁 식사",
dDay: 6,
time: "PM 7:30",
placeName: "이태원역"
),
MeetingPromise(
promiseID: 10,
name: "아침 조깅",
dDay: 14,
time: "AM 6:00",
placeName: "한강공원"
),
MeetingPromise(
promiseID: 11,
name: "커피 브레이크",
dDay: 8,
time: "PM 4:00",
placeName: "을지로입구"
),
MeetingPromise(
promiseID: 12,
name: "스터디 그룹",
dDay: 12,
time: "PM 5:00",
placeName: "강남역"
),
MeetingPromise(
promiseID: 13,
name: "뮤직 페스티벌",
dDay: 9,
time: "PM 2:00",
placeName: "난지공원"
),
MeetingPromise(
promiseID: 14,
name: "낚시 여행",
dDay: 11,
time: "AM 5:00",
placeName: "속초항"
),
MeetingPromise(
promiseID: 15,
name: "가족 모임",
dDay: 13,
time: "PM 1:00",
placeName: "광화문역"
)
]
)

return ResponseBodyDTO(success: true, data: mockData, error: nil)
}

func exitMeeting(with meetingID: Int) -> Single<ResponseBodyDTO<EmptyModel>> {
let falseResponse = ResponseBodyDTO<EmptyModel>(success: false, data: nil, error: nil)
return .just(falseResponse)
}
}


final class MockInviteCodeService: InviteCodeServiceProtocol {
func joinMeeting(with request: RegisterMeetingsModel) -> ResponseBodyDTO<RegisterMeetingsResponseModel>? {
let mockData = RegisterMeetingsResponseModel(
Expand Down
44 changes: 44 additions & 0 deletions KkuMulKum/Network/Service/UserService.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// UserService.swift
// KkuMulKum
//
// Created by 이지훈 on 8/22/24.
//

import Foundation

import Moya

final class MyPageUserService: MyPageUserServiceType {
private var provider = MoyaProvider<UserTargetType>()

init(provider: MoyaProvider<UserTargetType> = MoyaProvider(plugins: [MoyaLoggingPlugin()])) {
self.provider = provider
}

func getUserInfo() async throws -> LoginUserModel {
return try await performRequest(.getUserInfo)
}

func performRequest<T: ResponseModelType>(_ target: UserTargetType) async throws -> T {
return try await withCheckedThrowingContinuation { continuation in
provider.request(target) { result in
switch result {
case .success(let response):
do {
let decodedResponse = try JSONDecoder().decode(ResponseBodyDTO<T>.self, from: response.data)
guard decodedResponse.success, let data = decodedResponse.data else {
throw decodedResponse.error.map(NetworkErrorMapper.mapErrorResponse) ??
NetworkError.unknownError("Unknown error occurred")
}
continuation.resume(returning: data)
} catch {
continuation.resume(throwing: error is NetworkError ? error : NetworkError.decodingError)
}
case .failure(let error):
continuation.resume(throwing: NetworkError.networkError(error))
}
}
}
}
}
Loading

0 comments on commit 0248303

Please sign in to comment.