diff --git a/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt b/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt new file mode 100644 index 0000000000000000000000000000000000000000..a469c93b51263af1b59ad8e533f50bc3f40b82a1 --- /dev/null +++ b/signalc/src/main/kotlin/friends/murmur/signalboost/command/Executor.kt @@ -0,0 +1,59 @@ +package friends.murmur.signalboost.command + +import friends.murmur.signalboost.model.* +import info.signalboost.signalc.model.SocketRequest + +class Executor(val app: Application) { + fun execute(executable: Executable, dispatchable: Dispatchable): CommandResult { + val (command, payload, language) = executable + val(channel, sender, scMessage) = dispatchable + + return when(command) { + Command.BROADCAST -> broadcast(channel, sender, scMessage, payload) + else -> TODO("Not implemented yet!") + } + } + + private fun broadcast(channel: Channel, sender: Membership, scMessage: SignalcMessage, payload: String) = CommandResult( + status = "SUCCESS", + command = Command.BROADCAST, + payload = payload, + message = "", + notifications = broadcastNotificationsOf(channel, sender, scMessage.attachments, payload), + ) + + private fun broadcastNotificationsOf( + channel: Channel, + sender: Membership, + attachments: List<SocketRequest.Send.Attachment>, + body: String): List<Notification> + { + val adminNotifications = channel.adminMemberships.map { + Notification( + recipient = it.memberPhoneNumber, + message = appendHeaderToRelayableMessage( + sender, + it, + "broadcastMessage", + body, + ), + attachments = attachments, + ) + } + + val subscriberNotifications = channel.subscriberMemberships.map { + Notification( + recipient = it.memberPhoneNumber, + message = body, + attachments = attachments, + ) + } + + return adminNotifications + subscriberNotifications + } + + private fun appendHeaderToRelayableMessage(sender: Membership, recipient: Membership, notificationKey: String, body: String): String { + // TODO + return body // lol + } +} \ No newline at end of file diff --git a/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt b/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt new file mode 100644 index 0000000000000000000000000000000000000000..8c96c6b30bd2fb6b7185096af345b543b9c36c4b --- /dev/null +++ b/signalc/src/main/kotlin/friends/murmur/signalboost/model/Model.kt @@ -0,0 +1,83 @@ +package friends.murmur.signalboost.model + +import info.signalboost.signalc.model.SignalcAddress +import info.signalboost.signalc.model.SocketRequest + + +enum class Language(asString: String) { + EN("EN"), + ES("ES"), + FR("FR"), + DE("DE"), +} + +enum class MemberType { + ADMIN, + SUBSCRIBER, + NONE +} + +data class Channel( + val memberships: List<Membership>, +) { + val adminMemberships: List<Membership> + get() = memberships.filter { it.type == MemberType.ADMIN } + val subscriberMemberships: List<Membership> + get() = memberships.filter { it.type == MemberType.SUBSCRIBER } +} + +data class Membership( + val type: MemberType, + val channelPhoneNumber: String, + val memberPhoneNumber: String, + val language: Language, +) + +data class SignalcMessage( + val type: String = "SEND", + val username: String, + val recipientAddress: SignalcAddress, + val messageBody: String, + val attachments: List<SocketRequest.Send.Attachment>, + val expiresInSeconds: Int, +) + +data class Dispatchable( + val channel: Channel, + val sender: Membership, + val message: SignalcMessage, +) + +data class Executable( + val command: Command, + val paylod: String, + val language: Language, +) + + + +data class SignalboostResult( + val status: String, + val message: String, +) + +data class Notification( + val recipient: String, + val message: String, + val attachments: List<SocketRequest.Send.Attachment>, +) + +data class CommandResult( + val command: Command, + val payload: String, + val status: String, + val message: String, + val notifications: List<Notification>, +) + +enum class Command(val asString: String) { + BROADCAST("BROADCAST") +} + + +class Application