Skip to content

Commit 17f1ba7

Browse files
author
Bas Buijsen
committed
add getter for metadata
1 parent bc02afe commit 17f1ba7

File tree

6 files changed

+104
-7
lines changed

6 files changed

+104
-7
lines changed

firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package dev.gitlive.firebase.storage
88
import android.net.Uri
99
import com.google.android.gms.tasks.OnCanceledListener
1010
import com.google.android.gms.tasks.OnCompleteListener
11+
import com.google.android.gms.tasks.Task
1112
import com.google.firebase.storage.OnPausedListener
1213
import com.google.firebase.storage.OnProgressListener
1314
import com.google.firebase.storage.StorageMetadata
@@ -58,6 +59,8 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe
5859
actual val root: StorageReference get() = StorageReference(android.root)
5960
actual val storage: FirebaseStorage get() = FirebaseStorage(android.storage)
6061

62+
actual suspend fun getMetadata(): FirebaseStorageMetadata? = android.metadata.await().toFirebaseStorageMetadata()
63+
6164
actual fun child(path: String): StorageReference = StorageReference(android.child(path))
6265

6366
actual suspend fun delete() = android.delete().await().run { Unit }
@@ -117,7 +120,6 @@ actual class File(val uri: Uri)
117120

118121
actual typealias FirebaseStorageException = com.google.firebase.storage.StorageException
119122

120-
121123
fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
122124
return StorageMetadata.Builder()
123125
.setCacheControl(this.cacheControl)
@@ -130,4 +132,19 @@ fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
130132
(key, value) -> setCustomMetadata(key, value)
131133
}
132134
}.build()
135+
}
136+
137+
fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
138+
val sdkMetadata = this
139+
return storageMetadata {
140+
md5Hash = sdkMetadata.md5Hash
141+
cacheControl = sdkMetadata.cacheControl
142+
contentDisposition = sdkMetadata.contentDisposition
143+
contentEncoding = sdkMetadata.contentEncoding
144+
contentLanguage = sdkMetadata.contentLanguage
145+
contentType = sdkMetadata.contentType
146+
sdkMetadata.customMetadataKeys.forEach {
147+
setCustomMetadata(it, sdkMetadata.getCustomMetadata(it))
148+
}
149+
}
133150
}

firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ expect class StorageReference {
3232
val root: StorageReference
3333
val storage: FirebaseStorage
3434

35+
suspend fun getMetadata(): FirebaseStorageMetadata?
36+
3537
fun child(path: String): StorageReference
3638

3739
suspend fun delete()

firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ actual class StorageReference(val ios: FIRStorageReference) {
6565

6666
actual fun child(path: String): StorageReference = StorageReference(ios.child(path))
6767

68+
actual suspend fun getMetadata(): FirebaseStorageMetadata? = ios.awaitResult {
69+
metadataWithCompletion { metadata, error ->
70+
if (error == null) {
71+
it.invoke(metadata?.toFirebaseStorageMetadata(), null)
72+
} else {
73+
it.invoke(null, error)
74+
}
75+
}
76+
}
77+
6878
actual suspend fun delete() = await { ios.deleteWithCompletion(it) }
6979

7080
actual suspend fun getDownloadUrl(): String = ios.awaitResult {
@@ -161,4 +171,19 @@ fun FirebaseStorageMetadata.toFIRMetadata(): FIRStorageMetadata {
161171
metadata.setContentLanguage(this.contentLanguage)
162172
metadata.setContentType(this.contentType)
163173
return metadata
174+
}
175+
176+
fun FIRStorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
177+
val sdkMetadata = this
178+
return storageMetadata {
179+
md5Hash = sdkMetadata.md5Hash()
180+
cacheControl = sdkMetadata.cacheControl()
181+
contentDisposition = sdkMetadata.contentDisposition()
182+
contentEncoding = sdkMetadata.contentEncoding()
183+
contentLanguage = sdkMetadata.contentLanguage()
184+
contentType = sdkMetadata.contentType()
185+
sdkMetadata.customMetadata()?.forEach {
186+
setCustomMetadata(it.key.toString(), it.value.toString())
187+
}
188+
}
164189
}

firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/externals/storage.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
package dev.gitlive.firebase.storage.externals
55

66
import dev.gitlive.firebase.externals.FirebaseApp
7-
import dev.gitlive.firebase.storage.FirebaseStorageMetadata
87
import kotlin.js.Promise
98

109
external fun getStorage(app: FirebaseApp? = definedExternally): FirebaseStorage
@@ -14,9 +13,11 @@ external fun ref(ref: StorageReference, url: String? = definedExternally): Stora
1413

1514
external fun getDownloadURL(ref: StorageReference): Promise<String>
1615

17-
external fun uploadBytes(ref: StorageReference, file: dynamic, metadata: FirebaseStorageMetadata?): Promise<Unit>
16+
external fun getMetadata(ref: StorageReference): Promise<StorageMetadata>
1817

19-
external fun uploadBytesResumable(ref: StorageReference, data: dynamic, metadata: FirebaseStorageMetadata?): UploadTask
18+
external fun uploadBytes(ref: StorageReference, file: dynamic, metadata: StorageMetadata?): Promise<Unit>
19+
20+
external fun uploadBytesResumable(ref: StorageReference, data: dynamic, metadata: StorageMetadata?): UploadTask
2021

2122
external fun deleteObject(ref: StorageReference): Promise<Unit>;
2223

@@ -59,6 +60,25 @@ external interface UploadTaskSnapshot {
5960
val totalBytes: Number
6061
}
6162

63+
external class StorageMetadata {
64+
val bucket: String?
65+
var cacheControl: String?
66+
var contentDisposition: String?
67+
var contentEncoding: String?
68+
var contentLanguage: String?
69+
var contentType: String?
70+
var customMetadata: Map<String, String>?
71+
val fullPath: String?
72+
val generation: String?
73+
val md5Hash: String?
74+
val metageneration: String?
75+
val name: String?
76+
val size: Number?
77+
val timeCreated: String?
78+
val updated: String?
79+
80+
}
81+
6282
external class UploadTask : Promise<UploadTaskSnapshot> {
6383
fun cancel(): Boolean;
6484
fun on(event: String, next: (snapshot: UploadTaskSnapshot) -> Unit, error: (a: StorageError) -> Unit, complete: () -> Unit): () -> Unit

firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ actual class StorageReference(val js: dev.gitlive.firebase.storage.externals.Sto
5151
actual val root: StorageReference get() = StorageReference(js.root)
5252
actual val storage: FirebaseStorage get() = FirebaseStorage(js.storage)
5353

54+
actual suspend fun getMetadata(): FirebaseStorageMetadata? = rethrow { getMetadata(js).await().toFirebaseStorageMetadata() }
55+
5456
actual fun child(path: String): StorageReference = StorageReference(ref(js, path))
5557

5658
actual suspend fun delete() = rethrow { deleteObject(js).await() }
@@ -59,10 +61,10 @@ actual class StorageReference(val js: dev.gitlive.firebase.storage.externals.Sto
5961

6062
actual suspend fun listAll(): ListResult = rethrow { ListResult(listAll(js).await()) }
6163

62-
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?): Unit = rethrow { uploadBytes(js, file, metadata).await() }
64+
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?): Unit = rethrow { uploadBytes(js, file, metadata?.toStorageMetadata()).await() }
6365

6466
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow = rethrow {
65-
val uploadTask = uploadBytesResumable(js, file, metadata)
67+
val uploadTask = uploadBytesResumable(js, file, metadata?.toStorageMetadata())
6668

6769
val flow = callbackFlow {
6870
val unsubscribe = uploadTask.on(
@@ -123,4 +125,31 @@ internal fun errorToException(error: dynamic) = (error?.code ?: error?.message ?
123125
FirebaseStorageException(code, error)
124126
}
125127
}
126-
}
128+
}
129+
130+
131+
fun StorageMetadata.toFirebaseStorageMetadata(): FirebaseStorageMetadata {
132+
val sdkMetadata = this
133+
return storageMetadata {
134+
md5Hash = sdkMetadata.md5Hash
135+
cacheControl = sdkMetadata.cacheControl
136+
contentDisposition = sdkMetadata.contentDisposition
137+
contentEncoding = sdkMetadata.contentEncoding
138+
contentLanguage = sdkMetadata.contentLanguage
139+
contentType = sdkMetadata.contentType
140+
sdkMetadata.customMetadata?.entries?.forEach {
141+
setCustomMetadata(it.key, it.value)
142+
}
143+
}
144+
}
145+
146+
fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
147+
val metadata = StorageMetadata()
148+
metadata.cacheControl = cacheControl
149+
metadata.contentDisposition = contentDisposition
150+
metadata.contentEncoding = contentEncoding
151+
metadata.contentLanguage = contentLanguage
152+
metadata.contentType = contentType
153+
metadata.customMetadata = customMetadata
154+
return metadata
155+
}

firebase-storage/src/jvmMain/kotlin/dev/gitlive/firebase/storage/storage.jvm.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ actual class StorageReference {
5151
actual val storage: FirebaseStorage
5252
get() = TODO("Not yet implemented")
5353

54+
actual suspend fun getMetadata(): FirebaseStorageMetadata? {
55+
TODO("Not yet implemented")
56+
}
57+
5458
actual fun child(path: String): StorageReference {
5559
TODO("Not yet implemented")
5660
}

0 commit comments

Comments
 (0)