Skip to content

Commit 2e9ac3d

Browse files
committed
[Feat] Runnect#125 - 글수정 API 연결
1 parent 5ccec82 commit 2e9ac3d

9 files changed

Lines changed: 447 additions & 46 deletions

File tree

Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@
145145
CEEC6B4B2961D89700D00E1E /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC6B4A2961D89700D00E1E /* CustomNavigationBar.swift */; };
146146
CEF3CD9A296DB305002723A1 /* CourseDetailResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3CD99296DB305002723A1 /* CourseDetailResponseDto.swift */; };
147147
CEFA9A2F29FC263700F2D0CF /* UserDeleteResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFA9A2E29FC263700F2D0CF /* UserDeleteResponseDto.swift */; };
148-
DA0587F22A05D54100B72869 /* EditCourseReguestDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA0587F12A05D54100B72869 /* EditCourseReguestDto.swift */; };
148+
DA0587F22A05D54100B72869 /* EditCourseRequestDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA0587F12A05D54100B72869 /* EditCourseRequestDto.swift */; };
149+
DA0587F42A05DEC000B72869 /* CourseEditVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA0587F32A05DEC000B72869 /* CourseEditVC.swift */; };
149150
DA20D847296697A600F1581F /* MyCourseSelectVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA20D846296697A600F1581F /* MyCourseSelectVC.swift */; };
150151
DA20D849296697B400F1581F /* CourseUploadVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA20D848296697B400F1581F /* CourseUploadVC.swift */; };
151152
DA20D84E2966A9B300F1581F /* CourseSearchVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA20D84D2966A9B300F1581F /* CourseSearchVC.swift */; };
@@ -308,7 +309,8 @@
308309
CEEC6B4A2961D89700D00E1E /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = "<group>"; };
309310
CEF3CD99296DB305002723A1 /* CourseDetailResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseDetailResponseDto.swift; sourceTree = "<group>"; };
310311
CEFA9A2E29FC263700F2D0CF /* UserDeleteResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDeleteResponseDto.swift; sourceTree = "<group>"; };
311-
DA0587F12A05D54100B72869 /* EditCourseReguestDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCourseReguestDto.swift; sourceTree = "<group>"; };
312+
DA0587F12A05D54100B72869 /* EditCourseRequestDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCourseRequestDto.swift; sourceTree = "<group>"; };
313+
DA0587F32A05DEC000B72869 /* CourseEditVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseEditVC.swift; sourceTree = "<group>"; };
312314
DA20D846296697A600F1581F /* MyCourseSelectVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCourseSelectVC.swift; sourceTree = "<group>"; };
313315
DA20D848296697B400F1581F /* CourseUploadVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseUploadVC.swift; sourceTree = "<group>"; };
314316
DA20D84D2966A9B300F1581F /* CourseSearchVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CourseSearchVC.swift; sourceTree = "<group>"; };
@@ -722,6 +724,7 @@
722724
isa = PBXGroup;
723725
children = (
724726
A3BC2F422966A93100198261 /* CourseDetailVC.swift */,
727+
DA0587F32A05DEC000B72869 /* CourseEditVC.swift */,
725728
);
726729
path = VC;
727730
sourceTree = "<group>";
@@ -1150,7 +1153,7 @@
11501153
DA0587F02A05D52100B72869 /* RequestDto */ = {
11511154
isa = PBXGroup;
11521155
children = (
1153-
DA0587F12A05D54100B72869 /* EditCourseReguestDto.swift */,
1156+
DA0587F12A05D54100B72869 /* EditCourseRequestDto.swift */,
11541157
);
11551158
path = RequestDto;
11561159
sourceTree = "<group>";
@@ -1376,6 +1379,7 @@
13761379
A3F67AE2296D33AC001598A2 /* MyPageDto.swift in Sources */,
13771380
CE591EA1296D5EB5000FCBB3 /* PrivateCourseResponseDto.swift in Sources */,
13781381
A3BC2F3F2964706100198261 /* UploadedCourseInfoCVC.swift in Sources */,
1382+
DA0587F42A05DEC000B72869 /* CourseEditVC.swift in Sources */,
13791383
CE6655FE295D912300C64E12 /* calculateTopInset.swift in Sources */,
13801384
CEEC6B492961C5E200D00E1E /* SplashVC.swift in Sources */,
13811385
CE6655D0295D85FF00C64E12 /* CancelBag.swift in Sources */,
@@ -1434,7 +1438,7 @@
14341438
CE17F02D2961BBA100E1DED0 /* ColorLiterals.swift in Sources */,
14351439
CEC2A68E2962AF2C00160BF7 /* RNMarker.swift in Sources */,
14361440
CE6655D2295D862A00C64E12 /* Publisher+Driver.swift in Sources */,
1437-
DA0587F22A05D54100B72869 /* EditCourseReguestDto.swift in Sources */,
1441+
DA0587F22A05D54100B72869 /* EditCourseRequestDto.swift in Sources */,
14381442
A3C2CACE29E313CC00EC525B /* SettingVC.swift in Sources */,
14391443
CE21C02E299E601700F62AF5 /* StampRouter.swift in Sources */,
14401444
CE6655E6295D887F00C64E12 /* UIStackView+.swift in Sources */,

Runnect-iOS/Runnect-iOS/Global/UIComponents/RNAlertVC.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ final class RNAlertVC: UIViewController {
2525
private let descriptionLabel = UILabel().then {
2626
$0.font = .b4
2727
$0.textColor = .g2
28+
$0.numberOfLines = 0
29+
$0.textAlignment = .center
2830
}
2931

3032
private lazy var yesButton = UIButton(type: .custom).then {
@@ -105,7 +107,7 @@ extension RNAlertVC {
105107
make.centerX.equalToSuperview()
106108
make.centerY.equalToSuperview()
107109
make.leading.trailing.equalToSuperview().inset(30)
108-
make.height.equalTo(126)
110+
// make.height.equalTo(126)
109111
}
110112

111113
containerView.addSubviews(descriptionLabel, yesButton, noButton)
@@ -116,6 +118,7 @@ extension RNAlertVC {
116118
}
117119

118120
noButton.snp.makeConstraints { make in
121+
make.top.equalTo(descriptionLabel.snp.bottom).offset(20)
119122
make.leading.equalToSuperview().offset(16)
120123
make.trailing.equalTo(containerView.snp.centerX).offset(-4)
121124
make.height.equalTo(44)
@@ -124,6 +127,7 @@ extension RNAlertVC {
124127
}
125128

126129
yesButton.snp.makeConstraints { make in
130+
make.top.equalTo(noButton.snp.top)
127131
make.trailing.equalToSuperview().inset(16)
128132
make.leading.equalTo(containerView.snp.centerX).offset(4)
129133
make.height.equalTo(44)

Runnect-iOS/Runnect-iOS/Network/Dto/CourseDetailDto/RequestDto/EditCourseReguestDto.swift renamed to Runnect-iOS/Runnect-iOS/Network/Dto/CourseDetailDto/RequestDto/EditCourseRequestDto.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ import Foundation
99

1010
// MARK: - EditCourseReguestDto
1111

12-
struct EditCourseReguestDto: Codable {
12+
struct EditCourseRequestDto: Codable {
1313
let title, description: String
1414
}

Runnect-iOS/Runnect-iOS/Network/Dto/CourseDetailDto/ResponseDto/UploadedCourseDetailResponseDto.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ struct UploadUser: Codable {
2020
let nickname: String
2121
let level: Int
2222
let image: String
23+
let isNowUser: Bool?
2324
}

Runnect-iOS/Runnect-iOS/Network/Router/PublicCourseRouter.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ enum PublicCourseRouter {
1414
case courseUploadingData(param: CourseUploadingRequestDto)
1515
case getUploadedCourseDetail(publicCourseId: Int)
1616
case getUploadedCourseInfo
17-
case updatePublicCourse(publicCousrseId: Int, param: EditCourseReguestDto)
18-
}
17+
case updatePublicCourse(publicCourseId: Int, editCourseRequestDto: EditCourseRequestDto)
18+
}
1919

2020
extension PublicCourseRouter: TargetType {
2121

@@ -36,7 +36,7 @@ extension PublicCourseRouter: TargetType {
3636
return "/public-course/detail/\(publicCourseId)"
3737
case .getUploadedCourseInfo:
3838
return "/public-course/user"
39-
case .updatePublicCourse(let publicCourseId ):
39+
case .updatePublicCourse(let publicCourseId, _):
4040
return "/public-course/\(publicCourseId)"
4141
}
4242
}
@@ -61,8 +61,11 @@ extension PublicCourseRouter: TargetType {
6161
return .requestParameters(parameters: try param.asParameter(), encoding: JSONEncoding.default)
6262
} catch {
6363
fatalError("Encoding 실패")}
64-
case .updatePublicCourse(let publicCourseId):
65-
return .requestJSONEncodable(publicCourseId)
64+
case .updatePublicCourse(_, let param):
65+
do {
66+
return .requestParameters(parameters: try param.asParameter(), encoding: JSONEncoding.default)
67+
} catch {
68+
fatalError("Encoding 실패")}
6669
case .getCourseData, .getUploadedCourseDetail, .getUploadedCourseInfo:
6770
return .requestPlain
6871
}

Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ final class CourseDetailVC: UIViewController {
2525

2626
private var courseModel: Course?
2727

28+
private var uploadedCourseDetailModel: UploadedCourseDetailResponseDto?
29+
2830
private var courseId: Int?
2931
private var publicCourseId: Int?
30-
private var userId: Int?
32+
private var isMyCourse: Bool?
3133

3234
// MARK: - UI Components
3335
private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton)
@@ -80,7 +82,7 @@ final class CourseDetailVC: UIViewController {
8082
$0.textColor = .g1
8183
$0.font = .h4
8284
}
83-
85+
8486
private let courseDistanceInfoView = CourseDetailInfoView(title: "거리", description: "0.0km")
8587

8688
private let courseDepartureInfoView = CourseDetailInfoView(title: "출발지", description: "위치")
@@ -103,7 +105,7 @@ final class CourseDetailVC: UIViewController {
103105
$0.sizeToFit()
104106
}
105107
// MARK: - View Life Cycle
106-
108+
107109
override func viewDidLoad() {
108110
super.viewDidLoad()
109111
setNavigationBar()
@@ -127,44 +129,49 @@ extension CourseDetailVC {
127129
}
128130

129131
@objc func moreButtonDidTap() {
130-
//Todo : case를 2개를 나눠서, userID가 나인경우에는 editAction,이외에는 신고액션
131-
// 삭제 & 수정 올라오는거(유저아이디가 나인경우)
132-
//UploadedCourseDetailResponseDto 에서 유저정보 가져오는 법
133-
let userId = ""//본인아이디
132+
guard let isMyCourse = self.isMyCourse, let uploadedCourseDetailModel = self.uploadedCourseDetailModel else { return }
133+
134134
let cancelAction = UIAlertAction(title: "닫기", style: .cancel, handler: nil)
135-
if "유저아이디" == "본인아이디" {
136-
let editAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
137-
let courseUploadVC = CourseUploadVC()
138-
let editAction = UIAlertAction(title: "수정하기", style: .destructive, handler: {(_: UIAlertAction!) in
139-
self.present(courseUploadVC, animated: true, completion: nil)
140-
})
141-
let delateAction = UIAlertAction(title: "삭제하기", style: .cancel, handler: nil)
142-
[ editAction, delateAction, cancelAction].forEach { editAlertController.addAction($0) }
143-
present(editAlertController, animated: true, completion: nil)
144-
145-
} else {
146-
// 신고폼 올라오는 거(유저아이디가 내가 아닌 경우)
147-
let reportAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
148-
let formUrl = NSURL(string: "https://docs.google.com/forms/d/e/1FAIpQLSek2rkClKfGaz1zwTEHX3Oojbq_pbF3ifPYMYezBU0_pe-_Tg/viewform")
149-
let formSafariView: SFSafariViewController = SFSafariViewController(url: formUrl! as URL)
150-
let reportAction = UIAlertAction(title: "신고하기", style: .destructive, handler: {(_: UIAlertAction!) in
151-
self.present(formSafariView, animated: true, completion: nil)
152-
})
153-
[ reportAction, cancelAction ].forEach { reportAlertController.addAction($0) }
154-
present(reportAlertController, animated: true, completion: nil)
155-
}
156-
};
157135

136+
if isMyCourse == true {
137+
let editAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
138+
let courseEditVC = CourseEditVC()
139+
courseEditVC.loadData(model: uploadedCourseDetailModel)
140+
courseEditVC.publicCourseId = self.publicCourseId
141+
let editAction = UIAlertAction(title: "수정하기", style: .default, handler: {(_: UIAlertAction!) in
142+
self.navigationController?.pushViewController(courseEditVC, animated: false)
143+
})
144+
let delateVC = RNAlertVC(description: "코스를 정말로 삭제하시겠어요?")
145+
delateVC.rightButtonTapAction = { [weak self] in
146+
// self?.delateCourse()
147+
}
148+
delateVC.modalPresentationStyle = .overFullScreen
149+
let delateAction = UIAlertAction(title: "삭제하기", style: .destructive, handler: {(_: UIAlertAction!) in
150+
self.present(delateVC, animated: true, completion: nil)})
151+
[ editAction, delateAction, cancelAction].forEach { editAlertController.addAction($0) }
152+
present(editAlertController, animated: false, completion: nil)
153+
} else {
154+
// 신고폼 올라오는 거(유저아이디가 내가 아닌 경우)
155+
let reportAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
156+
let formUrl = NSURL(string: "https://docs.google.com/forms/d/e/1FAIpQLSek2rkClKfGaz1zwTEHX3Oojbq_pbF3ifPYMYezBU0_pe-_Tg/viewform")
157+
let formSafariView: SFSafariViewController = SFSafariViewController(url: formUrl! as URL)
158+
let reportAction = UIAlertAction(title: "신고하기", style: .destructive, handler: {(_: UIAlertAction!) in
159+
self.present(formSafariView, animated: true, completion: nil)
160+
})
161+
[ reportAction, cancelAction ].forEach { reportAlertController.addAction($0) }
162+
present(reportAlertController, animated: true, completion: nil)
163+
}
164+
}
158165

159166
private func pushToCountDownVC() {
160167
guard let courseModel = self.courseModel,
161168
let path = courseModel.path,
162169
let distance = courseModel.distance
163170
else { return }
164-
171+
165172
let countDownVC = CountDownVC()
166173
let locations = path.map { NMGLatLng(lat: $0[0], lng: $0[1]) }
167-
174+
168175
let runningModel = RunningModel(courseId: self.courseId,
169176
publicCourseId: self.publicCourseId,
170177
locations: locations,
@@ -187,11 +194,13 @@ extension CourseDetailVC {
187194
}
188195

189196
func setData(model: UploadedCourseDetailResponseDto) {
197+
self.uploadedCourseDetailModel = model
190198
self.mapImageView.setImage(with: model.publicCourse.image)
191199
self.profileImageView.image = GoalRewardInfoModel.stampNameImageDictionary[model.user.image]
192200
self.profileNameLabel.text = model.user.nickname //유저닉네임
193201
self.runningLevelLabel.text = "Lv. \(model.user.level)"
194202
self.courseTitleLabel.text = model.publicCourse.title
203+
self.isMyCourse = model.user.isNowUser
195204
guard let scrap = model.publicCourse.scrap else { return }
196205
self.likeButton.isSelected = scrap
197206

@@ -310,12 +319,12 @@ extension CourseDetailVC {
310319
make.top.equalTo(firstHorizontalDivideLine.snp.bottom).offset(16)
311320
make.leading.equalTo(view.safeAreaLayoutGuide).offset(16)
312321
}
313-
322+
314323
courseDetailStackView.snp.makeConstraints { make in
315324
make.top.equalTo(courseTitleLabel.snp.bottom).offset(19)
316325
make.leading.trailing.equalToSuperview().inset(16)
317326
}
318-
327+
319328
secondHorizontalDivideLine.snp.makeConstraints { make in
320329
make.top.equalTo(courseDetailStackView.snp.bottom).offset(27)
321330
make.leading.trailing.equalTo(view.safeAreaLayoutGuide)
@@ -412,3 +421,32 @@ extension CourseDetailVC {
412421
}
413422
}
414423
}
424+
425+
extension CourseDetailVC {
426+
private func delateCourse() {
427+
// guard let courseId = courseModel?.id else { return }
428+
// let requsetDto = CourseUploadingRequestDto(courseId: courseId, title: titletext, description: descriptiontext)
429+
//
430+
// LoadingIndicator.showLoading()
431+
// PublicCourseProvider.request(.courseUploadingData(param: requsetDto)) { [weak self] response in
432+
// LoadingIndicator.hideLoading()
433+
// guard let self = self else { return }
434+
// switch response {
435+
// case .success(let result):
436+
// let status = result.statusCode
437+
// if 200..<300 ~= status {
438+
// self.navigationController?.popToRootViewController(animated: true)
439+
// }
440+
// if status >= 400 {
441+
// print("400 error")
442+
// self.showNetworkFailureToast()
443+
// }
444+
// case .failure(let error):
445+
// print(error.localizedDescription)
446+
// self.showNetworkFailureToast()
447+
// }
448+
// }
449+
// }
450+
// }
451+
}
452+
}

0 commit comments

Comments
 (0)