From 88b8f90d27e47a1a458f1f3269b4a278e04a9bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 8 Jan 2026 16:45:33 +0100 Subject: [PATCH] pl-api: support Iceshrimp.NET drive updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/lib/client.ts | 9 +++++++++ packages/pl-api/lib/entities/drive-folder.ts | 11 +++++++++++ packages/pl-api/lib/entities/drive-status.ts | 20 ++++++++++++++++++++ packages/pl-api/lib/entities/index.ts | 1 + 4 files changed, 41 insertions(+) create mode 100644 packages/pl-api/lib/entities/drive-status.ts diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 0ad6a52d4..0055257c5 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -41,6 +41,7 @@ import { domainBlockSchema, driveFileSchema, driveFolderSchema, + driveStatusSchema, emojiReactionSchema, extendedDescriptionSchema, familiarFollowersSchema, @@ -6012,6 +6013,14 @@ class PlApiClient { return v.parse(driveFileSchema, response.json); }, + + getDriveStatus: async () => { + await this.#getIceshrimpAccessToken(); + + const response = await this.request('/api/iceshrimp/drive/status'); + + return v.parse(driveStatusSchema, response.json); + }, }; public readonly stories = { diff --git a/packages/pl-api/lib/entities/drive-folder.ts b/packages/pl-api/lib/entities/drive-folder.ts index 81ef8d771..db6e85961 100644 --- a/packages/pl-api/lib/entities/drive-folder.ts +++ b/packages/pl-api/lib/entities/drive-folder.ts @@ -3,11 +3,18 @@ import * as v from 'valibot'; import { type DriveFile, driveFileSchema } from './drive-file'; import { filteredArray } from './utils'; +const drivePathEntrySchema = v.object({ + id: v.fallback(v.nullable(v.string()), null), + name: v.fallback(v.nullable(v.string()), null), + parent_id: v.fallback(v.nullable(v.string()), null), +}); + const baseDriveFolderSchema = v.object({ id: v.fallback(v.nullable(v.string()), null), name: v.fallback(v.nullable(v.string()), null), parent_id: v.fallback(v.nullable(v.string()), null), files: filteredArray(driveFileSchema), + path: filteredArray(drivePathEntrySchema), }); /** @@ -16,6 +23,10 @@ const baseDriveFolderSchema = v.object({ const driveFolderSchema: v.BaseSchema> = v.pipe(v.any(), v.transform((folder) => ({ ...folder, parent_id: folder.parentId, + path: folder.path?.map((entry: any) => ({ + ...entry, + parent_id: entry.parentId, + })), })), v.object({ ...baseDriveFolderSchema.entries, folders: filteredArray(v.lazy(() => driveFolderSchema)), diff --git a/packages/pl-api/lib/entities/drive-status.ts b/packages/pl-api/lib/entities/drive-status.ts new file mode 100644 index 000000000..0595d4b7e --- /dev/null +++ b/packages/pl-api/lib/entities/drive-status.ts @@ -0,0 +1,20 @@ +import * as v from 'valibot'; + +/** + * @category Schemas +*/ +const driveStatusSchema = v.pipe(v.any(), v.transform((status) => ({ + file_count: status.fileCount, + used_size: status.usedSize, + ...status, +})), v.object({ + file_count: v.fallback(v.number(), 0), + used_size: v.fallback(v.number(), 0), +})); + +/** + * @category Entity types + */ +type DriveStatus = v.InferOutput; + +export { driveStatusSchema, type DriveStatus }; \ No newline at end of file diff --git a/packages/pl-api/lib/entities/index.ts b/packages/pl-api/lib/entities/index.ts index 97948d695..e67f64979 100644 --- a/packages/pl-api/lib/entities/index.ts +++ b/packages/pl-api/lib/entities/index.ts @@ -40,6 +40,7 @@ export * from './directory/statistics-period'; export * from './domain-block'; export * from './drive-file'; export * from './drive-folder'; +export * from './drive-status'; export * from './emoji-reaction'; export * from './extended-description'; export * from './familiar-followers';