Marketplace » History » Revision 29
Revision 28 (Ryan Supawarapong, 02/23/2026 02:02 AM) → Revision 29/36 (Ryan Supawarapong, 02/23/2026 02:03 AM)
# Marketplace There are the following API: 1. [Lists](#Lists) [List](#List) 2. [Posted](#Posted) 3. [Interested](#Interested) 4. [Get Interested](#Get-Interested) ## Diagram <img src="market_place.png"><br> ``` title Market Place actor "customer" as c actor "owner" as o actor "admin" as a participant "frontend" as fe participant "admin" as adm participant "backend" as be database "database" as db participant "notification" as n o->fe: post sell asset fe->be: verify asset and quantities be<->db: query database be->fe: true/false fe->c: true: dispaly new post c->fe: click "interest" button fe->be: update status and count down 15 minutes be<->db: update database be->fe: true/false fe->c: show status "locked" be->n: update payment notification n->c: email bank account info and payment noti within 15 minutes c->n: click confirm payment c->fe: totp to confirm payment fe->be: update payment fe->fe: update status to "pending payment confirm" be<->db: update database be->n: update payment confirmation n->o: email payment acknowledge confirmation and pay service fees o->n: click confirm service fees o->fe: totp to confirm service fees fe->be: update service fees transaction fe->fe: update status to "pending service fees confirm" be<->db: update database be->n: send service fees notification n->a: get noti for new service fees adm<->be: get new service fees a->adm: verify service fees adm<->be: show service fees a->adm: approved service fees adm->be: update service fees status be<->db: update database be->n: send notification n->o: get noti service fees approved fe->fe: update status to "complete" ``` ## API route ## Lists | Type | Value | |---|---| | API Path | `/api/v1/customer/marketplace/lists` | | Request Type | `GET` | | Content-Type | `application/json` | | Authorization | `bearer ...` | ### Request Body | Key | Type | Example | Required | |---|---|---|---| | - | - | - | no body | ### Success Response (200) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"success"` | yes | | data | object | `{"transactions":[...]}` | yes | | data.transactions | array<object> | `[{"id":1,"transactionId":"TXN_123",...}]` | yes | | data.transactions[].id | number | `1` | no (`omitempty`) | | data.transactions[].sellerCode | string | `"90000005"` | no | | data.transactions[].sellerName | string | `"First Last"` | no | | data.transactions[].assetCode | string | `"ASSET001"` | no | | data.transactions[].assetName | string | `"Asset 001"` | no | | data.transactions[].assetShortName | string | `"A001"` | no | | data.transactions[].quantity | number | `10` | no | | data.transactions[].price | number | `10.01` | no | | data.transactions[].totalAmount | number | `100.10` | no | | data.transactions[].currency | string | `"THB"` | no | | data.transactions[].status | number | `1` | no | ### Error Response #### Internal Server Error (500) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"error"` | yes | | message | string | `"database error"` | yes | --- ## Posted | Type | Value | |---|---| | API Path | `/api/v1/customer/marketplace/posted` | | Request Type | `POST` | | Content-Type | `application/json` | | Authorization | `bearer ...` | ### Request Body > `customerCode` and `customerName` are injected from auth token by handler, not required from client body. | Key | Type | Example | Required | |---|---|---|---| | assetCode | string | `"ASSET001"` | yes | | assetName | string | `"Asset 001"` | yes | | assetShortName | string | `"A001"` | yes | | quantity | number | `5` | yes (`> 0`) | | price | number | `10` | yes (`> 0`) | | totalAmount | number | `50` | yes (`> 0`) | ### Success Response (200) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"success"` | yes | ### Error Response #### Bad Request (400) - bind error | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"error":"...bind error..."}` | yes | | data.error | string | `"code=400, message=..."` | yes | #### Unauthorized (401) - token missing/invalid | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"error":"invalid token claims"}` | yes | | data.error | string | `"invalid token claims"` | yes | #### Bad Request (400) - validation error | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"errors":{"assetCode":"required"}}` | yes | | data.errors | object | `{"field":"message"}` | yes | #### Internal Server Error (500) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"error"` | yes | | message | string | `"internal error"` | yes | --- ## Interested | Type | Value | |---|---| | API Path | `/api/v1/customer/marketplace/interested` | | Request Type | `POST` | | Content-Type | `application/json` | | Authorization | `bearer ...` | ### Request Body | Key | Type | Example | Required | |---|---|---|---| | assetCode | string | `"ASSET001"` | yes | | assetName | string | `"Asset 001"` | yes | | assetShortName | string | `"A001"` | yes | | quantity | number | `5` | yes (`> 0`) | | price | number | `10` | yes (`> 0`) | | totalAmount | number | `50` | yes (`> 0`) | | transactionId | string | `"TXN_123"` | yes | ### Success Response (200) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"success"` | yes | | data | object | `{"emailID":"emailID"}` | yes | | data.emailID | string | `"emailID"` | yes | ### Error Response #### Bad Request (400) - bind error | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"error":"...bind error..."}` | yes | | data.error | string | `"code=400, message=..."` | yes | #### Unauthorized (401) - token missing/invalid | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"error":"invalid token claims"}` | yes | | data.error | string | `"invalid token claims"` | yes | #### Bad Request (400) - validation error | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"errors":{"transactionId":"required"}}` | yes | | data.errors | object | `{"field":"message"}` | yes | #### Internal Server Error (500) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"error"` | yes | | message | string | `"internal error"` | yes | --- ## Get Interested | Type | Value | |---|---| | API Path | `/api/v1/customer/marketplace/interested/lists` | | Request Type | `GET` | | Content-Type | `application/json` | | Authorization | `bearer ...` | ### Request Body No request body. ### Success Response (200) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"success"` | yes | | data | object | `{"interestedList":[...]}` | yes | | data.interestedList | array<object> | `[{"transactionId":"TXN_123",...}]` | yes | #### `data.interestedList[]` object | JSON Path | Type | Example | Required | |---|---|---|---| | id | number | `1` | no | | transactionId | string | `"TXN_123"` | no | | buyerCode | string | `"90000004"` | no | | buyerName | string | `"FirstLast"` | no | | sellerCode | string | `"90000005"` | no | | sellerName | string | `"First Last"` | no | | assetCode | string | `"ASSET001"` | no | | assetName | string | `"Asset 001"` | no | | assetShortName | string | `"A001"` | no | | quantity | number | `10` | no | | price | number | `10.01` | no | | totalAmount | number | `100.10` | no | | currency | string | `"THB"` | no | | status | number | `1` | no | | paymentId | string | `"PMT_123"` | no | | createdAt | string (datetime) | `"2026-02-23T10:00:00Z"` | no | | deletedAt | object/null | `null` | no | ### Error Response #### Unauthorized (401) - token missing/invalid | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"failed"` | yes | | data | object | `{"error":"invalid token claims"}` | yes | | data.error | string | `"invalid token claims"` | yes | #### Internal Server Error (500) | JSON Path | Type | Example | Required | |---|---|---|---| | status | string | `"error"` | yes | | message | string | `"internal error"` | yes |