Skip to content

Commit

Permalink
[Fix] sopt-makers#46- Merge Conflict 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
devxsby committed Dec 23, 2022
2 parents 944b90b + c70cbf2 commit 230a6ce
Show file tree
Hide file tree
Showing 16 changed files with 166 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public struct I18N {
public struct SignUp {
public static let signUp = "회원가입"
public static let nickname = "닉네임"
public static let nicknameTextFieldPlaceholder = "한글/영문 NN자로 입력해주세요."
public static let nicknameTextFieldPlaceholder = "한글/영문 10자 이하로 입력해주세요."
public static let email = "이메일"
public static let emailTextFieldPlaceholder = "이메일을 입력해주세요."
public static let password = "비밀번호"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,38 @@

import Combine

import Core
import Domain
import Network

public class SignUpRepository {

private let networkService: AuthService
private let cancelBag = Set<AnyCancellable>()
private let userService: UserService
private let cancelBag = CancelBag()

public init(service: AuthService) {
public init(service: AuthService, userService: UserService) {
self.networkService = service
self.userService = userService
}
}

extension SignUpRepository: SignUpRepositoryInterface {
public func getNicknameAvailable(nickname: String) -> AnyPublisher<Bool, Error> {
return networkService.getNicknameAvailable(nickname: nickname).map { statusCode in
statusCode == 200
}.eraseToAnyPublisher()
}

public func getEmailAvailable(email: String) -> AnyPublisher<Bool, Error> {
return networkService.getEmailAvailable(email: email).map { statusCode in
statusCode == 200
}.eraseToAnyPublisher()
}

public func postSignUp(signUpRequest: SignUpModel) -> AnyPublisher<Bool, Error> {
return userService.postSignUp(nickname: signUpRequest.nickname, email: signUpRequest.email, password: signUpRequest.password).map { statusCode in
statusCode == 200
}.eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ import Network
extension SignUpEntity {

public func toDomain() -> SignUpModel {
return SignUpModel.init()
return SignUpModel.init(nickname: nickname, email: email, password: password)
}
}
10 changes: 8 additions & 2 deletions SOPT-Stamp-iOS/Projects/Domain/Sources/Model/SignUpModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ import Foundation

public struct SignUpModel {

public init() {

public let nickname, email, password: String
public let osType = "iOS"
public let clientToken: String? = nil

public init(nickname: String, email: String, password: String) {
self.nickname = nickname
self.email = email
self.password = password
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@
import Combine

public protocol SignUpRepositoryInterface {

func getNicknameAvailable(nickname: String) -> AnyPublisher<Bool, Error>
func getEmailAvailable(email: String) -> AnyPublisher<Bool, Error>
func postSignUp(signUpRequest: SignUpModel) -> AnyPublisher<Bool, Error>
}
41 changes: 29 additions & 12 deletions SOPT-Stamp-iOS/Projects/Domain/Sources/UseCase/SignUpUseCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ public protocol SignUpUseCase {
func checkEmail(email: String)
func checkPassword(password: String)
func checkAccordPassword(firstPassword: String, secondPassword: String)
func signUp(signUpRequest: SignUpModel)

var isNicknameValid: CurrentValueSubject<Bool, Error> { get set }
var isEmailFormValid: CurrentValueSubject<Bool, Error> { get set }
var isPasswordFormValid: CurrentValueSubject<Bool, Error> { get set }
var isAccordPassword: CurrentValueSubject<Bool, Error> { get set }
var isValidForm: CurrentValueSubject<Bool, Error> { get set }
var signUpSuccess: CurrentValueSubject<Bool, Error> { get set }
}

public class DefaultSignUpUseCase {
Expand All @@ -34,6 +36,7 @@ public class DefaultSignUpUseCase {
public var isPasswordFormValid = CurrentValueSubject<Bool, Error>(false)
public var isAccordPassword = CurrentValueSubject<Bool, Error>(false)
public var isValidForm = CurrentValueSubject<Bool, Error>(false)
public var signUpSuccess = CurrentValueSubject<Bool, Error>(false)

public init(repository: SignUpRepositoryInterface) {
self.repository = repository
Expand All @@ -43,16 +46,27 @@ public class DefaultSignUpUseCase {

extension DefaultSignUpUseCase: SignUpUseCase {
public func checkNickname(nickname: String) {
// 닉네임 글자 수 정해지면 로직 추가
let isValid = checkNicknameForm(nickname: nickname)
guard isValid else { return }
// 서버 통신
repository.getNicknameAvailable(nickname: nickname)
.sink { event in
print("SignUpUseCase nickname: \(event)")
} receiveValue: { isValid in
self.isNicknameValid.send(isValid)
}.store(in: cancelBag)
}

public func checkEmail(email: String) {
let isValid = checkEmailForm(email: email)
guard isValid else { return }
// 서버 통신
guard isValid else {
self.isEmailFormValid.send(isValid)
return
}

repository.getEmailAvailable(email: email)
.sink { event in
print("SignUpUseCase email: \(event)")
} receiveValue: { isValid in
self.isEmailFormValid.send(isValid)
}.store(in: cancelBag)
}

public func checkPassword(password: String) {
Expand All @@ -62,6 +76,15 @@ extension DefaultSignUpUseCase: SignUpUseCase {
public func checkAccordPassword(firstPassword: String, secondPassword: String) {
checkAccordPasswordForm(firstPassword: firstPassword, secondPassword: secondPassword)
}

public func signUp(signUpRequest: SignUpModel) {
repository.postSignUp(signUpRequest: signUpRequest)
.sink { event in
print("SignUpUseCase signUp: \(event)")
} receiveValue: { isValid in
self.signUpSuccess.send(isValid)
}.store(in: cancelBag)
}
}

// MARK: - Methods
Expand All @@ -82,16 +105,10 @@ extension DefaultSignUpUseCase {
}.store(in: cancelBag)
}

func checkNicknameForm(nickname: String) -> Bool {
isNicknameValid.send(true)
return true
}

func checkEmailForm(email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegEx)
let isValid = emailTest.evaluate(with: email)
isEmailFormValid.send(isValid)
return isValid
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,12 @@ public class CustomTextFieldView: UIView {
}
}

public var maxLength: Int?

public var text: String {
self.textField.text ?? ""
}

/// alert Label을 다른 CustomTextField에 보여주기 위한 delegate
weak var alertDelegate: CustomTextFieldViewAlertDelegate?

Expand Down Expand Up @@ -241,6 +247,12 @@ extension CustomTextFieldView {
return self
}

@discardableResult
public func setMaxLength(_ length: Int) -> Self {
self.maxLength = length
return self
}

/// alertText를 다른 TextField에 보여주기 위한 delegate 설정
public func setAlertDelegate(_ textView: CustomTextFieldViewAlertDelegate) -> Self {
self.alertDelegate = textView
Expand Down Expand Up @@ -281,6 +293,12 @@ extension CustomTextFieldView {
textChanged
.replaceNil(with: "")
.sink { text in
if let maxLength = self.maxLength, text.count > maxLength {
let index = text.index(text.startIndex, offsetBy: maxLength)
let newString = text[text.startIndex..<index]
self.textField.text = String(newString)
}

self.rightButton.isEnabled = !text.isEmpty
if text.isEmpty {
self.changeAlertLabelText("")
Expand Down Expand Up @@ -464,6 +482,7 @@ extension CustomTextFieldView {
// MARK: - UITextFieldDelegate

extension CustomTextFieldView: UITextFieldDelegate {

public func textFieldDidBeginEditing(_ textField: UITextField) {
self.setTextFieldViewState(.editing)
}
Expand Down
21 changes: 11 additions & 10 deletions SOPT-Stamp-iOS/Projects/Modules/Network/Sources/API/AuthAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import Alamofire
import Moya

public enum AuthAPI {
case sample(provider: String)
case getNicknameAvailable(nickname: String)
case getEmailAvailable(email: String)
}

extension AuthAPI: BaseAPI {
Expand All @@ -22,42 +23,42 @@ extension AuthAPI: BaseAPI {
// MARK: - Path
public var path: String {
switch self {
case .sample:
case .getNicknameAvailable, .getEmailAvailable:
return ""
}
}

// MARK: - Method
public var method: Moya.Method {
switch self {
case .sample:
return .post
case .getNicknameAvailable, .getEmailAvailable:
return .get
}
}

// MARK: - Parameters
private var bodyParameters: Parameters? {
var params: Parameters = [:]
switch self {
case .sample(let provider):
params["platform"] = provider
case .getNicknameAvailable, .getEmailAvailable:
break
}
return params
}

private var parameterEncoding: ParameterEncoding {
switch self {
case .sample:
return URLEncoding.init(destination: .queryString, arrayEncoding: .noBrackets, boolEncoding: .literal)
default:
return JSONEncoding.default
}
}

public var task: Task {
switch self {
case .sample:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
case .getNicknameAvailable(let nickname):
return .requestParameters(parameters: ["nickname": nickname], encoding: URLEncoding.queryString)
case .getEmailAvailable(let email):
return .requestParameters(parameters: ["email": email], encoding: URLEncoding.queryString)
default:
return .requestPlain
}
Expand Down
20 changes: 10 additions & 10 deletions SOPT-Stamp-iOS/Projects/Modules/Network/Sources/API/UserAPI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,25 @@ import Alamofire
import Moya

public enum UserAPI {
case sample(provider: String)
case signUp(nickname: String, email: String, password: String)
}

extension UserAPI: BaseAPI {

public static var apiType: APIType = .auth
public static var apiType: APIType = .user

// MARK: - Path
public var path: String {
switch self {
case .sample:
return ""
case .signUp:
return "signup"
}
}

// MARK: - Method
public var method: Moya.Method {
switch self {
case .sample:
case .signUp:
return .post
}
}
Expand All @@ -39,24 +39,24 @@ extension UserAPI: BaseAPI {
private var bodyParameters: Parameters? {
var params: Parameters = [:]
switch self {
case .sample(let provider):
params["platform"] = provider
case .signUp(let nickname, let email, let password):
params["nickname"] = nickname
params["email"] = email
params["password"] = password
}
return params
}

private var parameterEncoding: ParameterEncoding {
switch self {
case .sample:
return URLEncoding.init(destination: .queryString, arrayEncoding: .noBrackets, boolEncoding: .literal)
default:
return JSONEncoding.default
}
}

public var task: Task {
switch self {
case .sample:
case .signUp:
return .requestParameters(parameters: bodyParameters ?? [:], encoding: parameterEncoding)
default:
return .requestPlain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,13 @@
import Foundation

public struct SignUpEntity {
public let nickname: String
public let email: String
public let password: String

public init(nickname: String, email: String, password: String) {
self.nickname = nickname
self.email = email
self.password = password
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum APIType {
case notice
case auth
case alert
case user
}

public protocol BaseAPI: TargetType {
Expand All @@ -26,11 +27,13 @@ extension BaseAPI {

switch Self.apiType {
case .alert:
base += "alert"
base += "/alert"
case .notice:
base += "notice"
base += "/notice"
case .auth:
base += "auth"
base += "/auth"
case .user:
base += "/user"
}

guard let url = URL(string: base) else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,16 @@ import Moya
public typealias DefaultAuthService = BaseService<AuthAPI>

public protocol AuthService {

func getNicknameAvailable(nickname: String) -> AnyPublisher<Int, Error>
func getEmailAvailable(email: String) -> AnyPublisher<Int, Error>
}

extension DefaultAuthService: AuthService {
public func getNicknameAvailable(nickname: String) -> AnyPublisher<Int, Error> {
return requestObjectInCombineNoResult(.getNicknameAvailable(nickname: nickname))
}

public func getEmailAvailable(email: String) -> AnyPublisher<Int, Error> {
return requestObjectInCombineNoResult(.getEmailAvailable(email: email))
}
}
Loading

0 comments on commit 230a6ce

Please sign in to comment.