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

# 사용자 생성 콘텐츠 조정

> PlayFab Economy v2에서 ReportItem 및 검토 API를 사용해 부적절한 사용자 생성 콘텐츠를 신고, 검토, 삭제할 수 있는 UGC 조정 흐름을 구축합니다.

이 가이드는 게임 내 콘텐츠에 대한 조정 흐름을 만드는 데 사용할 수 있는 API 호출을 살펴봅니다.

## 아이템 신고

플레이어는 클라이언트에서 `ReportItem` API를 호출하여 아이템을 신고할 수 있습니다. 아이템 `Id` 또는 `AlernateId`를 제공해야 합니다. 다음과 같은 추가 **선택적** 매개 변수를 추가할 수 있습니다.

* `ConcernCategory`: 신고에 대한 우려 범주
* `Reason`: 신고에 대한 자유 텍스트 입력

다음은 샘플 요청 본문입니다.

```json theme={null}
{
  "Id": "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
  "ConcernCategory": "Profanity",
  "Reason": "There was swearing in the description."
}
```

지정되지 않은 경우 `ConcernCategory`는 기본적으로 `None`으로 설정됩니다. 유효한 `ConcernCategory` 값은 다음과 같습니다.

* `None`
* `OffensiveContent`
* `ChildExploitation`
* `MalwareOrVirus`
* `PrivacyConcerns`
* `MisleadingApp`
* `PoorPerformance`
* `ReviewResponse`
* `SpamAdvertising`
* `Profanity`

`ReportItem` API를 호출하면 이벤트 이름 `item_reported`로 **오직** PlayStream 이벤트만 발생합니다. Game Manager에서 [Data Explorer](/services/playfab/data-analytics/learn-data/data-explorer/getting-started-with-data-explorer-basic)를 사용해 이를 쿼리할 수 있습니다. 예제 쿼리는 아래에서 볼 수 있습니다.

다음 쿼리는 **최근 3일 동안 ItemId별 ConcernCategory별 총 신고 수**를 반환합니다.

```kusto theme={null}
['events.all']
| where Timestamp > ago (3d)
| where FullName_Name == "item_reported"
| project ItemId = tostring(EventData.Payload.ItemId), ConcernCategory = tostring(EventData.Payload.ConcernCategory)
| summarize TotalReportCount = count() by ItemId, ConcernCategory
| sort by TotalReportCount desc
| render columnchart kind=stacked
```

다음 쿼리는 **최근 3일 동안 특정 ItemId에 대해 제출된 모든 신고**를 반환합니다.

```kusto theme={null}
['events.all']
| where Timestamp > ago (3d)
| where FullName_Name == "item_reported"
| where EventData.Payload.ItemId == "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
| project Timestamp, ItemId = tostring(EventData.Payload.ItemId), ConcernCategory = tostring(EventData.Payload.ConcernCategory), Reason = tostring(EventData.Payload.Reason), ReportingPlayer = Entity_Id
| sort by Timestamp
```

## 아이템의 조정 상태 변경

`SetItemModerationState` API를 사용해 **게시된** 아이템의 조정 상태를 변경할 수 있습니다. `Approved`가 아닌 상태의 아이템은 모든 플레이어에 대해 공개 카탈로그에서 액세스할 수 없습니다. 아이템 작성자는 `GetItem` 및 `GetDraftItems` API를 사용해 계속해서 아이템에 액세스할 수 있습니다. **타이틀 엔터티**와 **관리자**는 `SearchItems`, `GetDraftItems`, `GetItem`을 통해 승인되지 않은 아이템을 볼 수 있습니다.

이 API는 **타이틀 엔터티**만 호출할 수 있습니다. 아이템 `Id` 또는 `AlernateId`와 `Status`를 제공해야 합니다. **선택적** `Reason` 자유 텍스트 매개 변수도 추가할 수 있습니다. 서비스 호출로는 다음과 같습니다.

```json theme={null}
{
  "Status": "AwaitingModeration",
  "Reason": "User reports over threshold",
  "Id": "3f5dd8d4-4ee1-4748-8855-56a8a0277bf9"
}
```

기본적으로 게시된 아이템은 조정 상태가 없습니다. 초안 아이템을 다시 게시하는 것은 조정 상태를 변경하지 **않습니다**. 유효한 `Status` 값은 다음과 같습니다.

* `AwaitingModeration`
* `Approved`
* `Rejected`

다음 쿼리는 **최근 3일 동안 현재 `AwaitingModeration` 상태인 모든 아이템**을 반환합니다.

```kusto theme={null}
let TimeRange = ago(3d);
['events.all']
| where Timestamp > TimeRange
| where FullName_Name == "item_moderation_state_changed"
| project Timestamp, ItemId = tostring(EventData.Payload.ItemId)
| summarize MaxTimestamp = max(Timestamp) by ItemId
| extend TimeAndId = strcat(MaxTimestamp, "|", ItemId)
| join kind = leftouter (
    ['events.all']
    | where Timestamp > TimeRange
    | where FullName_Name == "item_moderation_state_changed"
    | project Timestamp, ItemId = tostring(EventData.Payload.ItemId), TargetStatus = tostring(EventData.Payload.TargetStatus), Reason = tostring(EventData.Payload.Reason)
    | extend TimeAndId = strcat(Timestamp, "|", ItemId)) on TimeAndId
| project Timestamp, ItemId, TargetStatus, Reason
| where TargetStatus == "AwaitingModeration"
```

## 아이템 삭제

`DeleteItem` API를 호출하여 아이템을 삭제할 수 있습니다. 이 호출은 초안 카탈로그에서 아이템을 제거하고(게시된 경우) 공개 카탈로그의 해당 아이템도 제거합니다. 아이템 `Id` 또는 `AlernateId`를 제공해야 합니다.

```json theme={null}
{
  "Id": "852a2d2b-7754-427e-9ad4-fce2b24a4cef"
}
```


## Related topics

- [XR-018 사용자 생성 콘텐츠](/ko/publishing/certification/xr/xr-018.md)
- [PlayFab 사용자 생성 콘텐츠](/ko/services/playfab/economy-monetization/economy-v2/ugc/overview.md)
- [FMA: XR-018 사용자 생성 콘텐츠](/ko/publishing/certification/fma/xr-018.md)
- [첫 번째 사용자 생성 콘텐츠 게시](/ko/services/playfab/economy-monetization/economy-v2/tutorials/publish-ugc.md)
- [사용자 생성 콘텐츠(UGC) 빠른 시작](/ko/services/playfab/economy-monetization/economy-v2/ugc/quickstart.md)
