diff --git a/src/assets/icons/chevron-left.svg b/src/assets/icons/chevron-left.svg new file mode 100644 index 0000000..a70deca --- /dev/null +++ b/src/assets/icons/chevron-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/routes/admin/media/audit/+page.svelte b/src/routes/admin/media/audit/+page.svelte new file mode 100644 index 0000000..190a995 --- /dev/null +++ b/src/routes/admin/media/audit/+page.svelte @@ -0,0 +1,673 @@ + + + +
+
+ +

Cloudinary Audit

+
+
+ +
+
+ + {#if loading} +
+
+

Analyzing Cloudinary storage...

+
+ {:else if error} +
+ +

{error}

+ +
+ {:else if auditData} + +
+
+
+

Total Files

+

{auditData.summary.totalCloudinaryFiles.toLocaleString()}

+

in Cloudinary

+
+
+
+
+

Database References

+

{auditData.summary.totalDatabaseReferences.toLocaleString()}

+

tracked files

+
+
+
+
+

Orphaned Files

+

{auditData.summary.orphanedFilesCount.toLocaleString()}

+

{auditData.summary.orphanedFilesSizeFormatted} wasted

+
+
+
+
+

Missing Files

+

{auditData.summary.missingReferencesCount.toLocaleString()}

+

broken references

+
+
+
+ + {#if auditData.orphanedFiles.length > 0} + +
+
+ {#if hasSelection} + {selectedFiles.size} files selected ({formatBytes(selectedSize)}) + {:else} + {auditData.orphanedFiles.length} orphaned files found + {/if} +
+
+ + +
+
+ + +
+ + + + + + + + + + + + + {#each auditData.orphanedFiles as file} + + + + + + + + + {/each} + +
+ + PreviewFile PathSizeDimensionsCreated
+ toggleFile(file.publicId)} + /> + + {#if file.format === 'svg'} +
.svg
+ {:else} + {file.publicId} + {/if} +
+ {file.folder}/ + {file.publicId.split('/').pop()} + {file.sizeFormatted} + {#if file.dimensions} + {file.dimensions.width}×{file.dimensions.height} + {:else} + — + {/if} + {formatDate(file.createdAt)}
+
+ {:else} + +
+ +

All Clean!

+

No orphaned files found. Your Cloudinary storage is in sync with your database.

+
+ {/if} + + {#if deleteResults} +
+

Deletion Complete

+

✓ Successfully deleted {deleteResults.succeeded} files

+ {#if deleteResults.failed.length > 0} +

✗ Failed to delete {deleteResults.failed.length} files

+ {/if} +
+ {/if} + {/if} +
+ + + +
+

Are you sure you want to delete {selectedFiles.size} orphaned files?

+

This will free up {formatBytes(selectedSize)} of storage.

+

⚠️ This action cannot be undone.

+
+
+ + +
+
+ +