@lacrous/omnicloud 0.2.11 → 0.2.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lacrous/omnicloud",
3
- "version": "0.2.11",
3
+ "version": "0.2.12",
4
4
  "description": "SDK and core building blocks for OmniCloud — self-hosted cloud storage powered by your Telegram account.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -48,9 +48,9 @@
48
48
  "prisma": "^6.2.0"
49
49
  },
50
50
  "devDependencies": {
51
- "@omnicloud/core": "0.2.11",
52
- "@omnicloud/shared": "0.2.11",
53
- "@omnicloud/telegram": "0.2.11",
51
+ "@omnicloud/core": "0.2.12",
52
+ "@omnicloud/shared": "0.2.12",
53
+ "@omnicloud/telegram": "0.2.12",
54
54
  "@types/node": "^22.10.0",
55
55
  "esbuild": "0.25.12",
56
56
  "tsup": "^8.3.0",
package/server/index.js CHANGED
@@ -1593,6 +1593,23 @@ var FileService = class {
1593
1593
  }
1594
1594
  };
1595
1595
 
1596
+ // ../core/src/utils/folder-order.ts
1597
+ function deepestFirst(folderIds, folders) {
1598
+ const byId = new Map(folders.map((folder) => [folder.id, folder]));
1599
+ const depthOf = (id) => {
1600
+ let depth = 0;
1601
+ const seen = /* @__PURE__ */ new Set();
1602
+ let cursor = byId.get(id)?.parentId ?? null;
1603
+ while (cursor !== null && !seen.has(cursor)) {
1604
+ seen.add(cursor);
1605
+ depth += 1;
1606
+ cursor = byId.get(cursor)?.parentId ?? null;
1607
+ }
1608
+ return depth;
1609
+ };
1610
+ return [...folderIds].sort((a, b) => depthOf(b) - depthOf(a));
1611
+ }
1612
+
1596
1613
  // ../core/src/services/folder-service.ts
1597
1614
  var FolderService = class {
1598
1615
  constructor(folders, files, engineFor, activity = noopActivityRecorder) {
@@ -1795,7 +1812,10 @@ var FolderService = class {
1795
1812
  const remainingFolderIds = new Set(
1796
1813
  affected.filter((file) => !removedFileIds.includes(file.id)).map((file) => file.folderId)
1797
1814
  );
1798
- const deletable = folderIds.filter((folderId) => !remainingFolderIds.has(folderId));
1815
+ const deletable = deepestFirst(
1816
+ folderIds.filter((folderId) => !remainingFolderIds.has(folderId)),
1817
+ subtree
1818
+ );
1799
1819
  if (deletable.length > 0) {
1800
1820
  await this.folders.deleteMany(deletable);
1801
1821
  }
@@ -1969,22 +1989,13 @@ var TrashService = class {
1969
1989
  }
1970
1990
  const allFolders = await this.folders.listByUser(userId);
1971
1991
  const trashedFolders = allFolders.filter((folder) => folder.deletedAt !== null);
1972
- const depth = (folder) => {
1973
- let level = 0;
1974
- let cursor = folder.parentId;
1975
- const seen = /* @__PURE__ */ new Set();
1976
- while (cursor !== null && !seen.has(cursor)) {
1977
- seen.add(cursor);
1978
- const parent = allFolders.find((candidate) => candidate.id === cursor);
1979
- if (!parent) break;
1980
- level += 1;
1981
- cursor = parent.parentId;
1982
- }
1983
- return level;
1984
- };
1985
- trashedFolders.sort((a, b) => depth(a) - depth(b));
1992
+ const orderedIds = deepestFirst(
1993
+ trashedFolders.map((folder) => folder.id),
1994
+ allFolders
1995
+ );
1986
1996
  let deletedFolders = 0;
1987
- for (const folder of trashedFolders) {
1997
+ for (const folderId of orderedIds) {
1998
+ const folder = trashedFolders.find((candidate) => candidate.id === folderId);
1988
1999
  const stillHasFiles = await this.files.query(
1989
2000
  userId,
1990
2001
  { folderId: folder.id, trashed: true },
@@ -4972,7 +4983,7 @@ function encryptionCheck(configured) {
4972
4983
  }
4973
4984
 
4974
4985
  // ../../apps/api/src/routes/storage.ts
4975
- var VERSION = "0.2.11";
4986
+ var VERSION = "0.2.12";
4976
4987
  function registerStorageRoutes(app2, container2) {
4977
4988
  app2.get("/api/health", async () => {
4978
4989
  const database = await probeDatabase(container2);