From cd88c818ec468d04103faa7d0bd910f032f53eeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 19 Oct 2022 15:00:30 +0200
Subject: [PATCH] Display additional meta data in UI

 * Content Type for objects
 * number of objects in a bucket
 * Size of a bucket

#16
---
 src/client/models/BucketOut.ts               | 8 ++++++++
 src/client/models/S3ObjectMetaInformation.ts | 4 ++++
 src/components/BucketListItem.vue            | 4 ++--
 src/components/BucketView.vue                | 2 ++
 src/components/Modals/CopyObjectModal.vue    | 1 +
 src/components/Modals/CreateFolderModal.vue  | 1 +
 src/components/Modals/ObjectDetailModal.vue  | 2 +-
 src/components/Modals/UploadObjectModal.vue  | 1 +
 src/views/object-storage/BucketsView.vue     | 9 ++++++++-
 9 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/client/models/BucketOut.ts b/src/client/models/BucketOut.ts
index b1bb787..92b9426 100644
--- a/src/client/models/BucketOut.ts
+++ b/src/client/models/BucketOut.ts
@@ -22,5 +22,13 @@ export type BucketOut = {
      * UID of the owner
      */
     owner: string;
+    /**
+     * Number of Objects in this bucket
+     */
+    num_objects: number;
+    /**
+     * Total size of objects in this bucket in bytes
+     */
+    size: number;
 };
 
diff --git a/src/client/models/S3ObjectMetaInformation.ts b/src/client/models/S3ObjectMetaInformation.ts
index 4292c7e..ed92a73 100644
--- a/src/client/models/S3ObjectMetaInformation.ts
+++ b/src/client/models/S3ObjectMetaInformation.ts
@@ -14,6 +14,10 @@ export type S3ObjectMetaInformation = {
      * Name of the Bucket in which the object is
      */
     bucket: string;
+    /**
+     * MIME type of the object
+     */
+    content_type: string;
     /**
      * Size of the object in Bytes
      */
diff --git a/src/components/BucketListItem.vue b/src/components/BucketListItem.vue
index 7141b83..0cd7cf6 100644
--- a/src/components/BucketListItem.vue
+++ b/src/components/BucketListItem.vue
@@ -110,11 +110,11 @@ onMounted(() => {
             </tr>
             <tr>
               <th scope="row" class="fw-bold">Objects:</th>
-              <td>0</td>
+              <td>{{ bucket.num_objects }}</td>
             </tr>
             <tr>
               <th scope="row" class="fw-bold">Size:</th>
-              <td>{{ filesize(0) }}</td>
+              <td>{{ filesize(bucket.size) }}</td>
             </tr>
           </tbody>
         </table>
diff --git a/src/components/BucketView.vue b/src/components/BucketView.vue
index feab82d..69aeaa3 100644
--- a/src/components/BucketView.vue
+++ b/src/components/BucketView.vue
@@ -138,12 +138,14 @@ const objectState = reactive({
     size: 0,
     bucket: "",
     last_modified: "2022-01-01",
+    content_type: "text/plain",
   },
   viewDetailObject: {
     key: "",
     size: 0,
     bucket: "",
     last_modified: "2022-01-01",
+    content_type: "text/plain",
   },
 } as {
   objects: S3ObjectMetaInformation[];
diff --git a/src/components/Modals/CopyObjectModal.vue b/src/components/Modals/CopyObjectModal.vue
index 26e5d41..f239951 100644
--- a/src/components/Modals/CopyObjectModal.vue
+++ b/src/components/Modals/CopyObjectModal.vue
@@ -57,6 +57,7 @@ function copyObject() {
         bucket: formState.destBucket,
         size: props.sourceObject.size,
         last_modified: dayjs().toISOString(),
+        content_type: props.sourceObject.content_type,
       });
       copyModal?.hide();
       successToast?.show();
diff --git a/src/components/Modals/CreateFolderModal.vue b/src/components/Modals/CreateFolderModal.vue
index bbff4f9..bc9b2f8 100644
--- a/src/components/Modals/CreateFolderModal.vue
+++ b/src/components/Modals/CreateFolderModal.vue
@@ -59,6 +59,7 @@ function uploadFolder() {
         bucket: props.bucketName,
         size: 0,
         last_modified: dayjs().toISOString(),
+        content_type: "text/plain",
       });
       formState.folderName = "";
     })
diff --git a/src/components/Modals/ObjectDetailModal.vue b/src/components/Modals/ObjectDetailModal.vue
index 1e70b47..8669961 100644
--- a/src/components/Modals/ObjectDetailModal.vue
+++ b/src/components/Modals/ObjectDetailModal.vue
@@ -34,7 +34,7 @@ const props = defineProps<{
             </tr>
             <tr>
               <th scope="row">Content Type</th>
-              <td>text/plain</td>
+              <td>{{ props.s3Object.content_type }}</td>
             </tr>
             <tr>
               <th scope="row">Timestamp</th>
diff --git a/src/components/Modals/UploadObjectModal.vue b/src/components/Modals/UploadObjectModal.vue
index a46e9d3..a1d5bea 100644
--- a/src/components/Modals/UploadObjectModal.vue
+++ b/src/components/Modals/UploadObjectModal.vue
@@ -95,6 +95,7 @@ async function uploadObject() {
       bucket: props.bucketName,
       size: formState.file?.size ?? 0,
       last_modified: dayjs().toISOString(),
+      content_type: formState.file?.type ?? "text/plain",
     });
     formState.key = "";
     (
diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue
index ad7d4e5..9d8ce59 100644
--- a/src/views/object-storage/BucketsView.vue
+++ b/src/views/object-storage/BucketsView.vue
@@ -193,7 +193,14 @@ onMounted(() => {
             :active="false"
             :loading="true"
             :permission="undefined"
-            :bucket="{ name: '', description: '', created_at: '', owner: '' }"
+            :bucket="{
+              name: '',
+              description: '',
+              created_at: '',
+              owner: '',
+              size: 0,
+              num_objects: 0,
+            }"
           ></bucket-list-item>
         </div>
       </div>
-- 
GitLab