> ## 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.

# Consent API

> 인식 서비스 시작 전 사용자 동의 및 권한 처리

# 개요

사용자가 앱 내에서 서비스 이용약관, 개인정보 수집·이용, 마케팅 정보 수신 등에 대한 동의를 관리할 수 있도록 SDK에서 제공하는 API입니다. 고객사 앱은 SDK의 `getConsent` / `setConsent` / `withdrawConsent` 메서드를 통해 사용자의 동의 정보를 조회·저장·철회할 수 있습니다.

## 지원하는 동의 항목

| 필드                                        | Title                     | 비고                                                                 |
| :---------------------------------------- | :------------------------ | :----------------------------------------------------------------- |
| `agreeTermsOfService`                     | 서비스 이용약관 동의               |                                                                    |
| `agreePersonalInfoUseAndSharing`          | 개인정보 수집·이용 및 제3자 제공 동의    |                                                                    |
| `agreeMarketingInfoReceive`               | 마케팅 정보 수신 동의              | 캐시백 및 광고 알림에 대한 수신 동의 입니다. 미동의시 알림이 나가지 않습니다.                      |
| `agreeMarketingPersonalInfoUseAndSharing` | 마케팅 목적 개인정보 수집·이용·제공 동의   | 캐시백 및 광고 알림을 보내기 위해 서비스이용기록을 이용한다는 개인정보 동의 입니다. 미동의시 알림이 나가지 않습니다. |
| `agreeNighttimeNotification`              | 야간(21:00\~08:00) 알림 수신 동의 | 미동의시 야간에 알림이 나가지 않습니다.                                             |

<Tip>
  Consent API는 현재 설정된 userId를 키로 사용하여 동의 정보를 저장·조회합니다. 호출 전에 `setUserId()` 로 userId를 먼저 설정해 두는 것을 권장합니다. userId가 비어 있는 상태로 호출하면 실패 콜백이 호출됩니다.
</Tip>

## Reference

method, callback, Data 등의 레퍼런스의 경우 다음 페이지를 [참조](https://app.notion.com/p/v1-3-0-20dab01eaa8e808ba8d5c40161f54b89?pvs=21)하시면 됩니다.

# 사용 예시

## 0. 사전 설정

Consent API 호출 전에 `setUserId()` 로 userId를 설정해 두는 것을 권장합니다. Consent 정보는 이 userId를 키로 서버에 저장됩니다.

```kotlin theme={null}
val moment = MomentSDK.getInstance(context)
moment.setUserId("test-user-id", object : MomentSDK.ResultCallback {
    override fun onSuccess() {
        // userId 설정 완료 후 consent API 호출
    }
    override fun onFailure(exception: MomentException) {}
})
```

## 1. 동의 상태 조회 (`getConsent`)

저장된 사용자 동의 상태를 조회하여 UI에 반영하는 예시입니다.

```kotlin theme={null}
moment.getConsent(object : MomentSDK.CallbackWithResult<GetUserConsentResponse> {
    override fun onSuccess(result: GetUserConsentResponse) {
        binding.swConsentTos.isChecked = result.agreeTermsOfService
        binding.swConsentPersonalInfo.isChecked = result.agreePersonalInfoUseAndSharing
        binding.swConsentMarketingInfo.isChecked = result.agreeMarketingInfoReceive
        binding.swConsentMarketingPersonal.isChecked = result.agreeMarketingPersonalInfoUseAndSharing
        binding.swConsentNighttimeNoti.isChecked = result.agreeNighttimeNotification
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "getConsent failed: ${exception.errorCode}")
    }
})
```

## 2. 동의 저장 (`setConsent`)

사용자가 동의 화면에서 입력한 값을 서버에 저장하는 예시입니다. 5개 필드를 모두 지정해서 전달해야 합니다.

```kotlin theme={null}
val request = SubmitUserConsentRequest.newBuilder()
    .setAgreeTermsOfService(true)
    .setAgreePersonalInfoUseAndSharing(true)
    .setAgreeMarketingInfoReceive(binding.swConsentMarketingInfo.isChecked)
    .setAgreeMarketingPersonalInfoUseAndSharing(binding.swConsentMarketingPersonal.isChecked)
    .setAgreeNighttimeNotification(binding.swConsentNighttimeNoti.isChecked)
    .build()

moment.setConsent(request, object : MomentSDK.CallbackWithResult<SubmitUserConsentResponse> {
    override fun onSuccess(result: SubmitUserConsentResponse) {
        // 서버에 반영된 최종 값으로 UI 재동기화
        binding.swConsentTos.isChecked = result.agreeTermsOfService
        binding.swConsentPersonalInfo.isChecked = result.agreePersonalInfoUseAndSharing
        binding.swConsentMarketingInfo.isChecked = result.agreeMarketingInfoReceive
        binding.swConsentMarketingPersonal.isChecked = result.agreeMarketingPersonalInfoUseAndSharing
        binding.swConsentNighttimeNoti.isChecked = result.agreeNighttimeNotification
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "setConsent failed: ${exception.errorCode}")
    }
})
```

<Warning>
  일부 항목만 변경하고 싶은 경우에도, 변경하지 않는 항목은 현재 값(예: `getConsent` 로 조회한 값 또는 UI에 표시되는 스위치 상태)을 그대로 다시 지정해 주어야 합니다. 지정하지 않은 필드는 `false` 로 저장됩니다.
</Warning>

## 3. 동의 철회 (`withdrawConsent`)

사용자가 모든 동의를 철회할 때(예: 회원 탈퇴, "모든 동의 해제" 버튼 등) 사용합니다. 모든 동의 필드가 `false` 로 저장됩니다.

```kotlin theme={null}
moment.withdrawConsent(object : MomentSDK.ResultCallback {
    override fun onSuccess() {
        binding.swConsentTos.isChecked = false
        binding.swConsentPersonalInfo.isChecked = false
        binding.swConsentMarketingInfo.isChecked = false
        binding.swConsentMarketingPersonal.isChecked = false
        binding.swConsentNighttimeNoti.isChecked = false
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "withdrawConsent failed: ${exception.errorCode}")
    }
})
```

<Danger>
  `withdrawConsent` 는 `agreeTermsOfService` 를 포함한 **모든** 동의를 철회합니다. 일부 동의만 해제하려면 `setConsent` 를 사용해 원하는 필드만 `false` 로 지정해 호출해 주세요.
</Danger>

사용자가 앱 내에서 서비스 이용약관, 개인정보 수집·이용, 마케팅 정보 수신 등에 대한 동의를 관리할 수 있도록 SDK에서 제공하는 API입니다. 고객사 앱은 SDK의 `getConsent` / `setConsent` / `withdrawConsent` 메서드를 통해 사용자의 동의 정보를 조회·저장·철회할 수 있습니다.

## 지원하는 동의 항목

| 필드                                        | Title                     | 비고                                                                 |
| :---------------------------------------- | :------------------------ | :----------------------------------------------------------------- |
| `agreeTermsOfService`                     | 서비스 이용약관 동의               |                                                                    |
| `agreePersonalInfoUseAndSharing`          | 개인정보 수집·이용 및 제3자 제공 동의    |                                                                    |
| `agreeMarketingInfoReceive`               | 마케팅 정보 수신 동의              | 캐시백 및 광고 알림에 대한 수신 동의 입니다. 미동의시 알림이 나가지 않습니다.                      |
| `agreeMarketingPersonalInfoUseAndSharing` | 마케팅 목적 개인정보 수집·이용·제공 동의   | 캐시백 및 광고 알림을 보내기 위해 서비스이용기록을 이용한다는 개인정보 동의 입니다. 미동의시 알림이 나가지 않습니다. |
| `agreeNighttimeNotification`              | 야간(21:00\~08:00) 알림 수신 동의 | 미동의시 야간에 알림이 나가지 않습니다.                                             |

<Tip>
  Consent API는 현재 설정된 userId를 키로 사용하여 동의 정보를 저장·조회합니다. 호출 전에 `setUserId()` 로 userId를 먼저 설정해 두는 것을 권장합니다. userId가 비어 있는 상태로 호출하면 실패 콜백이 호출됩니다.
</Tip>

## Reference

method, callback, Data 등의 레퍼런스의 경우 다음 페이지를 [참조](/api/android)하시면 됩니다.

# 사용 예시

## 0. 사전 설정

Consent API 호출 전에 `setUserId()` 로 userId를 설정해 두는 것을 권장합니다. Consent 정보는 이 userId를 키로 서버에 저장됩니다.

```kotlin theme={null}
val moment = MomentSDK.getInstance(context)
moment.setUserId("test-user-id", object : MomentSDK.ResultCallback {
    override fun onSuccess() {
        // userId 설정 완료 후 consent API 호출
    }
    override fun onFailure(exception: MomentException) {}
})
```

## 1. 동의 상태 조회 (`getConsent`)

저장된 사용자 동의 상태를 조회하여 UI에 반영하는 예시입니다.

```kotlin theme={null}
moment.getConsent(object : MomentSDK.CallbackWithResult<GetUserConsentResponse> {
    override fun onSuccess(result: GetUserConsentResponse) {
        binding.swConsentTos.isChecked = result.agreeTermsOfService
        binding.swConsentPersonalInfo.isChecked = result.agreePersonalInfoUseAndSharing
        binding.swConsentMarketingInfo.isChecked = result.agreeMarketingInfoReceive
        binding.swConsentMarketingPersonal.isChecked = result.agreeMarketingPersonalInfoUseAndSharing
        binding.swConsentNighttimeNoti.isChecked = result.agreeNighttimeNotification
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "getConsent failed: ${exception.errorCode}")
    }
})
```

## 2. 동의 저장 (`setConsent`)

사용자가 동의 화면에서 입력한 값을 서버에 저장하는 예시입니다. 5개 필드를 모두 지정해서 전달해야 합니다.

```kotlin theme={null}
val request = SubmitUserConsentRequest.newBuilder()
    .setAgreeTermsOfService(true)
    .setAgreePersonalInfoUseAndSharing(true)
    .setAgreeMarketingInfoReceive(binding.swConsentMarketingInfo.isChecked)
    .setAgreeMarketingPersonalInfoUseAndSharing(binding.swConsentMarketingPersonal.isChecked)
    .setAgreeNighttimeNotification(binding.swConsentNighttimeNoti.isChecked)
    .build()

moment.setConsent(request, object : MomentSDK.CallbackWithResult<SubmitUserConsentResponse> {
    override fun onSuccess(result: SubmitUserConsentResponse) {
        // 서버에 반영된 최종 값으로 UI 재동기화
        binding.swConsentTos.isChecked = result.agreeTermsOfService
        binding.swConsentPersonalInfo.isChecked = result.agreePersonalInfoUseAndSharing
        binding.swConsentMarketingInfo.isChecked = result.agreeMarketingInfoReceive
        binding.swConsentMarketingPersonal.isChecked = result.agreeMarketingPersonalInfoUseAndSharing
        binding.swConsentNighttimeNoti.isChecked = result.agreeNighttimeNotification
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "setConsent failed: ${exception.errorCode}")
    }
})
```

<Warning>
  일부 항목만 변경하고 싶은 경우에도, 변경하지 않는 항목은 현재 값(예: `getConsent` 로 조회한 값 또는 UI에 표시되는 스위치 상태)을 그대로 다시 지정해 주어야 합니다. 지정하지 않은 필드는 `false` 로 저장됩니다.
</Warning>

## 3. 동의 철회 (`withdrawConsent`)

사용자가 모든 동의를 철회할 때(예: 회원 탈퇴, "모든 동의 해제" 버튼 등) 사용합니다. 모든 동의 필드가 `false` 로 저장됩니다.

```kotlin theme={null}
moment.withdrawConsent(object : MomentSDK.ResultCallback {
    override fun onSuccess() {
        binding.swConsentTos.isChecked = false
        binding.swConsentPersonalInfo.isChecked = false
        binding.swConsentMarketingInfo.isChecked = false
        binding.swConsentMarketingPersonal.isChecked = false
        binding.swConsentNighttimeNoti.isChecked = false
    }

    override fun onFailure(exception: MomentException) {
        Log.e("Consent", "withdrawConsent failed: ${exception.errorCode}")
    }
})
```

<Danger>
  `withdrawConsent` 는 `agreeTermsOfService` 를 포함한 **모든** 동의를 철회합니다. 일부 동의만 해제하려면 `setConsent` 를 사용해 원하는 필드만 `false` 로 지정해 호출해 주세요.
</Danger>
