From 8972a90b6c8cd28b58273bd703d7573a53d2208b Mon Sep 17 00:00:00 2001 From: mae Date: Tue, 17 Mar 2026 03:28:37 -0500 Subject: [PATCH] initial commit --- .gitignore | 36 +++ LICENSE.txt | 21 ++ README.md | 49 ++++ build.gradle.kts | 67 +++++ gradle.properties | 2 + gradle/libs.versions.toml | 45 ++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 248 ++++++++++++++++++ gradlew.bat | 93 +++++++ logo.png | Bin 0 -> 7376 bytes logo.svg | 175 ++++++++++++ settings.gradle.kts | 15 ++ .../online/maestoso/cofront/Identifier.kt | 15 ++ src/jsMain/kotlin/Cofront.kt | 11 + .../kotlin/online/maestoso/cofront/Cofront.kt | 15 ++ .../online/maestoso/cofront/Security.kt | 25 ++ .../kotlin/online/maestoso/cofront/api/API.kt | 11 + .../maestoso/cofront/frontend/Favicon.kt | 30 +++ .../maestoso/cofront/frontend/Frontend.kt | 8 + .../maestoso/cofront/frontend/Javascript.kt | 19 ++ .../online/maestoso/cofront/frontend/Page.kt | 50 ++++ .../maestoso/cofront/frontend/Resources.kt | 20 ++ .../maestoso/cofront/frontend/Stylesheet.kt | 35 +++ .../maestoso/cofront/frontend/pages/Index.kt | 13 + src/jvmMain/resources/logback.xml | 12 + .../static/favicon/apple-touch-icon.png | Bin 0 -> 8790 bytes .../static/favicon/favicon-96x96.png | Bin 0 -> 6761 bytes .../resources/static/favicon/favicon.ico | Bin 0 -> 15086 bytes .../resources/static/favicon/favicon.svg | 3 + .../resources/static/favicon/site.webmanifest | 21 ++ .../favicon/web-app-manifest-192x192.png | Bin 0 -> 9187 bytes .../favicon/web-app-manifest-512x512.png | Bin 0 -> 31067 bytes src/test/kotlin/ApplicationTest.kt | 22 ++ 34 files changed, 1068 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 logo.png create mode 100644 logo.svg create mode 100644 settings.gradle.kts create mode 100644 src/commonMain/kotlin/online/maestoso/cofront/Identifier.kt create mode 100644 src/jsMain/kotlin/Cofront.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/Cofront.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/Security.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/api/API.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Favicon.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Frontend.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Javascript.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Page.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Resources.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/Stylesheet.kt create mode 100644 src/jvmMain/kotlin/online/maestoso/cofront/frontend/pages/Index.kt create mode 100644 src/jvmMain/resources/logback.xml create mode 100644 src/jvmMain/resources/static/favicon/apple-touch-icon.png create mode 100644 src/jvmMain/resources/static/favicon/favicon-96x96.png create mode 100644 src/jvmMain/resources/static/favicon/favicon.ico create mode 100644 src/jvmMain/resources/static/favicon/favicon.svg create mode 100644 src/jvmMain/resources/static/favicon/site.webmanifest create mode 100644 src/jvmMain/resources/static/favicon/web-app-manifest-192x192.png create mode 100644 src/jvmMain/resources/static/favicon/web-app-manifest-512x512.png create mode 100644 src/test/kotlin/ApplicationTest.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c426c32 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0742c9b --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Mae Rosaline + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..49afa5e --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Cofront + +This project was created using the [Ktor Project Generator](https://start.ktor.io). + +Here are some useful links to get you started: + +- [Ktor Documentation](https://ktor.io/docs/home.html) +- [Ktor GitHub page](https://github.com/ktorio/ktor) +- The [Ktor Slack chat](https://app.slack.com/client/T09229ZC6/C0A974TJ9). You'll need + to [request an invite](https://surveys.jetbrains.com/s3/kotlin-slack-sign-up) to join. + +## Features + +Here's a list of features included in this project: + +| Name | Description | +|------------------------------------------------------------------------|------------------------------------------------------------------------------------| +| [Routing](https://start.ktor.io/p/routing) | Provides a structured routing DSL | +| [Authentication](https://start.ktor.io/p/auth) | Provides extension point for handling the Authorization header | +| [Content Negotiation](https://start.ktor.io/p/content-negotiation) | Provides automatic content conversion according to Content-Type and Accept headers | +| [kotlinx.serialization](https://start.ktor.io/p/kotlinx-serialization) | Handles JSON serialization using kotlinx.serialization library | +| [Sessions](https://start.ktor.io/p/ktor-sessions) | Adds support for persistent sessions through cookies or headers | +| [Static Content](https://start.ktor.io/p/static-content) | Serves static files from defined locations | +| [HTML DSL](https://start.ktor.io/p/html-dsl) | Generates HTML from Kotlin DSL | +| [CSS DSL](https://start.ktor.io/p/css-dsl) | Generates CSS from Kotlin DSL | +| [Exposed](https://start.ktor.io/p/exposed) | Adds Exposed database to your application | +| [Rate Limiting](https://start.ktor.io/p/ktor-server-rate-limiting) | Manage request rate limiting as you see fit | + +## Building & Running + +To build or run the project, use one of the following tasks: + +| Task | Description | +|-----------------------------------------|----------------------------------------------------------------------| +| `./gradlew test` | Run the tests | +| `./gradlew build` | Build everything | +| `./gradlew buildFatJar` | Build an executable JAR of the server with all dependencies included | +| `./gradlew buildImage` | Build the docker image to use with the fat JAR | +| `./gradlew publishImageToLocalRegistry` | Publish the docker image locally | +| `./gradlew run` | Run the server | +| `./gradlew runDocker` | Run using the local docker image | + +If the server starts successfully, you'll see the following output: + +``` +2024-12-04 14:32:45.584 [main] INFO Application - Application started in 0.303 seconds. +2024-12-04 14:32:45.682 [main] INFO Application - Responding at http://0.0.0.0:8080 +``` + diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..ab5d9b5 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,67 @@ +@file:OptIn(ExperimentalKotlinGradlePluginApi::class, ExperimentalDistributionDsl::class) + +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDistributionDsl + +plugins { + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.ktor) + alias(libs.plugins.kotlinx.serialization) +} + +group = "online.maestoso" +version = "0.1.0" + +kotlin { + js { + browser { + distribution { + outputDirectory = file("src/generated/resources/js") + } + } + useEsModules() + binaries.executable() + + compilerOptions { + target = "es2015" + optIn.add("kotlin.js.ExperimentalJsExport") + } + generateTypeScriptDefinitions() + } + jvm { + mainRun { + mainClass = "online.maestoso.cofront.CofrontKt" + } + binaries { + executable { + mainClass.set("online.maestoso.cofront.CofrontKt") + } + } + } + sourceSets { + commonMain.dependencies { + implementation(libs.bundles.commonMain) + } + commonTest.dependencies { + implementation(libs.bundles.commonTest) + } + jvmMain { + resources.setSrcDirs(resources.srcDirs + file("src/generated/resources")) + jvmToolchain(21) + dependencies { + implementation(libs.bundles.jvmMain) + } + tasks["jvmProcessResources"].dependsOn += tasks["jsBrowserDistribution"] + + } + jvmTest.dependencies { + implementation(libs.bundles.jvmTest) + } + jsMain { + dependencies { + implementation(libs.bundles.jsMain) + } + + } + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ac01301 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +kotlin.code.style=official +kotlin.js.ir.output.granularity=whole-program \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..a39bb3b --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,45 @@ +[versions] +exposed = "0.61.0" +h2 = "2.3.232" +kotlin = "2.3.10" +kotlinx-html = "0.12.0" +kotlinx-browser = "0.5.0" +kotlinx-serialization = "1.8.0" +kotlin-css-jvm = "2025.6.4" +ktor = "3.4.1" +ktor-server-rate-limiting = "2.2.1" +logback = "1.5.13" + +[libraries] +ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" } +ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" } +ktor-server-auth = { module = "io.ktor:ktor-server-auth", version.ref = "ktor" } +ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" } +ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } +ktor-server-sessions = { module = "io.ktor:ktor-server-sessions", version.ref = "ktor" } +ktor-server-host-common = { module = "io.ktor:ktor-server-host-common", version.ref = "ktor" } +ktor-server-html-builder = { module = "io.ktor:ktor-server-html-builder", version.ref = "ktor" } +ktor-server-rate-limiting = { module = "io.github.flaxoos:ktor-server-rate-limiting", version.ref = "ktor-server-rate-limiting"} +ktor-test = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" } +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +kotlinx-html = { module = "org.jetbrains.kotlinx:kotlinx-html", version.ref = "kotlinx-html" } +kotlinx-browser = { module = "org.jetbrains.kotlinx:kotlinx-browser", version.ref = "kotlinx-browser" } +kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } +kotlin-css = { module = "org.jetbrains.kotlin-wrappers:kotlin-css-jvm", version.ref = "kotlin-css-jvm" } +exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" } +exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" } +h2 = { module = "com.h2database:h2", version.ref = "h2" } +logback = { name = "logback", module = "ch.qos.logback:logback-classic", version.ref = "logback" } +kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } + +[bundles] +jvmMain = ["ktor-server-core", "ktor-server-netty", "ktor-server-auth", "ktor-server-content-negotiation", "ktor-serialization-kotlinx-json", "ktor-server-sessions", "ktor-server-host-common", "ktor-server-html-builder", "ktor-server-rate-limiting", "kotlinx-html", "kotlin-css", "exposed-core", "exposed-jdbc", "h2"] +jvmTest = ["ktor-test", "kotlin-test-junit"] +commonMain = ["kotlinx-serialization"] +commonTest = ["kotlin-test"] +jsMain = ["kotlinx-browser"] +jsTest = [] +[plugins] +ktor = { id = "io.ktor.plugin", version.ref = "ktor" } +kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8bdaf60c75ab801e22807dde59e12a8735a34077 GIT binary patch literal 45457 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
E3O!uy!x-n^Xipuqmga7Z(85N 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®G46aK?r|^ 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 M0bT}%>?I%`0L*Dn)Bpeg literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..19a6bde --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..adff685 --- /dev/null +++ b/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..c4bdd3a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,93 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2e02bf288facb56996f54035c1fc7cfa76c589 GIT binary patch literal 7376 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 Zzf(RW{I+MC5(5JRgQu&X%Q~loCIH%=PMZJ# literal 0 HcmV?d00001 diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..b1b12ae --- /dev/null +++ b/logo.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..51cd3fa --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,15 @@ +rootProject.name = "Cofront" + +dependencyResolutionManagement { + repositories { + mavenCentral() + maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-js-wrappers") + maven("https://packages.confluent.io/maven/") + } +} +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + } +} \ No newline at end of file diff --git a/src/commonMain/kotlin/online/maestoso/cofront/Identifier.kt b/src/commonMain/kotlin/online/maestoso/cofront/Identifier.kt new file mode 100644 index 0000000..f00100c --- /dev/null +++ b/src/commonMain/kotlin/online/maestoso/cofront/Identifier.kt @@ -0,0 +1,15 @@ +@file:OptIn(ExperimentalUuidApi::class) +package online.maestoso.cofront + +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid + +data class Identifier(val id: Uuid, val domain: String) { + override fun toString(): String { + return "$id@$domain" + } +} +fun String.toIdentifier(): Identifier { + val split = split('@', limit = 2) + return Identifier(Uuid.parse(split[0]), split[1]) +} \ No newline at end of file diff --git a/src/jsMain/kotlin/Cofront.kt b/src/jsMain/kotlin/Cofront.kt new file mode 100644 index 0000000..98542ca --- /dev/null +++ b/src/jsMain/kotlin/Cofront.kt @@ -0,0 +1,11 @@ +@file:OptIn(ExperimentalUuidApi::class) + +import kotlinx.browser.window +import online.maestoso.cofront.Identifier +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid + +fun main() { + window.alert("kotlin js test") + val i = Identifier(Uuid.generateV7(), "localhost") +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/Cofront.kt b/src/jvmMain/kotlin/online/maestoso/cofront/Cofront.kt new file mode 100644 index 0000000..523fc47 --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/Cofront.kt @@ -0,0 +1,15 @@ +package online.maestoso.cofront + +import io.ktor.server.application.* +import io.ktor.server.engine.* +import io.ktor.server.netty.* +import online.maestoso.cofront.frontend.configureFrontend + +fun main() { + embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module) + .start(wait = true) +} +fun Application.module() { + configureSecurity() + configureFrontend() +} diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/Security.kt b/src/jvmMain/kotlin/online/maestoso/cofront/Security.kt new file mode 100644 index 0000000..8142874 --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/Security.kt @@ -0,0 +1,25 @@ +package online.maestoso.cofront + +import io.ktor.server.application.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import io.ktor.server.sessions.* +import kotlinx.serialization.Serializable + +fun Application.configureSecurity() { + install(Sessions) { + cookie("MY_SESSION") { + cookie.extensions["SameSite"] = "lax" + } + } + routing { + get("/session/increment") { + val session = call.sessions.get() ?: MySession() + call.sessions.set(session.copy(count = session.count + 1)) + call.respondText("Counter is ${session.count}. Refresh to increment.") + } + } +} + +@Serializable +data class MySession(val count: Int = 0) diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/api/API.kt b/src/jvmMain/kotlin/online/maestoso/cofront/api/API.kt new file mode 100644 index 0000000..145a7bf --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/api/API.kt @@ -0,0 +1,11 @@ +@file:OptIn(ExperimentalUuidApi::class) + +package online.maestoso.cofront.api + +import online.maestoso.cofront.Identifier +import kotlin.uuid.ExperimentalUuidApi +import kotlin.uuid.Uuid + +fun test() { + val i = Identifier(Uuid.generateV7(), "localhost") +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Favicon.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Favicon.kt new file mode 100644 index 0000000..d896b24 --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Favicon.kt @@ -0,0 +1,30 @@ +package online.maestoso.cofront.frontend + +import io.ktor.server.application.Application +import io.ktor.server.response.respondResource +import io.ktor.server.routing.get +import io.ktor.server.routing.routing +import kotlinx.html.FlowOrMetaDataOrPhrasingContent +import kotlinx.html.link +import kotlinx.html.meta + +const val FAVICON_ROOT: String = "/static/favicon" +fun FlowOrMetaDataOrPhrasingContent.favicon() { + link(rel = "icon", type = "image/png", href= "$FAVICON_ROOT/favicon-96x96.png") { + attributes["sizes"] = "96x96" + } + link(rel = "icon", type = "image/svg+xml", href="$FAVICON_ROOT/favicon.svg") + link(rel = "shortcut icon", href="$FAVICON_ROOT/favicon.ico") + link(rel = "apple-touch-icon", href="$FAVICON_ROOT/apple-touch-icon.png") { + attributes["sizes"] = "180x180" + } + meta(name = "apple-mobile-web-app-tile", content="Cofront") + link(rel = "manifest", href="$FAVICON_ROOT/site.webmanifest") +} +fun Application.configureFavicon() { + routing { + get("/favicon.ico") { + call.respondResource("static/favicon/favicon.ico") + } + } +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Frontend.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Frontend.kt new file mode 100644 index 0000000..5419900 --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Frontend.kt @@ -0,0 +1,8 @@ +package online.maestoso.cofront.frontend + +import io.ktor.server.application.Application + +fun Application.configureFrontend() { + configureResources() + addAllPages() +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Javascript.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Javascript.kt new file mode 100644 index 0000000..a56c9cc --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Javascript.kt @@ -0,0 +1,19 @@ +package online.maestoso.cofront.frontend + +import io.ktor.http.ContentType +import io.ktor.server.application.Application +import io.ktor.server.http.content.staticResources +import io.ktor.server.routing.get +import io.ktor.server.routing.routing +import kotlinx.html.FlowOrMetaDataOrPhrasingContent +import kotlinx.html.script + +fun Application.configureJavascript() { + routing { + staticResources("/js", "js") + } +} + +fun FlowOrMetaDataOrPhrasingContent.js() { + script(type = ContentType.Text.JavaScript.toString(), src = "js/Cofront.js") {} +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Page.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Page.kt new file mode 100644 index 0000000..d8524cc --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Page.kt @@ -0,0 +1,50 @@ +package online.maestoso.cofront.frontend + +import io.ktor.http.* +import io.ktor.server.application.* +import io.ktor.server.html.* +import io.ktor.server.routing.* +import kotlinx.css.CssBuilder +import kotlinx.html.BODY +import kotlinx.html.HEAD +import kotlinx.html.body +import kotlinx.html.head +import kotlinx.html.meta +import kotlinx.html.style +import kotlinx.html.unsafe +import online.maestoso.cofront.frontend.pages.Index +import kotlin.String +import kotlin.Unit + +abstract class Page(val path: String) { + open val style: CssBuilder.() -> Unit = {} + open val head: HEAD.() -> Unit = {} + open val body: BODY.() -> Unit = {} + + fun addPage(app: Application) { + app.routing { + get(this@Page.path) { + call.respondHtml { + head { + meta(charset = Charsets.UTF_8.toString()) + stylesheet() + favicon() + js() + apply(this@Page.head) + val css = CssBuilder().apply(this@Page.style) + unsafe { + this@head.style(type = ContentType.Text.CSS.toString(), content = css.toString()) + } + } + body { + apply(this@Page.body) + } + } + } + } + } +} + +fun Application.addAllPages() { + Index.addPage(this) +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Resources.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Resources.kt new file mode 100644 index 0000000..4700cce --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Resources.kt @@ -0,0 +1,20 @@ +package online.maestoso.cofront.frontend + +import io.ktor.server.application.* +import io.ktor.server.http.content.* +import io.ktor.server.response.respondRedirect +import io.ktor.server.routing.* + +fun Application.configureResources() { + configureFavicon() + configureJavascript() + routing { + get("/res/{path}") { + when(call.parameters["path"]) { + "index.css" -> call.configureStylesheet() + else -> call.respondRedirect("/static/${call.parameters["path"]}", true) + } + } + staticResources("/static", "static") + } +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Stylesheet.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Stylesheet.kt new file mode 100644 index 0000000..f6a925a --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/Stylesheet.kt @@ -0,0 +1,35 @@ +package online.maestoso.cofront.frontend + +import io.ktor.http.ContentType +import io.ktor.server.application.* +import io.ktor.server.response.* +import io.ktor.server.routing.* +import kotlinx.css.* +import kotlinx.html.FlowOrMetaDataOrPhrasingContent +import kotlinx.html.link + +suspend fun RoutingCall.configureStylesheet() { + css { + media("(prefers-color-scheme: dark)") { + html { + backgroundColor = Color("#222") + color = Color.white + } + } + media("not (prefers-color-scheme: dark)") { + html { + backgroundColor = Color.ghostWhite + color = Color.black + } + } + html { + + } + } +} +suspend inline fun ApplicationCall.css(builder: CssBuilder.() -> Unit) { + this.respondText(CssBuilder().apply(builder).toString(), ContentType.Text.CSS) +} +fun FlowOrMetaDataOrPhrasingContent.stylesheet() { + link(rel = "stylesheet", href = "/res/index.css") +} \ No newline at end of file diff --git a/src/jvmMain/kotlin/online/maestoso/cofront/frontend/pages/Index.kt b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/pages/Index.kt new file mode 100644 index 0000000..7b9a928 --- /dev/null +++ b/src/jvmMain/kotlin/online/maestoso/cofront/frontend/pages/Index.kt @@ -0,0 +1,13 @@ +package online.maestoso.cofront.frontend.pages + +import kotlinx.html.BODY +import kotlinx.html.h1 +import online.maestoso.cofront.frontend.Page + +object Index : Page("/") { + override val body: BODY.() -> Unit = { + h1 { + +"Cofront" + } + } +} \ No newline at end of file diff --git a/src/jvmMain/resources/logback.xml b/src/jvmMain/resources/logback.xml new file mode 100644 index 0000000..aadef5d --- /dev/null +++ b/src/jvmMain/resources/logback.xml @@ -0,0 +1,12 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/src/jvmMain/resources/static/favicon/apple-touch-icon.png b/src/jvmMain/resources/static/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..26b013ef7a5460634c2ac54fd3bed0ad0e063370 GIT binary patch literal 8790 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 literal 0 HcmV?d00001 diff --git a/src/jvmMain/resources/static/favicon/favicon.ico b/src/jvmMain/resources/static/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c2bff0db75eef1bf88768dba61fae0a6861170e6 GIT binary patch literal 15086 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 + + \ No newline at end of file diff --git a/src/jvmMain/resources/static/favicon/site.webmanifest b/src/jvmMain/resources/static/favicon/site.webmanifest new file mode 100644 index 0000000..797b4a4 --- /dev/null +++ b/src/jvmMain/resources/static/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Cofront", + "short_name": "Cofront", + "icons": [ + { + "src": "/static/favicon/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/static/favicon//web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#216778", + "background_color": "#216778", + "display": "standalone" +} diff --git a/src/jvmMain/resources/static/favicon/web-app-manifest-192x192.png b/src/jvmMain/resources/static/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..3e1fc1936d636f37e4c9e2c68a7d8699fcc76798 GIT binary patch literal 9187 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 literal 0 HcmV?d00001 diff --git a/src/jvmMain/resources/static/favicon/web-app-manifest-512x512.png b/src/jvmMain/resources/static/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..90cdae625a78073638e0da2174d25311a3546a90 GIT binary patch literal 31067 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 literal 0 HcmV?d00001 diff --git a/src/test/kotlin/ApplicationTest.kt b/src/test/kotlin/ApplicationTest.kt new file mode 100644 index 0000000..e209dfa --- /dev/null +++ b/src/test/kotlin/ApplicationTest.kt @@ -0,0 +1,22 @@ +package online.maestoso + +import io.ktor.client.request.* +import io.ktor.http.* +import io.ktor.server.testing.* +import online.maestoso.cofront.module +import kotlin.test.Test +import kotlin.test.assertEquals + +class ApplicationTest { + + @Test + fun testRoot() = testApplication { + application { + module() + } + client.get("/").apply { + assertEquals(HttpStatusCode.OK, status) + } + } + +}