diff --git a/.github/workflows/dependent-issues.yml b/.github/workflows/dependent-issues.yml index d081deed..3ca867b0 100644 --- a/.github/workflows/dependent-issues.yml +++ b/.github/workflows/dependent-issues.yml @@ -21,6 +21,10 @@ on: jobs: check: runs-on: ubuntu-latest + env: + # z0al/dependent-issues@v1.5.2 targets Node.js 20; allow it to run on + # Node.js 20 until the action is updated to support Node.js 24. + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: 'true' steps: - uses: z0al/dependent-issues@v1.5.2 env: diff --git a/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/TransferManager.kt b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/TransferManager.kt index c1c6f65e..21499079 100644 --- a/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/TransferManager.kt +++ b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/TransferManager.kt @@ -41,6 +41,7 @@ import com.infomaniak.multiplatform_swisstransfer.database.utils.FileUtilsForApi import com.infomaniak.multiplatform_swisstransfer.exceptions.NotFoundException import com.infomaniak.multiplatform_swisstransfer.exceptions.NullPropertyException import com.infomaniak.multiplatform_swisstransfer.exceptions.UnsupportedTransferDeeplinkUrlException +import com.infomaniak.multiplatform_swisstransfer.mappers.toTransferDB import com.infomaniak.multiplatform_swisstransfer.mappers.toTransferUi import com.infomaniak.multiplatform_swisstransfer.mappers.toTransferUiList import com.infomaniak.multiplatform_swisstransfer.mappers.toTransferUiListFlow @@ -666,8 +667,7 @@ class TransferManager internal constructor( private suspend fun addTransferV2(linkId: String, transferApi: TransferApiV2, password: String?) { val userId = accountManager.currentUser?.id ?: return - val transferDB = TransferDB( - transfer = transferApi, + val transferDB = transferApi.toTransferDB( linkId = linkId, userOwnerId = userId, direction = TransferDirection.RECEIVED, diff --git a/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/UploadV2Manager.kt b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/UploadV2Manager.kt index 9017ebf1..7cc23f73 100644 --- a/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/UploadV2Manager.kt +++ b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/managers/UploadV2Manager.kt @@ -21,7 +21,6 @@ import androidx.room.immediateTransaction import androidx.room.useWriterConnection import androidx.sqlite.SQLiteException import com.infomaniak.multiplatform_swisstransfer.common.exceptions.UnknownException -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.Transfer import com.infomaniak.multiplatform_swisstransfer.common.interfaces.upload.UploadSessionRequest import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus @@ -31,12 +30,14 @@ import com.infomaniak.multiplatform_swisstransfer.database.dao.TransferDao import com.infomaniak.multiplatform_swisstransfer.database.dao.UploadDao import com.infomaniak.multiplatform_swisstransfer.database.models.transfers.v2.TransferDB import com.infomaniak.multiplatform_swisstransfer.database.utils.FileUtilsForApiV2 +import com.infomaniak.multiplatform_swisstransfer.mappers.toTransferDB import com.infomaniak.multiplatform_swisstransfer.network.exceptions.ApiException.ApiV2ErrorException import com.infomaniak.multiplatform_swisstransfer.network.exceptions.ApiException.UnexpectedApiErrorFormatException import com.infomaniak.multiplatform_swisstransfer.network.exceptions.NetworkException import com.infomaniak.multiplatform_swisstransfer.network.exceptions.TooManyRequestException import com.infomaniak.multiplatform_swisstransfer.network.exceptions.UnauthorizedException import com.infomaniak.multiplatform_swisstransfer.network.exceptions.UploadErrorsException +import com.infomaniak.multiplatform_swisstransfer.network.models.transfer.v2.TransferApi import com.infomaniak.multiplatform_swisstransfer.network.models.upload.request.v2.ChunkEtag import com.infomaniak.multiplatform_swisstransfer.network.models.upload.request.v2.CreateTransfer import com.infomaniak.multiplatform_swisstransfer.network.models.upload.request.v2.TransferFile @@ -89,7 +90,7 @@ class UploadV2Manager( /** * Prepare a transfer to be uploaded. * - * @return The [Transfer] object to use for [uploadFileChunk] and [uploadFile], + * @return The [TransferApi] object to use for [uploadFileChunk] and [uploadFile], * or [getUploadFileChunkUrl] and [getUploadFileUrl] * * @throws NetworkException If there is a network error. @@ -122,7 +123,7 @@ class UploadV2Manager( ) suspend fun prepareTransfer( request: UploadSessionRequest, - ): Transfer = withContext(Dispatchers.Default) { + ): TransferApi = withContext(Dispatchers.Default) { val userId = requireCurrentUserId() transferDao.deleteAnyPendingTransfer(userId) @@ -143,8 +144,7 @@ class UploadV2Manager( recipients = request.recipientsEmails.toList() ) uploadRepository.createTransfer(transferCreationPayload).also { apiTransfer -> - val transferToPersist = TransferDB( - transfer = apiTransfer, + val transferToPersist = apiTransfer.toTransferDB( linkId = null, password = transferCreationPayload.password, direction = TransferDirection.SENT, @@ -171,7 +171,7 @@ class UploadV2Manager( * @throws CancellationException If the operation is canceled. */ @Throws(CancellationException::class, UnknownException::class) - suspend fun getPendingTransferIfAny(): Transfer? { + suspend fun getPendingTransferIfAny(): TransferDB? { val userId = requireCurrentUserId() return transferDao.getPendingTransfer(userId) } diff --git a/STCommon/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/common/interfaces/transfers/v2/Transfer.kt b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/mappers/TransferApiV2Ext.kt similarity index 52% rename from STCommon/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/common/interfaces/transfers/v2/Transfer.kt rename to STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/mappers/TransferApiV2Ext.kt index 1642d80c..fb01d439 100644 --- a/STCommon/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/common/interfaces/transfers/v2/Transfer.kt +++ b/STCore/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/mappers/TransferApiV2Ext.kt @@ -15,25 +15,31 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2 +package com.infomaniak.multiplatform_swisstransfer.mappers import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus +import com.infomaniak.multiplatform_swisstransfer.database.models.transfers.v2.TransferDB +import com.infomaniak.multiplatform_swisstransfer.network.models.transfer.v2.TransferApi -interface Transfer { - val id: String - val senderEmail: String - val title: String? - val message: String? - val createdAt: Long - val expiresAt: Long - val files: List get() = emptyList() - val totalSize: Long - - //region Only local - val password: String? get() = null - val transferStatus: TransferStatus get() = TransferStatus.READY - val recipientsEmails: Set get() = emptySet() - val linkId: String? get() = null - //endregion -} +internal fun TransferApi.toTransferDB( + direction: TransferDirection, + linkId: String?, + userOwnerId: Long, + password: String? = null, + status: TransferStatus = TransferStatus.READY, +): TransferDB = TransferDB( + id = id, + senderEmail = senderEmail, + title = title, + message = message, + createdAt = createdAt, + expiresAt = expiresAt, + totalSize = totalSize, + password = password, + transferDirection = direction, + transferStatus = status, + recipientsEmails = emptySet(), + linkId = linkId, + userOwnerId = userOwnerId, +) diff --git a/STDatabase/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/database/models/transfers/v2/TransferDB.kt b/STDatabase/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/database/models/transfers/v2/TransferDB.kt index e4b73ae7..56ef6d4f 100644 --- a/STDatabase/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/database/models/transfers/v2/TransferDB.kt +++ b/STDatabase/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/database/models/transfers/v2/TransferDB.kt @@ -20,56 +20,29 @@ package com.infomaniak.multiplatform_swisstransfer.database.models.transfers.v2 import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.File -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.Transfer import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus @Entity data class TransferDB( @PrimaryKey - override val id: String, - override val senderEmail: String, - override val title: String?, - override val message: String?, - override val createdAt: Long, - override val expiresAt: Long, - override val totalSize: Long, + val id: String, + val senderEmail: String, + val title: String?, + val message: String?, + val createdAt: Long, + val expiresAt: Long, + val totalSize: Long, // Local - override val password: String? = null, + val password: String? = null, val transferDirection: TransferDirection, - override val transferStatus: TransferStatus, - override val recipientsEmails: Set = emptySet(), - override val linkId: String? = null, + val transferStatus: TransferStatus, + val recipientsEmails: Set = emptySet(), + val linkId: String? = null, val userOwnerId: Long, //TODO[ST-v2]: Add language -) : Transfer { +) { @Ignore - override var files: List = emptyList() + var files: List = emptyList() internal set - - constructor( - transfer: Transfer, - direction: TransferDirection, - linkId: String?, - userOwnerId: Long, - password: String? = transfer.password, - status: TransferStatus = transfer.transferStatus - ) : this( - id = transfer.id, - senderEmail = transfer.senderEmail, - title = transfer.title, - message = transfer.message, - createdAt = transfer.createdAt, - expiresAt = transfer.expiresAt, - totalSize = transfer.totalSize, - password = password, - transferDirection = direction, - transferStatus = status, - recipientsEmails = transfer.recipientsEmails, - linkId = linkId, - userOwnerId = userOwnerId - ) { - this.files = transfer.files - } } diff --git a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/TransfersTest.kt b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/TransfersTest.kt index 769af5b9..f710ff48 100644 --- a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/TransfersTest.kt +++ b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/TransfersTest.kt @@ -17,7 +17,6 @@ */ package com.infomaniak.multiplatform_swisstransfer.database.v2 -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.Transfer import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus import com.infomaniak.multiplatform_swisstransfer.database.AppDatabase @@ -68,15 +67,11 @@ class TransfersTest : RobolectricTestsBase() { insertTransfer(DummyTransferForV2.transfer1, TransferDirection.SENT, null) // Insert a pending upload - val uploadTransfer = TransferDB( - transfer = DummyTransferForV2.transfer2, - direction = TransferDirection.SENT, - linkId = null, - userOwnerId = userId, - ).copy( + val uploadTransfer = DummyTransferForV2.transfer2.copy( id = "upload1", transferDirection = TransferDirection.SENT, transferStatus = TransferStatus.PENDING_UPLOAD, + userOwnerId = userId, ) transferDao.upsertTransfer(uploadTransfer) @@ -589,27 +584,19 @@ class TransfersTest : RobolectricTestsBase() { } private suspend fun insertTransfer( - transfer: Transfer, + transfer: TransferDB, transferDirection: TransferDirection, password: String?, linkId: String? = null, ) { - val transferDB = TransferDB( - id = transfer.id, - senderEmail = transfer.senderEmail, - title = transfer.title, - message = transfer.message, - createdAt = transfer.createdAt, - expiresAt = transfer.expiresAt, - totalSize = transfer.totalSize, - password = password, - transferDirection = transferDirection, - transferStatus = transfer.transferStatus, - recipientsEmails = transfer.recipientsEmails, - userOwnerId = userId, - linkId = linkId, + transferDao.upsertTransfer( + transfer.copy( + transferDirection = transferDirection, + password = password, + userOwnerId = userId, + linkId = linkId, + ) ) - transferDao.upsertTransfer(transferDB) } //endregion } diff --git a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/UploadTest.kt b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/UploadTest.kt index ea8a358b..bc3c934c 100644 --- a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/UploadTest.kt +++ b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/UploadTest.kt @@ -17,7 +17,6 @@ */ package com.infomaniak.multiplatform_swisstransfer.database.v2 -import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus import com.infomaniak.multiplatform_swisstransfer.database.AppDatabase import com.infomaniak.multiplatform_swisstransfer.database.DatabaseProvider @@ -144,28 +143,20 @@ class UploadTest : RobolectricTestsBase() { private fun createPendingUploadTransfer( id: String, createdAt: Long = 0, - ): TransferDB = TransferDB( - transfer = DummyTransferForV2.transfer1, - direction = TransferDirection.SENT, - linkId = null, - userOwnerId = userId, - ).copy( + ): TransferDB = DummyTransferForV2.transfer1.copy( id = id, createdAt = createdAt, transferStatus = TransferStatus.PENDING_UPLOAD, + userOwnerId = userId, ) private fun createTransferWithStatus( id: String, status: TransferStatus, - ): TransferDB = TransferDB( - transfer = DummyTransferForV2.transfer1, - direction = TransferDirection.SENT, - linkId = null, - userOwnerId = userId, - ).copy( + ): TransferDB = DummyTransferForV2.transfer1.copy( id = id, transferStatus = status, + userOwnerId = userId, ) //endregion } diff --git a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/dataset/DummyTransferForV2.kt b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/dataset/DummyTransferForV2.kt index 9d7f04af..79885ca0 100644 --- a/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/dataset/DummyTransferForV2.kt +++ b/STDatabase/src/commonTest/kotlin/com/infomaniak/multiplatform_swisstransfer/database/v2/dataset/DummyTransferForV2.kt @@ -18,8 +18,9 @@ package com.infomaniak.multiplatform_swisstransfer.database.v2.dataset import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.File -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.Transfer +import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection import com.infomaniak.multiplatform_swisstransfer.common.models.TransferStatus +import com.infomaniak.multiplatform_swisstransfer.database.models.transfers.v2.TransferDB object DummyTransferForV2 { @@ -27,30 +28,32 @@ object DummyTransferForV2 { id: String, expiresAt: Long, transferStatus: TransferStatus = TransferStatus.READY, - ): Transfer = object : Transfer { - override val id: String = id - override val senderEmail: String = "" - override val title: String? = null - override val message: String? = null - override val createdAt: Long = 0 - override val expiresAt: Long = expiresAt - override val totalSize: Long = 0 - override val transferStatus: TransferStatus = transferStatus - } + ): TransferDB = TransferDB( + id = id, + senderEmail = "", + title = null, + message = null, + createdAt = 0, + expiresAt = expiresAt, + totalSize = 0, + transferDirection = TransferDirection.SENT, + transferStatus = transferStatus, + userOwnerId = 0L, + ) private const val `2024-11-01` = 1_730_458_842L private const val `2100-01-01` = 4_102_441_200L - val transfer1 = transfer("transferLinkUUID1", `2024-11-01`) + val transfer1: TransferDB = transfer("transferLinkUUID1", `2024-11-01`) - val transfer2 = transfer("transfer2", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) - val transfer3 = transfer("transfer3", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) - val transfer4 = transfer("transfer4", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) + val transfer2: TransferDB = transfer("transfer2", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) + val transfer3: TransferDB = transfer("transfer3", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) + val transfer4: TransferDB = transfer("transfer4", `2100-01-01`, TransferStatus.WAIT_VIRUS_CHECK) - val expired: Transfer = transfer1 - val notExpired: Transfer = transfer2 + val expired: TransferDB = transfer1 + val notExpired: TransferDB = transfer2 - val transfers = listOf(transfer1, transfer2, transfer3, transfer4) + val transfers: List = listOf(transfer1, transfer2, transfer3, transfer4) fun createDummyFile( path: String, diff --git a/STNetwork/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/network/models/transfer/v2/TransferApi.kt b/STNetwork/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/network/models/transfer/v2/TransferApi.kt index 8910fe60..faf0f610 100644 --- a/STNetwork/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/network/models/transfer/v2/TransferApi.kt +++ b/STNetwork/src/commonMain/kotlin/com/infomaniak/multiplatform_swisstransfer/network/models/transfer/v2/TransferApi.kt @@ -17,22 +17,21 @@ */ package com.infomaniak.multiplatform_swisstransfer.network.models.transfer.v2 -import com.infomaniak.multiplatform_swisstransfer.common.interfaces.transfers.v2.Transfer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class TransferApi( - override val id: String, + val id: String, @SerialName("sender") - override val senderEmail: String, - override val title: String? = null, - override val message: String? = null, + val senderEmail: String, + val title: String? = null, + val message: String? = null, @SerialName("created_at") - override val createdAt: Long, + val createdAt: Long, @SerialName("expires_at") - override val expiresAt: Long, - override val files: List, + val expiresAt: Long, + val files: List, @SerialName("total_size") - override val totalSize: Long, -) : Transfer + val totalSize: Long, +)