diff --git a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt index fc3068f..8ecc931 100644 --- a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt +++ b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt @@ -5,6 +5,7 @@ import com.github.jasync.sql.db.postgresql.PostgreSQLConnection import com.github.jasync.sql.db.postgresql.PostgreSQLConnectionBuilder import fr.postgresjson.entity.EntityI import fr.postgresjson.serializer.Serializer +import java.io.File class Connection( @@ -12,11 +13,24 @@ class Connection( private val port: Int = 5432, private val database: String = "dc-project", private val username: String = "dc-project", - private val password: String = "dc-project" + private val password: String = "dc-project", + queriesDirectory: File? = null ) { + private val queries = mutableMapOf>() private lateinit var connection: ConnectionPool val serializer = Serializer() + init { + if (queriesDirectory === null) { + val resource = this::class.java.getResource("/sql/query") + if (resource !== null) { + fetchQueries(File(resource.toURI())) + } + } else { + fetchQueries(queriesDirectory) + } + } + fun connect(): ConnectionPool { if (!::connection.isInitialized || !connection.isConnected()) { connection = PostgreSQLConnectionBuilder.createConnectionPool( @@ -26,7 +40,13 @@ class Connection( return connection } - inline fun > selectOne(sql: String, values: List = emptyList()): R? { + inline fun ?> selectOne(group: String, name: String, values: List = emptyList()): R? { + val sql: String = getQuery(group, name) + + return selectOne(sql, values) + } + + inline fun ?> selectOne(sql: String, values: List = emptyList()): R? { val future = connect().sendPreparedStatement(sql, values) val json = future.get().rows[0].getString(0) if (json === null) { @@ -49,4 +69,24 @@ class Connection( return obj } } + + private fun fetchQueries(queriesDirectory: File) { + queriesDirectory.walk().filter{it.isDirectory}.forEach { directory -> + val group = directory.name + directory.walk().filter{it.isFile}.forEach { file -> + val sql = file.readText() + if (queries[group] === null) { + queries[group] = mutableMapOf() + } + queries[group]!![file.nameWithoutExtension] = sql + } + } + } + + fun getQuery(group: String, name: String): String { + if (queries[group] === null || queries[group]!![name] === null) { + throw Exception("No query defined for $group/$name") + } + return queries[group]!![name]!! + } } \ No newline at end of file diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt index ab4e847..2d88019 100644 --- a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -32,8 +32,8 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { return mapper.writeValueAsString(source) } - inline fun > deserialize(json: String): E { - return this.mapper.readValue(json) + inline fun ?> deserialize(json: String): E { + return this.mapper.readValue(json) } inline fun deserializeList(json: String): E { diff --git a/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt b/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt index 7c18c93..519da48 100644 --- a/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt +++ b/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt @@ -7,6 +7,9 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class ConnectionTest() { + private class ObjTest(var name: String): IdEntity() + private class ObjTest2(var title: String, var test: ObjTest?): IdEntity() + private lateinit var connection: Connection @BeforeEach @@ -41,7 +44,4 @@ class ConnectionTest() { assertTrue(objs[0].id == 1) assertTrue(objs[0].test!!.id == 1) } -} - -class ObjTest(var name: String): IdEntity() -class ObjTest2(var title: String, var test: ObjTest?): IdEntity() \ No newline at end of file +} \ No newline at end of file diff --git a/src/test/kotlin/fr/postgresjson/serializer/RequestTest.kt b/src/test/kotlin/fr/postgresjson/serializer/RequestTest.kt new file mode 100644 index 0000000..c4d1a70 --- /dev/null +++ b/src/test/kotlin/fr/postgresjson/serializer/RequestTest.kt @@ -0,0 +1,19 @@ +package fr.postgresjson.serializer + +import fr.postgresjson.connexion.Connection +import fr.postgresjson.entity.IdEntity +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import java.io.File + +class RequestTest { + class ObjTest(var name:String): IdEntity(1) + + @Test + fun getRequestFromFile() { + val resources = File(this::class.java.getResource("/sql/query").toURI()) + val objTest: ObjTest? = Connection(queriesDirectory = resources).selectOne("Test", "test") + assertTrue(objTest!!.id == 2) + assertTrue(objTest.name == "test") + } +} \ No newline at end of file diff --git a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt index f97d3dd..ed1126d 100644 --- a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt +++ b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt @@ -9,7 +9,7 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class SerializerTest { - class ObjTest(var val1: String, var val2: Int) : IdEntity(1) + private class ObjTest(var val1: String, var val2: Int) : IdEntity(1) private val serializer = Serializer() diff --git a/src/test/resources/sql/query/Test/test.sql b/src/test/resources/sql/query/Test/test.sql new file mode 100644 index 0000000..6530ea1 --- /dev/null +++ b/src/test/resources/sql/query/Test/test.sql @@ -0,0 +1 @@ +select json_build_object('id', 2, 'name', 'test'); \ No newline at end of file