Skip to content

Commit 334d8e1

Browse files
authored
Merge pull request #8 from Daniel-Ric/feature/2026-01-28/implement-new-endpoint-for-item-count-by-creator
creator-mapping
2 parents 4d10a3d + c04d811 commit 334d8e1

File tree

6 files changed

+32
-10
lines changed

6 files changed

+32
-10
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Optional Marketplace headers (when enabled):
227227
| ------ | --------------------------------------------- | --------------------------------------------------- |
228228
| GET | `/inventory/balances` | Player virtual currency balances |
229229
| GET | `/inventory/entitlements?includeReceipt=true` | Player entitlements (optionally with receipts) |
230-
| GET | `/inventory/creators?includeUnknown=true` | Inventory counts grouped by creator (optional) |
230+
| GET | `/inventory/creators?includeUnknown=true` | Inventory counts grouped by creator display name |
231231
| GET | `/inventory/playfab/items?filter=<query>` | PlayFab inventory items with official filters |
232232

233233
#### Purchase
@@ -273,7 +273,7 @@ Headers: `authorization` (JWT), `x-mc-token` (required). Returns `{ count, entit
273273

274274
#### `GET /inventory/creators?includeUnknown=<bool>`
275275

276-
Headers: `authorization` (JWT), `x-mc-token` (required). Returns `{ count, totalItems, unknownCount, creators }` with creator ownership counts derived from entitlements.
276+
Headers: `authorization` (JWT), `x-mc-token` (required). Returns `{ count, totalItems, unknownCount, creators }` with creator ownership counts derived from entitlements and mapped to creator display names.
277277

278278
#### `GET /inventory/playfab/items?filter=<query>`
279279

src/routes/inventory.routes.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {jwtMiddleware} from "../utils/jwt.js";
33
import {asyncHandler} from "../utils/async.js";
44
import {badRequest} from "../utils/httpError.js";
55
import {getBalances, getInventory} from "../services/minecraft.service.js";
6+
import {getCreators} from "../services/marketplace.service.js";
67
import {getEntityTokenForPlayer, getInventoryItems} from "../services/playfab.service.js";
78
import {summarizeCreators} from "../utils/inventoryCreators.js";
89

@@ -29,7 +30,9 @@ router.get("/creators", jwtMiddleware, asyncHandler(async (req, res) => {
2930
const includeReceipt = String(req.query.includeReceipt || "false") === "true";
3031
const includeUnknown = String(req.query.includeUnknown || "false") === "true";
3132
const entitlements = await getInventory(mcToken, includeReceipt);
32-
const {totalItems, unknownCount, creators} = summarizeCreators(entitlements, {includeUnknown});
33+
const creatorMap = await getCreators(mcToken);
34+
const creatorLookup = Object.fromEntries(Object.entries(creatorMap).map(([name, id]) => [String(id), name]));
35+
const {totalItems, unknownCount, creators} = summarizeCreators(entitlements, {includeUnknown, creatorLookup});
3336
res.json({count: Object.keys(creators).length, totalItems, unknownCount, creators});
3437
}));
3538

src/routes/purchase.routes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,9 @@ router.get("/inventory/creators", asyncHandler(async (req, res) => {
240240
if (!mcToken && st) mcToken = await getMCToken(st);
241241
if (!mcToken) throw badRequest("x-mc-token or x-playfab-session is required");
242242
const entitlements = await getInventory(mcToken, includeReceipt);
243-
const {totalItems, unknownCount, creators} = summarizeCreators(entitlements, {includeUnknown});
243+
const creatorMap = await getCreators(mcToken);
244+
const creatorLookup = Object.fromEntries(Object.entries(creatorMap).map(([name, id]) => [String(id), name]));
245+
const {totalItems, unknownCount, creators} = summarizeCreators(entitlements, {includeUnknown, creatorLookup});
244246
res.json({count: Object.keys(creators).length, totalItems, unknownCount, creators});
245247
}));
246248

src/utils/inventoryCreators.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,22 @@ function resolveCreator(entitlement) {
5858
return "";
5959
}
6060

61-
export function summarizeCreators(entitlements, {includeUnknown = false, unknownKey = "unknown"} = {}) {
61+
export function summarizeCreators(entitlements, {
62+
includeUnknown = false,
63+
unknownKey = "unknown",
64+
creatorLookup = null
65+
} = {}) {
6266
const items = Array.isArray(entitlements) ? entitlements : [];
6367
const counts = new Map();
6468
let unknownCount = 0;
6569
const unknownLabel = String(unknownKey || "").trim() || "unknown";
70+
const lookup = creatorLookup && typeof creatorLookup === "object" ? creatorLookup : null;
6671

6772
for (const entitlement of items) {
68-
const creator = resolveCreator(entitlement);
69-
if (creator) {
70-
counts.set(creator, (counts.get(creator) || 0) + 1);
73+
const resolved = resolveCreator(entitlement);
74+
if (resolved) {
75+
const mapped = lookup && lookup[resolved] ? lookup[resolved] : resolved;
76+
counts.set(mapped, (counts.get(mapped) || 0) + 1);
7177
continue;
7278
}
7379
unknownCount += 1;

src/utils/swagger.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ const options = {
169169
get: {
170170
tags: ["Inventory"],
171171
summary: "Get inventory creators",
172-
description: "Returns owned inventory counts grouped by creator.",
172+
description: "Returns owned inventory counts grouped by creator display name.",
173173
parameters: [{
174174
in: "header",
175175
name: "x-mc-token",
@@ -463,7 +463,7 @@ const options = {
463463
get: {
464464
tags: ["Purchase"],
465465
summary: "Get inventory creators via purchase flow",
466-
description: "Returns owned inventory counts grouped by creator using either a Minecraft token or a PlayFab session.",
466+
description: "Returns owned inventory counts grouped by creator display name using either a Minecraft token or a PlayFab session.",
467467
parameters: [{
468468
in: "header",
469469
name: "x-mc-token",

test/inventoryCreators.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,14 @@ test("summarizeCreators can include unknown bucket", () => {
3737
assert.equal(summary.unknownCount, 1);
3838
assert.deepEqual(summary.creators, {Alpha: 1, unknown: 1});
3939
});
40+
41+
test("summarizeCreators maps creator ids using lookup", () => {
42+
const entitlements = [{creatorId: "master_player_account:abc"}, {creatorId: "master_player_account:def"}];
43+
const summary = summarizeCreators(entitlements, {
44+
creatorLookup: {
45+
"master_player_account:abc": "Alpha Studio",
46+
"master_player_account:def": "Beta Studio"
47+
}
48+
});
49+
assert.deepEqual(summary.creators, {"Alpha Studio": 1, "Beta Studio": 1});
50+
});

0 commit comments

Comments
 (0)