Skip to content

Commit

Permalink
[gateway] send message state by Worker
Browse files Browse the repository at this point in the history
  • Loading branch information
capcom6 committed May 13, 2024
1 parent 7abbc98 commit 2374b5a
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ data class MessageWithRecipients(
parentColumn = "id",
entityColumn = "messageId",
)
val states: List<RecipientState> = emptyList()
val states: List<MessageState> = emptyList()
) {
val state: Message.State
get() = when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ class GatewayApi(
val id: String,
val state: MessageState,
val recipients: List<RecipientState>,
val states: Map<MessageState, Long>
)

data class Message(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import me.capcom.smsgateway.data.entities.Message
import me.capcom.smsgateway.data.entities.MessageWithRecipients
import me.capcom.smsgateway.domain.MessageState
import me.capcom.smsgateway.modules.events.EventBus
import me.capcom.smsgateway.modules.gateway.events.DeviceRegisteredEvent
import me.capcom.smsgateway.modules.gateway.workers.PullMessagesWorker
import me.capcom.smsgateway.modules.gateway.workers.SendStateWorker
import me.capcom.smsgateway.modules.messages.MessagesService
import me.capcom.smsgateway.modules.messages.data.MessageSource
import me.capcom.smsgateway.modules.messages.data.SendParams
Expand Down Expand Up @@ -56,11 +58,7 @@ class GatewayModule(
val event = event as? MessageStateChangedEvent ?: return@collect
if (event.source != MessageSource.Gateway) return@collect

try {
sendState(event)
} catch (th: Throwable) {
th.printStackTrace()
}
SendStateWorker.start(context, event.id)
}
}
}
Expand All @@ -74,29 +72,28 @@ class GatewayModule(
this._api = null
}

private suspend fun sendState(
event: MessageStateChangedEvent
internal suspend fun sendState(
message: MessageWithRecipients
) {
val settings = settings.registrationInfo ?: return

withContext(Dispatchers.IO) {
api.patchMessages(
settings.token,
listOf(
GatewayApi.MessagePatchRequest(
event.id,
event.state.toApiState(),
event.recipients.map {
GatewayApi.RecipientState(
it.phoneNumber,
it.state.toApiState(),
it.error
)
}
)
api.patchMessages(
settings.token,
listOf(
GatewayApi.MessagePatchRequest(
message.message.id,
message.message.state.toApiState(),
message.recipients.map {
GatewayApi.RecipientState(
it.phoneNumber,
it.state.toApiState(),
it.error
)
},
message.states.associate { it.state.toApiState() to it.updatedAt }
)
)
}
)
}

suspend fun registerFcmToken(pushToken: String) {
Expand Down Expand Up @@ -148,35 +145,22 @@ class GatewayModule(
)
}

internal suspend fun getNewMessages() {
internal suspend fun getNewMessages(context: Context) {
val settings = settings.registrationInfo ?: return
val messages = api.getMessages(settings.token)
for (message in messages) {
try {
processMessage(message)
processMessage(context, message)
} catch (th: Throwable) {
th.printStackTrace()
}
}
}

private suspend fun processMessage(message: GatewayApi.Message) {
private fun processMessage(context: Context, message: GatewayApi.Message) {
val messageState = messagesService.getMessage(message.id)
if (messageState != null) {
sendState(
MessageStateChangedEvent(
messageState.message.id,
messageState.message.state,
messageState.message.source,
messageState.recipients.map { rcp ->
MessageStateChangedEvent.Recipient(
rcp.phoneNumber,
rcp.state,
rcp.error
)
}
)
)
SendStateWorker.start(context, message.id)
return
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package me.capcom.smsgateway.modules.gateway
package me.capcom.smsgateway.modules.gateway.workers

import android.content.Context
import androidx.lifecycle.map
Expand All @@ -24,7 +24,11 @@ class PullMessagesWorker(
) : CoroutineWorker(appContext, params) {
override suspend fun doWork(): Result {
try {
withContext(Dispatchers.IO) { App.instance.gatewayModule.getNewMessages() }
withContext(Dispatchers.IO) {
App.instance.gatewayModule.getNewMessages(
applicationContext
)
}
return Result.success()
} catch (th: Throwable) {
th.printStackTrace()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package me.capcom.smsgateway.modules.gateway
package me.capcom.smsgateway.modules.gateway.workers

import android.content.Context
import androidx.work.*
import androidx.work.BackoffPolicy
import androidx.work.Constraints
import androidx.work.CoroutineWorker
import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkRequest
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import me.capcom.smsgateway.App
import java.util.concurrent.TimeUnit

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package me.capcom.smsgateway.modules.gateway.workers

import android.content.Context
import androidx.work.BackoffPolicy
import androidx.work.Constraints
import androidx.work.CoroutineWorker
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkRequest
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import me.capcom.smsgateway.modules.gateway.GatewayModule
import me.capcom.smsgateway.modules.messages.MessagesService
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.util.concurrent.TimeUnit

class SendStateWorker(appContext: Context, params: WorkerParameters) :
CoroutineWorker(appContext, params), KoinComponent {
private val messagesService: MessagesService by inject()
private val gatewayModule: GatewayModule by inject()
override suspend fun doWork(): Result {
try {
val messageId = inputData.getString(MESSAGE_ID) ?: return Result.failure()
val message = messagesService.getMessage(messageId) ?: return Result.failure()

withContext(Dispatchers.IO) {
gatewayModule.sendState(message)
}
return Result.success()
} catch (th: Throwable) {
th.printStackTrace()
return when {
this.runAttemptCount < RETRY_COUNT -> Result.retry()
else -> Result.failure()
}
}
}

companion object {
private const val RETRY_COUNT = 3

private const val MESSAGE_ID = "messageId"

fun start(context: Context, messageId: String) {
val work = OneTimeWorkRequestBuilder<SendStateWorker>()
.setInputData(workDataOf(MESSAGE_ID to messageId))
.setBackoffCriteria(
BackoffPolicy.EXPONENTIAL,
WorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS
)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
)
.build()

WorkManager.getInstance(context)
.enqueue(work)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -212,15 +212,7 @@ class MessagesService(
events.emitEvent(
MessageStateChangedEvent(
id,
msg.state,
msg.message.source,
msg.recipients.map {
MessageStateChangedEvent.Recipient(
it.phoneNumber,
it.state,
it.error
)
}
)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,13 @@
package me.capcom.smsgateway.modules.messages.events

import me.capcom.smsgateway.data.entities.Message
import me.capcom.smsgateway.modules.events.AppEvent
import me.capcom.smsgateway.modules.messages.data.MessageSource

class MessageStateChangedEvent(
val id: String,
val state: Message.State,
val source: MessageSource,
val recipients: List<Recipient>,
): AppEvent(NAME) {
companion object {
const val NAME = "MessageStateChangedEvent"
}

data class Recipient(
val phoneNumber: String,
val state: Message.State,
val error: String?,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import me.capcom.smsgateway.helpers.SettingsHelper
import me.capcom.smsgateway.modules.gateway.PullMessagesWorker
import me.capcom.smsgateway.modules.gateway.RegistrationWorker
import me.capcom.smsgateway.modules.gateway.workers.PullMessagesWorker
import me.capcom.smsgateway.modules.gateway.workers.RegistrationWorker

class PushService : FirebaseMessagingService() {
private val settingsHelper by lazy { SettingsHelper(this) }
Expand Down

0 comments on commit 2374b5a

Please sign in to comment.