Skip to content

Commit 5d789b5

Browse files
author
Bas Buijsen
committed
add metadata to storage
1 parent d0fd99e commit 5d789b5

File tree

6 files changed

+70
-15
lines changed

6 files changed

+70
-15
lines changed

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.google.android.gms.tasks.OnCanceledListener
1010
import com.google.android.gms.tasks.OnCompleteListener
1111
import com.google.firebase.storage.OnPausedListener
1212
import com.google.firebase.storage.OnProgressListener
13+
import com.google.firebase.storage.StorageMetadata
1314
import com.google.firebase.storage.UploadTask
1415
import dev.gitlive.firebase.Firebase
1516
import dev.gitlive.firebase.FirebaseApp
@@ -65,10 +66,20 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe
6566

6667
actual suspend fun listAll(): ListResult = ListResult(android.listAll().await())
6768

68-
actual suspend fun putFile(file: File) = android.putFile(file.uri).await().run {}
69+
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) {
70+
if (metadata != null) {
71+
android.putFile(file.uri, metadata.toStorageMetadata()).await().run {}
72+
} else {
73+
android.putFile(file.uri).await().run {}
74+
}
75+
}
6976

70-
actual fun putFileResumable(file: File): ProgressFlow {
71-
val android = android.putFile(file.uri)
77+
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow {
78+
val android = if (metadata != null) {
79+
android.putFile(file.uri, metadata.toStorageMetadata())
80+
} else {
81+
android.putFile(file.uri)
82+
}
7283

7384
val flow = callbackFlow {
7485
val onCanceledListener = OnCanceledListener { cancel() }
@@ -105,3 +116,18 @@ actual class ListResult(android: com.google.firebase.storage.ListResult) {
105116
actual class File(val uri: Uri)
106117

107118
actual typealias FirebaseStorageException = com.google.firebase.storage.StorageException
119+
120+
121+
fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
122+
return StorageMetadata.Builder()
123+
.setCacheControl(this.cacheControl)
124+
.setContentDisposition(this.contentDisposition)
125+
.setContentEncoding(this.contentEncoding)
126+
.setContentLanguage(this.contentLanguage)
127+
.setContentType(this.contentType)
128+
.apply {
129+
customMetadata?.entries?.forEach {
130+
(key, value) -> setCustomMetadata(key, value)
131+
}
132+
}.build()
133+
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ expect class StorageReference {
4040

4141
suspend fun listAll(): ListResult
4242

43-
suspend fun putFile(file: File)
43+
suspend fun putFile(file: File, metadata: FirebaseStorageMetadata? = null)
4444

45-
fun putFileResumable(file: File): ProgressFlow
45+
fun putFileResumable(file: File, metadata: FirebaseStorageMetadata? = null): ProgressFlow
4646
}
4747

4848
expect class ListResult {
@@ -66,3 +66,13 @@ interface ProgressFlow : Flow<Progress> {
6666

6767

6868
expect class FirebaseStorageException : FirebaseException
69+
70+
data class FirebaseStorageMetadata(
71+
val md5Hash: String? = null,
72+
val cacheControl: String? = null,
73+
val contentDisposition: String? = null,
74+
val contentEncoding: String? = null,
75+
val contentLanguage: String? = null,
76+
val contentType: String? = null,
77+
val customMetadata: Map<String, String>? = null
78+
)

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package dev.gitlive.firebase.storage
66

77
import cocoapods.FirebaseStorage.FIRStorage
88
import cocoapods.FirebaseStorage.FIRStorageListResult
9+
import cocoapods.FirebaseStorage.FIRStorageMetadata
910
import cocoapods.FirebaseStorage.FIRStorageReference
1011
import cocoapods.FirebaseStorage.FIRStorageTaskStatusFailure
1112
import cocoapods.FirebaseStorage.FIRStorageTaskStatusPause
@@ -76,10 +77,10 @@ actual class StorageReference(val ios: FIRStorageReference) {
7677
}
7778
}
7879

79-
actual suspend fun putFile(file: File) = ios.awaitResult { putFile(file.url, null, completion = it) }.run {}
80+
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) = ios.awaitResult { putFile(file.url, metadata?.toFIRMetadata(), completion = it) }.run {}
8081

81-
actual fun putFileResumable(file: File): ProgressFlow {
82-
val ios = ios.putFile(file.url)
82+
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow {
83+
val ios = ios.putFile(file.url, metadata?.toFIRMetadata())
8384

8485
val flow = callbackFlow {
8586
ios.observeStatus(FIRStorageTaskStatusProgress) {
@@ -147,3 +148,20 @@ suspend inline fun <T, reified R> T.awaitResult(function: T.(callback: (R?, NSEr
147148
}
148149
return job.await() as R
149150
}
151+
152+
fun FirebaseStorageMetadata.toFIRMetadata(): FIRStorageMetadata {
153+
val metadata = FIRStorageMetadata()
154+
val customMetadata: Map<Any?, String>? = this.customMetadata?.let {
155+
it.mapKeys { entry ->
156+
entry.key as Any to entry.value
157+
}
158+
}
159+
160+
metadata.setCustomMetadata(customMetadata)
161+
metadata.setCacheControl(this.cacheControl)
162+
metadata.setContentDisposition(this.contentDisposition)
163+
metadata.setContentEncoding(this.contentEncoding)
164+
metadata.setContentLanguage(this.contentLanguage)
165+
metadata.setContentType(this.contentType)
166+
return metadata
167+
}

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

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

66
import dev.gitlive.firebase.externals.FirebaseApp
7+
import dev.gitlive.firebase.storage.FirebaseStorageMetadata
78
import kotlin.js.Promise
89

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

1415
external fun getDownloadURL(ref: StorageReference): Promise<String>
1516

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

18-
external fun uploadBytesResumable(ref: StorageReference, data: dynamic): UploadTask
19+
external fun uploadBytesResumable(ref: StorageReference, data: dynamic, metadata: FirebaseStorageMetadata?): UploadTask
1920

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

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ actual class StorageReference(val js: dev.gitlive.firebase.storage.externals.Sto
5959

6060
actual suspend fun listAll(): ListResult = rethrow { ListResult(listAll(js).await()) }
6161

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

64-
actual fun putFileResumable(file: File): ProgressFlow = rethrow {
65-
val uploadTask = uploadBytesResumable(js, file)
64+
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow = rethrow {
65+
val uploadTask = uploadBytesResumable(js, file, metadata)
6666

6767
val flow = callbackFlow {
6868
val unsubscribe = uploadTask.on(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ actual class StorageReference {
6666
TODO("Not yet implemented")
6767
}
6868

69-
actual fun putFileResumable(file: File): ProgressFlow {
69+
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow {
7070
TODO("Not yet implemented")
7171
}
7272

73-
actual suspend fun putFile(file: File) {
73+
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) {
7474
}
7575

7676
}

0 commit comments

Comments
 (0)