From 3ab7451b2ed4bbb89395a35d74a79d5bf7dabb84 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 17 Aug 2020 23:25:09 +0600 Subject: [PATCH] add mimetype is image check for binary content and upgrade mime types --- .../postssystem/core/content/Content.kt | 3 ++ .../utils/common/KnownMimeTypes.kt | 32 +++++++++++++++++++ .../common/{MimeType.kt => MimeTypeTools.kt} | 9 ++---- .../postssystem/utils/common/MimeType.kt | 19 ----------- .../postssystem/utils/common/MimeTypeTools.kt | 7 ++++ .../postssystem/utils/common/MimeType.kt | 13 -------- .../postssystem/utils/common/MimeTypeTools.kt | 5 +++ 7 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/KnownMimeTypes.kt rename utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/{MimeType.kt => MimeTypeTools.kt} (72%) delete mode 100644 utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt create mode 100644 utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt delete mode 100644 utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt create mode 100644 utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt diff --git a/core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt b/core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt index 92a8bee7..9b61f70b 100644 --- a/core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt +++ b/core/api/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/content/Content.kt @@ -33,6 +33,9 @@ data class BinaryContent( val dataAllocator: ByteArrayAllocator ) : Content() +val BinaryContent.isImage: Boolean + get() = mimeType is KnownMimeTypes.Image + /** * Content which is already registered in database. Using its [id] you can retrieve all known * [com.insanusmokrassar.postssystem.core.post.RegisteredPost]s by using diff --git a/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/KnownMimeTypes.kt b/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/KnownMimeTypes.kt new file mode 100644 index 00000000..bd15ae94 --- /dev/null +++ b/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/KnownMimeTypes.kt @@ -0,0 +1,32 @@ +package com.insanusmokrassar.postssystem.utils.common + +import kotlinx.serialization.Serializable + +@Serializable(MimeTypeSerializer::class) +interface MimeType { + val raw: String +} +data class CustomMimeType(override val raw: String) : MimeType + +private const val imageMainType = "image" + +sealed class KnownMimeTypes(override val raw: String) : MimeType { + object Any : MimeType, KnownMimeTypes("*/*") + sealed class Image(raw: String) : MimeType, KnownMimeTypes(raw) { + object Any : Image("$imageMainType/*") + object Gif : Image("$imageMainType/gif") + object Jpeg : Image("$imageMainType/jpeg") + object PNG : Image("$imageMainType/png") + } +} + +internal val knownMimeTypes: Set = setOf( + KnownMimeTypes.Any, + KnownMimeTypes.Image.Any, + KnownMimeTypes.Image.Gif, + KnownMimeTypes.Image.Jpeg, + KnownMimeTypes.Image.PNG +) +fun findBuiltinMimeType(from: String): MimeType? { + return knownMimeTypes.firstOrNull { it.raw == from } +} diff --git a/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt b/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt similarity index 72% rename from utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt rename to utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt index 930c6e66..278c4e86 100644 --- a/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt +++ b/utils/common/src/commonMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt @@ -2,18 +2,15 @@ package com.insanusmokrassar.postssystem.utils.common import kotlinx.serialization.* -private val mimesCache = mutableMapOf() - -@Serializable(MimeTypeSerializer::class) -expect class MimeType { - val raw: String +private val mimesCache = mutableMapOf().also { + knownMimeTypes.forEach { mimeType -> it[mimeType.raw] = mimeType } } fun mimeType(raw: String) = mimesCache.getOrPut(raw) { parseMimeType(raw) } -internal expect fun parseMimeType(raw: String): MimeType +internal fun parseMimeType(raw: String): MimeType = findBuiltinMimeType(raw) ?: CustomMimeType(raw) @Serializer(MimeType::class) internal object MimeTypeSerializer : KSerializer { diff --git a/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt b/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt deleted file mode 100644 index ff7ff02b..00000000 --- a/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.insanusmokrassar.postssystem.utils.common - -import kotlinx.serialization.* -import org.w3c.dom.get -import kotlin.browser.window - -private val mimesCache = mutableMapOf() - -@Serializable(MimeTypeSerializer::class) -actual class MimeType( - actual val raw: String -) { - @Transient - val jsMimeType = window.navigator.mimeTypes[raw] - - override fun toString(): String = raw -} - -actual fun parseMimeType(raw: String) = MimeType(raw) diff --git a/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt b/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt new file mode 100644 index 00000000..c31a426d --- /dev/null +++ b/utils/common/src/jsMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt @@ -0,0 +1,7 @@ +package com.insanusmokrassar.postssystem.utils.common + +import org.w3c.dom.get +import kotlin.browser.window + +val MimeType.jsMimeType + get() = window.navigator.mimeTypes[raw] diff --git a/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt b/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt deleted file mode 100644 index d4a7b9fb..00000000 --- a/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeType.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.insanusmokrassar.postssystem.utils.common - -import kotlinx.serialization.* - -private val mimesCache = mutableMapOf() - -@Serializable(MimeTypeSerializer::class) -actual class MimeType( - actual val raw: String -) : javax.activation.MimeType(raw) - -actual fun parseMimeType(raw: String): MimeType = MimeType(raw) - diff --git a/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt b/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt new file mode 100644 index 00000000..b7638cbb --- /dev/null +++ b/utils/common/src/jvmMain/kotlin/com/insanusmokrassar/postssystem/utils/common/MimeTypeTools.kt @@ -0,0 +1,5 @@ +package com.insanusmokrassar.postssystem.utils.common + +val MimeType.asActivationMimeType: javax.activation.MimeType + get() = javax.activation.MimeType(raw) +