forked from shihaam/thijooree
update docs
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# Activity History
|
||||
|
||||
Fetch the audit/activity log for the authenticated session. This is a separate feed from transaction history ([04-history.md](04-history.md)) — it records login events, profile switches, transfers initiated, beneficiary edits, etc.
|
||||
|
||||
Source: `MibActivityHistoryClient.kt`.
|
||||
|
||||
---
|
||||
|
||||
## Endpoint
|
||||
|
||||
```
|
||||
POST https://faisamobilex-wv.mib.com.mv/aProfile/getPagedActivityHistory
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Authentication
|
||||
|
||||
WebView session cookies (see [README](README.md)) plus `X-Requested-With: XMLHttpRequest`.
|
||||
|
||||
Unlike most WebView AJAX calls, this endpoint sends **no `Referer`** and **no `Origin`** header.
|
||||
|
||||
```
|
||||
Cookie: mbmodel=IOS-1.0; xxid=<session_xxid>; IBSID=<session_xxid>; mbnonce=<nonceGenerator>; time-tracker=597
|
||||
X-Requested-With: XMLHttpRequest
|
||||
User-Agent: Mozilla/5.0 (Linux; Android <ver>; wv) AppleWebKit/537.36 ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Request Body (form-urlencoded)
|
||||
|
||||
| Field | Value | Description |
|
||||
|---|---|---|
|
||||
| `start` | `1` | Start record index (1-based, inclusive) |
|
||||
| `end` | `100` | End record index (inclusive) |
|
||||
| `includeCount` | `1` | Return `total_count` in the response |
|
||||
|
||||
The app uses a default page size of **100** (`MibActivityHistoryClient.kt:120`).
|
||||
|
||||
---
|
||||
|
||||
## Response
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"total_count": "248",
|
||||
"data": [
|
||||
{
|
||||
"aid": "A0001",
|
||||
"activityType": "Local Transfer",
|
||||
"pa": "You",
|
||||
"activity": "transferred MVR 100.00 to",
|
||||
"pb": "Ahmed Ali",
|
||||
"date": "16 May 2026 15:10"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
| Field | Description |
|
||||
|---|---|
|
||||
| `success` | `true` on success |
|
||||
| `total_count` | Total entries on the server side (as a string — parse to int) |
|
||||
| `data` | Array of activity records |
|
||||
|
||||
### Record fields
|
||||
|
||||
| Field | Description |
|
||||
|---|---|
|
||||
| `aid` | Activity ID — used as the notification ID for read-state tracking |
|
||||
| `activityType` | Category label (e.g. `"Local Transfer"`, `"Beneficiary Added"`, `"Switch Profile"`, `"Log in"`) |
|
||||
| `pa` | Subject — the actor, typically `"You"` |
|
||||
| `activity` | Verb phrase describing the action |
|
||||
| `pb` | Object — counterparty / target of the action |
|
||||
| `date` | Timestamp formatted `"dd MMM yyyy HH:mm"` in **US locale** (parsed with `SimpleDateFormat("dd MMM yyyy HH:mm", Locale.US)`) |
|
||||
|
||||
### Display message
|
||||
|
||||
The app concatenates the three text fields with single spaces, skipping blanks:
|
||||
|
||||
```
|
||||
message = "$pa $activity $pb"
|
||||
```
|
||||
|
||||
E.g. `"You transferred MVR 100.00 to Ahmed Ali"`.
|
||||
|
||||
---
|
||||
|
||||
## Skipped Activity Types
|
||||
|
||||
The client hard-filters two `activityType` values out of the UI feed (`MibActivityHistoryClient.kt:13`):
|
||||
|
||||
```kotlin
|
||||
private val SKIP_TYPES = setOf("Switch Profile", "Log in")
|
||||
```
|
||||
|
||||
These records are still counted in `total_count` and still consume their slot in the requested `[start, end]` page. Pagination therefore has to fetch past them.
|
||||
|
||||
---
|
||||
|
||||
## Pagination — `fetchUntilEnough`
|
||||
|
||||
Because hidden types reduce the effective yield of each page, a thin helper repeats `fetchActivity` until enough visible records are collected or all pages are exhausted (`MibActivityHistoryClient.kt:116-134`):
|
||||
|
||||
```kotlin
|
||||
fun fetchUntilEnough(
|
||||
session: MibSession,
|
||||
loginId: String,
|
||||
minCount: Int = 5,
|
||||
pageSize: Int = 100
|
||||
): FetchResult
|
||||
```
|
||||
|
||||
Loop logic:
|
||||
|
||||
1. Start at `start = 1`.
|
||||
2. Call `fetchActivity(session, loginId, start, start + pageSize - 1)`.
|
||||
3. Append filtered items to the accumulator.
|
||||
4. Stop when **either** the accumulator has at least `minCount` items, **or** the raw page came back empty, **or** `start + pageSize - 1 >= totalCount`.
|
||||
5. Otherwise advance `start += pageSize` and repeat.
|
||||
|
||||
The returned `FetchResult` carries:
|
||||
|
||||
| Field | Description |
|
||||
|---|---|
|
||||
| `items` | Filtered, ready-to-display notifications |
|
||||
| `rawCount` | Total raw items consumed from the server (pre-filter) |
|
||||
| `totalCount` | Server-reported total |
|
||||
| `nextStart` | Next `start` to use for further pagination |
|
||||
|
||||
---
|
||||
|
||||
## Failure
|
||||
|
||||
Any non-2xx response, JSON parse failure, or `success: false` is mapped to an empty `FetchResult(emptyList(), 0, 0, end + 1)` — failures are silent. The caller distinguishes "no data" from "transient failure" by inspecting `totalCount`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
[← Contacts](09-contacts.md)
|
||||
Reference in New Issue
Block a user