> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fairytech.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# iOS SDK API

# Class

## `MomentCashbackService`

```swift theme={null}

class MomentCashbackService {
    private init() {}
    
    // 사용자 ID 설정 (콜백 있음)
    func setUserId(_ userId: String, onComplete: CashbackCallbackPayload) {}
    
    // 캐시백 리스트 불러오기
    func listCashback(onComplete: @Sendable @MainActor @escaping (Result<[CashbackProgramType], Error>) -> Void) {
}

```

* Full reference
  ```swift theme={null}
  func listCashback(onComplete: @Sendable @MainActor @escaping (Result<[CashbackProgramType], Error>) -> Void) {
  ```
  *
  ## Argument
  * *Returns*
    * .success (list)
    * .failure(error)

## `CashbackViewController`

UIKit에서 캐시백 서비스 UI를 론칭할때 사용하는 클래스

```swift theme={null}
public class CashbackViewController: UIViewController {
		// retun값을 받을 delegate
    public weak var delegate: CashbackViewControllerDelegate?
    // Redirect하고 싶은 URL
    public var redirectTo: String?
}
```

## `CashbackViewControllerDelegate`

`CashbackViewController` 콜백 delegate protocol

```swift theme={null}
public protocol CashbackViewControllerDelegate: AnyObject {
		// UI 화면에서 종료시 불림
		func cashbackViewControllerDidFinish(_ viewController: CashbackViewController)
		
		// UI 화면에서 에러가 발생했을 때
		func cashbackViewController(_ viewController: CashbackViewController, didFailWithError error: CashbackError)
}
```

## `CashbackError`

```swift theme={null}
// WARNING: case가 불러와지지 않습니다. CashbackError.rawValue (0,1, ...)로 이용이 필요합니다

public enum CashbackError: Error {
    /**
     * @case userIdNotFound
     * @discussion Indicates that no user ID could be found or retrieved,
     *           which is necessary for Moment cashback service activation.
     */
    case userIdNotFound = 0

    /**
     * @case initializationError
     * @discussion Indicates that an error occurred during CashbackUI initialization.
     * @param error The underlying error regarding initialization.
     */
    case initializationError(Error)
}
```

# Callback

## `CashbackCallbackPayload`

```swift theme={null}

/// Simple callback payload for SDK operations
public struct CashbackCallbackPayload: Sendable {
    public let success: Bool
    public let message: String
}
```

* Full reference
  ```kotlin theme={null}
  case success:
  ```
  * *Description*
    * method 호출이 성공했을 때 불림.
  ```kotlin theme={null}
  fun onFailure(exception: MomentException)
  ```
  * *Description*
    * method 호출이 실패했을 때 불림.

# Data

Moment가 제공하는 Cashback program 상세 페이지에서는 각 data들을 아래와 같이 사용하고 있습니다.

## `CashbackProgramType`

```swift theme={null}
public struct CashbackProgramType {
    // 프로그램의 비즈니스 ID
    public var businessId: String
    
    // 프로그램의 비즈니스 명칭
    public var businessName: String
    
    // 비즈니스 이미지 URL
    public var businessImageUrl: String
    
    // 비지니스가 속한 카테고리
    public var category: BusinessCategoryType
    
    /*
     * 운영 사이트의 URL
     * e.g., "<https://www.lotteon.com/p/display/main/lotteon>"
     */
    public var url: String
    
    /*
     * 프로그램 이름
     * e.g., "상품 판매 프로그램", "커미션 프로그램"
     */
    public var programName: String
    
    /*
     * 적립 불가능한 경우들 (markdown string)
     * NOTE: listCashback 호출 시, 항상 빈 string을 반환합니다.
     * e.g., "임직원몰, 상품권, e쿠폰, 순금, 롯데온 앱에서 구매 시"
     */
    public var displayAllowedCases: String
    
    /*
     * 유의사항 (markdown string)
     * NOTE: listCashback 호출 시, 항상 빈 string을 반환합니다.
     * e.g.,
     * "* 구매금액에서 적립금, 즉시할인, 쿠폰, 배송비, 상품 결제 금액의 10% 부가세 제외된 실 구매금액을 기준으로 적립됩니다.
     *  * 쇼핑비서를 통한 결제 건에 한해 적립 되오니 반드시 쇼핑비서를 통해 결제해주세요."
     */
    public var displayCaution: String
    
    /*
     * products = [
     *      {
     *           target: string,                                    // "옥스포드 신발, 운동화"
     *           startDateTimestampMillis: number,                  // 1689064080859
     *           endDateTimestampMillis: number,                    // 1689064090012
     *           commissionType: enum,                              // CPS
     *           commission: CashbackCommission,                    // {"3.5", "%"}
     *           platforms: enum,                                   // MOBILE_WEB (string enum)
     *           transactionCreated: CashbackTransactionTrigger,    // {"PURCHASED", {"3", "시간"}}
     *           transactionConfirmed: CashbackTransactionTrigger,  // {"PURCHASED", {"2", "달"}}
     *      }, ...
     * ]
     *
     * products는 비어있을 수 없음. 항상 [0]번 index가 main product로 취급됨.
     * 모든 항목이 동일한 프로그램을 공유하는 경우
     * [0]번째 index에 target = ""로 데이터가 들어가 있음.
     */
    public var products: [CashbackProductType]
}
```

## `CashbackProductType`

```swift theme={null}
public struct CashbackProductType {
    /*
     * 적립 대상
     * target = "" 일 경우 전체
     * e.g., "옥스포드 신발, 운동화"
     */
    public var target: String
    
    // 프로그램 시작 일자 (timestamp millis)
    public var startDateTimestampMillis: Int64
    
    // 프로그램 종료 일자 (timestamp millis)
    public var endDateTimestampMillis: Int64
    
    /*
     * 커미션 유형
     * e.g., CashbackCommissionType.CPS, CashbackCommissionType.CPA, etc.
     */
    public var commissionType: CashbackCommissionType
    
    /*
     * 커미션: 커미션 값 + 커미션 유닛
     * e.g. (2.5 + %), (3000 + KRW)
     */
    public var commission: CashbackCommission
   
}

```

## `CashbackCommission`

```swift theme={null}
public struct CashbackCommission {
    /*
     * 커미션의 값에 해당하는 필드
     * e.g., "2.5"
     */
    public var amount: String
    
    /*
     * 커미션 단위
     * e.g., PERCENTAGE_COMMISSION_UNIT (1), KRW_COMMISSION_UNIT (2)
     */
    public var unit: CashbackCommissionUnit
}

```

## `CashbackCommissionType`

```swift theme={null}
// WARNING: case가 불러와지지 않습니다. CashbackCommissionType.rawValue (1,2, ..)로 이용이 필요합니다
public enum CashbackCommissionType {
    /// 알 수 없음 / 미분류
		case unknown = 0
		
    /* Cost Per Sale */
    case CPS
    
    /* Cost Per Action */
    case CPA
    
    /* Cost Per Click */
    case CPC
    
    /* Cost Per iMpression */
    case CPM
}
```

## `BusinessCategoryType`

```swift theme={null}
// WARNING: case가 불러와지지 않습니다. BusinessCategoryType.rawValue (1,2, ..)로 이용이 필요합니다
public enum BusinessCategoryType: Int, Sendable, CaseIterable {
    /// 알 수 없음 / 미분류
    case unknown = 0
    
    /// 음식, 식품 관련 (예: CJ더 마켓 등)
    case food
    
    /// 종합 쇼핑몰, 온라인몰
    case mall
    
    /// 문화, 도서 (예: Yes24, 교보문고)
    case culture
    
    /// 여행, 항공, 숙박, 교통
    case travel
    
    /// 전자제품, 가전
    case electronics
    
    /// 유아, 아동 용품
    case infant
    
    /// 건강, 헬스케어, 의료
    case health
    
    /// 패션, 의류, 잡화
    case fashion
    
    /// 뷰티, 화장품, 미용
    case beauty
    
    /// 금융, 보험, 투자
    case finance
    
    /// 리빙, 가구, 생활용품
    case living
    
    /// 교육, 학습, 자기계발
    case education
    
    /// 기타
    case etc
}

```
