Skip to content

Commit 08e4acd

Browse files
authored
[Merge] #198 - 자격증 상세뷰 댓글 API 연결 및 이력서뷰 리브랜딩 반영
2 parents 0321d24 + a0bc2f2 commit 08e4acd

65 files changed

Lines changed: 1669 additions & 885 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CERTI-iOS/Application/DIContainer/AppDIContainer.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ final class AppDIContainer {
2727
private lazy var acquisitionService: AcquisitionServiceProtocol = AcquisitionService()
2828
private lazy var careersService: CareersServiceProtocol = CareersService()
2929
private lazy var activityService: ActivityServiceProtocol = ActivityService()
30-
30+
private lazy var commentService: CommentServiceProtocol = CommentService()
3131

3232
// MARK: - Repositories
3333
// UseCase 다 만들면 private 붙이기
@@ -41,7 +41,7 @@ final class AppDIContainer {
4141
private lazy var acquisitionRepository: AcquisitionRepository = DefaultAcquisitionRepository(service: acquisitionService)
4242
private lazy var careersRepository: CareersRepository = DefaultCareersRepository(service: careersService)
4343
private lazy var activityRepository: ActivityRepository = DefaultActivityRepository(service: activityService)
44-
44+
private lazy var commentRepository: CommentRepository = DefaultCommentRepository(service: commentService)
4545
}
4646

4747

@@ -227,6 +227,22 @@ extension AppDIContainer {
227227
func makeFetchTrackUsecase() -> DefaultFetchTrackUsecase {
228228
return DefaultFetchTrackUsecase(repository: userRepository)
229229
}
230+
231+
func makeFetchCommentUseCase() -> FetchCommentUseCase {
232+
return DefaultFetchCommentUseCase(repository: commentRepository)
233+
}
234+
235+
func makeAddCommentUseCase() -> AddCommentUseCase {
236+
return DefaultAddCommentUseCase(repository: commentRepository)
237+
}
238+
239+
func makeDeleteCommentUseCase() -> DeleteCommentUseCase {
240+
return DefaultDeleteCommentUseCase(repository: commentRepository)
241+
}
242+
243+
func makeLikeCommentUseCase() -> LikeCommentUseCase {
244+
return DefaultLikeCommentUseCase(repository: commentRepository)
245+
}
230246
}
231247

232248

@@ -259,12 +275,17 @@ extension AppDIContainer {
259275
return DefaultCertificationDetailFactory(
260276
fetchCertificationDetailUseCase: makeFetchCertificationDetailUseCase(),
261277
addPreCertificationUseCase: makeAddPreCertificationUseCase(),
262-
addAcquisitionUseCase: makeAddAcquisitionUseCase()
278+
addAcquisitionUseCase: makeAddAcquisitionUseCase(),
279+
fetchCommentUseCase: makeFetchCommentUseCase(),
280+
addCommentUseCase: makeAddCommentUseCase(),
281+
deleteCommentUseCase: makeDeleteCommentUseCase(),
282+
likeCommentUseCase: makeLikeCommentUseCase()
263283
)
264284
}
265285

266286
func makeResumeFactory() -> ResumeFactory {
267287
return DefaultResumeFactory(
288+
fetchUserInfoUseCase: makeFetchUserInfoUseCase(),
268289
fetchJobUseCase: makeFetchJobUseCase(),
269290
fetchAcquisitionListUseCase: makeFetchAcquisitionListUseCase(),
270291
fetchAcquisitionDetailUseCase: makeFetchAcquisitionDetailUseCase(),

CERTI-iOS/Data/Network/Acquisition/AcquisitionAPI.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Moya
1111

1212
enum AcquisitionAPI {
1313
case fetchAcquisitionList
14-
case addAcquisition(certificationId: Int)
14+
case addAcquisition(request: AddAcquisitionRequestDTO)
1515
case fetchAcquisitionDetail(id: Int)
1616
case deleteAcquisition(id: Int)
1717
}
@@ -28,8 +28,8 @@ extension AcquisitionAPI: BaseTargetType {
2828
switch self {
2929
case .fetchAcquisitionList:
3030
return "acquisition"
31-
case .addAcquisition(let certificationId):
32-
return "acquisition/\(certificationId)"
31+
case .addAcquisition:
32+
return "acquisition"
3333
case .fetchAcquisitionDetail(let id):
3434
return "acquisition/\(id)"
3535
case .deleteAcquisition(let id):
@@ -54,8 +54,8 @@ extension AcquisitionAPI: BaseTargetType {
5454
switch self {
5555
case .fetchAcquisitionList:
5656
return .requestPlain
57-
case .addAcquisition:
58-
return .requestPlain
57+
case .addAcquisition(let request):
58+
return .requestJSONEncodable(request)
5959
case .fetchAcquisitionDetail:
6060
return .requestPlain
6161
case .deleteAcquisition:

CERTI-iOS/Data/Network/Acquisition/AcquisitionService.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Moya
1111

1212
protocol AcquisitionServiceProtocol {
1313
func fetchAcquisitionList() async -> Result<AcquisitionListResponseDTO, NetworkError>
14-
func addAcquisition(certificationId: Int) async -> Result<BaseResponseDTO<Bool>, NetworkError>
14+
func addAcquisition(request: AddAcquisitionRequestDTO) async -> Result<BaseResponseDTO<Bool>, NetworkError>
1515
func fetchAcquisitionDetail(id: Int) async -> Result<AcquisitionDetailResponseDTO, NetworkError>
1616
func deleteAcquisition(id: Int) async -> Result<Void, NetworkError>
1717
}
@@ -23,8 +23,8 @@ final class AcquisitionService: BaseService, AcquisitionServiceProtocol {
2323
return await requestDecodable(provider, .fetchAcquisitionList)
2424
}
2525

26-
func addAcquisition(certificationId: Int) async -> Result<BaseResponseDTO<Bool>, NetworkError> {
27-
return await requestDecodable(provider, .addAcquisition(certificationId: certificationId))
26+
func addAcquisition(request: AddAcquisitionRequestDTO) async -> Result<BaseResponseDTO<Bool>, NetworkError> {
27+
return await requestDecodable(provider, .addAcquisition(request: request))
2828
}
2929

3030
func fetchAcquisitionDetail(id: Int) async -> Result<AcquisitionDetailResponseDTO, NetworkError> {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// AddAcquisitionRequestDTO.swift
3+
// CERTI-iOS
4+
//
5+
// Created by 이상엽 on 1/30/26.
6+
//
7+
8+
import Foundation
9+
10+
struct AddAcquisitionRequestDTO: Encodable {
11+
let certificationId: Int
12+
}

CERTI-iOS/Data/Network/Acquisition/DTO/Response/AcquisitionDetailResponseDTO.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct AcquisitionDetailInfo: Decodable {
1717
let name: String
1818
let tags: [String]
1919
let description: String
20-
let createdAt: String
20+
let acquisitionDate: String
2121

2222

2323
// MARK: - Func
@@ -31,7 +31,7 @@ struct AcquisitionDetailInfo: Decodable {
3131
name: name,
3232
tags: tags,
3333
description: description,
34-
createdAt: createdAt
34+
acquisitionDate: acquisitionDate
3535
)
3636
}
3737

CERTI-iOS/Data/Network/Acquisition/DTO/Response/AcquisitionListResponseDTO.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@ extension AcquisitionListData {
2222
}
2323

2424
struct AcquisitionListInfo: Decodable {
25+
let certificationId: Int
2526
let acquisitionId: Int
2627
let cardFrontImageUrl: String
2728
let index: Int
2829
let name: String
2930
let tags: [String]
3031
let description: String
31-
let createdAt: String
32+
let acquisitionDate: String
33+
let grade: String?
34+
let certificationType: String
3235

3336

3437
// MARK: - Func
@@ -37,13 +40,14 @@ struct AcquisitionListInfo: Decodable {
3740
return AcquisitionListEntityData(
3841
acquisitionID: acquisitionId,
3942
cardFrontImageURL: cardFrontImageUrl,
40-
certificationType: "",
43+
certificationType: certificationType,
44+
certificationID: certificationId,
4145
index: index,
4246
name: name,
4347
tags: tags,
4448
description: description,
45-
acquisitionDate: createdAt,
46-
grade: ""
49+
acquisitionDate: acquisitionDate,
50+
grade: grade ?? ""
4751
)
4852
}
4953
}

CERTI-iOS/Data/Network/Certification/DTO/Response/CertificationDetailResponseDTO.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct CertificationDetailData: Decodable {
2222
let applicationMethod: String
2323
let applicationUrl: String
2424
let expirationPeriod: String
25+
let certState: String
2526
}
2627

2728
extension CertificationDetailData {
@@ -38,7 +39,8 @@ extension CertificationDetailData {
3839
testDateInformation: testDateInformation,
3940
applicationMethod: applicationMethod,
4041
applicationUrl: applicationUrl,
41-
expirationPeriod: expirationPeriod
42+
expirationPeriod: expirationPeriod,
43+
certState: certState
4244
)
4345
}
4446
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//
2+
// CommentAPI.swift
3+
// CERTI-iOS
4+
//
5+
// Created by 이상엽 on 1/26/26.
6+
//
7+
8+
import Foundation
9+
10+
import Moya
11+
12+
enum CommentAPI {
13+
case getComment(certificationId: Int, page: Int, size: Int, sort: String)
14+
case addComment(request: CommentRequestDTO)
15+
case deleteComment(commentId: Int)
16+
case likeComment(commentId: Int)
17+
}
18+
19+
extension CommentAPI: BaseTargetType {
20+
var headerType: HeaderType {
21+
switch self {
22+
default:
23+
return .accessTokenHeader
24+
}
25+
}
26+
27+
var path: String {
28+
switch self {
29+
case .getComment:
30+
return "comments"
31+
case .addComment:
32+
return "comments"
33+
case .deleteComment(let commentId):
34+
return "comments/\(commentId)"
35+
case .likeComment(let commentId):
36+
return "comments/\(commentId)/like"
37+
}
38+
}
39+
40+
var method: Moya.Method {
41+
switch self {
42+
case .getComment:
43+
return .get
44+
case .addComment:
45+
return .post
46+
case .deleteComment:
47+
return .delete
48+
case .likeComment:
49+
return .post
50+
}
51+
}
52+
53+
var task: Moya.Task {
54+
switch self {
55+
case .getComment(let certificationId, let page, let size, let sort):
56+
return .requestParameters(parameters: [
57+
"certificationId": certificationId,
58+
"page": page,
59+
"size": size,
60+
"sort": sort
61+
], encoding: URLEncoding.queryString)
62+
case .addComment(let request):
63+
return .requestJSONEncodable(request)
64+
case .deleteComment:
65+
return .requestPlain
66+
case .likeComment:
67+
return .requestPlain
68+
}
69+
}
70+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// CommentService.swift
3+
// CERTI-iOS
4+
//
5+
// Created by 이상엽 on 1/26/26.
6+
//
7+
8+
import Foundation
9+
10+
import Moya
11+
12+
protocol CommentServiceProtocol {
13+
func getComment(certificationId: Int, page: Int, size: Int, sort: String) async -> Result<CommentListResponseDTO, NetworkError>
14+
func addComment(request: CommentRequestDTO) async ->Result<Void, NetworkError>
15+
func deleteComment(commentId: Int) async ->Result<Void, NetworkError>
16+
func likeComment(commentId: Int) async -> Result<Void, NetworkError>
17+
}
18+
19+
final class CommentService: BaseService, CommentServiceProtocol {
20+
private let provider = MoyaProvider<CommentAPI>.init(plugins: [MoyaPlugin()])
21+
22+
func getComment(certificationId: Int, page: Int, size: Int, sort: String) async -> Result<CommentListResponseDTO, NetworkError> {
23+
return await requestDecodable(provider, .getComment(certificationId: certificationId, page: page, size: size, sort: sort))
24+
}
25+
26+
func addComment(request: CommentRequestDTO) async -> Result<Void, NetworkError> {
27+
return await requestVoid(provider, .addComment(request: request))
28+
}
29+
30+
func deleteComment(commentId: Int) async -> Result<Void, NetworkError> {
31+
return await requestVoid(provider, .deleteComment(commentId: commentId))
32+
}
33+
34+
func likeComment(commentId: Int) async -> Result<Void, NetworkError> {
35+
return await requestVoid(provider, .likeComment(commentId: commentId))
36+
}
37+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// CommentRequestDTO.swift
3+
// CERTI-iOS
4+
//
5+
// Created by 이상엽 on 1/31/26.
6+
//
7+
8+
import Foundation
9+
10+
struct CommentRequestDTO: Encodable {
11+
let content: String
12+
let certificationId: Int
13+
}

0 commit comments

Comments
 (0)