This commit is contained in:
2022-01-25 15:21:01 +06:00
parent 3746efc596
commit e4dfdc07fc
595 changed files with 59923 additions and 47 deletions
.gitignore
client
src
jsMain
kotlin
dev
inmo
postssystem
client
resources
uikit
.eslintrc.json.gitignore.npmignore.webstorm.jsBACKERS.mdCHANGELOG.mdCONTRIBUTING.mdLICENSE.mdREADME.mdbuild.gradlecomposer.jsonjsconfig.jsonpackage.json
src
images
backgrounds
components
icons
500px.svgalbum.svgarrow-down.svgarrow-left.svgarrow-right.svgarrow-up.svgbag.svgban.svgbehance.svgbell.svgbold.svgbolt.svgbookmark.svgcalendar.svgcamera.svgcart.svgcheck.svgchevron-double-left.svgchevron-double-right.svgchevron-down.svgchevron-left.svgchevron-right.svgchevron-up.svgclock.svgclose.svgcloud-download.svgcloud-upload.svgcode.svgcog.svgcomment.svgcommenting.svgcomments.svgcopy.svgcredit-card.svgdatabase.svgdesktop.svgdiscord.svgdownload.svgdribbble.svgetsy.svgexpand.svgfacebook.svgfile-edit.svgfile-pdf.svgfile-text.svgfile.svgflickr.svgfolder.svgforward.svgfoursquare.svgfuture.svggit-branch.svggit-fork.svggithub-alt.svggithub.svggitter.svggoogle.svggrid.svghappy.svghashtag.svgheart.svghistory.svghome.svgimage.svginfo.svginstagram.svgitalic.svgjoomla.svglaptop.svglifesaver.svglink.svglinkedin.svglist.svglocation.svglock.svgmail.svgmenu.svgmicrophone.svgminus-circle.svgminus.svgmore-vertical.svgmore.svgmove.svgnut.svgpagekit.svgpaint-bucket.svgpencil.svgphone-landscape.svgphone.svgpinterest.svgplay-circle.svgplay.svgplus-circle.svgplus.svgprint.svgpull.svgpush.svgquestion.svgquote-right.svgreceiver.svgreddit.svgrefresh.svgreply.svgrss.svgsearch.svgserver.svgsettings.svgshrink.svgsign-in.svgsign-out.svgsocial.svgsoundcloud.svgstar.svgstrikethrough.svgtable.svgtablet-landscape.svgtablet.svgtag.svgthumbnails.svgtiktok.svgtrash.svgtriangle-down.svgtriangle-left.svgtriangle-right.svgtriangle-up.svgtripadvisor.svgtumblr.svgtv.svgtwitch.svgtwitter.svguikit.svgunlock.svgupload.svguser.svgusers.svgvideo-camera.svgvimeo.svgwarning.svgwhatsapp.svgwordpress.svgworld.svgxing.svgyelp.svgyoutube.svg
js
less
components
theme
uikit.lessuikit.theme.less
scss
components
mixins-theme.scssmixins.scss
theme
uikit-theme.scssuikit.scssvariables-theme.scssvariables.scss
yarn.lock
features/common/common/src/jvmMain/kotlin/dev/inmo/postssystem/features/common/common
gradle
server
services/posts/client
settings.gradle

@ -32,3 +32,62 @@ dependencies {
api "org.jetbrains.exposed:exposed-jdbc:$kotlin_exposed_version"
api "org.postgresql:postgresql:$psql_version"
}
task copyClient(type: Copy) {
dependsOn ":postssystem.client:jsBrowserDistribution"
File clientSources = project(":postssystem.client").file("build/distributions")
SourceDirectorySet resources = sourceSets.main.resources
File webFolderPath = new File(resources.getSrcDirs()[0].toString(), "web")
exclude("*.map")
from clientSources.absolutePath
into webFolderPath.absolutePath
}
tasks.getByName("compileKotlin")
.dependsOn(project(":postssystem.client").jsBrowserDistribution)
.dependsOn(copyClient)
tasks.getByName("compileKotlin").configure {
mustRunAfter project(":postssystem.client").jsBrowserDistribution
mustRunAfter copyClient
}
tasks.getByName("run")
.dependsOn(project(":postssystem.client").jsBrowserDistribution)
.dependsOn(copyClient)
tasks.getByName("run").configure {
mustRunAfter project(":postssystem.client").jsBrowserDistribution
mustRunAfter copyClient
}
task copyUIKitCSS(type: Copy) {
dependsOn ":postssystem.client.uikit:build"
File dist = project(":postssystem.client.uikit").file("dist")
SourceDirectorySet resources = sourceSets.main.resources
File webFolderPath = new File(resources.getSrcDirs()[0].toString(), "web")
File cssFilesFolder = new File(dist, "css")
from cssFilesFolder.absolutePath
include "uikit.min.css"
into new File(webFolderPath, "css").absolutePath
}
task copyUIKitJS(type: Copy) {
dependsOn ":postssystem.client.uikit:build"
File dist = project(":postssystem.client.uikit").file("dist")
SourceDirectorySet resources = sourceSets.main.resources
File webFolderPath = new File(resources.getSrcDirs()[0].toString(), "web")
File jsFilesFolder = new File(dist, "js")
from jsFilesFolder.absolutePath
include "uikit.min.js"
include "uikit-icons.min.js"
into new File(webFolderPath, "js").absolutePath
}
tasks.getByName("processResources")
.dependsOn(copyUIKitJS)
.dependsOn(copyUIKitCSS)
tasks.getByName("processResources").configure {
mustRunAfter copyUIKitJS
mustRunAfter copyUIKitCSS
}

@ -2,21 +2,19 @@ package dev.inmo.postssystem.server
import dev.inmo.micro_utils.ktor.server.configurators.ApplicationRoutingConfigurator
import io.ktor.application.call
import io.ktor.http.content.files
import io.ktor.http.content.static
import io.ktor.http.content.*
import io.ktor.response.respondRedirect
import io.ktor.routing.Route
import io.ktor.routing.get
import java.io.File
class ClientStaticRoutingConfiguration(
clientStatic: String?
private val clientStatic: String?
) : ApplicationRoutingConfigurator.Element {
private val staticFile = clientStatic ?.let { File(clientStatic).takeIf { it.exists() } }
override fun Route.invoke() {
staticFile ?.let {
clientStatic ?.let {
static("client") {
files(it)
resources(it)
get {
call.respondRedirect("client/index.html")
}

@ -12,7 +12,6 @@ data class Config(
val databaseConfig: DatabaseConfig = DatabaseConfig(),
@SerialName("auth")
val authConfig: AuthConfig = AuthConfig(),
val clientStatic: String? = null,
val filesFolder: String,
val debugMode: Boolean = false
) {

@ -192,7 +192,7 @@ fun getDIModule(
singleWithBinds { RolesManagerRolesStorageServerRoutesConfigurator(get(), get()) }
singleWithBinds { ServerPostsServiceRoutingConfigurator(get(), get(), get()) }
singleWithBinds { ClientStaticRoutingConfiguration(get<Config>().clientStatic) }
singleWithBinds { ClientStaticRoutingConfiguration("web") }
singleWithBinds {
RolesAuthenticationConfigurator<Role>(
get(),
@ -213,6 +213,7 @@ fun getDIModule(
)
}
singleWithBinds { AuthenticationRoutingConfigurator(get(), get(), get()) }
singleWithBinds { NotFoundStatusPageRedirectToIndex("/client") }
if (config.debugMode) {
single<ApplicationRoutingConfigurator.Element>(StringQualifier("Tracer")) { ApplicationRoutingConfigurator.Element {(this as Routing).trace { application.log.trace(it.buildText()) } } }

@ -0,0 +1,17 @@
package dev.inmo.postssystem.server
import dev.inmo.micro_utils.ktor.server.configurators.StatusPagesConfigurator
import io.ktor.application.call
import io.ktor.features.StatusPages
import io.ktor.http.HttpStatusCode
import io.ktor.response.respondRedirect
data class NotFoundStatusPageRedirectToIndex(
val redirectTo: String
) : StatusPagesConfigurator.Element {
override fun StatusPages.Configuration.invoke() {
status(HttpStatusCode.NotFound) {
call.respondRedirect(redirectTo)
}
}
}

@ -0,0 +1,5 @@
.vertical_container {
display: flex;
flex-direction: column;
align-items: center;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,3 @@
.gone {
display: none;
}

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PostsSystem</title>
<link rel="stylesheet" href="css/uikit.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700" type="text/css">
<link rel="stylesheet" href="css/containers.css" type="text/css">
<link rel="stylesheet" href="css/visibility.css" type="text/css">
</head>
<body>
<div id="navbar" class="uk-section uk-section-secondary uk-padding-remove"></div>
<main class="uk-flex">
<div id="main" class="main-view"></div>
<div id="modal"></div>
</main>
<script src="js/uikit.min.js"></script>
<script src="js/uikit-icons.min.js"></script>
<script type="application/javascript" src="postssystem.client.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -4,7 +4,6 @@
"username": "test",
"password": "test"
},
"clientStatic": "../client/build/distributions",
"filesFolder": "/tmp/files",
"debugMode": true
}