Skip to content

Commit b0c41cd

Browse files
authored
Merge pull request #56 from YAPP-Github/BOOK-91-feature/#54
feat: 로그인 기능 구현 및 전체 모듈 연결
2 parents 70494e2 + 47757b5 commit b0c41cd

63 files changed

Lines changed: 1218 additions & 141 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.

.github/workflows/ios_ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ jobs:
1919
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
2020
APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
2121
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
22+
APP_STORE_CONNECT_API_KEY_PATH: ${{ secrets.APP_STORE_CONNECT_API_KEY_PATH }}
2223

2324
steps:
2425
- name: 🔄 Checkout source code
@@ -39,6 +40,7 @@ jobs:
3940
echo "MATCH_REPO_URL=$MATCH_REPO_URL"
4041
echo "APP_STORE_CONNECT_API_KEY_ID=$APP_STORE_CONNECT_API_KEY_ID"
4142
echo "APP_STORE_CONNECT_ISSUER_ID=$APP_STORE_CONNECT_ISSUER_ID"
43+
echo "APP_STORE_CONNECT_API_KEY_PATH=$APP_STORE_CONNECT_API_KEY_PATH"
4244
} > .env.ci
4345
4446
- name: 📱 Select Xcode

src/Projects/BKCore/Sources/DiContainer/Autowired.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@
1515
/// }
1616
/// ```
1717
@propertyWrapper
18-
struct Autowired<T> {
18+
public struct Autowired<T> {
1919
private var service: T
2020

21-
init() {
22-
guard let resolved = DIContainer.shared.resolve(type: T.self) else {
23-
fatalError("\(#file) - \(#line): \(#function) - resolved failed for \(T.self)")
21+
public init(name: String? = nil) {
22+
guard let resolved = DIContainer.shared.resolve(type: T.self, name: name) else {
23+
fatalError("\(#file) - \(#line): \(#function) - resolved failed for \(T.self) - with \(name ?? "none")")
2424
}
2525
self.service = resolved
2626
}
2727

28-
var wrappedValue: T {
28+
public var wrappedValue: T {
2929
return service
3030
}
3131
}

src/Projects/BKCore/Sources/DiContainer/Interface/Assembly.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
/// ### Example
66
/// ```swift
77
/// // 각 계층에서
8-
/// final class DataAssembly: Assembly { ... }
9-
/// final class DomainAssembly: Assembly { ... }
8+
/// public struct DataAssembly: Assembly { ... }
9+
/// public struct DomainAssembly: Assembly { ... }
1010
/// // SceneDelegate에서
1111
/// DIContainer.shared.assemble([DataAssembly(), DomainAssembly()])
1212
/// ```
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import Combine
4+
import Foundation
5+
import OSLog
6+
7+
public extension Publisher {
8+
func debugError(
9+
_ label: String = "",
10+
logger: Logger,
11+
file: String = #fileID,
12+
function: String = #function,
13+
line: Int = #line
14+
) -> Publishers.HandleEvents<Self> {
15+
handleEvents(receiveCompletion: { completion in
16+
guard case let .failure(error) = completion else { return }
17+
Log.error(
18+
"[Combine Error] \(label) ↳ error: \(error)",
19+
logger: logger,
20+
file: file,
21+
function: function,
22+
line: line
23+
)
24+
})
25+
}
26+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import OSLog
4+
5+
public enum AppLogger {
6+
private static let subsystem = "Booket.26th.yapp"
7+
8+
public static let auth = Logger(subsystem: subsystem, category: "auth")
9+
public static let network = Logger(subsystem: subsystem, category: "network")
10+
public static let ui = Logger(subsystem: subsystem, category: "ui")
11+
public static let storage = Logger(subsystem: subsystem, category: "storage")
12+
public static let viewModel = Logger(subsystem: subsystem, category: "viewModel")
13+
public static let database = Logger(subsystem: subsystem, category: "database")
14+
}
15+
16+
public enum Log {
17+
public static func debug(
18+
_ message: String,
19+
logger: Logger,
20+
file: String = #fileID,
21+
function: String = #function,
22+
line: Int = #line
23+
) {
24+
logger.debug("\(message, privacy: .public) [\(file):\(line) \(function)]")
25+
}
26+
27+
public static func error(
28+
_ message: String,
29+
logger: Logger,
30+
file: String = #fileID,
31+
function: String = #function,
32+
line: Int = #line
33+
) {
34+
logger.error("\(message, privacy: .public) [\(file):\(line) \(function)]")
35+
}
36+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import BKDomain
4+
import Foundation
5+
6+
enum AuthAPI {
7+
case login(provider: AuthProvider, token: String)
8+
case logout
9+
case refresh(token: String)
10+
case me
11+
}
12+
13+
extension AuthAPI: RequestTarget {
14+
var baseURL: String {
15+
return "\(APIConfig.baseURL)/auth"
16+
}
17+
18+
var path: String {
19+
switch self {
20+
case .login:
21+
return "/signin"
22+
case .logout:
23+
return "/signout"
24+
case .refresh:
25+
return "/refresh"
26+
case .me:
27+
return "/me"
28+
}
29+
}
30+
31+
var method: HTTPMethod {
32+
switch self {
33+
case .login, .logout, .refresh:
34+
return .post
35+
case .me:
36+
return .get
37+
}
38+
}
39+
40+
var headers: [String: String] {
41+
switch self {
42+
case .login, .refresh:
43+
return [
44+
"Content-Type": "application/json"
45+
]
46+
case .logout, .me:
47+
return [:]
48+
}
49+
}
50+
51+
var body: (any Encodable)? {
52+
switch self {
53+
case .login(let provider, let token):
54+
return AuthLoginRequestDTO(
55+
providerType: provider,
56+
oauthToken: token
57+
)
58+
case .refresh(let token):
59+
return RefreshRequestDTO(
60+
refreshToken: token
61+
)
62+
case .logout, .me:
63+
return nil
64+
}
65+
}
66+
67+
var query: [String: Any] {
68+
switch self {
69+
case .login, .logout, .refresh, .me:
70+
return [:]
71+
}
72+
}
73+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import Foundation
4+
5+
private final class BKDataBundleToken {}
6+
7+
enum APIConfig {
8+
private static let bundle = Bundle(for: BKDataBundleToken.self)
9+
10+
static let baseURL: String = {
11+
guard let value = bundle.object(forInfoDictionaryKey: "BASE_API_URL") as? String else {
12+
fatalError("Can't load environment: BKData.BASE_API_URL")
13+
}
14+
return value
15+
}()
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import BKDomain
4+
import Foundation
5+
6+
public struct AuthLoginRequestDTO: Encodable {
7+
let providerType: AuthProvider
8+
let oauthToken: String
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright © 2025 Booket. All rights reserved
2+
3+
import Foundation
4+
5+
public struct RefreshRequestDTO: Encodable {
6+
public var refreshToken: String
7+
}

src/Projects/BKDomain/Sources/Entity/AuthTokens.swift renamed to src/Projects/BKData/Sources/DTO/Response/AuthLoginResponseDTO.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import Foundation
44

5-
/// 로그인 성공 시 반환되는 정보
6-
public struct AuthTokens {
5+
public struct AuthLoginResponseDTO: Decodable {
76
public let accessToken: String
87
public let refreshToken: String
98
}

0 commit comments

Comments
 (0)