1+ package com.github.xepozz.spiral.router.endpoints
2+
3+ import com.github.xepozz.spiral.SpiralIcons
4+ import com.github.xepozz.spiral.router.index.RouterIndexUtil
5+ import com.intellij.microservices.endpoints.EndpointType
6+ import com.intellij.microservices.endpoints.EndpointsFilter
7+ import com.intellij.microservices.endpoints.EndpointsProvider
8+ import com.intellij.microservices.endpoints.FrameworkPresentation
9+ import com.intellij.microservices.endpoints.HTTP_SERVER_TYPE
10+ import com.intellij.microservices.endpoints.ModuleEndpointsFilter
11+ import com.intellij.microservices.endpoints.presentation.HttpMethodPresentation
12+ import com.intellij.navigation.ItemPresentation
13+ import com.intellij.openapi.project.Project
14+ import com.intellij.psi.PsiElement
15+ import com.intellij.psi.util.PsiModificationTracker
16+ import com.jetbrains.php.lang.PhpLangUtil
17+ import com.jetbrains.php.lang.PhpLanguage
18+
19+ class SpiralEndpointsProvider : EndpointsProvider <SpiralGroup , SpiralEndpoint > {
20+ override val endpointType: EndpointType = HTTP_SERVER_TYPE
21+ override val presentation = FrameworkPresentation (" Spiral" , " Spiral Framework" , SpiralIcons .SPIRAL )
22+
23+ override fun getStatus (project : Project ) = EndpointsProvider .Status .AVAILABLE
24+
25+ override fun getModificationTracker (project : Project ) =
26+ PsiModificationTracker .getInstance(project).forLanguage(PhpLanguage .INSTANCE )
27+
28+ override fun getEndpointGroups (project : Project , filter : EndpointsFilter ): Iterable <SpiralGroup > {
29+ if (filter !is ModuleEndpointsFilter ) return emptyList()
30+
31+ return RouterIndexUtil
32+ .getAllRoutes(project)
33+ .flatMap { route -> route.methods.map { SpiralEndpoint (route.uri, it, route.fqn, route.group ? : " Root" ) } }
34+ .sortedBy { it.url }
35+ .groupBy { it.group }
36+ .map { (group, routes) -> SpiralGroup (project, group, routes) }
37+ .apply { println (" groups $this ${this .map { it.group to it.routes.size }} " ) }
38+ }
39+
40+ override fun getEndpoints (group : SpiralGroup ) = group.routes
41+
42+ override fun isValidEndpoint (group : SpiralGroup , endpoint : SpiralEndpoint ) = true // group.isValid()
43+
44+ override fun getDocumentationElement (group : SpiralGroup , endpoint : SpiralEndpoint ): PsiElement ? {
45+ return RouterIndexUtil .getControllerMethodByFqn(group.project, endpoint.fqn).firstOrNull()
46+ }
47+
48+ override fun getEndpointPresentation (group : SpiralGroup , endpoint : SpiralEndpoint ): ItemPresentation {
49+ return HttpMethodPresentation (
50+ endpoint.url,
51+ endpoint.method,
52+ PhpLangUtil .toPresentableFQN(endpoint.fqn.replace(" ." , " ::" )),
53+ SpiralIcons .SPIRAL ,
54+ )
55+ }
56+
57+ override fun getNavigationElement (group : SpiralGroup , endpoint : SpiralEndpoint ): PsiElement ? {
58+ return RouterIndexUtil .getControllerMethodByFqn(group.project, endpoint.fqn).firstOrNull()
59+ }
60+ }
0 commit comments