---
# System prepended metadata

title: Poker Hilo

---

# Poker Hilo

- Hi-Lo stands for High-Low which is a poker game
- Dealer first draw two cards, 1 face-up, 1 face-down. Then user have to
  guess whether the face-down card is higher or lower than the face-up card
- User will win if they guess right, and push if two cards are tie
- The face-up card must not be `King` or `Ace`
- The odds depends on the face-up card and the choosen `game_type`. For example
  if the face-up card is `Queen` and choosen `game_type` is `LO` the odds is 0.1,
  the reason the odds is very low in this case because there are 11 cards which are
  lower than `Queen` so user got a very high chance to win the game.
- In this game FE need to make 2 request. The first request to get the face-up card
  and the second request(AKA bet request) to place a bet

# DB

- `hi_lo_game_record`

  - `id(bigint)`: primary key
  - `user_id(int)`: reference to user table
  - `partner_id(int)`: reference to partner table
  - `hi_lo_batch_id(bigint)`: reference to hi_lo_card_batch table
  - `first_card(text)`:
  - `second_card(text)`:
  - `game_type(text)`: either HI or LO
  - `bet_amount(bigint)`:
  - `result_type(int)`
  - `reward_amount(bigint)`:
  - `ctime, mtime, status`

- `hi_lo_config`

  - `id(bigint)`: primary key
  - `partner_id(int)`: reference to partner table
  - `bet_min(bigint)`: minimum amount of money user have to bet in a game
  - `bet_max(bigint)`: maximum amount of money user can bet in a game
  - `odds([]float)`: this odds aray for `LO` game type. When build the Config object
    on application level odds array for `HI` must be the reverse of odds array for `LO`
  - `ctime, mtime, status`

- `hi_lo_card_batch`
  - `id(bigint)`: primary key
  - `first_card(text)`:
  - `user_id(int)`:reference to user table
  - `ctime, mtime, status`

# Card value

- card value is a string with 2 character
  - The first character is the suit of the card
  - The second character is the face of the card
- There are 4 suits: DIAMOND(D), HEART(H), SPADE(S), AND CLUB(C)
- There are 13 faces: A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K

# Odds table

| Value | Card | Lower | Higher |
| ----- | ---- | ----- | ------ |
| 13    | K    | -     | -      |
| 12    | Q    | 0.1   | 9.7    |
| 11    | J    | 0.1   | 4.3    |
| 10    | 10   | 0.1   | 2.5    |
| 9     | 9    | 0.3   | 1.6    |
| 8     | 8    | 0.5   | 1.1    |
| 7     | 7    | 0.7   | 0.7    |
| 6     | 6    | 1.1   | 0.5    |
| 5     | 5    | 1.6   | 0.3    |
| 4     | 4    | 2.5   | 0.1    |
| 3     | 3    | 4.3   | 0.1    |
| 2     | 2    | 9.7   | 0.1    |
| 1     | A    | -     | -      |

# API specs

## Fetching API

- This API must be called before the betting API
- This API is used to fetch the first card

### Endpoint

`api/game/hi_lo/gen`

### Request

- empty request body

### Response

- `batch_id(bigint)`: is used along with the betting API to indentify `first_card`
- `first_card(text)`:

### Example

```sh
http POST $cards_url/api/game/hi_lo/gen
HTTP/1.1 200
{
    "batch_id": 1,
    "first_card": "H3"
}
```

### BE implementation

- Validate token
- Generate card
- Insert `hi_lo_card_batch` into DB

## Betting API

### Endpoint

`api/game/hi_lo/bet`

### Request

- `batch_id(bigint)`: is used to identify `first_card`
- `game_type(text)`: either HI or LO
- `bet_amount(bigint)`: amount of money user bet in

### Response

- `first_cards(text)`:
- `second_card(text)`:
- `game_type(text)`: either HI or LO
- `game_result(int)`: either WIN(1), LOSE(2), DRAW(3)
- `bet_amount(bigint)`: amount of money user bet in
- `reward_amount(bigint)`: amount of money user rewardded

### Example

```sh
echo '{
    "batch_id": 1,
    "game_type": 1,
    "bet_amount: 10000
}' | http $card_url/api/game/hi_lo/bet
HTTP/1.1 200

{
    "first_cards": "H3",
    "second_cards": "DK"
    "game_type": 1,
    "game_result": 1,
    "bet_amount": 100000,
    "reward_amount": 200000,
}
```

### BE implementation

- Validate session, config, bets, balance
- Fetch `hi_lo_card_batch` and validate it
  - Whether `hi_lo_card_batch.user_id` identical to `user_id` from token
  - Whether `hi_lo_card_batch.status` is Active(1)
  - Whether `hi_lo_card_batch.ctime` is within 10 minutes from current timestamp
- Update `hi_lo_card_batch.status` to InActive(1)
- Create bet transaction, and deduct money from user's wallet
- Generate second card, and check if user win
- Insert game record and bet records into db
- If reward greater than zero, create a reward transaction and add up money
  to the user's wallet
