🐳 Adds dockerfile

This commit is contained in:
Daniel Svitan 2025-05-18 12:28:37 +02:00
parent d1ddd7be3b
commit c124754c96
7 changed files with 110 additions and 10 deletions

57
backend/.dockerignore Normal file
View File

@ -0,0 +1,57 @@
### Gradle template
.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
### Kotlin template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### Custom
.idea/
.kotlin/
data/
compose.yaml
src/main/resources/.env

8
backend/Dockerfile Normal file
View File

@ -0,0 +1,8 @@
FROM gradle:jdk17
WORKDIR /app
COPY --chown=gradle:gradle . .
RUN gradle buildFatJar
CMD ["gradle", "runFatJar"]

View File

@ -23,7 +23,9 @@ fun main() {
} }
fun Application.module() { fun Application.module() {
val dotenv = dotenv() val dotenv = dotenv {
ignoreIfMissing = true
}
configureHTTP() configureHTTP()
configureErrors() configureErrors()

View File

@ -1,7 +1,7 @@
<configuration> <configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
</encoder> </encoder>
</appender> </appender>
<root level="INFO"> <root level="INFO">
@ -9,4 +9,4 @@
</root> </root>
<logger name="org.eclipse.jetty" level="INFO"/> <logger name="org.eclipse.jetty" level="INFO"/>
<logger name="io.netty" level="INFO"/> <logger name="io.netty" level="INFO"/>
</configuration> </configuration>

View File

@ -7,15 +7,14 @@ import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
class ApplicationTest { class ApplicationTest {
@Test @Test
fun testRoot() = testApplication { fun testRoot() = testApplication {
application { application {
module() module()
} }
client.get("/").apply { client.get("/").apply {
assertEquals(HttpStatusCode.OK, status) assertEquals(HttpStatusCode.OK, status)
} }
} }
} }

View File

@ -38,6 +38,7 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import dev.svitan.antifed.ui.theme.AntiFedTheme import dev.svitan.antifed.ui.theme.AntiFedTheme
import io.ktor.client.call.body
import io.ktor.client.request.get import io.ktor.client.request.get
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -56,6 +57,12 @@ class AuthActivity : ComponentActivity() {
var checkingUrl by remember { mutableStateOf(false) } var checkingUrl by remember { mutableStateOf(false) }
var isServerUrlOk by remember { mutableStateOf(false) } var isServerUrlOk by remember { mutableStateOf(false) }
var needToCheckToken by remember { mutableStateOf(false) }
var checkingToken by remember { mutableStateOf(false) }
var isTokenOk by remember { mutableStateOf(false) }
var auths by remember { mutableStateOf(listOf<AuthDTO>()) }
val prefs = LocalContext.current.getSharedPreferences( val prefs = LocalContext.current.getSharedPreferences(
stringResource(R.string.settings_prefs_key), stringResource(R.string.settings_prefs_key),
MODE_PRIVATE MODE_PRIVATE
@ -68,7 +75,7 @@ class AuthActivity : ComponentActivity() {
fun serverUrlMatches(): Boolean { fun serverUrlMatches(): Boolean {
var re = Regex( var re = Regex(
"(?:http[s]?:\\/\\/.)?(?:www\\.)?[-a-zA-Z0-9@%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b(?:[-a-zA-Z0-9@:%_\\+.~#?&\\/\\/=]*)", """https?://[a-zA-Z0-9\\.]+\\.[a-zA-Z0-9]+""",
RegexOption.DOT_MATCHES_ALL RegexOption.DOT_MATCHES_ALL
) )
return re.containsMatchIn(serverUrl) return re.containsMatchIn(serverUrl)
@ -89,7 +96,6 @@ class AuthActivity : ComponentActivity() {
delay(1000) delay(1000)
checkingUrl = true checkingUrl = true
val response = client.get(serverUrl) val response = client.get(serverUrl)
checkingUrl = false checkingUrl = false
@ -101,11 +107,34 @@ class AuthActivity : ComponentActivity() {
} }
} }
LaunchedEffect(token) {
if (!needToCheckToken) return@LaunchedEffect
else isTokenOk = false
if (!isServerUrlOk) return@LaunchedEffect
if (token.isBlank()) return@LaunchedEffect
delay(1000)
checkingToken = true
val response = client.get("$serverUrl/auth")
if (response.status != HttpStatusCode.OK) {
checkingToken = false
needToCheckToken = false
isTokenOk = false
return@LaunchedEffect
}
auths = response.body<List<AuthDTO>>()
checkingToken = false
needToCheckToken = false
isTokenOk = true
}
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer,
titleContentColor = MaterialTheme.colorScheme.primary titleContentColor = MaterialTheme.colorScheme.primary
), ),
title = { title = {
@ -159,13 +188,19 @@ class AuthActivity : ComponentActivity() {
TextField( TextField(
value = token, value = token,
onValueChange = { token = it }, onValueChange = {
needToCheckToken = true
token = it
},
label = { Text(stringResource(R.string.token)) }, label = { Text(stringResource(R.string.token)) },
singleLine = true, singleLine = true,
isError = token.isBlank(), isError = token.isBlank(),
visualTransformation = PasswordVisualTransformation(), visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
) )
Spacer(modifier = Modifier.height(12.dp))
Text("auths: $auths")
} }
} }
} }

View File

@ -90,7 +90,6 @@ class MainActivity : ComponentActivity() {
topBar = { topBar = {
TopAppBar( TopAppBar(
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer,
titleContentColor = MaterialTheme.colorScheme.primary titleContentColor = MaterialTheme.colorScheme.primary
), ),
title = { title = {