Skip to content

Commit

Permalink
πŸ”— :: (#121) νšŒμ›κ°€μž… 성별 & ν”„λ‘œν•„ μΆ”κ°€
Browse files Browse the repository at this point in the history
  • Loading branch information
HongSJae committed Mar 11, 2024
2 parents ea5af89 + a3ef601 commit 299a98e
Show file tree
Hide file tree
Showing 46 changed files with 1,119 additions and 60 deletions.
7 changes: 7 additions & 0 deletions Projects/Core/Sources/Steps/GenderSettingStep.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import RxFlow

public enum GenderSettingStep: Step {
case tabsIsRequired
case genderSettingIsRequired(name: String, gcn: Int, email: String, password: String)
case profileSettingIsRequired(name: String, gcn: Int, email: String, password: String, isMan: Bool)
}
2 changes: 1 addition & 1 deletion Projects/Core/Sources/Steps/PasswordSettingStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ import RxFlow
public enum PasswordSettingStep: Step {
case tabsIsRequired
case passwordSettingIsRequired(name: String, gcn: Int, email: String)
case privacyIsRequired(name: String, gcn: Int, email: String, password: String)
case genderSettingIsRequired(name: String, gcn: Int, email: String, password: String)
}
9 changes: 8 additions & 1 deletion Projects/Core/Sources/Steps/PrivacyStep.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,12 @@ import RxFlow

public enum PrivacyStep: Step {
case tabsIsRequired
case privacyIsRequired(name: String, gcn: Int, email: String, password: String)
case privacyIsRequired(
name: String,
gcn: Int,
email: String,
password: String,
isMan: Bool,
profileImageURL: String?
)
}
14 changes: 14 additions & 0 deletions Projects/Core/Sources/Steps/ProfileSettingStep.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import RxFlow

public enum ProfileSettingStep: Step {
case tabsIsRequired
case profileSettingIsRequired(name: String, gcn: Int, email: String, password: String, isMan: Bool)
case privacyIsRequired(
name: String,
gcn: Int,
email: String,
password: String,
isMan: Bool,
profileImageURL: String?
)
}
3 changes: 3 additions & 0 deletions Projects/Data/Sources/DI/DataSourceAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public final class DataSourceAssembly: Assembly {
container.register(RemoteFilesDataSource.self) { resolver in
RemoteFilesDataSourceImpl(keychain: self.keychain(resolver))
}
container.register(RemotePresignedURLDataSource.self) { resolver in
RemotePresignedURLDataSourceImpl(keychain: self.keychain(resolver))
}

container.register(RemoteStudentsDataSource.self) { resolver in
RemoteStudentsDataSourceImpl(keychain: self.keychain(resolver))
Expand Down
5 changes: 5 additions & 0 deletions Projects/Data/Sources/DI/RepositoryAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ public final class RepositoryAssembly: Assembly {
remoteFilesDataSource: resolver.resolve(RemoteFilesDataSource.self)!
)
}
container.register(PresignedURLRepository.self) { resolver in
PresignedURLRepositoryImpl(
remotePresignedURLDataSource: resolver.resolve(RemotePresignedURLDataSource.self)!
)
}
}
// swiftlint:enable function_body_length
}
9 changes: 7 additions & 2 deletions Projects/Data/Sources/DI/UseCaseAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,16 @@ public final class UseCaseAssembly: Assembly {
}

// Files
container.register(UploadFilesUseCase.self) { resolver in
UploadFilesUseCase(
container.register(FetchPresignedURLUseCase.self) { resolver in
FetchPresignedURLUseCase(
filesRepository: resolver.resolve(FilesRepository.self)!
)
}
container.register(UploadImageToS3UseCase.self) { resolver in
UploadImageToS3UseCase(
presignedURLRepository: resolver.resolve(PresignedURLRepository.self)!
)
}
}
// swiftlint:enable function_body_length
}
23 changes: 21 additions & 2 deletions Projects/Data/Sources/DTO/Files/UploadFilesResponseDTO.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
import Foundation
import Domain

struct UploadFilesResponseDTO: Decodable {
let urls: [String]
struct FetchPresignedURLResponseDTO: Decodable {
let urls: [URLsResponseDTO]
}

struct URLsResponseDTO: Decodable {
let filePath: String
let presignedUrl: String

enum CodingKeys: String, CodingKey {
case filePath = "file_path"
case presignedUrl = "pre_signed_url"
}
}

extension FetchPresignedURLResponseDTO {
func toDomain() -> [PresignedURLEntity] {
self.urls.map {
.init(filePath: $0.filePath, presignedUrl: $0.presignedUrl)
}
}
}
41 changes: 14 additions & 27 deletions Projects/Data/Sources/DataSource/API/FilesAPI.swift
Original file line number Diff line number Diff line change
@@ -1,52 +1,39 @@
import Moya
import Foundation
import Domain
import Foundation
import Moya
import AppNetwork

enum FilesAPI {
case uploadFiles(data: [Data], fileName: String)
public enum FilesAPI {
case fetchPresignedURL(req: UploadFilesRequestDTO)
}

extension FilesAPI: JobisAPI {
typealias ErrorType = JobisError
public typealias ErrorType = JobisError

var domain: JobisDomain {
public var domain: JobisDomain {
.files
}

var urlPath: String {
return ""
public var urlPath: String {
return "/pre-signed"
}

var method: Moya.Method {
public var method: Moya.Method {
return .post
}

var task: Moya.Task {
public var task: Moya.Task {
switch self {
case let .uploadFiles(data, fileName):
var multipartData: [MultipartFormData] {
data.map {
MultipartFormData(
provider: .data($0),
name: "file",
fileName: fileName
)
}
}

return .uploadCompositeMultipart(
multipartData,
urlParameters: ["type": "EXTENSION_FILE"]
)
case let .fetchPresignedURL(req):
return .requestJSONEncodable(req)
}
}

var jwtTokenType: JwtTokenType {
public var jwtTokenType: JwtTokenType {
.none
}

var errorMap: [Int: ErrorType]? {
public var errorMap: [Int: ErrorType]? {
return [:]
}
}
54 changes: 54 additions & 0 deletions Projects/Data/Sources/DataSource/API/PresignedURLAPI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import Moya
import Foundation
import AppNetwork
import Domain

public enum PresignedURLAPI {
case uploadImageToS3(presignedURL: String, data: Data)
}

extension PresignedURLAPI: JobisAPI {
public typealias ErrorType = JobisError

public var domain: JobisDomain {
.presignedURL
}

public var urlPath: String {
""
}

public var baseURL: URL {
switch self {
case let .uploadImageToS3(presignedURL, _):
return URL(string: presignedURL)!
}
}

public var path: String {
return ""
}

public var method: Moya.Method {
return .put
}

public var task: Moya.Task {
switch self {
case let .uploadImageToS3(_, data):
return .requestData(data)
}
}

public var headers: [String: String]? {
return ["Content-Type": "image/jpg"]
}

public var jwtTokenType: JwtTokenType {
.none
}

public var errorMap: [Int: JobisError]? {
[:]
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import RxSwift
import Foundation
import AppNetwork
import Domain

protocol RemoteFilesDataSource {
func uploadFiles(data: [Data], fileName: String) -> Single<[String]>
func fetchPresignedURL(req: UploadFilesRequestDTO) -> Single<[PresignedURLEntity]>
}

final class RemoteFilesDataSourceImpl: RemoteBaseDataSource<FilesAPI>, RemoteFilesDataSource {
func uploadFiles(data: [Data], fileName: String) -> Single<[String]> {
request(.uploadFiles(data: data, fileName: fileName))
.map(UploadFilesResponseDTO.self)
.map(\.urls)
func fetchPresignedURL(req: UploadFilesRequestDTO) -> Single<[PresignedURLEntity]> {
request(.fetchPresignedURL(req: req))
.map(FetchPresignedURLResponseDTO.self)
.map { $0.toDomain() }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import RxSwift
import Foundation
import AppNetwork
import Domain

protocol RemotePresignedURLDataSource {
func uploadImageToS3(presignedURL: String, data: Data) -> Completable
}

final class RemotePresignedURLDataSourceImpl: RemoteBaseDataSource<PresignedURLAPI>,
RemotePresignedURLDataSource {
func uploadImageToS3(presignedURL: String, data: Data) -> Completable {
request(.uploadImageToS3(presignedURL: presignedURL, data: data))
.asCompletable()
}
}
4 changes: 2 additions & 2 deletions Projects/Data/Sources/Repositories/FilesRepositoryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct FilesRepositoryImpl: FilesRepository {
self.remoteFilesDataSource = remoteFilesDataSource
}

func uploadFiles(data: [Data], fileName: String) -> Single<[String]> {
remoteFilesDataSource.uploadFiles(data: data, fileName: fileName)
func fetchPresignedURL(req: UploadFilesRequestDTO) -> Single<[PresignedURLEntity]> {
remoteFilesDataSource.fetchPresignedURL(req: req)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import RxSwift
import Domain
import Foundation

struct PresignedURLRepositoryImpl: PresignedURLRepository {
private let remotePresignedURLDataSource: any RemotePresignedURLDataSource

init(remotePresignedURLDataSource: any RemotePresignedURLDataSource) {
self.remotePresignedURLDataSource = remotePresignedURLDataSource
}

func uploadImageToS3(presignedURL: String, data: Data) -> Completable {
remotePresignedURLDataSource.uploadImageToS3(presignedURL: presignedURL, data: data)
}
}
11 changes: 11 additions & 0 deletions Projects/Domain/Sources/Entities/Files/PresignedEntity.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import Foundation

public struct PresignedURLEntity: Equatable {
public let filePath: String
public let presignedUrl: String

public init(filePath: String, presignedUrl: String) {
self.filePath = filePath
self.presignedUrl = presignedUrl
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import Foundation

public struct UploadFileModel {
public let file: Data
public let fileName: String

public init(file: Data, fileName: String) {
self.file = file
self.fileName = fileName
}
}

public struct UploadFilesRequestDTO: Encodable {
public let files: [FileRequestDTO]

public init(files: [FileRequestDTO]) {
self.files = files
}
}

public struct FileRequestDTO: Encodable {
public let type = "EXTENSION_FILE"
public let fileName: String

public init(fileName: String) {
self.fileName = fileName
}

enum CodingKeys: String, CodingKey {
case fileName = "file_name"
case type
}
}

public extension [UploadFileModel] {
func toRequestDTO() -> [FileRequestDTO] {
self.map { .init(fileName: $0.fileName) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ public struct SignupRequestQuery: Encodable {
public let name: String
public let gender: GenderType
public let classRoom, number: Int
public let deviceToken: String?
public let profileImageURL: String?
public let platformType: String

public init(
Expand All @@ -15,7 +17,9 @@ public struct SignupRequestQuery: Encodable {
name: String,
gender: GenderType,
classRoom: Int,
number: Int
number: Int,
deviceToken: String?,
profileImageURL: String?
) {
self.email = email
self.password = password
Expand All @@ -24,6 +28,8 @@ public struct SignupRequestQuery: Encodable {
self.gender = gender
self.classRoom = classRoom
self.number = number
self.deviceToken = deviceToken
self.profileImageURL = profileImageURL
self.platformType = "IOS"
}

Expand All @@ -32,6 +38,8 @@ public struct SignupRequestQuery: Encodable {
case password, grade, name, gender
case classRoom = "class_room"
case number
case deviceToken = "device_token"
case profileImageURL = "profile_image_url"
case platformType = "platform_type"
}
}
2 changes: 1 addition & 1 deletion Projects/Domain/Sources/Repositories/FilesRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import RxSwift
import Foundation

public protocol FilesRepository {
func uploadFiles(data: [Data], fileName: String) -> Single<[String]>
func fetchPresignedURL(req: UploadFilesRequestDTO) -> Single<[PresignedURLEntity]>
}
Loading

0 comments on commit 299a98e

Please sign in to comment.