@lacrous/omnicloud 0.2.9 → 0.2.10

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
@@ -1357,6 +1357,23 @@ async function resolveItemQuery(folders, userId, input) {
1357
1357
  // ../core/src/services/auth-session-service.ts
1358
1358
  var import_node_crypto3 = require("crypto");
1359
1359
 
1360
+ // ../core/src/services/version-retention.ts
1361
+ function versionsToPrune(versions, currentVersionId, policy, now) {
1362
+ const historical = versions.filter((version) => version.id !== currentVersionId).sort((a, b) => b.versionNumber - a.versionNumber);
1363
+ switch (policy.kind) {
1364
+ case "KEEP_ALL":
1365
+ return [];
1366
+ case "KEEP_LATEST_N": {
1367
+ const keep = Math.max(0, policy.count);
1368
+ return historical.slice(keep);
1369
+ }
1370
+ case "KEEP_FOR_DAYS": {
1371
+ const cutoff = now.getTime() - policy.days * 24 * 60 * 60 * 1e3;
1372
+ return historical.filter((version) => version.createdAt.getTime() < cutoff);
1373
+ }
1374
+ }
1375
+ }
1376
+
1360
1377
  // ../core/src/services/upload-operation.ts
1361
1378
  function isValidOperationId(id) {
1362
1379
  return /^[A-Za-z0-9_-]{8,64}$/.test(id);
@@ -1945,6 +1962,33 @@ var FileService = class {
1945
1962
  };
1946
1963
  }
1947
1964
  // ── internals ────────────────────────────────────────────────────────────
1965
+ /**
1966
+ * Removes historical versions the policy no longer keeps. For each version the
1967
+ * Telegram message is deleted first, and its row only after that succeeds, the
1968
+ * same order as a permanent delete. A failed remote delete leaves that version
1969
+ * in place. The current version is never removed. Returns how many were removed.
1970
+ */
1971
+ async pruneVersions(userId, fileId, policy, now = /* @__PURE__ */ new Date()) {
1972
+ const record = await this.get(userId, fileId);
1973
+ const versions = await this.files.listVersions(fileId);
1974
+ const doomed = versionsToPrune(versions, record.currentVersionId ?? null, policy, now);
1975
+ if (doomed.length === 0) return 0;
1976
+ const engine = await this.engineFor(userId);
1977
+ let removed = 0;
1978
+ for (const version of doomed) {
1979
+ await engine.remove({ messageId: String(version.telegramMessageId) });
1980
+ await this.files.deleteVersion(version.id);
1981
+ removed += 1;
1982
+ }
1983
+ await this.activity.record({
1984
+ userId,
1985
+ action: "delete",
1986
+ resourceType: "file",
1987
+ resourceId: fileId,
1988
+ resourceName: `${record.name} (${removed} old version${removed === 1 ? "" : "s"})`
1989
+ });
1990
+ return removed;
1991
+ }
1948
1992
  async assertFolder(userId, folderId) {
1949
1993
  const folder = await this.folders.findById(folderId);
1950
1994
  if (!folder || folder.userId !== userId) {