Basic funcionality of Ktor

This commit is contained in:
2025-01-13 18:23:20 +01:00
parent c0f6a22582
commit c1e8f9654f
7 changed files with 62 additions and 5 deletions

View File

@@ -59,7 +59,7 @@ fun Application.module() {
dictionary(dictionaryService) dictionary(dictionaryService)
pronunciation(pronunciationService) pronunciation(pronunciationService)
language(languageService) language(languageService)
translation(translationService) translation(translationService,termService)
term(termService) term(termService)
} }

View File

@@ -13,12 +13,14 @@ import javax.sql.DataSource
import tables.* import tables.*
import dao.* import dao.*
import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigFactory
import models.Translation
object DatabaseFactory { object DatabaseFactory {
private val log = LoggerFactory.getLogger(this::class.java) private val log = LoggerFactory.getLogger(this::class.java)
private val dbs : MutableMap<Int,Database> = mutableMapOf() private val dbs : MutableMap<Int,Database> = mutableMapOf()
private val hdb : MutableMap<String,Database> = mutableMapOf() private val hdb : MutableMap<String,Database> = mutableMapOf()
private val htrans: MutableMap<String,Translation> = mutableMapOf()
fun connectAndMigrate() { fun connectAndMigrate() {
log.info("Initialising database") log.info("Initialising database")
@@ -41,9 +43,18 @@ object DatabaseFactory {
return HikariDataSource(config) return HikariDataSource(config)
} }
fun getTranslationForLanguages(l1: String, l2: String): Translation? = htrans["${l1}${l2}"]?: null
fun connectAll(): Map<Int,Database> { fun connectAll(): Map<Int,Database> {
val hMap : MutableMap<Int, Database> = mutableMapOf() val hMap : MutableMap<Int, Database> = mutableMapOf()
transaction { transaction {
for (trans in TranslationDao.all()) {
val l1 = trans.lang1.shortName.lowercase()
val l2 = trans.lang2.shortName.lowercase()
htrans["${l1}${l2}"] = trans.toModel()
}
for (dict in DictionaryDao.all()) { for (dict in DictionaryDao.all()) {
val cfg = ConfigFactory.load().getConfig("h2") val cfg = ConfigFactory.load().getConfig("h2")
val config = HikariConfig().apply { val config = HikariConfig().apply {

View File

@@ -4,10 +4,14 @@ import dao.TermDao
import models.Term import models.Term
import models.TermFull import models.TermFull
import models.Pronunciation import models.Pronunciation
import models.Translation
interface TermService { interface TermService {
fun getTerm(id: Int): Term? fun getTerm(id: Int): Term?
fun getFullTerm(id: Int): TermFull? fun getFullTerm(id: Int): TermFull?
fun getAllTerm(): List<Term> fun getAllTerm(): List<Term>
fun getPronunciationsForTerm(id: Int): List<Pronunciation>? fun getPronunciationsForTerm(id: Int): List<Pronunciation>?
fun getTranslationForTerm(term: String, trans: Translation): List<TermFull>?
fun getTranslationForTerm(term: String, fromLang: String, toLang: String): List<TermFull>?
} }

View File

@@ -3,9 +3,12 @@ package service
import dao.TermDao import dao.TermDao
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import service.DatabaseFactory.dbExecId import service.DatabaseFactory.dbExecId
import service.DatabaseFactory.dbExecName
import models.Term import models.Term
import models.TermFull import models.TermFull
import models.Pronunciation import models.Pronunciation
import models.Translation
import tables.*
class TermServiceImpl : TermService { class TermServiceImpl : TermService {
override fun getTerm(id: Int): Term? = dbExecId(1) { override fun getTerm(id: Int): Term? = dbExecId(1) {
@@ -21,6 +24,19 @@ class TermServiceImpl : TermService {
} }
override fun getPronunciationsForTerm(id: Int): List<Pronunciation>? = dbExecId(1) { override fun getPronunciationsForTerm(id: Int): List<Pronunciation>? = dbExecId(1) {
null TermDao.findById(id)?.toFullModel()?.pronunciations
} }
override fun getTranslationForTerm(term: String,trans: Translation): List<TermFull>? =
dbExecId(trans.dictionaryId) {
if (trans.direction == 1)
TermDao.find { Terms.string1 eq term }.map { it.toFullModel() }
else
TermDao.find { Terms.string2 eq term }.map { it.toFullModel() }
}
override fun getTranslationForTerm(term: String, fromLang: String, toLang: String): List<TermFull>? = dbExecName(fromLang,toLang) {
TermDao.find { Terms.string1 eq term }.map { it.toFullModel() }
}
} }

View File

@@ -5,5 +5,6 @@ import models.Translation
interface TranslationService { interface TranslationService {
fun getTranslation(id: Int): Translation? fun getTranslation(id: Int): Translation?
fun getTranslationFromTo(from: String, to: String): Translation?
fun getAllTranslations(): List<Translation> fun getAllTranslations(): List<Translation>
} }

View File

@@ -1,17 +1,24 @@
package service package service
import dao.TranslationDao import dao.TranslationDao
import dao.LanguageDao
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import service.DatabaseFactory.dbExecId import service.DatabaseFactory.dbExecId
import service.DatabaseFactory.getTranslationForLanguages
import models.Translation import models.Translation
import tables.Translations
import tables.Languages
class TranslationServiceImpl : TranslationService { class TranslationServiceImpl : TranslationService {
override fun getTranslation(id: Int): Translation? = dbExecId(1) { override fun getTranslation(id: Int): Translation? = dbExecId(0) {
TranslationDao.findById(id)?.toModel() TranslationDao.findById(id)?.toModel()
} }
override fun getAllTranslations(): List<Translation> = dbExecId(1) { override fun getAllTranslations(): List<Translation> = dbExecId(0) {
TranslationDao.all().map { it.toModel() } TranslationDao.all().map { it.toModel() }
} }
override fun getTranslationFromTo(from: String, to: String): Translation? = dbExecId(0) {
getTranslationForLanguages(from,to)
}
} }

View File

@@ -8,8 +8,12 @@ import io.ktor.server.websocket.*
import io.ktor.websocket.* import io.ktor.websocket.*
import service.TranslationServiceImpl import service.TranslationServiceImpl
import service.TranslationService import service.TranslationService
import service.TermServiceImpl
import service.TermService
import service.DatabaseFactory.getTranslationForLanguages
fun Route.translation(TranslationService: TranslationServiceImpl) {
fun Route.translation(TranslationService: TranslationServiceImpl,TermService: TermServiceImpl) {
route("/translation") { route("/translation") {
@@ -24,6 +28,20 @@ fun Route.translation(TranslationService: TranslationServiceImpl) {
else call.respond(Translation) else call.respond(Translation)
} }
get("/{from}/{to}/{term}") {
val from = call.parameters["from"]?: throw IllegalStateException("Must provide from")
val to = call.parameters["to"]?: throw IllegalStateException("Must provide to")
val term = call.parameters["term"]?: throw IllegalStateException("Must provide term")
val translation = getTranslationForLanguages(from,to)
if (translation == null) call.respond(HttpStatusCode.NotFound)
else {
val terms = TermService.getTranslationForTerm(term,translation)
if (terms == null) call.respond(HttpStatusCode.NotFound)
else call.respond(terms)
}
}
} }
} }