Skip to content

Commit edebb22

Browse files
authored
Merge pull request #6 from EqualExperts/build
Build
2 parents 8fde739 + 46c37b8 commit edebb22

File tree

14 files changed

+205
-134
lines changed

14 files changed

+205
-134
lines changed

.github/workflows/build.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Build Project
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
pull_request:
7+
branches: [ main ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- uses: actions/checkout@v5
15+
with:
16+
fetch-depth: 0 # Fetch all history for all branches and tags
17+
18+
- name: Set up JDK 21
19+
uses: actions/setup-java@v5
20+
with:
21+
java-version: '21'
22+
distribution: 'temurin'
23+
cache: gradle
24+
25+
- name: Grant execute permission for gradlew
26+
run: chmod +x ./gradlew
27+
28+
- name: Build and test all projects
29+
run: ./gradlew build --no-daemon
30+
31+
- name: Test Summary
32+
uses: mikepenz/action-junit-report@v5
33+
if: always() # always run even if the previous step fails
34+
with:
35+
report_paths: '**/build/test-results/test/TEST-*.xml'
36+
37+
- name: Upload Build Artifacts
38+
uses: actions/upload-artifact@v4
39+
if: success()
40+
with:
41+
name: build-artifacts
42+
path: |
43+
*/build/libs/*.jar
44+
*/build/reports/**

http4k-example/src/main/kotlin/za/co/ee/learning/domain/users/usecases/Authenticate.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,22 @@ class Authenticate(
5959
private fun authenticateUser(
6060
user: User,
6161
validatedRequest: AuthenticateRequest,
62-
): DomainResult<User> = either {
63-
val passwordHashString = user.passwordHash.bind()
64-
if (passwordProvider.matches(validatedRequest.password, passwordHashString)) {
65-
user
66-
} else {
67-
raise(DomainError.InvalidCredentials)
62+
): DomainResult<User> =
63+
either {
64+
val passwordHashString = user.passwordHash.bind()
65+
if (passwordProvider.matches(validatedRequest.password, passwordHashString)) {
66+
user
67+
} else {
68+
raise(DomainError.InvalidCredentials)
69+
}
6870
}
69-
}
7071

71-
private fun createToken(authenticatedUser: User): DomainResult<AuthenticateResponse> = either {
72-
val tokenInfo: TokenInfo = jwtProvider.generate(authenticatedUser).bind()
73-
AuthenticateResponse(
74-
token = tokenInfo.token,
75-
expires = tokenInfo.expires,
76-
)
77-
}
72+
private fun createToken(authenticatedUser: User): DomainResult<AuthenticateResponse> =
73+
either {
74+
val tokenInfo: TokenInfo = jwtProvider.generate(authenticatedUser).bind()
75+
AuthenticateResponse(
76+
token = tokenInfo.token,
77+
expires = tokenInfo.expires,
78+
)
79+
}
7880
}

http4k-example/src/main/kotlin/za/co/ee/learning/infrastructure/database/InMemoryUserRepository.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package za.co.ee.learning.infrastructure.database
22

3-
import arrow.core.Either
43
import arrow.core.Option
54
import arrow.core.right
6-
import za.co.ee.learning.domain.DomainError
75
import za.co.ee.learning.domain.DomainResult
86
import za.co.ee.learning.domain.users.User
97
import za.co.ee.learning.domain.users.UserRepository

http4k-example/src/main/kotlin/za/co/ee/learning/infrastructure/security/DefaultJWTProvider.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import za.co.ee.learning.domain.security.JWTProvider
1111
import za.co.ee.learning.domain.security.TokenInfo
1212
import za.co.ee.learning.domain.users.User
1313
import java.time.Instant
14-
import java.util.*
14+
import java.util.Date
15+
import java.util.UUID
1516

1617
class DefaultJWTProvider(
1718
private val secret: String,
@@ -32,13 +33,14 @@ class DefaultJWTProvider(
3233
val now = Instant.now()
3334
val expiresAt = now.plusSeconds(expirationSeconds)
3435

35-
val token = JWT
36-
.create()
37-
.withIssuer(issuer)
38-
.withSubject(user.id.toString())
39-
.withIssuedAt(Date.from(now))
40-
.withExpiresAt(Date.from(expiresAt))
41-
.sign(algorithm)
36+
val token =
37+
JWT
38+
.create()
39+
.withIssuer(issuer)
40+
.withSubject(user.id.toString())
41+
.withIssuedAt(Date.from(now))
42+
.withExpiresAt(Date.from(expiresAt))
43+
.sign(algorithm)
4244

4345
TokenInfo(
4446
token = token,

http4k-example/src/test/kotlin/za/co/ee/learning/domain/users/usecases/AuthenticateTest.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class AuthenticateTest :
4343
TokenInfo(
4444
token = testToken,
4545
expires = testExpires,
46-
)
46+
),
4747
)
4848

4949
beforeTest {
@@ -62,10 +62,10 @@ class AuthenticateTest :
6262

6363
val value = result.shouldBeRight()
6464
value shouldBe
65-
AuthenticateResponse(
66-
token = testToken,
67-
expires = testExpires,
68-
)
65+
AuthenticateResponse(
66+
token = testToken,
67+
expires = testExpires,
68+
)
6969

7070
verify { userRepository.findByEmail(validEmail) }
7171
verify { passwordProvider.matches(validPassword, passwordHash) }

http4k-example/src/test/kotlin/za/co/ee/learning/infrastructure/api/AuthenticateEndpointTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class AuthenticateEndpointTest :
4646
TokenInfo(
4747
token = testToken,
4848
expires = testExpires,
49-
)
49+
),
5050
)
5151
beforeTest {
5252
clearAllMocks()

quarkus-rest/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
22

33
plugins {
44
kotlin("jvm")
5-
kotlin("plugin.allopen") version "1.9.22"
5+
kotlin("plugin.allopen") version "2.1.20"
6+
id("org.jlleitschuh.gradle.ktlint") version "12.1.2"
67
id("io.quarkus")
78
}
89

@@ -16,7 +17,7 @@ val quarkusPlatformArtifactId: String by project
1617
val quarkusPlatformVersion: String by project
1718

1819
dependencies {
19-
implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
20+
implementation(enforcedPlatform("$quarkusPlatformGroupId:$quarkusPlatformArtifactId:$quarkusPlatformVersion"))
2021
// Rest Support
2122
implementation("io.quarkus:quarkus-rest-jackson")
2223
// Rest Client Support
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
package za.co.ee.learning.client
22

3-
import jakarta.ws.rs.*
3+
import jakarta.ws.rs.Consumes
4+
import jakarta.ws.rs.POST
5+
import jakarta.ws.rs.Path
6+
import jakarta.ws.rs.Produces
47
import jakarta.ws.rs.core.MediaType
58
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient
69

7-
810
data class UrlValidationRequest(val name: String, val url: String)
11+
912
data class UrlValidationResponse(val name: String, val result: String)
1013

1114
@Path("/validate-url")
12-
@RegisterRestClient(configKey="validator-service")
15+
@RegisterRestClient(configKey = "validator-service")
1316
interface UrlValidatorClient {
1417
@POST
1518
@Produces(MediaType.APPLICATION_JSON)
1619
@Consumes(MediaType.APPLICATION_JSON)
1720
fun validateUrl(urlValidationRequest: UrlValidationRequest): UrlValidationResponse
18-
}
21+
}

quarkus-rest/src/main/kotlin/za/co/ee/learning/model/KotlinLearningPath.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,5 @@ package za.co.ee.learning.model
88
*/
99
data class KotlinLearningPath(
1010
var name: String,
11-
12-
var resources: MutableMap<String, String> = mutableMapOf()
11+
var resources: MutableMap<String, String> = mutableMapOf(),
1312
)

quarkus-rest/src/main/kotlin/za/co/ee/learning/resource/LearningPathResource.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@ package za.co.ee.learning.resource
22

33
import io.smallrye.common.annotation.RunOnVirtualThread
44
import jakarta.inject.Inject
5-
import jakarta.ws.rs.*
5+
import jakarta.ws.rs.Consumes
6+
import jakarta.ws.rs.DELETE
7+
import jakarta.ws.rs.GET
8+
import jakarta.ws.rs.POST
9+
import jakarta.ws.rs.PUT
10+
import jakarta.ws.rs.Path
11+
import jakarta.ws.rs.PathParam
12+
import jakarta.ws.rs.Produces
13+
import jakarta.ws.rs.QueryParam
614
import jakarta.ws.rs.core.MediaType
715
import jakarta.ws.rs.core.Response
816
import za.co.ee.learning.model.KotlinLearningPath
@@ -16,7 +24,6 @@ import za.co.ee.learning.service.LearningPathService
1624
@Produces(MediaType.APPLICATION_JSON)
1725
@Consumes(MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED)
1826
class LearningPathResource {
19-
2027
@Inject
2128
lateinit var learningPathService: LearningPathService
2229

@@ -40,7 +47,9 @@ class LearningPathResource {
4047
@PUT
4148
@Path("/name/{name}")
4249
@RunOnVirtualThread
43-
fun updateName(@PathParam("name") name: String): KotlinLearningPath {
50+
fun updateName(
51+
@PathParam("name") name: String,
52+
): KotlinLearningPath {
4453
return learningPathService.updateName(name)
4554
}
4655

@@ -54,7 +63,10 @@ class LearningPathResource {
5463
@PUT
5564
@Path("/resource")
5665
@RunOnVirtualThread
57-
fun addOrUpdateResource(@QueryParam("name") name: String?, @QueryParam("url") url: String?): Response {
66+
fun addOrUpdateResource(
67+
@QueryParam("name") name: String?,
68+
@QueryParam("url") url: String?,
69+
): Response {
5870
if (name.isNullOrBlank() || url.isNullOrBlank()) {
5971
return Response.status(Response.Status.BAD_REQUEST)
6072
.entity("Both name and url parameters are required")
@@ -79,7 +91,9 @@ class LearningPathResource {
7991
@DELETE
8092
@Path("/resource/{name}")
8193
@RunOnVirtualThread
82-
fun removeResource(@PathParam("name") name: String): KotlinLearningPath {
94+
fun removeResource(
95+
@PathParam("name") name: String,
96+
): KotlinLearningPath {
8397
return learningPathService.removeResource(name)
8498
}
8599

0 commit comments

Comments
 (0)