@objectstack/rest 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1315,6 +1315,40 @@ var RestServer = class {
1315
1315
  }
1316
1316
  });
1317
1317
  }
1318
+ if (metadata.endpoints.items !== false) {
1319
+ this.routeManager.register({
1320
+ method: "GET",
1321
+ path: `${metaPath}/diagnostics`,
1322
+ handler: async (req, res) => {
1323
+ try {
1324
+ const environmentId = isScoped ? req.params?.environmentId : void 0;
1325
+ const p = await this.resolveProtocol(environmentId, req);
1326
+ if (typeof p.getMetaDiagnostics !== "function") {
1327
+ res.status(501).json({
1328
+ error: "not_implemented",
1329
+ message: "protocol.getMetaDiagnostics() is not available in this kernel"
1330
+ });
1331
+ return;
1332
+ }
1333
+ const severityParam = req.query?.severity ?? "error";
1334
+ const severity = severityParam === "warning" ? "warning" : "error";
1335
+ const result = await p.getMetaDiagnostics({
1336
+ type: req.query?.type || void 0,
1337
+ severity,
1338
+ packageId: req.query?.package || void 0
1339
+ });
1340
+ res.json(result);
1341
+ } catch (error) {
1342
+ logError("[REST] Unhandled error:", error);
1343
+ sendError(res, error);
1344
+ }
1345
+ },
1346
+ metadata: {
1347
+ summary: "List metadata entries that fail spec validation",
1348
+ tags: ["metadata"]
1349
+ }
1350
+ });
1351
+ }
1318
1352
  if (metadata.endpoints.items !== false) {
1319
1353
  this.routeManager.register({
1320
1354
  method: "GET",
@@ -1404,7 +1438,8 @@ var RestServer = class {
1404
1438
  return;
1405
1439
  }
1406
1440
  const isAppType = req.params.type === "app";
1407
- if (metadata.enableCache && p.getMetaItemCached && !isAppType) {
1441
+ const isDraftRead = typeof req.query?.state === "string" && req.query.state.toLowerCase() === "draft";
1442
+ if (metadata.enableCache && p.getMetaItemCached && !isAppType && !isDraftRead) {
1408
1443
  const cacheRequest = {
1409
1444
  ifNoneMatch: req.headers["if-none-match"],
1410
1445
  ifModifiedSince: req.headers["if-modified-since"]
@@ -1435,10 +1470,12 @@ var RestServer = class {
1435
1470
  res.json(await this.translateMetaItem(req, req.params.type, environmentId, result.data));
1436
1471
  } else {
1437
1472
  const packageId = req.query?.package || void 0;
1473
+ const stateParam = typeof req.query?.state === "string" ? req.query.state.toLowerCase() : void 0;
1438
1474
  const item = await p.getMetaItem({
1439
1475
  type: req.params.type,
1440
1476
  name: req.params.name,
1441
- packageId
1477
+ packageId,
1478
+ ...stateParam === "draft" ? { state: "draft" } : {}
1442
1479
  });
1443
1480
  let visible = item;
1444
1481
  if (isAppType && item) {
@@ -1497,7 +1534,8 @@ var RestServer = class {
1497
1534
  ...environmentId ? { environmentId } : {},
1498
1535
  ...parentVersion !== void 0 ? { parentVersion } : {},
1499
1536
  ...actor ? { actor } : {},
1500
- ...force ? { force: true } : {}
1537
+ ...force ? { force: true } : {},
1538
+ ...typeof req.query?.mode === "string" && req.query.mode.toLowerCase() === "draft" ? { mode: "draft" } : {}
1501
1539
  });
1502
1540
  res.json(result);
1503
1541
  } catch (error) {
@@ -1527,12 +1565,14 @@ var RestServer = class {
1527
1565
  const parentVersion = typeof ifMatchHeader === "string" ? ifMatchHeader.replace(/^"|"$/g, "") : void 0;
1528
1566
  const actorHeader = req.headers?.["x-actor"] ?? req.headers?.["X-Actor"] ?? req.user?.id ?? req.userId;
1529
1567
  const actor = typeof actorHeader === "string" ? actorHeader : void 0;
1568
+ const stateParam = typeof req.query?.state === "string" && req.query.state.toLowerCase() === "draft" ? "draft" : void 0;
1530
1569
  const result = await p.deleteMetaItem({
1531
1570
  type: req.params.type,
1532
1571
  name: req.params.name,
1533
1572
  ...environmentId ? { environmentId } : {},
1534
1573
  ...parentVersion !== void 0 ? { parentVersion } : {},
1535
- ...actor ? { actor } : {}
1574
+ ...actor ? { actor } : {},
1575
+ ...stateParam ? { state: stateParam } : {}
1536
1576
  });
1537
1577
  res.json(result);
1538
1578
  } catch (error) {
@@ -1578,6 +1618,124 @@ var RestServer = class {
1578
1618
  tags: ["metadata"]
1579
1619
  }
1580
1620
  });
1621
+ this.routeManager.register({
1622
+ method: "POST",
1623
+ path: `${metaPath}/:type/:name/publish`,
1624
+ handler: async (req, res) => {
1625
+ try {
1626
+ const environmentId = isScoped ? req.params?.environmentId : void 0;
1627
+ const p = await this.resolveProtocol(environmentId, req);
1628
+ if (!p.publishMetaItem) {
1629
+ res.status(501).json({
1630
+ error: "Publish operation not supported by protocol implementation"
1631
+ });
1632
+ return;
1633
+ }
1634
+ const actorHeader = req.headers?.["x-actor"] ?? req.headers?.["X-Actor"] ?? req.user?.id ?? req.userId;
1635
+ const actor = typeof actorHeader === "string" ? actorHeader : void 0;
1636
+ const body = req.body && typeof req.body === "object" ? req.body : {};
1637
+ const message = typeof body.message === "string" ? body.message : void 0;
1638
+ const result = await p.publishMetaItem({
1639
+ type: req.params.type,
1640
+ name: req.params.name,
1641
+ ...environmentId ? { environmentId } : {},
1642
+ ...actor ? { actor } : {},
1643
+ ...message ? { message } : {}
1644
+ });
1645
+ res.json(result);
1646
+ } catch (error) {
1647
+ logError("[REST] Unhandled error:", error);
1648
+ sendError(res, error);
1649
+ }
1650
+ },
1651
+ metadata: {
1652
+ summary: "Publish the pending draft overlay (promotes draft \u2192 active)",
1653
+ tags: ["metadata"]
1654
+ }
1655
+ });
1656
+ this.routeManager.register({
1657
+ method: "POST",
1658
+ path: `${metaPath}/:type/:name/rollback`,
1659
+ handler: async (req, res) => {
1660
+ try {
1661
+ const environmentId = isScoped ? req.params?.environmentId : void 0;
1662
+ const p = await this.resolveProtocol(environmentId, req);
1663
+ if (!p.rollbackMetaItem) {
1664
+ res.status(501).json({
1665
+ error: "Rollback operation not supported by protocol implementation"
1666
+ });
1667
+ return;
1668
+ }
1669
+ const body = req.body && typeof req.body === "object" ? req.body : {};
1670
+ const toVersionRaw = body.toVersion ?? body.version ?? req.query?.toVersion;
1671
+ const toVersion = Number(toVersionRaw);
1672
+ if (!Number.isFinite(toVersion) || toVersion < 1) {
1673
+ res.status(400).json({
1674
+ error: `'toVersion' (positive integer) is required`,
1675
+ code: "invalid_request"
1676
+ });
1677
+ return;
1678
+ }
1679
+ const actorHeader = req.headers?.["x-actor"] ?? req.headers?.["X-Actor"] ?? req.user?.id ?? req.userId;
1680
+ const actor = typeof actorHeader === "string" ? actorHeader : void 0;
1681
+ const message = typeof body.message === "string" ? body.message : void 0;
1682
+ const result = await p.rollbackMetaItem({
1683
+ type: req.params.type,
1684
+ name: req.params.name,
1685
+ toVersion,
1686
+ ...environmentId ? { environmentId } : {},
1687
+ ...actor ? { actor } : {},
1688
+ ...message ? { message } : {}
1689
+ });
1690
+ res.json(result);
1691
+ } catch (error) {
1692
+ logError("[REST] Unhandled error:", error);
1693
+ sendError(res, error);
1694
+ }
1695
+ },
1696
+ metadata: {
1697
+ summary: "Restore the body at the given history version as the new live row",
1698
+ tags: ["metadata"]
1699
+ }
1700
+ });
1701
+ this.routeManager.register({
1702
+ method: "GET",
1703
+ path: `${metaPath}/:type/:name/diff`,
1704
+ handler: async (req, res) => {
1705
+ try {
1706
+ const environmentId = isScoped ? req.params?.environmentId : void 0;
1707
+ const p = await this.resolveProtocol(environmentId, req);
1708
+ if (!p.diffMetaItem) {
1709
+ res.status(501).json({
1710
+ error: "Diff operation not supported by protocol implementation"
1711
+ });
1712
+ return;
1713
+ }
1714
+ const parseV = (raw) => {
1715
+ if (raw === void 0 || raw === null || raw === "") return void 0;
1716
+ const n = Number(raw);
1717
+ return Number.isFinite(n) ? n : void 0;
1718
+ };
1719
+ const fromVersion = parseV(req.query?.from ?? req.query?.fromVersion);
1720
+ const toVersion = parseV(req.query?.to ?? req.query?.toVersion);
1721
+ const result = await p.diffMetaItem({
1722
+ type: req.params.type,
1723
+ name: req.params.name,
1724
+ ...environmentId ? { environmentId } : {},
1725
+ ...fromVersion !== void 0 ? { fromVersion } : {},
1726
+ ...toVersion !== void 0 ? { toVersion } : {}
1727
+ });
1728
+ res.json(result);
1729
+ } catch (error) {
1730
+ logError("[REST] Unhandled error:", error);
1731
+ sendError(res, error);
1732
+ }
1733
+ },
1734
+ metadata: {
1735
+ summary: "Diff two metadata versions (from/to query params; omit for previous-vs-current)",
1736
+ tags: ["metadata"]
1737
+ }
1738
+ });
1581
1739
  if (metadata.endpoints.item !== false) {
1582
1740
  this.routeManager.register({
1583
1741
  method: "GET",