diff --git a/src/main/kotlin/application/Application.kt b/src/main/kotlin/application/Application.kt index c89008b..a87bcfb 100644 --- a/src/main/kotlin/application/Application.kt +++ b/src/main/kotlin/application/Application.kt @@ -23,9 +23,12 @@ import fr.dcproject.component.comment.constitution.routes.installCommentConstitu import fr.dcproject.component.comment.generic.routes.installCommentRoutes import fr.dcproject.component.constitution.constitutionKoinModule import fr.dcproject.component.constitution.routes.installConstitutionRoutes +import fr.dcproject.component.doc.routes.installDocRoutes import fr.dcproject.component.follow.followKoinModule import fr.dcproject.component.follow.routes.article.installFollowArticleRoutes import fr.dcproject.component.follow.routes.constitution.installFollowConstitutionRoutes +import fr.dcproject.component.notification.NotificationConsumer +import fr.dcproject.component.notification.routes.installNotificationsRoutes import fr.dcproject.component.opinion.opinionKoinModule import fr.dcproject.component.opinion.routes.installOpinionRoutes import fr.dcproject.component.views.viewKoinModule @@ -33,9 +36,6 @@ import fr.dcproject.component.vote.routes.installVoteRoutes import fr.dcproject.component.vote.voteKoinModule import fr.dcproject.component.workgroup.routes.installWorkgroupRoutes import fr.dcproject.component.workgroup.workgroupKoinModule -import fr.dcproject.notification.NotificationConsumer -import fr.dcproject.routes.definition -import fr.dcproject.routes.notificationArticle import fr.dcproject.security.AccessDeniedException import fr.postgresjson.migration.Migrations import io.ktor.application.Application @@ -43,7 +43,6 @@ import io.ktor.application.ApplicationStopped import io.ktor.application.call import io.ktor.application.install import io.ktor.auth.Authentication -import io.ktor.auth.authenticate import io.ktor.client.HttpClient import io.ktor.client.engine.jetty.Jetty import io.ktor.features.AutoHeadResponse @@ -165,14 +164,8 @@ fun Application.module(env: Env = PROD) { installVoteRoutes() installConstitutionRoutes() installCommentConstitutionRoutes() - - authenticate(optional = true) { - definition() - } - - authenticate("url") { - notificationArticle(get()) - } + installNotificationsRoutes() + installDocRoutes() } install(StatusPages) { diff --git a/src/main/kotlin/application/KoinModule.kt b/src/main/kotlin/application/KoinModule.kt index bdf9afa..8255dc0 100644 --- a/src/main/kotlin/application/KoinModule.kt +++ b/src/main/kotlin/application/KoinModule.kt @@ -8,10 +8,11 @@ import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.datatype.joda.JodaModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.rabbitmq.client.ConnectionFactory +import fr.dcproject.component.notification.NotificationConsumer +import fr.dcproject.component.notification.NotificationsPush +import fr.dcproject.component.notification.Publisher import fr.dcproject.messages.Mailer import fr.dcproject.messages.NotificationEmailSender -import fr.dcproject.notification.NotificationConsumer -import fr.dcproject.notification.publisher.Publisher import fr.postgresjson.connexion.Connection import fr.postgresjson.connexion.Requester import fr.postgresjson.migration.Migrations @@ -19,10 +20,8 @@ import io.ktor.client.HttpClient import io.ktor.client.features.websocket.WebSockets import io.ktor.util.KtorExperimentalAPI import io.lettuce.core.RedisClient -import notification.NotificationsPush import org.koin.core.qualifier.named import org.koin.dsl.module -import org.koin.ktor.ext.get @KtorExperimentalAPI val KoinModule = module { diff --git a/src/main/kotlin/component/article/routes/UpsertArticle.kt b/src/main/kotlin/component/article/routes/UpsertArticle.kt index 77a14e0..b76f7e0 100644 --- a/src/main/kotlin/component/article/routes/UpsertArticle.kt +++ b/src/main/kotlin/component/article/routes/UpsertArticle.kt @@ -7,9 +7,9 @@ import fr.dcproject.component.article.ArticleRepository import fr.dcproject.component.article.routes.UpsertArticle.UpsertArticleRequest.Input import fr.dcproject.component.auth.citizen import fr.dcproject.component.auth.citizenOrNull +import fr.dcproject.component.notification.ArticleUpdateNotification +import fr.dcproject.component.notification.Publisher import fr.dcproject.component.workgroup.WorkgroupRef -import fr.dcproject.notification.ArticleUpdateNotification -import fr.dcproject.notification.publisher.Publisher import fr.dcproject.security.assert import io.ktor.application.ApplicationCall import io.ktor.application.call diff --git a/src/main/kotlin/component/auth/jwt/JwtInstallation.kt b/src/main/kotlin/component/auth/jwt/JwtInstallation.kt index b878f9a..e08fcf9 100644 --- a/src/main/kotlin/component/auth/jwt/JwtInstallation.kt +++ b/src/main/kotlin/component/auth/jwt/JwtInstallation.kt @@ -25,6 +25,7 @@ fun jwtInstallation(userRepo: UserRepository): Authentication.Configuration.() - } } + /* Token in URL */ jwt("url") { verifier(JwtConfig.verifier) realm = "dc-project.fr" diff --git a/src/main/kotlin/routes/OpenAPI.kt b/src/main/kotlin/component/doc/routes/OpenAPI.kt similarity index 91% rename from src/main/kotlin/routes/OpenAPI.kt rename to src/main/kotlin/component/doc/routes/OpenAPI.kt index 7db42ea..701f534 100644 --- a/src/main/kotlin/routes/OpenAPI.kt +++ b/src/main/kotlin/component/doc/routes/OpenAPI.kt @@ -1,4 +1,4 @@ -package fr.dcproject.routes +package fr.dcproject.component.doc.routes import fr.dcproject.utils.readResource import io.ktor.application.call diff --git a/src/main/kotlin/component/doc/routes/install.kt b/src/main/kotlin/component/doc/routes/install.kt new file mode 100644 index 0000000..491e270 --- /dev/null +++ b/src/main/kotlin/component/doc/routes/install.kt @@ -0,0 +1,16 @@ +package fr.dcproject.component.doc.routes + +import io.ktor.auth.authenticate +import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.routing.Routing +import io.ktor.util.KtorExperimentalAPI +import kotlinx.coroutines.ExperimentalCoroutinesApi + +@KtorExperimentalAPI +@ExperimentalCoroutinesApi +@KtorExperimentalLocationsAPI +fun Routing.installDocRoutes() { + authenticate(optional = true) { + definition() + } +} diff --git a/src/main/kotlin/notification/Notification.kt b/src/main/kotlin/component/notification/Notification.kt similarity index 97% rename from src/main/kotlin/notification/Notification.kt rename to src/main/kotlin/component/notification/Notification.kt index ab6fd02..3ba9d7d 100644 --- a/src/main/kotlin/notification/Notification.kt +++ b/src/main/kotlin/component/notification/Notification.kt @@ -1,4 +1,4 @@ -package fr.dcproject.notification +package fr.dcproject.component.notification import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.PropertyNamingStrategies diff --git a/src/main/kotlin/notification/NotificationConsumer.kt b/src/main/kotlin/component/notification/NotificationConsumer.kt similarity index 98% rename from src/main/kotlin/notification/NotificationConsumer.kt rename to src/main/kotlin/component/notification/NotificationConsumer.kt index d41c91b..98354fb 100644 --- a/src/main/kotlin/notification/NotificationConsumer.kt +++ b/src/main/kotlin/component/notification/NotificationConsumer.kt @@ -1,4 +1,4 @@ -package fr.dcproject.notification +package fr.dcproject.component.notification import com.rabbitmq.client.AMQP.BasicProperties import com.rabbitmq.client.BuiltinExchangeType.DIRECT @@ -12,7 +12,6 @@ import fr.dcproject.component.follow.FollowArticleRepository import fr.dcproject.component.follow.FollowConstitutionRepository import fr.dcproject.component.follow.FollowSimple import fr.dcproject.messages.NotificationEmailSender -import fr.dcproject.notification.publisher.Publisher import io.ktor.utils.io.errors.IOException import io.lettuce.core.RedisClient import io.lettuce.core.api.async.RedisAsyncCommands diff --git a/src/main/kotlin/notification/NotificationsPush.kt b/src/main/kotlin/component/notification/NotificationsPush.kt similarity index 98% rename from src/main/kotlin/notification/NotificationsPush.kt rename to src/main/kotlin/component/notification/NotificationsPush.kt index a1b5b91..568639c 100644 --- a/src/main/kotlin/notification/NotificationsPush.kt +++ b/src/main/kotlin/component/notification/NotificationsPush.kt @@ -1,9 +1,8 @@ -package notification +package fr.dcproject.component.notification import com.fasterxml.jackson.core.JsonProcessingException import fr.dcproject.component.auth.citizen import fr.dcproject.component.citizen.CitizenI -import fr.dcproject.notification.Notification import io.ktor.http.cio.websocket.Frame import io.ktor.http.cio.websocket.Frame.Text import io.ktor.http.cio.websocket.readText diff --git a/src/main/kotlin/notification/publisher/Publisher.kt b/src/main/kotlin/component/notification/Publisher.kt similarity index 89% rename from src/main/kotlin/notification/publisher/Publisher.kt rename to src/main/kotlin/component/notification/Publisher.kt index ec528b6..d10d34f 100644 --- a/src/main/kotlin/notification/publisher/Publisher.kt +++ b/src/main/kotlin/component/notification/Publisher.kt @@ -1,7 +1,6 @@ -package fr.dcproject.notification.publisher +package fr.dcproject.component.notification import com.rabbitmq.client.ConnectionFactory -import fr.dcproject.notification.EntityNotification import kotlinx.coroutines.Deferred import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope diff --git a/src/main/kotlin/routes/Notification.kt b/src/main/kotlin/component/notification/routes/Notification.kt similarity index 81% rename from src/main/kotlin/routes/Notification.kt rename to src/main/kotlin/component/notification/routes/Notification.kt index 106752b..58669ad 100644 --- a/src/main/kotlin/routes/Notification.kt +++ b/src/main/kotlin/component/notification/routes/Notification.kt @@ -1,10 +1,10 @@ -package fr.dcproject.routes +package fr.dcproject.component.notification.routes +import fr.dcproject.component.notification.NotificationsPush import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.routing.Route import io.ktor.websocket.webSocket import kotlinx.coroutines.ExperimentalCoroutinesApi -import notification.NotificationsPush /** * Consume Websocket, then remove notification in redis. diff --git a/src/main/kotlin/component/notification/routes/install.kt b/src/main/kotlin/component/notification/routes/install.kt new file mode 100644 index 0000000..0289fea --- /dev/null +++ b/src/main/kotlin/component/notification/routes/install.kt @@ -0,0 +1,15 @@ +package fr.dcproject.component.notification.routes + +import io.ktor.auth.authenticate +import io.ktor.locations.KtorExperimentalLocationsAPI +import io.ktor.routing.Routing +import kotlinx.coroutines.ExperimentalCoroutinesApi +import org.koin.ktor.ext.get + +@ExperimentalCoroutinesApi +@KtorExperimentalLocationsAPI +fun Routing.installNotificationsRoutes() { + authenticate("url") { + notificationArticle(get()) + } +} diff --git a/src/test/kotlin/functional/NotificationConsumerTest.kt b/src/test/kotlin/functional/NotificationConsumerTest.kt index 633520d..35d4e99 100644 --- a/src/test/kotlin/functional/NotificationConsumerTest.kt +++ b/src/test/kotlin/functional/NotificationConsumerTest.kt @@ -7,10 +7,10 @@ import fr.dcproject.component.article.ArticleRef import fr.dcproject.component.citizen.CitizenRef import fr.dcproject.component.follow.FollowArticleRepository import fr.dcproject.component.follow.FollowSimple +import fr.dcproject.component.notification.ArticleUpdateNotification +import fr.dcproject.component.notification.NotificationConsumer +import fr.dcproject.component.notification.Publisher import fr.dcproject.messages.NotificationEmailSender -import fr.dcproject.notification.ArticleUpdateNotification -import fr.dcproject.notification.NotificationConsumer -import fr.dcproject.notification.publisher.Publisher import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.util.KtorExperimentalAPI import io.lettuce.core.RedisClient diff --git a/src/test/kotlin/functional/NotificationsPushTest.kt b/src/test/kotlin/functional/NotificationsPushTest.kt index afd465b..97a9c9f 100644 --- a/src/test/kotlin/functional/NotificationsPushTest.kt +++ b/src/test/kotlin/functional/NotificationsPushTest.kt @@ -4,8 +4,9 @@ import com.rabbitmq.client.ConnectionFactory import fr.dcproject.application.Configuration import fr.dcproject.component.article.ArticleForView import fr.dcproject.component.citizen.CitizenRef -import fr.dcproject.notification.ArticleUpdateNotification -import fr.dcproject.notification.Notification +import fr.dcproject.component.notification.ArticleUpdateNotification +import fr.dcproject.component.notification.Notification +import fr.dcproject.component.notification.NotificationsPush import io.lettuce.core.RedisClient import io.mockk.every import io.mockk.spyk @@ -14,7 +15,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.runBlocking -import notification.NotificationsPush import org.amshove.kluent.`should be equal to` import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Tag