2 Commits

Author SHA1 Message Date
546736690c continue reborn :( 2024-08-26 23:58:53 +06:00
e98a484c4d start second (or third?) reborn 2024-02-16 13:40:47 +06:00
93 changed files with 223 additions and 238 deletions
.gitignorebuild.gradle
client
defaultAndroidSettings.gradleextensions.gradle
features
auth
client
common
server
src
jvmMain
kotlin
dev
inmo
postssystem
client
template
client
common
common
client
build.gradle
src
jsMain
kotlin
dev
inmo
postssystem
features
common
main
common
src
commonMain
kotlin
dev
inmo
postssystem
jsMain
kotlin
dev
inmo
postssystem
features
jvmMain
kotlin
dev
inmo
linuxX64Main
kotlin
dev
inmo
postssystem
features
main
mingwX64Main
kotlin
dev
inmo
postssystem
features
content
binary
client
common
server
src
jvmMain
kotlin
dev
inmo
postssystem
features
client
common
text
files
client
src
commonMain
kotlin
dev
inmo
postssystem
main
common
src
jvmMain
kotlin
dev
inmo
postssystem
features
main
posts
client
common
src
commonMain
kotlin
dev
inmo
postssystem
features
posts
common
main
server
src
jvmMain
kotlin
dev
inmo
postssystem
features
publication
client
common
roles
client
src
commonMain
kotlin
main
common
manager
client
common
status
client
src
commonMain
kotlin
dev
inmo
postssystem
features
main
common
template
client
common
users
client
src
commonMain
kotlin
dev
inmo
postssystem
main
common
build.gradle
src
commonMain
kotlin
dev
inmo
postssystem
features
users
common
jvmMain
kotlin
dev
inmo
postssystem
features
main
gradle.properties
gradle
mppAndroidProject.gradlemppJavaProject.gradlemppJsProject.gradlemppProjectWithSerialization.gradle
publicators
simple
client
src
androidMain
commonMain
kotlin
dev
inmo
postssystem
publicators
common
src
template
client
src
common
src
publish.gradle
services
posts
client
src
androidMain
commonMain
kotlin
dev
inmo
postssystem
services
common
src
server
src
jvmMain
kotlin
dev
inmo
postssystem
template
client
src
common
src
settings.gradle
targets/telegram
content
polls
client
src
common
src
loader
client
src
common
src
template
client
src
common
src

1
.gitignore vendored

@ -1,4 +1,5 @@
.idea .idea
.kotlin
out/* out/*
*.iml *.iml
target target

@ -23,6 +23,7 @@ allprojects {
mavenCentral() mavenCentral()
google() google()
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" } maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
maven { url "https://nexus.inmo.dev/repository/maven-releases/" }
} }
} }

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -58,5 +58,6 @@
"semver": "^7.3.2", "semver": "^7.3.2",
"svgo": "^2.8.0", "svgo": "^2.8.0",
"watch-run": "^1.2.5" "watch-run": "^1.2.5"
} },
"packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
} }

@ -1,39 +1,16 @@
apply plugin: 'com.getkeepsafe.dexcount' apply plugin: 'com.getkeepsafe.dexcount'
android { android {
ext {
jvmKotlinFolderFile = {
String sep = File.separator
return new File("${project.projectDir}${sep}src${sep}jvmMain${sep}kotlin")
}
enableIncludingJvmCodeInAndroidPart = {
File jvmKotlinFolder = jvmKotlinFolderFile()
if (jvmKotlinFolder.exists()) {
android.sourceSets.main.java.srcDirs += jvmKotlinFolder.path
}
}
disableIncludingJvmCodeInAndroidPart = {
File jvmKotlinFolder = jvmKotlinFolderFile()
String[] oldDirs = android.sourceSets.main.java.srcDirs
android.sourceSets.main.java.srcDirs = []
for (oldDir in oldDirs) {
if (oldDir != jvmKotlinFolder.path) {
android.sourceSets.main.java.srcDirs += oldDir
}
}
}
}
compileSdkVersion libs.versions.android.props.compileSdk.get().toInteger() compileSdkVersion libs.versions.android.props.compileSdk.get().toInteger()
buildToolsVersion libs.versions.android.props.buildTools.get() buildToolsVersion libs.versions.android.props.buildTools.get()
defaultConfig { defaultConfig {
minSdkVersion libs.versions.android.props.minSdk.get().toInteger() minSdkVersion libs.versions.android.props.minSdk.get().toInteger()
compileSdkVersion libs.versions.android.props.compileSdk.get().toInteger()
targetSdkVersion libs.versions.android.props.compileSdk.get().toInteger() targetSdkVersion libs.versions.android.props.compileSdk.get().toInteger()
versionCode "${android_code_version}".toInteger() versionCode "${android_code_version}".toInteger()
versionName "$version" versionName "$version"
namespace "${project.group}.${project.name}"
} }
buildTypes { buildTypes {
release { release {
@ -51,18 +28,7 @@ android {
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_17
} }
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
sourceSets {
String sep = File.separator
main.java.srcDirs += "src${sep}main${sep}kotlin"
}
enableIncludingJvmCodeInAndroidPart()
} }

@ -13,21 +13,6 @@ allprojects {
projectByName(name) projectByName(name)
} }
allTargetsConfiguration = { ->
kotlin {
targets.all {
compilations.all {
kotlinOptions {
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true"
]
}
}
}
}
}
mppProjectWithSerializationPresetPath = "${rootProject.projectDir.absolutePath}/mppProjectWithSerialization.gradle" mppProjectWithSerializationPresetPath = "${rootProject.projectDir.absolutePath}/mppProjectWithSerialization.gradle"
mppJavaProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJavaProject.gradle" mppJavaProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJavaProject.gradle"
mppJsProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJsProject.gradle" mppJsProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJsProject.gradle"

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -1,7 +1,6 @@
package dev.inmo.postssystem.features.auth.client package dev.inmo.postssystem.features.auth.client
import dev.inmo.micro_utils.common.Either import dev.inmo.micro_utils.common.Either
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
import dev.inmo.postssystem.features.auth.common.AuthKey import dev.inmo.postssystem.features.auth.common.AuthKey
import dev.inmo.postssystem.features.auth.common.AuthTokenInfo import dev.inmo.postssystem.features.auth.common.AuthTokenInfo
import dev.inmo.postssystem.features.common.common.AdditionalModules import dev.inmo.postssystem.features.common.common.AdditionalModules
@ -27,7 +26,6 @@ fun createAuthorizedFeaturesDIModule(
installClientAuthenticator(serverUrl, get(), get(AuthorizedQualifiers.CredsQualifier), onAuthKeyUpdated, onUserRetrieved, onAuthKeyInvalidated) installClientAuthenticator(serverUrl, get(), get(AuthorizedQualifiers.CredsQualifier), onAuthKeyUpdated, onUserRetrieved, onAuthKeyInvalidated)
} }
} }
single { UnifiedRequester(get(), get()) }
single { StatusFeatureClient(get(AuthorizedQualifiers.ServerUrlQualifier), get()) } single { StatusFeatureClient(get(AuthorizedQualifiers.ServerUrlQualifier), get()) }
AdditionalModules.Authorized.modules.forEach { AdditionalModules.Authorized.modules.forEach {

@ -2,14 +2,14 @@ package dev.inmo.postssystem.features.auth.client
import dev.inmo.postssystem.features.auth.common.* import dev.inmo.postssystem.features.auth.common.*
import dev.inmo.postssystem.features.users.common.User import dev.inmo.postssystem.features.users.common.User
import dev.inmo.micro_utils.ktor.client.UnifiedRequester import dev.inmo.micro_utils.ktor.client.bodyOrNull
import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.ktor.common.buildStandardUrl
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.HttpRequestBuilder import io.ktor.client.request.*
import kotlinx.serialization.builtins.nullable import kotlinx.serialization.builtins.nullable
class ClientAuthFeature( class ClientAuthFeature(
private val requester: UnifiedRequester, private val client: HttpClient,
baseUrl: String baseUrl: String
) : AuthFeature { ) : AuthFeature {
private val rootUrl = buildStandardUrl(baseUrl.dropLastWhile { it == '/' }, authRootPathPart) private val rootUrl = buildStandardUrl(baseUrl.dropLastWhile { it == '/' }, authRootPathPart)
@ -26,28 +26,23 @@ class ClientAuthFeature(
authGetMePathPart authGetMePathPart
) )
constructor(client: HttpClient, rootUrl: String): this( override suspend fun auth(creds: AuthCreds): AuthTokenInfo? = client.post(
UnifiedRequester(client), fullAuthPath
rootUrl ) {
) setBody(creds)
}.bodyOrNull()
override suspend fun auth(creds: AuthCreds): AuthTokenInfo? = requester.unipost( override suspend fun refresh(refresh: RefreshToken): AuthTokenInfo? = client.post(
fullAuthPath, fullRefreshPath
AuthCreds.serializer() to creds, ) {
AuthTokenInfo.serializer().nullable setBody(refresh)
) }.bodyOrNull()
override suspend fun refresh(refresh: RefreshToken): AuthTokenInfo? = requester.unipost( override suspend fun getMe(authToken: AuthToken): User? = client.post(
fullRefreshPath, fullGetMePath
RefreshToken.serializer() to refresh, ) {
AuthTokenInfo.serializer().nullable setBody(authToken)
) }.bodyOrNull()
override suspend fun getMe(authToken: AuthToken): User? = requester.unipost(
fullGetMePath,
AuthToken.serializer() to authToken,
User.serializer().nullable
)
fun isAuthRequest(builder: HttpRequestBuilder): Boolean = builder.url.buildString().let { fun isAuthRequest(builder: HttpRequestBuilder): Boolean = builder.url.buildString().let {
it == fullAuthPath || it == fullRefreshPath it == fullAuthPath || it == fullRefreshPath

@ -37,7 +37,7 @@ fun HttpClientConfig<*>.installClientAuthenticator(
}.onSecond { }.onSecond {
currentRefreshToken = it.refresh currentRefreshToken = it.refresh
} }
val creds = initialAuthKey.t1 as? AuthCreds val creds = initialAuthKey.t1OrNull as? AuthCreds
var userRefreshJob: Job? = null var userRefreshJob: Job? = null
install("Auth Token Refresher") { install("Auth Token Refresher") {

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.auth.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.auth.common"/>

@ -1,6 +1,6 @@
package dev.inmo.postssystem.features.auth.server.tokens package dev.inmo.postssystem.features.auth.server.tokens
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import dev.inmo.postssystem.features.auth.common.AuthToken import dev.inmo.postssystem.features.auth.common.AuthToken
import dev.inmo.postssystem.features.auth.common.RefreshToken import dev.inmo.postssystem.features.auth.common.RefreshToken
import dev.inmo.postssystem.features.users.common.UserId import dev.inmo.postssystem.features.users.common.UserId

@ -1,7 +1,7 @@
package dev.inmo.postssystem.features.auth.server.tokens package dev.inmo.postssystem.features.auth.server.tokens
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import com.soywiz.klock.milliseconds import korlibs.time.milliseconds
import dev.inmo.postssystem.features.auth.common.* import dev.inmo.postssystem.features.auth.common.*
import dev.inmo.postssystem.features.common.common.Milliseconds import dev.inmo.postssystem.features.common.common.Milliseconds
import dev.inmo.postssystem.features.users.common.* import dev.inmo.postssystem.features.users.common.*

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.client.template.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.client.template.common"/>

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -1,8 +1,8 @@
package dev.inmo.postssystem.features.common.common.ui package dev.inmo.postssystem.features.common.common.ui
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import com.soywiz.klock.ISO8601 import korlibs.time.ISO8601
import org.jetbrains.compose.web.dom.Text import org.jetbrains.compose.web.dom.Text
object DateTimeView { object DateTimeView {

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.common.client"/>

@ -1,6 +1,6 @@
package dev.inmo.postssystem.features.common.common package dev.inmo.postssystem.features.common.common
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializer import kotlinx.serialization.Serializer
import kotlinx.serialization.builtins.serializer import kotlinx.serialization.builtins.serializer

@ -1,6 +1,7 @@
package dev.inmo.postssystem.features.common.common package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.MPPFile import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.filesize
import io.ktor.utils.io.core.* import io.ktor.utils.io.core.*
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ByteArraySerializer import kotlinx.serialization.builtins.ByteArraySerializer
@ -27,9 +28,18 @@ class BytesBasedInputProvider(
} }
} }
@Serializable(SimpleInputProviderSerializer::class) internal interface FileInputProvider : SimpleInputProvider {
expect class FileBasedInputProvider : SimpleInputProvider {
val file: MPPFile val file: MPPFile
override val contentBytes: Long?
get() = file.filesize
}
@Serializable(SimpleInputProviderSerializer::class)
expect class FileBasedInputProvider : FileInputProvider {
override val file: MPPFile
override fun invoke(): Input
} }
@Serializable(SimpleInputProviderSerializer::class) @Serializable(SimpleInputProviderSerializer::class)

@ -7,12 +7,9 @@ import kotlinx.serialization.Serializable
@Serializable(SimpleInputProviderSerializer::class) @Serializable(SimpleInputProviderSerializer::class)
actual class FileBasedInputProvider internal constructor( actual class FileBasedInputProvider internal constructor(
actual val file: MPPFile actual override val file: MPPFile
) : SimpleInputProvider { ) : FileInputProvider {
override val contentBytes: Long actual override fun invoke(): Input = error("Files inputs must not be used directly")
get() = file.filesize
override fun invoke(): Input = error("Files inputs must not be used directly")
} }
fun MPPFile.inputProvider() = FileBasedInputProvider(this) fun MPPFile.inputProvider() = FileBasedInputProvider(this)

@ -8,10 +8,8 @@ import kotlinx.serialization.Serializable
@Serializable(SimpleInputProviderSerializer::class) @Serializable(SimpleInputProviderSerializer::class)
actual class FileBasedInputProvider( actual class FileBasedInputProvider(
actual val file: MPPFile actual override val file: MPPFile
) : SimpleInputProvider { ) : FileInputProvider {
override val contentBytes: Long?
get() = file.filesize
override fun invoke(): Input = file.inputStream().asInput() actual override fun invoke(): Input = file.inputStream().asInput()
} }

@ -1,6 +1,7 @@
package dev.inmo.postssystem.features.common.common package dev.inmo.postssystem.features.common.common
import org.koin.core.definition.Definition import org.koin.core.definition.Definition
import org.koin.core.definition.KoinDefinition
import org.koin.core.instance.InstanceFactory import org.koin.core.instance.InstanceFactory
import org.koin.core.module.Module import org.koin.core.module.Module
import org.koin.core.qualifier.Qualifier import org.koin.core.qualifier.Qualifier
@ -11,6 +12,6 @@ inline fun <reified T : Any> Module.singleWithBinds(
qualifier: Qualifier? = null, qualifier: Qualifier? = null,
createdAtStart: Boolean = false, createdAtStart: Boolean = false,
noinline definition: Definition<T> noinline definition: Definition<T>
): Pair<Module, InstanceFactory<*>> { ): KoinDefinition<*> {
return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.toTypedArray()) return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.toTypedArray())
} }

@ -0,0 +1,10 @@
package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.filename
import dev.inmo.micro_utils.mime_types.*
actual val MPPFile.mimeType: MimeType
get() {
return getMimeTypeOrAny(filename.extension)
}

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.common.common"/>

@ -0,0 +1,11 @@
package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.MPPFile
import dev.inmo.micro_utils.common.filename
import dev.inmo.micro_utils.mime_types.MimeType
import dev.inmo.micro_utils.mime_types.getMimeTypeOrAny
actual val MPPFile.mimeType: MimeType
get() {
return getMimeTypeOrAny(filename.extension)
}

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.binary.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.binary.common"/>

@ -6,7 +6,6 @@ import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.micro_utils.mime_types.KnownMimeTypes import dev.inmo.micro_utils.mime_types.KnownMimeTypes
import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.pagination.*
import dev.inmo.micro_utils.repos.* import dev.inmo.micro_utils.repos.*
import dev.inmo.postssystem.features.common.common.FileBasedInputProvider
import dev.inmo.postssystem.features.content.common.* import dev.inmo.postssystem.features.content.common.*
import dev.inmo.postssystem.features.content.server.storage.ServerContentStorage import dev.inmo.postssystem.features.content.server.storage.ServerContentStorage
import dev.inmo.postssystem.features.files.common.* import dev.inmo.postssystem.features.files.common.*

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.common"/>

@ -3,6 +3,7 @@ plugins {
id "org.jetbrains.kotlin.plugin.serialization" id "org.jetbrains.kotlin.plugin.serialization"
id "com.android.library" id "com.android.library"
alias(libs.plugins.compose) alias(libs.plugins.compose)
alias(libs.plugins.kt.jb.compose)
} }
apply from: "$mppProjectWithSerializationPresetPath" apply from: "$mppProjectWithSerializationPresetPath"

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.content.text.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.content.content.text.common"/>

@ -2,28 +2,28 @@ package dev.inmo.postssystem.features.files.client
import dev.inmo.postssystem.features.files.common.* import dev.inmo.postssystem.features.files.common.*
import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage
import dev.inmo.micro_utils.ktor.client.UnifiedRequester import dev.inmo.micro_utils.ktor.client.bodyOrNull
import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.ktor.common.buildStandardUrl
import dev.inmo.micro_utils.repos.ReadCRUDRepo import dev.inmo.micro_utils.repos.ReadCRUDRepo
import dev.inmo.micro_utils.repos.ktor.client.crud.KtorReadStandardCrudRepo import dev.inmo.micro_utils.repos.ktor.client.crud.KtorReadCRUDRepoClient
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.post import io.ktor.client.request.*
import io.ktor.client.request.setBody
import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.readBytes import io.ktor.client.statement.readBytes
import io.ktor.http.ContentType
import io.ktor.http.encodeURLQueryComponent
import kotlinx.serialization.BinaryFormat import kotlinx.serialization.BinaryFormat
import kotlinx.serialization.builtins.nullable import kotlinx.serialization.builtins.nullable
class ClientReadFilesStorage( class ClientReadFilesStorage(
baseUrl: String, baseUrl: String,
private val client: HttpClient, private val client: HttpClient,
private val serialFormat: BinaryFormat private val serialFormat: BinaryFormat,
) : ReadFilesStorage, ReadCRUDRepo<MetaFileInfoStorageWrapper, FileId> by KtorReadStandardCrudRepo( contentType: ContentType
) : ReadFilesStorage, ReadCRUDRepo<MetaFileInfoStorageWrapper, FileId> by KtorReadCRUDRepoClient<MetaFileInfoStorageWrapper, FileId>(
buildStandardUrl(baseUrl, filesRootPathPart), buildStandardUrl(baseUrl, filesRootPathPart),
UnifiedRequester(client, serialFormat), client,
MetaFileInfoStorageWrapper.serializer(), contentType,
MetaFileInfoStorageWrapper.serializer().nullable, { it.string.encodeURLQueryComponent() }
FileId.serializer()
) { ) {
private val fullFilesPath = buildStandardUrl(baseUrl, filesRootPathPart) private val fullFilesPath = buildStandardUrl(baseUrl, filesRootPathPart)
private val fullFilesGetBytesPath = buildStandardUrl( private val fullFilesGetBytesPath = buildStandardUrl(
@ -37,12 +37,11 @@ class ClientReadFilesStorage(
override suspend fun getFullFileInfo( override suspend fun getFullFileInfo(
id: FileId id: FileId
): FullFileInfoStorageWrapper? = unifiedRequester.uniget( ): FullFileInfoStorageWrapper? = client.get(
buildStandardUrl( buildStandardUrl(
fullFilesPath, fullFilesPath,
filesGetFullFileInfoPathPart, filesGetFullFileInfoPathPart,
filesFileIdParameter to unifiedRequester.encodeUrlQueryValue(FileId.serializer(), id) filesFileIdParameter to id.string.encodeURLQueryComponent()
), )
FullFileInfoStorageWrapper.serializer().nullable ).bodyOrNull()
)
} }

@ -5,5 +5,5 @@ import dev.inmo.postssystem.features.auth.client.AuthorizedQualifiers
import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage
val loader = AuthorizedModuleLoader { val loader = AuthorizedModuleLoader {
single<ReadFilesStorage> { ClientReadFilesStorage(get(AuthorizedQualifiers.ServerUrlQualifier), get(), get()) } single<ReadFilesStorage> { ClientReadFilesStorage(get(AuthorizedQualifiers.ServerUrlQualifier), get(), get(), get()) }
} }

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.files.client"/>

@ -61,4 +61,8 @@ class DiskReadFilesStorage(
} }
) )
} }
override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<FileId> {
return metasKeyValueRepo.keys(pagination)
}
} }

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.files.common"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.posts.client"/>

@ -1,6 +1,6 @@
package dev.inmo.postssystem.features.posts.common package dev.inmo.postssystem.features.posts.common
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import dev.inmo.postssystem.features.common.common.DateTimeSerializer import dev.inmo.postssystem.features.common.common.DateTimeSerializer
import dev.inmo.postssystem.features.content.common.Content import dev.inmo.postssystem.features.content.common.Content
import dev.inmo.postssystem.features.content.common.ContentId import dev.inmo.postssystem.features.content.common.ContentId

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.posts.common"/>

@ -1,6 +1,6 @@
package dev.inmo.postssystem.features.posts.server package dev.inmo.postssystem.features.posts.server
import com.soywiz.klock.DateTime import korlibs.time.DateTime
import dev.inmo.micro_utils.repos.exposed.* import dev.inmo.micro_utils.repos.exposed.*
import dev.inmo.postssystem.features.content.common.ContentId import dev.inmo.postssystem.features.content.common.ContentId
import dev.inmo.postssystem.features.posts.common.* import dev.inmo.postssystem.features.posts.common.*

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.publication.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.publication.common"/>

@ -1,7 +1,7 @@
package dev.inmo.postssystem.features.roles.client package dev.inmo.postssystem.features.roles.client
import dev.inmo.postssystem.features.roles.common.* import dev.inmo.postssystem.features.roles.common.*
import dev.inmo.micro_utils.ktor.client.UnifiedRequester import io.ktor.client.*
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
class ClientRolesStorage<T : Role>( class ClientRolesStorage<T : Role>(

@ -27,7 +27,7 @@ class ReadClientRolesStorage<T : Role>(
buildStandardUrl( buildStandardUrl(
userRolesFullUrl, userRolesFullUrl,
usersRolesGetSubjectsPathPart, usersRolesGetSubjectsPathPart,
usersRolesRoleQueryParameterName to unifiedRequester.encodeUrlQueryValue(serializer, role) usersRolesRoleQueryParameterName to role
) )
).body() ).body()

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.roles.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.roles.common"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.roles.manager.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.roles.manager.common"/>

@ -2,11 +2,9 @@ package dev.inmo.postssystem.features.status.client
import dev.inmo.postssystem.features.status.common.statusAuthorisedPathPart import dev.inmo.postssystem.features.status.common.statusAuthorisedPathPart
import dev.inmo.postssystem.features.status.common.statusRootPart import dev.inmo.postssystem.features.status.common.statusRootPart
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.ktor.common.buildStandardUrl
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.request.get import io.ktor.client.request.get
import io.ktor.client.statement.HttpResponse
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
class StatusFeatureClient( class StatusFeatureClient(

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.status.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.status.common"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.template.client"/>

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.template.common"/>

@ -5,5 +5,5 @@ import dev.inmo.postssystem.features.auth.client.AuthorizedQualifiers
import dev.inmo.postssystem.features.users.common.ReadUsersStorage import dev.inmo.postssystem.features.users.common.ReadUsersStorage
val loader = AuthorizedModuleLoader { val loader = AuthorizedModuleLoader {
single<ReadUsersStorage> { UsersStorageKtorClient(get(AuthorizedQualifiers.ServerUrlQualifier), get()) } single<ReadUsersStorage> { UsersStorageKtorClient(get(AuthorizedQualifiers.ServerUrlQualifier), get(), get()) }
} }

@ -1,19 +1,19 @@
package dev.inmo.postssystem.features.users.client package dev.inmo.postssystem.features.users.client
import dev.inmo.postssystem.features.users.common.* import dev.inmo.postssystem.features.users.common.*
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.ktor.common.buildStandardUrl
import dev.inmo.micro_utils.repos.ReadCRUDRepo import dev.inmo.micro_utils.repos.ReadCRUDRepo
import dev.inmo.micro_utils.repos.ktor.client.crud.KtorReadStandardCrudRepo import dev.inmo.micro_utils.repos.ktor.client.crud.KtorReadCRUDRepoClient
import kotlinx.serialization.builtins.nullable import io.ktor.client.*
import io.ktor.http.*
class UsersStorageKtorClient( class UsersStorageKtorClient(
baseUrl: String, baseUrl: String,
client: HttpClient client: HttpClient,
) : ReadUsersStorage, ReadCRUDRepo<User, UserId> by KtorReadStandardCrudRepo( contentType: ContentType
) : ReadUsersStorage, ReadCRUDRepo<User, UserId> by KtorReadCRUDRepoClient(
buildStandardUrl(baseUrl, usersServerPathPart), buildStandardUrl(baseUrl, usersServerPathPart),
client, client,
User.serializer(), contentType,
User.serializer().nullable, { it.long.toString() }
UserId.serializer()
) )

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.users.client"/>

@ -21,7 +21,3 @@ kotlin {
} }
} }
} }
android {
disableIncludingJvmCodeInAndroidPart()
}

@ -31,7 +31,7 @@ sealed class User : NewUser {
} }
@Serializable @Serializable
data class DefaultUser( data class RegisteredUser(
override val id: UserId, override val id: UserId,
override val firstName: String, override val firstName: String,
override val lastName: String, override val lastName: String,

@ -3,8 +3,7 @@ package dev.inmo.postssystem.features.users.common
import dev.inmo.micro_utils.repos.exposed.AbstractExposedCRUDRepo import dev.inmo.micro_utils.repos.exposed.AbstractExposedCRUDRepo
import dev.inmo.micro_utils.repos.exposed.initTable import dev.inmo.micro_utils.repos.exposed.initTable
import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.statements.InsertStatement import org.jetbrains.exposed.sql.statements.*
import org.jetbrains.exposed.sql.statements.UpdateStatement
class ExposedUsersStorage(override val database: Database) : UsersStorage, AbstractExposedCRUDRepo<User, UserId, NewUser>( class ExposedUsersStorage(override val database: Database) : UsersStorage, AbstractExposedCRUDRepo<User, UserId, NewUser>(
tableName = "Users" tableName = "Users"
@ -15,11 +14,12 @@ class ExposedUsersStorage(override val database: Database) : UsersStorage, Abstr
private val lastNameColumn = text("lastName") private val lastNameColumn = text("lastName")
override val primaryKey: PrimaryKey = PrimaryKey(userIdColumn) override val primaryKey: PrimaryKey = PrimaryKey(userIdColumn)
override val selectById: ISqlExpressionBuilder.(UserId) -> Op<Boolean> = { userIdColumn.eq(it.long) }
override val ResultRow.asId: UserId
get() = UserId(get(userIdColumn))
override val selectByIds: SqlExpressionBuilder.(List<UserId>) -> Op<Boolean> = { userIdColumn.inList(it.map { it.long }) }
override val selectById: SqlExpressionBuilder.(UserId) -> Op<Boolean> = { userIdColumn.eq(it.long) }
override val ResultRow.asObject: User override val ResultRow.asObject: User
get() = DefaultUser( get() = RegisteredUser(
get(userIdColumn).userId, get(userIdColumn).userId,
get(firstNameColumn), get(firstNameColumn),
get(lastNameColumn), get(lastNameColumn),
@ -30,19 +30,19 @@ class ExposedUsersStorage(override val database: Database) : UsersStorage, Abstr
initTable() initTable()
} }
override fun insert(value: NewUser, it: InsertStatement<Number>) { override fun insert(value: NewUser, it: UpdateBuilder<Int>) {
it[usernameColumn] = value.username.string it[usernameColumn] = value.username.string
it[firstNameColumn] = value.firstName it[firstNameColumn] = value.firstName
it[lastNameColumn] = value.lastName it[lastNameColumn] = value.lastName
} }
override fun update(id: UserId, value: NewUser, it: UpdateStatement) { override fun update(id: UserId?, value: NewUser, it: UpdateBuilder<Int>) {
it[usernameColumn] = value.username.string it[usernameColumn] = value.username.string
it[firstNameColumn] = value.firstName it[firstNameColumn] = value.firstName
it[lastNameColumn] = value.lastName it[lastNameColumn] = value.lastName
} }
override fun InsertStatement<Number>.asObject(value: NewUser): User = DefaultUser( override fun InsertStatement<Number>.asObject(value: NewUser): User = RegisteredUser(
get(userIdColumn).userId, get(userIdColumn).userId,
get(firstNameColumn), get(firstNameColumn),
get(lastNameColumn), get(lastNameColumn),

@ -1 +0,0 @@
<manifest package="dev.inmo.postssystem.features.users.common"/>

@ -1,6 +1,6 @@
kotlin.code.style=official kotlin.code.style=official
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2g org.gradle.jvmargs=-Xmx4g
kotlin.js.generate.externals=true kotlin.js.generate.externals=true
kotlin.incremental=true kotlin.incremental=true
kotlin.incremental.js=true kotlin.incremental.js=true

@ -1,39 +1,42 @@
[versions] [versions]
kotlin = "1.6.21" kotlin = "2.0.10"
kotlin-serialization = "1.3.3" kotlin-serialization = "1.7.1"
jsuikit = "0.1.7" kotlin-coroutines = "1.8.1"
compose = "1.2.0-alpha01-dev731" jsuikit = "0.7.6"
microutils = "0.11.12" compose = "1.7.0-alpha02"
tgbotapi = "2.1.2" microutils = "0.22.0"
ktor = "2.0.3" tgbotapi = "17.0.0"
klock = "2.7.0" ktor = "2.3.11"
koin = "3.2.0" korlibs = "5.4.0"
exposed = "0.38.2" koin = "3.5.6"
exposed = "0.53.0"
psql = "42.3.6" psql = "42.3.6"
scrimage = "4.0.31" scrimage = "4.1.1"
dokka = "1.6.21" dokka = "1.9.20"
logback = "1.2.10" logback = "1.2.10"
uuid = "0.4.1" uuid = "0.8.4"
android-junit = "4.12" android-junit = "4.12"
android-test-junit = "1.1.2" android-test-junit = "1.1.2"
android-espresso-core = "3.3.0" android-espresso-core = "3.3.0"
gh-release = "2.4.1" gh-release = "2.5.1"
android-gradle = "7.0.4" android-gradle = "8.2.2"
dexcount = "3.1.0" dexcount = "3.1.0"
android-coreKtx = "1.7.0" android-coreKtx = "1.12.0"
android-recyclerView = "1.2.1" android-recyclerView = "1.2.1"
android-appCompat = "1.4.1" android-appCompat = "1.4.1"
android-fragment = "1.6.2"
android-compose-material3 = "1.1.2"
android-espresso = "3.3.0" android-espresso = "3.3.0"
android-test = "1.1.2" android-test = "1.1.2"
android-props-minSdk = "19" android-props-minSdk = "21"
android-props-compileSdk = "32" android-props-compileSdk = "35"
android-props-buildTools = "32.0.0" android-props-buildTools = "35.0.0"
[libraries] [libraries]
@ -42,6 +45,10 @@ kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref =
kotlin-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlin-serialization" } kotlin-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlin-serialization" }
kotlin-serialization-properties = { module = "org.jetbrains.kotlinx:kotlinx-serialization-properties", version.ref = "kotlin-serialization" } kotlin-serialization-properties = { module = "org.jetbrains.kotlinx:kotlinx-serialization-properties", version.ref = "kotlin-serialization" }
kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlin-coroutines" }
kotlin-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlin-coroutines" }
kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlin-coroutines" }
jsuikit = { module = "dev.inmo:kjsuikit", version.ref = "jsuikit" } jsuikit = { module = "dev.inmo:kjsuikit", version.ref = "jsuikit" }
postgresql = { module = "org.postgresql:postgresql", version.ref = "psql" } postgresql = { module = "org.postgresql:postgresql", version.ref = "psql" }
@ -81,12 +88,18 @@ microutils-serialization-typedserializer = { module = "dev.inmo:micro_utils.seri
tgbotapi = { module = "dev.inmo:tgbotapi", version.ref = "tgbotapi" } tgbotapi = { module = "dev.inmo:tgbotapi", version.ref = "tgbotapi" }
klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" } klock = { module = "com.soywiz.korge:korlibs-time", version.ref = "korlibs" }
krypto = { module = "com.soywiz.korge:korlibs-crypto", version.ref = "korlibs" }
scrimage = { module = "com.sksamuel.scrimage:scrimage-core", version.ref = "scrimage" } scrimage = { module = "com.sksamuel.scrimage:scrimage-core", version.ref = "scrimage" }
androidx-test-junit = { module = "androidx.test.ext:junit", version.ref = "android-test-junit" } android-coreKtx = { module = "androidx.core:core-ktx", version.ref = "android-coreKtx" }
androidx-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "android-espresso-core" } android-recyclerView = { module = "androidx.recyclerview:recyclerview", version.ref = "android-recyclerView" }
android-appCompat-resources = { module = "androidx.appcompat:appcompat-resources", version.ref = "android-appCompat" }
android-compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "android-compose-material3" }
android-fragment = { module = "androidx.fragment:fragment", version.ref = "android-fragment" }
android-espresso = { module = "androidx.test.espresso:espresso-core", version.ref = "android-espresso" }
android-test-junit = { module = "androidx.test.ext:junit", version.ref = "android-test" }
# classpaths # classpaths
@ -100,3 +113,4 @@ buildscript-android-dexcount = { module = "com.getkeepsafe.dexcount:dexcount-gra
[plugins] [plugins]
compose = { id = "org.jetbrains.compose", version.ref = "compose" } compose = { id = "org.jetbrains.compose", version.ref = "compose" }
kt-jb-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

@ -1,4 +1,4 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

@ -1,11 +1,16 @@
project.version = "$version" project.version = "$version"
project.group = "$group" project.group = "$group"
// apply from: "$publishGradlePath" apply from: "$publishGradlePath"
kotlin { kotlin {
android { androidTarget {
publishAllLibraryVariants() publishAllLibraryVariants()
compilations.all {
kotlinOptions {
jvmTarget = "17"
}
}
} }
sourceSets { sourceSets {
@ -18,18 +23,15 @@ kotlin {
dependencies { dependencies {
implementation kotlin('test-common') implementation kotlin('test-common')
implementation kotlin('test-annotations-common') implementation kotlin('test-annotations-common')
} implementation libs.kt.coroutines.test
}
androidTest {
dependencies {
implementation kotlin('test-junit')
implementation libs.androidx.test.junit
implementation libs.androidx.espresso
} }
} }
} }
allTargetsConfiguration()
} }
apply from: "$defaultAndroidSettingsPresetPath" apply from: "$defaultAndroidSettingsPresetPath"
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

@ -4,7 +4,13 @@ project.group = "$group"
apply from: "$publishGradlePath" apply from: "$publishGradlePath"
kotlin { kotlin {
jvm() jvm {
compilations.main {
kotlinOptions {
jvmTarget = "17"
}
}
}
sourceSets { sourceSets {
commonMain { commonMain {
@ -16,6 +22,7 @@ kotlin {
dependencies { dependencies {
implementation kotlin('test-common') implementation kotlin('test-common')
implementation kotlin('test-annotations-common') implementation kotlin('test-annotations-common')
implementation libs.kotlin.coroutines.test
} }
} }
@ -25,11 +32,9 @@ kotlin {
} }
} }
} }
allTargetsConfiguration()
} }
java { java {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_17
} }

@ -13,21 +13,25 @@ kotlin {
commonMain { commonMain {
dependencies { dependencies {
implementation kotlin('stdlib') implementation kotlin('stdlib')
api libs.kotlin.serialization
} }
} }
commonTest { commonTest {
dependencies { dependencies {
implementation kotlin('test-common') implementation kotlin('test-common')
implementation kotlin('test-annotations-common') implementation kotlin('test-annotations-common')
implementation libs.kotlin.coroutines.test
} }
} }
jsTest { jsTest {
dependencies { dependencies {
implementation kotlin('test-js') implementation kotlin('test-js')
implementation kotlin('test-junit')
} }
} }
} }
}
allTargetsConfiguration()
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
} }

@ -4,19 +4,30 @@ project.group = "$group"
apply from: "$publishGradlePath" apply from: "$publishGradlePath"
kotlin { kotlin {
jvm() jvm {
compilations.main {
kotlinOptions {
jvmTarget = "17"
}
}
}
js (IR) { js (IR) {
browser() browser()
nodejs() nodejs()
} }
android { androidTarget {
publishAllLibraryVariants() publishAllLibraryVariants()
compilations.all {
kotlinOptions {
jvmTarget = "17"
}
}
} }
sourceSets { sourceSets {
commonMain { commonMain {
dependencies { dependencies {
implementation libs.kotlin.std implementation kotlin('stdlib')
api libs.kotlin.serialization api libs.kotlin.serialization
} }
} }
@ -24,6 +35,7 @@ kotlin {
dependencies { dependencies {
implementation kotlin('test-common') implementation kotlin('test-common')
implementation kotlin('test-annotations-common') implementation kotlin('test-annotations-common')
implementation libs.kotlin.coroutines.test
} }
} }
jvmTest { jvmTest {
@ -34,24 +46,23 @@ kotlin {
jsTest { jsTest {
dependencies { dependencies {
implementation kotlin('test-js') implementation kotlin('test-js')
implementation kotlin('test-junit')
} }
} }
androidTest { androidUnitTest {
dependencies { dependencies {
implementation kotlin('test-junit') implementation kotlin('test-junit')
implementation libs.androidx.test.junit implementation libs.android.test.junit
implementation libs.androidx.espresso implementation libs.android.espresso
} }
} }
}
allTargetsConfiguration() androidMain.dependsOn jvmMain
}
} }
apply from: "$defaultAndroidSettingsPresetPath" apply from: "$defaultAndroidSettingsPresetPath"
java { java {
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_17
} }

@ -1,11 +1,13 @@
package dev.inmo.postssystem.publicators.simple.client package dev.inmo.postssystem.publicators.simple.client
import dev.inmo.micro_utils.ktor.client.UnifiedRequester
import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.ktor.common.buildStandardUrl
import dev.inmo.postssystem.features.posts.common.PostId import dev.inmo.postssystem.features.posts.common.PostId
import dev.inmo.postssystem.features.publication.common.publicatorsRootPath import dev.inmo.postssystem.features.publication.common.publicatorsRootPath
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorPublishPathPart import dev.inmo.postssystem.publicators.simple.common.simplePublicatorPublishPathPart
import dev.inmo.postssystem.publicators.simple.common.simplePublicatorRootPath import dev.inmo.postssystem.publicators.simple.common.simplePublicatorRootPath
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import kotlinx.serialization.builtins.serializer import kotlinx.serialization.builtins.serializer
class SimplePublicatorServiceClient( class SimplePublicatorServiceClient(
@ -25,9 +27,9 @@ class SimplePublicatorServiceClient(
simplePublicatorPublishPathPart simplePublicatorPublishPathPart
) )
override suspend fun publish(postId: PostId) = unifiedRequester.unipost( override suspend fun publish(postId: PostId) = client.post(
publishFullUrl, publishFullUrl,
PostId.serializer() to postId, ) {
Unit.serializer() setBody(postId)
) }.body<Unit>()
} }

@ -1,7 +1,7 @@
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
task javadocsJar(type: Jar) { task javadocsJar(type: Jar) {
classifier = 'javadoc' archiveClassifier = 'javadoc'
} }
publishing { publishing {
@ -49,12 +49,15 @@ publishing {
maven { maven {
name = "GitHubPackages" name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/PostsSystem/core") url = uri("https://maven.pkg.github.com/PostsSystem/core")
credentials { credentials {
username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER') username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER')
password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD') password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD')
} }
} }
} }
} }
} }
} }

@ -8,7 +8,6 @@ import dev.inmo.micro_utils.ktor.common.encodeHex
import dev.inmo.micro_utils.repos.ktor.common.crud.createRouting import dev.inmo.micro_utils.repos.ktor.common.crud.createRouting
import dev.inmo.micro_utils.repos.ktor.common.crud.updateRouting import dev.inmo.micro_utils.repos.ktor.common.crud.updateRouting
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.removeRoute import dev.inmo.micro_utils.repos.ktor.common.one_to_many.removeRoute
import dev.inmo.postssystem.features.common.common.FileBasedInputProvider
import dev.inmo.postssystem.features.common.common.SimpleInputProvider import dev.inmo.postssystem.features.common.common.SimpleInputProvider
import dev.inmo.postssystem.features.content.common.* import dev.inmo.postssystem.features.content.common.*
import dev.inmo.postssystem.features.files.common.FileId import dev.inmo.postssystem.features.files.common.FileId

@ -11,7 +11,6 @@ import dev.inmo.micro_utils.repos.ktor.common.crud.createRouting
import dev.inmo.micro_utils.repos.ktor.common.crud.updateRouting import dev.inmo.micro_utils.repos.ktor.common.crud.updateRouting
import dev.inmo.micro_utils.repos.ktor.common.one_to_many.removeRoute import dev.inmo.micro_utils.repos.ktor.common.one_to_many.removeRoute
import dev.inmo.micro_utils.repos.ktor.server.crud.configureReadCRUDRepoRoutes import dev.inmo.micro_utils.repos.ktor.server.crud.configureReadCRUDRepoRoutes
import dev.inmo.postssystem.features.common.common.FileBasedInputProvider
import dev.inmo.postssystem.features.content.common.* import dev.inmo.postssystem.features.content.common.*
import dev.inmo.postssystem.features.files.common.FileId import dev.inmo.postssystem.features.files.common.FileId
import dev.inmo.postssystem.features.posts.common.* import dev.inmo.postssystem.features.posts.common.*

@ -83,5 +83,3 @@ includes.each { originalName ->
project.projectDir = new File(projectDirectory) project.projectDir = new File(projectDirectory)
println(project) println(project)
} }
enableFeaturePreview("VERSION_CATALOGS")