diff --git a/build.sbt b/build.sbt index c7b7fb00..943a356d 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ import sbtassembly.AssemblyPlugin.autoImport.assembly val V = new { val Scala = "3.3.1-RC4" - val jakon = "0.5.5" + val jakon = "0.5.6-SNAPSHOT" val spark = "2.9.4-JAKON.2" val log4j = "2.20.0" val circeVersion = "0.14.5" diff --git a/modules/backend/src/main/scala/cz/kamenitxan/jakon/core/database/DBHelper.scala b/modules/backend/src/main/scala/cz/kamenitxan/jakon/core/database/DBHelper.scala index 4c2741d7..af71cdf0 100644 --- a/modules/backend/src/main/scala/cz/kamenitxan/jakon/core/database/DBHelper.scala +++ b/modules/backend/src/main/scala/cz/kamenitxan/jakon/core/database/DBHelper.scala @@ -2,6 +2,7 @@ package cz.kamenitxan.jakon.core.database import com.zaxxer.hikari.HikariDataSource import cz.kamenitxan.jakon.core.configuration.{DatabaseType, Settings} +import cz.kamenitxan.jakon.core.database.annotation.OneToMany import cz.kamenitxan.jakon.core.model.* import cz.kamenitxan.jakon.logging.Logger import cz.kamenitxan.jakon.utils.TypeReferences.SEQ @@ -169,19 +170,14 @@ object DBHelper { if (fki._2.ids.size == 1 && r.entity.id == fki._2.ids.head) { field.set(r.entity, r.entity) } else { - val objectClass = field.getGenericType match { - case parameterizedType: ParameterizedType => - Class.forName(parameterizedType.getActualTypeArguments.toList.head.getTypeName).asInstanceOf[Class[JakonObject]] - case _ => - field.getType.asInstanceOf[Class[JakonObject]] - } - val (className, superClass) = field.getGenericType match { - case parameterizedType: ParameterizedType => - val typeCls = parameterizedType.getActualTypeArguments.head - (typeCls.getTypeName.substring(typeCls.getTypeName.lastIndexOf(".") + 1), typeCls.getClass.getSuperclass) - case _ => - (objectClass.getSimpleName, objectClass.getSuperclass) + val oneToManyAnn = field.getDeclaredAnnotation(classOf[OneToMany]) + val objectClass = if (oneToManyAnn != null) { + oneToManyAnn.genericClass().asInstanceOf[Class[JakonObject]] + } else { + field.getType.asInstanceOf[Class[JakonObject]] } + + val (className, superClass) = (objectClass.getSimpleName, objectClass.getSuperclass) val joinSql = if (objectClass.getSuperclass != classOf[JakonObject]) { s"JOIN ${superClass.getSimpleName} s ON s.id = JakonObject.id" } else { diff --git a/modules/backend/src/test/scala/core/ModelTest.scala b/modules/backend/src/test/scala/core/ModelTest.scala index 16a03dd7..c87b8563 100644 --- a/modules/backend/src/test/scala/core/ModelTest.scala +++ b/modules/backend/src/test/scala/core/ModelTest.scala @@ -1,6 +1,8 @@ package core -import cz.kamenitxan.jakon.core.model._ +import cz.kamenitxan.jakon.core.database.DBHelper +import cz.kamenitxan.jakon.core.model.* +import cz.kamenitxan.jakon.core.service.UserService import org.scalatest.DoNotDiscover import test.TestBase import utils.entity.{TestEmbeddedObject, TestObject} @@ -77,7 +79,7 @@ class ModelTest extends TestBase { obj.toString } - var eoid = 0; + var eoid = 0 test("Create TestEmbeddedObject") { _ => val obj = new TestObject val embedded = new TestEmbeddedObject @@ -99,6 +101,26 @@ class ModelTest extends TestBase { } */ + var otmid = 0 + test("Create OneToMany") { _ => + val users = DBHelper.withDbConnection(implicit conn => { + UserService.getAllUsers() + }).take(2) + + val obj = new TestObject + obj.oneToMany = users + eoid = obj.create() + } + + test("Fetch OneToMany") { _ => + DBHelper.withDbConnection(implicit conn => { + val sql = "SELECT * From TestObject WHERE id = ?" + val stmt = conn.prepareStatement(sql) + stmt.setInt(1, eoid) + val entity = DBHelper.selectSingleDeep(stmt)(conn, classOf[TestObject]) + assert(entity.oneToMany.nonEmpty) + }) + } var post: Post = _ test("Post Create") { _ => diff --git a/modules/backend/src/test/scala/utils/SqlGenTest.scala b/modules/backend/src/test/scala/utils/SqlGenTest.scala index 8960fcac..b3a87061 100644 --- a/modules/backend/src/test/scala/utils/SqlGenTest.scala +++ b/modules/backend/src/test/scala/utils/SqlGenTest.scala @@ -53,14 +53,14 @@ class SqlGenTest extends TestBase { }) } - /*test("DBHelper selectDeep") { _ => + test("DBHelper selectDeep") { _ => DBHelper.withDbConnection(implicit conn => { val stmt = conn.prepareStatement("SELECT * FROM JakonUser") - val users = DBHelper.selectDeep(stmt, classOf[JakonUser]) + val users = DBHelper.selectDeep(stmt)(conn, classOf[JakonUser]) assert(users.nonEmpty) assert(users.forall( u => u.acl != null)) }) - }*/ + } test("parseFilterParams invalid number") { _ => val params = mutable.Map( diff --git a/modules/backend/src/test/scala/utils/mail/EmailTest.scala b/modules/backend/src/test/scala/utils/mail/EmailTest.scala index ad879c6c..1bb886cd 100644 --- a/modules/backend/src/test/scala/utils/mail/EmailTest.scala +++ b/modules/backend/src/test/scala/utils/mail/EmailTest.scala @@ -1,7 +1,9 @@ package utils.mail import cz.kamenitxan.jakon.core.configuration.{DeployMode, Settings} +import cz.kamenitxan.jakon.core.database.DBHelper import cz.kamenitxan.jakon.core.model.JakonUser +import cz.kamenitxan.jakon.core.service.AclRuleService import cz.kamenitxan.jakon.utils.mail.{EmailEntity, EmailSendTask, EmailTemplateEntity} import cz.kamenitxan.jakon.webui.controller.pagelets.JakonRegistrationPagelet import org.scalatest.DoNotDiscover @@ -16,10 +18,15 @@ import scala.util.Random class EmailTest extends AnyFunSuite { test("registrationEmailTest") { - val user = new JakonUser() - user.email = "test@test.com" + Random.nextInt() - user.create() - new JakonRegistrationPagelet().sendRegistrationEmail(user) + DBHelper.withDbConnection(implicit conn => { + val user = new JakonUser() + user.firstName = "registrationEmailTest" + user.lastName = "lastName" + user.email = "test@test.com" + Random.nextInt() + user.acl = AclRuleService.getByName("Admin").get + user.create() + new JakonRegistrationPagelet().sendRegistrationEmail(user) + }) } test("EmailEntity") { diff --git a/modules/backend/src/test/scala/webui/AuthTest.scala b/modules/backend/src/test/scala/webui/AuthTest.scala index 5655a37e..f2408468 100644 --- a/modules/backend/src/test/scala/webui/AuthTest.scala +++ b/modules/backend/src/test/scala/webui/AuthTest.scala @@ -3,11 +3,12 @@ package webui import cz.kamenitxan.jakon.core.configuration.Settings import cz.kamenitxan.jakon.core.database.DBHelper import cz.kamenitxan.jakon.core.model.JakonUser +import cz.kamenitxan.jakon.core.service.AclRuleService import cz.kamenitxan.jakon.webui.controller.impl.Authentication import org.openqa.selenium.htmlunit.HtmlUnitDriver import org.openqa.selenium.{By, WebDriver} -import org.scalatest.{DoNotDiscover, Outcome} import org.scalatest.funsuite.FixtureAnyFunSuite +import org.scalatest.{DoNotDiscover, Outcome} import java.util.Locale import scala.util.Random @@ -41,14 +42,17 @@ class AuthTest extends FixtureAnyFunSuite { } test("create user") { _ => - val user = new JakonUser() - user.firstName = "testName" - user.lastName = "lastName" - user.email = email - user.password = password - user.locale = new Locale("en", "US") - - assert(user.create() > 0) + DBHelper.withDbConnection(implicit conn => { + val user = new JakonUser() + user.firstName = "testName" + user.lastName = "lastName" + user.email = email + user.password = password + user.locale = new Locale("en", "US") + user.acl = AclRuleService.getByName("Admin").get + + assert(user.create() > 0) + }) } test("check password") { _ =>