Skip to content

Commit cbfa882

Browse files
committed
Kobby Server With Extended API Draft
1 parent 680a1aa commit cbfa882

45 files changed

Lines changed: 1217 additions & 80 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cinema-api/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,9 @@ dependencies {
1515

1616
// Add this dependency to enable default Ktor adapters generation
1717
compileOnly("io.ktor:ktor-client-cio:2.3.13")
18+
19+
// todo
20+
compileOnly("com.graphql-java:graphql-java:24.3")
21+
compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
22+
compileOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactive:1.8.1")
1823
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
@file:Suppress("UNCHECKED_CAST")
2+
3+
package io.github.ermadmi78.kobby.cinema.api.kobby.server
4+
5+
import graphql.schema.DataFetchingEnvironment
6+
import graphql.schema.GraphQLCodeRegistry
7+
import graphql.schema.GraphQLScalarType
8+
import graphql.schema.GraphQLSchema
9+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.FilmResolutionModel
10+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.MutationResolutionModel
11+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.QueryResolutionModel
12+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.SubscriptionResolutionModel
13+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.ResolutionAspect
14+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.DEFAULT_CONTEXT_PROVIDER
15+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.DEFAULT_RESOLUTION_ASPECT
16+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.specification.program.code.*
17+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.specification.program.type.*
18+
import kotlin.coroutines.CoroutineContext
19+
20+
/**
21+
* Created on 07.02.2026
22+
*
23+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
24+
*/
25+
26+
fun buildCinemaSchemaUsingProgram(
27+
scalarLong: GraphQLScalarType,
28+
queryResolver: QueryResolutionModel,
29+
mutationResolver: MutationResolutionModel,
30+
subscriptionResolver: SubscriptionResolutionModel,
31+
filmResolver: FilmResolutionModel,
32+
aspect: ResolutionAspect = DEFAULT_RESOLUTION_ASPECT,
33+
coroutineContextProvider: (DataFetchingEnvironment) -> CoroutineContext = DEFAULT_CONTEXT_PROVIDER
34+
): GraphQLSchema {
35+
val codeRegistry: GraphQLCodeRegistry.Builder = GraphQLCodeRegistry.newCodeRegistry()
36+
QueryCode.register(codeRegistry, queryResolver, aspect, coroutineContextProvider)
37+
MutationCode.register(codeRegistry, mutationResolver, aspect, coroutineContextProvider)
38+
SubscriptionCode.register(codeRegistry, subscriptionResolver, aspect, coroutineContextProvider)
39+
FilmCode.register(codeRegistry, filmResolver, aspect, coroutineContextProvider)
40+
ActorCode.register(codeRegistry)
41+
42+
return GraphQLSchema.newSchema()
43+
.additionalType(scalarLong)
44+
.query(QueryType.build())
45+
.mutation(MutationType.build())
46+
.subscription(SubscriptionType.build())
47+
.additionalType(FilmType.build())
48+
.additionalType(ActorType.build())
49+
.codeRegistry(codeRegistry.build())
50+
.build()
51+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server
2+
3+
import graphql.schema.DataFetchingEnvironment
4+
import graphql.schema.GraphQLScalarType
5+
import graphql.schema.idl.RuntimeWiring
6+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.FilmResolutionModel
7+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.MutationResolutionModel
8+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.QueryResolutionModel
9+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver.SubscriptionResolutionModel
10+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.ResolutionAspect
11+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.DEFAULT_CONTEXT_PROVIDER
12+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.runtime.DEFAULT_RESOLUTION_ASPECT
13+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.specification.sdl.*
14+
import kotlin.coroutines.CoroutineContext
15+
16+
/**
17+
* Created on 15.02.2026
18+
*
19+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
20+
*/
21+
22+
fun wireCinemaSchemaRuntime(
23+
runtimeWiring: RuntimeWiring.Builder,
24+
scalarLong: GraphQLScalarType,
25+
queryResolver: QueryResolutionModel,
26+
mutationResolver: MutationResolutionModel,
27+
subscriptionResolver: SubscriptionResolutionModel,
28+
filmResolver: FilmResolutionModel,
29+
aspect: ResolutionAspect = DEFAULT_RESOLUTION_ASPECT,
30+
coroutineContextProvider: (DataFetchingEnvironment) -> CoroutineContext = DEFAULT_CONTEXT_PROVIDER
31+
) {
32+
runtimeWiring
33+
.scalar(scalarLong)
34+
35+
QueryWiring.register(runtimeWiring, queryResolver, aspect, coroutineContextProvider)
36+
MutationWiring.register(runtimeWiring, mutationResolver, aspect, coroutineContextProvider)
37+
SubscriptionWiring.register(runtimeWiring, subscriptionResolver, aspect, coroutineContextProvider)
38+
FilmWiring.register(runtimeWiring, filmResolver, aspect, coroutineContextProvider)
39+
ActorWiring.register(runtimeWiring)
40+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model
2+
3+
/**
4+
* Created on 16.02.2026
5+
*
6+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
7+
*/
8+
interface CinemaData {
9+
operator fun get(property: String): Any?
10+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.CinemaData
4+
5+
/**
6+
* Created on 07.02.2026
7+
*
8+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
9+
*/
10+
data class ActorData(
11+
val id: Long? = null,
12+
val firstName: String? = null,
13+
val lastName: String? = null,
14+
val __localContext: Map<String, Any?> = emptyMap()
15+
) : CinemaData {
16+
override operator fun get(property: String): Any? =
17+
__localContext[property]
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.CinemaData
4+
5+
/**
6+
* Created on 07.02.2026
7+
*
8+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
9+
*/
10+
data class FilmData(
11+
val id: Long? = null,
12+
val title: String? = null,
13+
val __localContext: Map<String, Any?> = emptyMap()
14+
) : CinemaData {
15+
override operator fun get(property: String): Any? =
16+
__localContext[property]
17+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data.ActorData
4+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data.FilmData
5+
6+
/**
7+
* Created on 07.02.2026
8+
*
9+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
10+
*/
11+
interface FilmResolutionModel {
12+
suspend fun actors(source: FilmData): List<ActorData>
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data.FilmData
4+
5+
/**
6+
* Created on 07.02.2026
7+
*
8+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
9+
*/
10+
interface MutationResolutionModel {
11+
suspend fun createFilm(title: String): FilmData
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data.FilmData
4+
5+
/**
6+
* Created on 07.02.2026
7+
*
8+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
9+
*/
10+
interface QueryResolutionModel {
11+
suspend fun film(id: Long): FilmData?
12+
13+
suspend fun films(): List<FilmData>
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.ermadmi78.kobby.cinema.api.kobby.server.model.resolver
2+
3+
import io.github.ermadmi78.kobby.cinema.api.kobby.server.model.data.FilmData
4+
import kotlinx.coroutines.flow.Flow
5+
6+
/**
7+
* Created on 07.02.2026
8+
*
9+
* @author Dmitry Ermakov (ermadmi78@gmail.com)
10+
*/
11+
interface SubscriptionResolutionModel {
12+
//TODO How to pass DataFetcherResult here?
13+
suspend fun filmCreated(): Flow<FilmData>
14+
}

0 commit comments

Comments
 (0)