> For the complete documentation index, see [llms.txt](/llms.txt)

# GS2-LoginReward トランザクションアクション

検証/消費/入手の各トランザクションアクションの仕様




## アクションの組み合わせと同時実行

すべてのサービスに共通する前提は [トランザクションアクションの組み合わせ]() にまとめています。先にそちらを読んでください。この節の残りは GS2-LoginReward 固有の内容です。

GS2-LoginReward のトランザクションアクションは、ネームスペース・ユーザー・ボーナスモデルの組で決まる 1 つの受け取り状況を対象にします。どのステップを受け取り済みかを、一覧を丸ごと持つ 1 行として記録します。

操作 | 同じ行を重ねたとき | 入れ子越し | 別の対象になる境界 | 直列実行モード有効時
--- | --- | --- | --- | ---
ステップの受け取り済みマーク<br>`MarkReceivedByUserId` | 同じステップなら統合。ステップが違えば発行時にエラー | 同じステップなら通る。ステップが違えば失敗する | ネームスペース・ユーザー・ボーナスモデル | ステップが違っても成立する。後から実行された方が、もう一方がすでに書き込んだ一覧を読んでから自分のステップを足すため、両方のステップがマークされる
マークの取り消し<br>`UnmarkReceivedByUserId` | 同じステップなら統合。ステップが違えば発行時にエラー | 同じステップなら通る。ステップが違えば失敗する | ネームスペース・ユーザー・ボーナスモデル | ステップが違っても成立する。後から実行された方が、もう一方がすでに書き込んだ一覧を読んでから自分のステップを外すため、両方のステップの取り消しが反映される
受け取り状況の破棄<br>`DeleteReceiveStatusByUserId` | 1 件に統合される | 失敗する | ネームスペース・ユーザー・ボーナスモデル | 入れ子越しでも成立する。1 件には統合されないが、すでに破棄された受け取り状況をもう一度破棄する場合は、作り直したうえで破棄するだけで済む

**複数のステップを 1 つのトランザクションで受け取らないでください。** 受け取り済みステップの一覧は 1 行にまとまっていて全体が書き換わるため、境界をステップ単位に割れません。そのため違うステップへのマークを 2 つ並べると合成できず、トランザクションを組み立てる時点でエラー (400) になります。同じステップへのマークは 1 つにまとまります。ステップごとにトランザクションを分けてください。

マークとその取り消しは行が違い、境界が同じです。1 つのトランザクションでマークと取り消しを行うことはできません。ステップの報酬の受け取りはマークとして表現され、そのマークを根拠に報酬が支払われます。

受け取り状況の破棄は内容を変えるのではなく丸ごと消すため、それを触る他のアクションと同居できません。

### 入れ子になったトランザクションに注意

内側からマークされたステップと、外側から触られた同じ受け取り状況が衝突して、トランザクションが失敗します。1 つのトランザクションの中でも入れ子越しでも、違うステップへのマークはどちらもエラーになります。

直列実行モード（`enableSequentialExecution` または `TransactionSettingV2`）を有効にすると、入れ子越しのこの失敗は起こらなくなります。内側のトランザクションは外側と同じ直列実行の区間で実行されるようになるため、後から実行された方が先に実行された方の書き込み済みの一覧を読んでから自分のステップを反映し、両方のステップが結果に残ります。1 つのトランザクション内で違うステップへのマークを 2 つ入れる制約は変わりません。これはアクションが実行される前の組み立て時点の検査なので、実行モードの影響を受けません。

### 制限を回避したい場合

受け取り済みマークは消費アクション、その取り消しと受け取り状況の破棄は入手アクションです。取り消しと破棄の衝突は `acquireActionUseJobQueue` を有効にすれば解消できますが、マークとの同居は `enableAtomicCommit` を無効にしないと解消しません。ただし、1 つのトランザクションに違うステップのマークを入れた場合は、どちらの設定でも許可されません。トランザクションを組み立てる時点で弾かれるためです。

### 同時実行とリトライ

受け取り状況はリビジョンの照合を伴って全体が書き換わるため、同じ受け取り状況への同時更新があると後から確定した側がコンフリクト (409) になります。リクエストの内容に問題があるわけではないので、リトライすれば成功します。

---



## Consume Action

消費アクション

### Gs2LoginReward:MarkReceivedByUserId

ユーザーIDを指定して受け取り済み化<br>

指定されたユーザーのボーナスモデルで特定のステップを手動で受け取り済みにマークします。

**数量指定可能なアクション：いいえ**

**反転可能なアクション：はい**

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| bonusModelName | string |  | ✓|  |  ~ 128文字 | ボーナスモデル名<br>この受け取り状態が紐づくログインボーナスモデルの名前。<br>ユーザーの受け取り進捗を特定のボーナスモデル定義に関連づけ、どの報酬リストと配布ルールが適用されるかを決定します。 |
| userId | string |  | ✓|  |  ~ 128文字 | ユーザーID<br>`#{userId}` と設定することでログイン中のユーザーIDに置換されます。 |
| stepNumber | int |  | ✓|  | 0 ~ 100 | ステップ番号 |
| timeOffsetToken | string |  | |  |  ~ 1024文字 | タイムオフセットトークン |




**JSON**
```json
{
    "action": "Gs2LoginReward:MarkReceivedByUserId",
    "request": {
        "namespaceName": "[string]ネームスペース名",
        "bonusModelName": "[string]ボーナスモデル名",
        "userId": "[string]ユーザーID",
        "stepNumber": "[int]ステップ番号",
        "timeOffsetToken": "[string]タイムオフセットトークン"
    }
}
```

**YAML**
```yaml

action: Gs2LoginReward:MarkReceivedByUserId
request:
  namespaceName: "[string]ネームスペース名"
  bonusModelName: "[string]ボーナスモデル名"
  userId: "[string]ユーザーID"
  stepNumber: "[int]ステップ番号"
  timeOffsetToken: "[string]タイムオフセットトークン"
```

**GS2-Script**
```lua

transaction.service("loginReward").consume.mark_received_by_user_id({
    namespaceName="[string]ネームスペース名",
    bonusModelName="[string]ボーナスモデル名",
    userId="[string]ユーザーID",
    stepNumber="[int]ステップ番号",
    timeOffsetToken="[string]タイムオフセットトークン",
})
```


---

## Acquire Action

入手アクション

### Gs2LoginReward:DeleteReceiveStatusByUserId

ユーザーIDを指定して受け取り状態のリセット<br>

指定されたユーザーのボーナスモデルの受け取り状態データを全て削除し、ボーナスの進捗を完全にリセットします。

**数量指定可能なアクション：いいえ**

**反転可能なアクション：いいえ**

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| bonusModelName | string |  | ✓|  |  ~ 128文字 | ボーナスモデル名<br>この受け取り状態が紐づくログインボーナスモデルの名前。<br>ユーザーの受け取り進捗を特定のボーナスモデル定義に関連づけ、どの報酬リストと配布ルールが適用されるかを決定します。 |
| userId | string |  | ✓|  |  ~ 128文字 | ユーザーID<br>`#{userId}` と設定することでログイン中のユーザーIDに置換されます。 |
| timeOffsetToken | string |  | |  |  ~ 1024文字 | タイムオフセットトークン |




**JSON**
```json
{
    "action": "Gs2LoginReward:DeleteReceiveStatusByUserId",
    "request": {
        "namespaceName": "[string]ネームスペース名",
        "bonusModelName": "[string]ボーナスモデル名",
        "userId": "[string]ユーザーID",
        "timeOffsetToken": "[string]タイムオフセットトークン"
    }
}
```

**YAML**
```yaml

action: Gs2LoginReward:DeleteReceiveStatusByUserId
request:
  namespaceName: "[string]ネームスペース名"
  bonusModelName: "[string]ボーナスモデル名"
  userId: "[string]ユーザーID"
  timeOffsetToken: "[string]タイムオフセットトークン"
```

**GS2-Script**
```lua

transaction.service("loginReward").acquire.delete_receive_status_by_user_id({
    namespaceName="[string]ネームスペース名",
    bonusModelName="[string]ボーナスモデル名",
    userId="[string]ユーザーID",
    timeOffsetToken="[string]タイムオフセットトークン",
})
```


---

### Gs2LoginReward:UnmarkReceivedByUserId

ユーザーIDを指定して未受け取り化<br>

指定されたユーザーのボーナスモデルで、受け取り済みにマークされたステップを未受け取りに戻します。<br>
指定されたステップが受け取り済みでない場合、エラーが返されます。

**数量指定可能なアクション：いいえ**

**反転可能なアクション：はい**

|  | 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128文字 | ネームスペース名<br>ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 |
| bonusModelName | string |  | ✓|  |  ~ 128文字 | ボーナスモデル名<br>この受け取り状態が紐づくログインボーナスモデルの名前。<br>ユーザーの受け取り進捗を特定のボーナスモデル定義に関連づけ、どの報酬リストと配布ルールが適用されるかを決定します。 |
| userId | string |  | ✓|  |  ~ 128文字 | ユーザーID<br>`#{userId}` と設定することでログイン中のユーザーIDに置換されます。 |
| stepNumber | int |  | ✓|  | 0 ~ 100 | ステップ番号 |
| timeOffsetToken | string |  | |  |  ~ 1024文字 | タイムオフセットトークン |




**JSON**
```json
{
    "action": "Gs2LoginReward:UnmarkReceivedByUserId",
    "request": {
        "namespaceName": "[string]ネームスペース名",
        "bonusModelName": "[string]ボーナスモデル名",
        "userId": "[string]ユーザーID",
        "stepNumber": "[int]ステップ番号",
        "timeOffsetToken": "[string]タイムオフセットトークン"
    }
}
```

**YAML**
```yaml

action: Gs2LoginReward:UnmarkReceivedByUserId
request:
  namespaceName: "[string]ネームスペース名"
  bonusModelName: "[string]ボーナスモデル名"
  userId: "[string]ユーザーID"
  stepNumber: "[int]ステップ番号"
  timeOffsetToken: "[string]タイムオフセットトークン"
```

**GS2-Script**
```lua

transaction.service("loginReward").acquire.unmark_received_by_user_id({
    namespaceName="[string]ネームスペース名",
    bonusModelName="[string]ボーナスモデル名",
    userId="[string]ユーザーID",
    stepNumber="[int]ステップ番号",
    timeOffsetToken="[string]タイムオフセットトークン",
})
```


---



