Skip to content

Commit ea1107b

Browse files
committed
feat: implement endpoints
1 parent 32e396f commit ea1107b

File tree

5 files changed

+93
-2
lines changed

5 files changed

+93
-2
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.github.xepozz.spiral.router.endpoints
2+
3+
data class SpiralEndpoint(
4+
val url: String,
5+
val method: String,
6+
val fqn: String,
7+
val group: String,
8+
)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.github.xepozz.spiral.router.endpoints
2+
3+
import com.intellij.openapi.project.Project
4+
5+
data class SpiralGroup(
6+
val project: Project,
7+
val group: String,
8+
val routes: Collection<SpiralEndpoint>
9+
)

src/main/kotlin/com/github/xepozz/spiral/router/index/RouterIndexUtil.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import com.intellij.openapi.util.text.StringUtil
55
import com.intellij.psi.PsiElement
66
import com.intellij.psi.search.GlobalSearchScope
77
import com.intellij.util.indexing.FileBasedIndex
8+
import com.jetbrains.php.PhpIndexImpl
89
import com.jetbrains.php.lang.psi.elements.ArrayCreationExpression
10+
import com.jetbrains.php.lang.psi.elements.Method
911
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression
1012

1113
object RouterIndexUtil {
@@ -36,4 +38,13 @@ object RouterIndexUtil {
3638
.getValues(RouterUrlsIndex.key, it, allScope)
3739
}
3840
}
41+
42+
fun getControllerMethodByFqn(project: Project, fqn: String): Collection<Method> {
43+
val (className, methodName) = fqn.split('.').apply { if (size != 2) return emptyList() }
44+
val phpIndex = PhpIndexImpl.getInstance(project)
45+
46+
return phpIndex
47+
.getAnyByFQN(className)
48+
.mapNotNull { it.findMethodByName(methodName) }
49+
}
3950
}

src/main/resources/META-INF/plugin.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,12 @@
7676
implementationClass="com.github.xepozz.spiral.cqrs.CqrsHandlersLineMarkerProvider"/>
7777

7878
<directoryProjectGenerator
79-
implementation="com.github.xepozz.spiral.scaffolder.project.SpiralProjectGenerator" />
79+
implementation="com.github.xepozz.spiral.scaffolder.project.SpiralProjectGenerator"/>
8080
<moduleBuilder
81-
builderClass="com.github.xepozz.spiral.scaffolder.project.SpiralModuleBuilder" />
81+
builderClass="com.github.xepozz.spiral.scaffolder.project.SpiralModuleBuilder"/>
82+
83+
<microservices.endpointsProvider
84+
implementation="com.github.xepozz.spiral.router.endpoints.SpiralEndpointsProvider"/>
8285
</extensions>
8386
<extensions defaultExtensionNs="com.jetbrains.php">
8487
<typeProvider4

0 commit comments

Comments
 (0)