Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
98b6b0e
Remove custom path parameter type binding from controllers
JohnnyJayJay Sep 3, 2023
ab1bafa
Use correct main class in build.gradle
JohnnyJayJay Sep 3, 2023
4b9ef87
Add secured annotations where previously missing
JohnnyJayJay Sep 3, 2023
013eabf
Add exception classes
JohnnyJayJay Sep 3, 2023
2d0f787
Add caching module (for template caching)
JohnnyJayJay Sep 3, 2023
47d460e
Refine GameController
JohnnyJayJay Sep 3, 2023
2405b3a
Add spdx validation to challenge object
JohnnyJayJay Sep 3, 2023
44408a0
Begin writing config code
JohnnyJayJay Sep 3, 2023
735ed19
remove module info (rip)
JohnnyJayJay Sep 4, 2023
c4ca628
fix weird logging error with conflicting slf4j impls
bristermitten Sep 2, 2024
06e989a
add keycloak config
bristermitten Oct 6, 2025
f154954
fix buggy tokenvalidator
bristermitten Oct 6, 2025
e64a0f1
expose swagger-ui and openapi
bristermitten Oct 6, 2025
4629f9b
add Serdeable annotations where required
bristermitten Oct 6, 2025
68921c1
remove redundant import
bristermitten Oct 6, 2025
15d13bf
start to more explicitly openapi document everything
bristermitten Oct 6, 2025
c0f3d4b
get a GameCreateRequest to parse
bristermitten Oct 6, 2025
48fcaae
add basic game storage and creation
bristermitten Oct 7, 2025
0c68325
game modes wip
bristermitten Oct 7, 2025
330c174
update dependencies
bristermitten Oct 7, 2025
bf3daa5
update to java 21
bristermitten Oct 7, 2025
102a9f0
start implementation of game logic runner using actor model
bristermitten Oct 7, 2025
5d5ee29
improve startGame api documentation and functionality
bristermitten Oct 7, 2025
ec1e31c
flesh out event system, able to send basic game created event
bristermitten Oct 7, 2025
ef3728d
bind games by id in pathvariables
bristermitten Oct 7, 2025
2ed164e
fix the openapi spec
bristermitten Oct 7, 2025
cd44ca7
make internal and public player types more clearly distinct
bristermitten Oct 8, 2025
b32a1fe
upgrade gradle and use java 25 because we are cool
bristermitten Oct 8, 2025
e7ff301
Add devenv for easy nix environment provisioning
bristermitten Aug 28, 2023
772f15a
add actual devenv config
bristermitten Aug 28, 2023
9d6b2e4
add nixfmt
bristermitten Aug 28, 2023
3ed164f
tidy up devenv.nix
bristermitten Aug 28, 2023
26ade39
add copyright
bristermitten Aug 28, 2023
a4e4f20
Remove pre-commit from .gitignore
bristermitten Aug 28, 2023
d02cc2e
goodbye devenv! you suck
bristermitten Oct 8, 2025
977c53a
use a more simple nix flake
bristermitten Oct 8, 2025
6e6f605
update pre-commit-config to use latest hook versions
bristermitten Oct 8, 2025
ecc6430
make everything REUSE compliant
bristermitten Oct 8, 2025
28c908d
update reuse-action version
bristermitten Oct 8, 2025
3746e57
update checkstyle version and config to latest google style guide
bristermitten Oct 8, 2025
a7d4997
checkstyle: allow longer line lengths in javadocs
bristermitten Oct 8, 2025
2c87f2d
make all code REUSE compliant
bristermitten Oct 8, 2025
84cf33d
only REUSE lint staged files in pre-commit
bristermitten Oct 8, 2025
5e769db
update RecordBuilder to latest version
bristermitten Oct 8, 2025
0bda44f
fix DefaultInitialGameStateProvider incorrectly creating GameStates
bristermitten Oct 8, 2025
c7aeb4a
make GamePlayers#admin nullable to allow no players
bristermitten Oct 8, 2025
9695986
add basic game joining logic
bristermitten Oct 8, 2025
dcc2a4b
setup Groovy + Spock for testing, add a basic test for GameController
bristermitten Oct 8, 2025
c9d87d4
add MapStruct, improve controller tests, refactor internal player joi…
bristermitten Oct 9, 2025
b7980e9
tidy DTO mapping code
bristermitten Oct 9, 2025
30cece1
fix compile errors and send SyncEvent when warmup starts
bristermitten Oct 9, 2025
8d4e9f2
fix main method which broke for some reason
bristermitten Oct 9, 2025
e3b55e9
start to add a more involved test
bristermitten Oct 9, 2025
255da8c
fix GameKeyTokenReader providing incorrect prefix
bristermitten Oct 9, 2025
424e5b4
implement a repository for player information, and fix auth based on …
bristermitten Oct 9, 2025
0703935
improve GameFlowSpec
bristermitten Oct 9, 2025
678769e
run junit in parallel
bristermitten Oct 9, 2025
aad7af2
refactor EventSink to use Micronauts event system
bristermitten Oct 9, 2025
e77bf81
start wiring up the challenges service
bristermitten Oct 10, 2025
ad6fb4b
rename Info -> ChallengeInfo
bristermitten Oct 10, 2025
7c788d6
fix incorrect usage of the challengesRandomGet api
bristermitten Oct 10, 2025
6d47150
configure base-path
bristermitten Oct 10, 2025
c22474b
map ChallengeSet -> RoundStartEvent
bristermitten Oct 11, 2025
44104a5
refactor SseEventSink to allow subscribing to all events
bristermitten Oct 11, 2025
47318b8
make SseEventSink safer if emitting fails
bristermitten Oct 11, 2025
6dee497
improve GameFlowSpec, checking for events
bristermitten Oct 11, 2025
ed6440c
make GameStartedHandler#onApplicationEvent async
bristermitten Oct 11, 2025
6e25033
fix checkstyle checking generated code
bristermitten Oct 11, 2025
8559cda
update to latest micronaut version
bristermitten Oct 11, 2025
9c97fc2
remove dead imports
bristermitten Oct 11, 2025
929b3a2
remove use of deprecated code
bristermitten Oct 11, 2025
4676137
remove MapStruct warning
bristermitten Oct 11, 2025
62a2e4f
improve documentation of GameCommand
bristermitten Oct 13, 2025
c6420da
start processing game rounds
bristermitten Oct 13, 2025
877f1f6
update CI workflows to work on any branch
bristermitten Oct 13, 2025
9ec0321
make checkstyle happy
bristermitten Oct 13, 2025
f885737
update gradle workflow to not use ancient action
bristermitten Oct 13, 2025
5f0648e
don't use configuration cache in actions
bristermitten Oct 13, 2025
9d136c4
debug actions
bristermitten Oct 13, 2025
ae273f0
fix gradle build not being isolatable from incorrect provider usage
bristermitten Oct 13, 2025
24278c0
use a mock in the GameFlowTest rather than calling the real challenge…
bristermitten Oct 13, 2025
8bda20c
add logging to ChallengeSetHandler
bristermitten Oct 13, 2025
8d1b602
remove Game#adminKey
bristermitten Oct 13, 2025
7cea138
start refactoring GameInfo DTO
bristermitten Oct 13, 2025
33cf6c0
refactor phase system, separating dto and model unions
bristermitten Oct 13, 2025
81641bc
simplify game flow to remove murky state in between GameStarted and R…
bristermitten Oct 13, 2025
77d28fb
remove dead methods
bristermitten Oct 13, 2025
212bcb7
improve documentation and checkstyle compliance
bristermitten Oct 13, 2025
19200ba
add utility method for easier querying of random enum values
bristermitten Oct 13, 2025
ec0a133
remove invalid @Singleton annotation from PhaseMapper
bristermitten Oct 13, 2025
9924cb3
improve documentation and slightly refactor AuthRepository
bristermitten Oct 13, 2025
98fcbac
fix GameRunnerRegistry constructor being too hidden
bristermitten Oct 13, 2025
6f7cd9f
implement bearer based auth
bristermitten Oct 14, 2025
aa5ad19
make GameAuthorizationRule high priority to make sure it isn't oversh…
bristermitten Oct 14, 2025
11a9448
remove some dead code
bristermitten Oct 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2025 Alexander Wood (BristerMitten)
#
# SPDX-License-Identifier: AGPL-3.0-or-later

use flake .
4 changes: 1 addition & 3 deletions .github/workflows/compliance.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
name: compliance tasks
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

permissions:
contents: read
Expand All @@ -15,7 +13,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v3
- name: REUSE Compliance check
uses: fsfe/reuse-action@v2
uses: fsfe/reuse-action@v6.0.0
openapi:
runs-on: ubuntu-latest
steps:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ jobs:
key: ${{ runner.os }}-gradle-test-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-test-
- name: Set up JDK 17
- name: Set up JDK 25
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
java-version: 25
- name: Docker login
uses: docker/login-action@v1
with:
Expand Down
21 changes: 11 additions & 10 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
name: Gradle build
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]

permissions:
contents: read
Expand All @@ -17,11 +15,13 @@ jobs:
- uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
java-version: 25

- name: Setup Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build --no-daemon
uses: gradle/actions/setup-gradle@v5

- name: Build with Gradle
run: ./gradlew build --no-daemon
checkstyle:
runs-on: ubuntu-latest
steps:
Expand All @@ -30,8 +30,9 @@ jobs:
- uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
java-version: 25
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: checkstyleMain checkstyleTest --no-daemon
uses: gradle/actions/setup-gradle@v5

- name: Run Checkstyle
run: ./gradlew checkstyleMain checkstyleTest --no-daemon
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,10 @@ out/
.settings
.classpath
.factorypath

# Devenv
.devenv*
devenv.local.nix

# direnv
.direnv
10 changes: 6 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,19 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/python-openapi/openapi-spec-validator
rev: 0.5.5 # The version to use or 'master' for latest
rev: 0.7.2
hooks:
- id: openapi-spec-validator
- repo: https://github.com/fsfe/reuse-tool
rev: v1.0.0
rev: v6.1.2
hooks:
- id: reuse
- id: reuse-lint-file
additional_dependencies:
- click
21 changes: 0 additions & 21 deletions .reuse/dep5

This file was deleted.

16 changes: 16 additions & 0 deletions REUSE.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
version = 1
SPDX-PackageName = "codosseum-backend"
SPDX-PackageSupplier = "JohnnyJayJay <johnnyjayjay02@gmail.com>"
SPDX-PackageDownloadLocation = "https://github.com/codosseum-org/backend"

[[annotations]]
path = ".github/workflows/**"
precedence = "aggregate"
SPDX-FileCopyrightText = "JohnnyJayJay"
SPDX-License-Identifier = "CC0-1.0"

[[annotations]]
path = ["gradle/**", "gradlew", "gradlew.bat"]
precedence = "aggregate"
SPDX-FileCopyrightText = "Gradle, Inc."
SPDX-License-Identifier = "Apache-2.0"
88 changes: 76 additions & 12 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import de.undercouch.gradle.tasks.download.Download


// SPDX-FileCopyrightText: 2023 Alex Wood
// SPDX-License-Identifier: AGPL-3.0-or-later
plugins {
id("com.github.johnrengelman.shadow") version "8.1.1"
id("io.micronaut.application") version "4.0.1"
id("io.micronaut.aot") version "4.0.1"
id("io.micronaut.openapi") version "4.0.1"
id("io.micronaut.application") version "4.5.5"
id("io.micronaut.aot") version "4.5.5"
id("io.micronaut.openapi") version "4.5.5"
id("groovy")
id("de.undercouch.download") version "5.6.0"
checkstyle
}

version = "0.1.0"
group = "org.developerden"
val challengesOpenApiSpec: Provider<RegularFile> = layout.buildDirectory.file("openapi/challenges-openapi.yaml")

repositories {
maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") {
Expand All @@ -20,38 +25,64 @@ repositories {

dependencies {
annotationProcessor("io.micronaut.openapi:micronaut-openapi")
implementation("io.micronaut.openapi:micronaut-openapi-annotations")
annotationProcessor("io.micronaut.serde:micronaut-serde-processor")
annotationProcessor("io.micronaut.validation:micronaut-validation-processor")
annotationProcessor("io.micronaut.security:micronaut-security-annotations")
annotationProcessor("io.soabase.record-builder:record-builder-processor:37")
annotationProcessor("io.soabase.record-builder:record-builder-processor:49")
annotationProcessor("org.mapstruct:mapstruct-processor:1.6.3")

implementation("io.micronaut.reactor:micronaut-reactor")
implementation("io.micronaut.cache:micronaut-cache-caffeine")
implementation("io.micronaut.security:micronaut-security")
implementation("io.micronaut.validation:micronaut-validation")
implementation("io.soabase.record-builder:record-builder-core:37")
implementation("io.micronaut.security:micronaut-security-oauth2")
implementation("io.micronaut.security:micronaut-security-jwt")
implementation("io.soabase.record-builder:record-builder-core:49")
implementation("io.micronaut.serde:micronaut-serde-jackson")
implementation("io.swagger.core.v3:swagger-annotations")
implementation("io.micronaut:micronaut-http-client")
implementation("com.github.kkuegler:human-readable-ids-java:0.1.1")
implementation("com.networknt:json-schema-validator:1.0.86")
implementation("org.spdx:java-spdx-library:(,2.0]") {
exclude("org.apache.logging.log4j")
}
implementation("org.mapstruct:mapstruct:1.6.3")
runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("org.yaml:snakeyaml")


testAnnotationProcessor("io.micronaut:micronaut-inject-java")
testImplementation("org.junit.jupiter:junit-jupiter:5.7.1")
testImplementation("io.micronaut.test:micronaut-test-junit5")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation("io.micronaut.test:micronaut-test-spock")
testImplementation(platform("org.spockframework:spock-bom:+"))
testImplementation("org.spockframework:spock-core")

}


application {
mainClass.set("org.developerden.codosseum.server.Application")
mainClass.set("org.developerden.codosseum.Application")
}

java {
sourceCompatibility = JavaVersion.toVersion("17")
targetCompatibility = JavaVersion.toVersion("17")
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

checkstyle {
toolVersion = "10.12.2"
toolVersion = "11.1.0"
configFile = configDirectory.file("google_checks.xml").get().asFile
sourceSets = emptySet()
sourceSets = listOf(project.sourceSets.main.get())
}

tasks.withType<Checkstyle> {
exclude {
it.file.path.contains("generated/openapi") // TODO: this could be slow?
}
}

tasks {
Expand All @@ -67,6 +98,7 @@ tasks {

graalvmNative.toolchainDetection.set(false)
micronaut {

runtime("netty")
testRuntime("junit5")
processing {
Expand All @@ -86,6 +118,38 @@ micronaut {
}

openapi {

client(
"challenges-service",
challengesOpenApiSpec
) {
apiPackageName = "org.developerden.codosseum.challenges.client.api"
modelPackageName = "org.developerden.codosseum.challenges.client.model"
useOptional = true
useSealed = true
}
}
}


val downloadChallengesServiceOpenApi by tasks.registering(Download::class) {
src("https://raw.githubusercontent.com/codosseum-org/challenges-service/refs/heads/openapi/openapi.yaml")
dest(challengesOpenApiSpec)
overwrite(true)
onlyIfModified(false)
}

tasks.named("generateChallenges-serviceOpenApiModels") { // task created by micronaut-openapi plugin
dependsOn(downloadChallengesServiceOpenApi)
}

tasks.named("generateChallenges-serviceOpenApiApis") { // task created by micronaut-openapi plugin
dependsOn(downloadChallengesServiceOpenApi)
}

tasks.named<Test>("test") {
useJUnitPlatform()
outputs.upToDateWhen { false }
systemProperties["junit.jupiter.execution.parallel.enabled"] = true
systemProperties["junit.jupiter.execution.parallel.mode.default"] = "concurrent"
maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1)
}
Loading
Loading