spring-web-modules/api/src/main/kotlin/com/cubetiqs/web/modules/uploader/UploaderEntity.kt
Sambo Chea fd12704bd5
Some checks failed
continuous-integration/drone/push Build is failing
Add zipper for zip all files with file local provider
2022-04-21 15:09:01 +07:00

143 lines
4.0 KiB
Kotlin

package com.cubetiqs.web.modules.uploader
import com.cubetiqs.web.modules.file.FileStorageFactory
import com.fasterxml.jackson.annotation.JsonIgnore
import org.hibernate.Hibernate
import org.springframework.data.annotation.CreatedDate
import org.springframework.data.annotation.LastModifiedDate
import org.springframework.data.jpa.domain.support.AuditingEntityListener
import org.springframework.web.multipart.MultipartFile
import java.io.File
import java.io.InputStream
import java.io.Serializable
import java.util.*
import javax.persistence.*
@UploaderModule
@Entity
@Table(name = "uploader")
@EntityListeners(AuditingEntityListener::class)
open class UploaderEntity(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
open var id: UUID? = null,
@Column(name = "filename")
open var filename: String? = null,
@Column(name = "content_type")
open var contentType: String? = null,
@Column(name = "content_length")
open var contentLength: Long? = null,
@Column(name = "path", length = 300)
open var path: String? = null,
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at")
@CreatedDate
open var createdAt: Date? = null,
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at")
@LastModifiedDate
open var updatedAt: Date? = null,
@Column(length = 30)
open var providerType: String? = null,
) : Serializable {
@Transient
@JsonIgnore
private var partFile: MultipartFile? = null
@Transient
@JsonIgnore
private var file: File? = null
@Transient
fun isFileExists(): Boolean {
val temp = getFile()
return temp?.exists() ?: false
}
@Transient
@JsonIgnore
fun getFile(): File? {
if (file == null) {
file = File(path ?: return null)
}
return file
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || Hibernate.getClass(this) != Hibernate.getClass(other)) return false
other as UploaderEntity
return id != null && id == other.id
}
override fun hashCode(): Int = javaClass.hashCode()
companion object {
fun fromFile(file: MultipartFile): UploaderEntity {
// transfer to file storage first
val store = FileStorageFactory.store(file)
val uploader = UploaderEntity()
uploader.partFile = file
uploader.providerType = "local"
uploader.filename = file.originalFilename
uploader.contentType = file.contentType
uploader.contentLength = file.size
uploader.path = store.shortPath
return uploader
}
fun fromUploader(uploader: UploaderEntity): MultipartFile? {
if (uploader.partFile != null) {
return uploader.partFile
}
val file = try {
File(uploader.path!!)
} catch (ex: Exception) {
null
} ?: return null
return object : MultipartFile {
override fun getInputStream(): InputStream {
return file.inputStream()
}
override fun getName(): String {
return file.name
}
override fun getOriginalFilename(): String? {
return uploader.filename
}
override fun getContentType(): String? {
return uploader.contentType
}
override fun isEmpty(): Boolean {
return file.length() == 0L
}
override fun getSize(): Long {
return file.length()
}
override fun getBytes(): ByteArray {
return file.readBytes()
}
override fun transferTo(dest: File) {
file.copyTo(dest)
}
}
}
}
}