From 28dc13e220e344aa258f31ac131bc323916404e9 Mon Sep 17 00:00:00 2001 From: QuadStingray Date: Mon, 31 Mar 2025 08:06:18 +0200 Subject: [PATCH] refactor: package object json extends AutoDerivation to not need double import --- README.md | 1 - docs/documentation/database/relationships.md | 1 - docs/documentation/gridfs-dao/crud.md | 1 - docs/documentation/mongo-dao/index.md | 1 - .../driver/mongodb/json/CirceSchema.scala | 61 ++++++++++++++----- .../driver/mongodb/json/package.scala | 4 +- .../pagination/MongoPaginatedFilter.scala | 3 - .../mongodb/schema/SchemaExplorer.scala | 1 - .../driver/mongodb/sync/MongoSyncer.scala | 2 +- .../relation/RelationDemoDatabase.scala | 1 - .../driver/mongodb/test/TestDatabase.scala | 1 - .../mongodb/test/UniversityDatabase.scala | 1 - 12 files changed, 51 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index d42e9bfc..44319a4f 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,6 @@ import org.bson.codecs.configuration.CodecRegistries._ import org.mongodb.scala.bson.ObjectId import org.mongodb.scala.bson.codecs.Macros._ import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ /** * import mongodb restaurants sample data diff --git a/docs/documentation/database/relationships.md b/docs/documentation/database/relationships.md index 534809bd..46bf17d3 100644 --- a/docs/documentation/database/relationships.md +++ b/docs/documentation/database/relationships.md @@ -21,7 +21,6 @@ Simple Setup. ```scala import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ case class User(id: Long, name: String, loginId: String) case class Login(id: String, email: String, password: String) diff --git a/docs/documentation/gridfs-dao/crud.md b/docs/documentation/gridfs-dao/crud.md index ba2d549c..8186613f 100644 --- a/docs/documentation/gridfs-dao/crud.md +++ b/docs/documentation/gridfs-dao/crud.md @@ -35,7 +35,6 @@ With implicit conversion you can use for OID Parameter: import dev.mongocamp.driver.mongodb._ // case class conversion only needed in the DAO Holder Class import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ ImageFilesDAO.deleteOne(oid) ``` diff --git a/docs/documentation/mongo-dao/index.md b/docs/documentation/mongo-dao/index.md index 432500cb..bdf1eb67 100644 --- a/docs/documentation/mongo-dao/index.md +++ b/docs/documentation/mongo-dao/index.md @@ -32,7 +32,6 @@ A Type Parameter is used for automatic Document to Class conversion. ```scala import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ object RestaurantDAO extends MongoDAO[Restaurant](provider, "restaurants") ``` diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/json/CirceSchema.scala b/src/main/scala/dev/mongocamp/driver/mongodb/json/CirceSchema.scala index 35ce8561..5460c9c1 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/json/CirceSchema.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/json/CirceSchema.scala @@ -1,27 +1,60 @@ package dev.mongocamp.driver.mongodb.json -import io.circe.Decoder +import dev.mongocamp.driver.mongodb.bson.BsonConverter import io.circe.Decoder.Result -import io.circe.Encoder -import io.circe.HCursor -import io.circe.Json -import java.util.Date +import io.circe.{Decoder, Encoder, HCursor, Json} +import io.circe.generic.AutoDerivation import org.bson.types.ObjectId import org.joda.time.DateTime import org.mongodb.scala.Document +import scala.jdk.CollectionConverters._ + +import java.util.Date trait CirceSchema extends CirceProductSchema { - implicit lazy val DocumentOneFormat: io.circe.Decoder[org.mongodb.scala.Document] = { - (c: HCursor) => - // not really needed only for decoder must exists - ??? - } + implicit lazy val DocumentOneFormat: Encoder[org.mongodb.scala.Document] with io.circe.Decoder[org.mongodb.scala.Document] = + new io.circe.Encoder[org.mongodb.scala.Document] with io.circe.Decoder[org.mongodb.scala.Document] { + override def apply(a: org.mongodb.scala.Document): Json = { + encodeMapStringAny(BsonConverter.asMap(a)) + } + + override def apply(c: HCursor): Result[org.mongodb.scala.Document] = { + Decoder.decodeString + .map( + s => { + val document = new org.mongodb.scala.Document(org.mongodb.scala.bson.BsonDocument(s)) + document + } + ) + .apply(c) + } + } - implicit lazy val DocumentTowFormat: io.circe.Decoder[org.bson.Document] = { - (c: HCursor) => - // not really needed only for decoder must exists - ??? + implicit lazy val DocumentTowFormat: Encoder[org.bson.Document] with io.circe.Decoder[org.bson.Document] = new io.circe.Encoder[org.bson.Document] + with io.circe.Decoder[org.bson.Document] { + override def apply(a: org.bson.Document): Json = { + val map = a.keySet().asScala + .map( + key => { + val value = a.get(key) + (key, encodeAnyToJson(value)) + } + ).toMap + encodeMapStringAny(map) + } + + override def apply(c: HCursor): Result[org.bson.Document] = { + Decoder + .decodeMap[String, Any] + .map( + m => { + val document = new org.bson.Document(m.asJava) + document + } + ) + .apply(c) + } } implicit val DateFormat: Encoder[Date] with io.circe.Decoder[Date] = new io.circe.Encoder[Date] with io.circe.Decoder[Date] { diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/json/package.scala b/src/main/scala/dev/mongocamp/driver/mongodb/json/package.scala index 5b425f9e..73ce51b8 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/json/package.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/json/package.scala @@ -1,3 +1,5 @@ package dev.mongocamp.driver.mongodb -package object json extends CirceSchema +import io.circe.generic.AutoDerivation + +package object json extends CirceSchema with AutoDerivation diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/pagination/MongoPaginatedFilter.scala b/src/main/scala/dev/mongocamp/driver/mongodb/pagination/MongoPaginatedFilter.scala index 7fabdf9e..7ad1c38f 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/pagination/MongoPaginatedFilter.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/pagination/MongoPaginatedFilter.scala @@ -2,9 +2,6 @@ package dev.mongocamp.driver.mongodb.pagination import dev.mongocamp.driver.mongodb._ import dev.mongocamp.driver.mongodb.exception.MongoCampPaginationException -import dev.mongocamp.driver.mongodb.MongoDAO -import io.circe.generic.auto._ -import io.circe.Decoder import org.mongodb.scala.bson.conversions.Bson case class MongoPaginatedFilter[A <: Any](dao: MongoDAO[A], filter: Bson = Map(), sort: Bson = Map(), projection: Bson = Map(), maxWait: Int = DefaultMaxWait) diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/schema/SchemaExplorer.scala b/src/main/scala/dev/mongocamp/driver/mongodb/schema/SchemaExplorer.scala index 0d19bf73..b2d5b88d 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/schema/SchemaExplorer.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/schema/SchemaExplorer.scala @@ -2,7 +2,6 @@ package dev.mongocamp.driver.mongodb.schema import dev.mongocamp.driver.mongodb._ import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ import org.bson.conversions.Bson import org.mongodb.scala.documentToUntypedDocument import org.mongodb.scala.Document diff --git a/src/main/scala/dev/mongocamp/driver/mongodb/sync/MongoSyncer.scala b/src/main/scala/dev/mongocamp/driver/mongodb/sync/MongoSyncer.scala index e5255ce7..bce21aa1 100644 --- a/src/main/scala/dev/mongocamp/driver/mongodb/sync/MongoSyncer.scala +++ b/src/main/scala/dev/mongocamp/driver/mongodb/sync/MongoSyncer.scala @@ -4,9 +4,9 @@ import dev.mongocamp.driver.mongodb._ import dev.mongocamp.driver.mongodb.database.DatabaseProvider import dev.mongocamp.driver.mongodb.database.MongoConfig import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ import io.circe.HCursor import scala.collection.mutable + case class MongoSyncer(sourceConfig: MongoConfig, targetConfig: MongoConfig, syncOperations: List[MongoSyncOperation] = List()) { implicit private lazy val ThrowableFormat: io.circe.Decoder[Throwable] = { diff --git a/src/test/scala/dev/mongocamp/driver/mongodb/relation/RelationDemoDatabase.scala b/src/test/scala/dev/mongocamp/driver/mongodb/relation/RelationDemoDatabase.scala index 65818258..69961fed 100644 --- a/src/test/scala/dev/mongocamp/driver/mongodb/relation/RelationDemoDatabase.scala +++ b/src/test/scala/dev/mongocamp/driver/mongodb/relation/RelationDemoDatabase.scala @@ -3,7 +3,6 @@ package dev.mongocamp.driver.mongodb.relation import dev.mongocamp.driver.mongodb._ import dev.mongocamp.driver.mongodb.database.DatabaseProvider import dev.mongocamp.driver.mongodb.json._ -import io.circe.generic.auto._ import org.mongodb.scala.bson.ObjectId import org.mongodb.scala.result.UpdateResult diff --git a/src/test/scala/dev/mongocamp/driver/mongodb/test/TestDatabase.scala b/src/test/scala/dev/mongocamp/driver/mongodb/test/TestDatabase.scala index 014b22cb..30cc8da9 100644 --- a/src/test/scala/dev/mongocamp/driver/mongodb/test/TestDatabase.scala +++ b/src/test/scala/dev/mongocamp/driver/mongodb/test/TestDatabase.scala @@ -8,7 +8,6 @@ import dev.mongocamp.driver.mongodb.json._ import dev.mongocamp.driver.mongodb.model._ import dev.mongocamp.driver.mongodb.GridFSDAO import dev.mongocamp.driver.mongodb.MongoDAO -import io.circe.generic.auto._ import org.mongodb.scala.model.changestream.ChangeStreamDocument import org.mongodb.scala.Document diff --git a/src/test/scala/dev/mongocamp/driver/mongodb/test/UniversityDatabase.scala b/src/test/scala/dev/mongocamp/driver/mongodb/test/UniversityDatabase.scala index b6dccb83..63d8fb0d 100644 --- a/src/test/scala/dev/mongocamp/driver/mongodb/test/UniversityDatabase.scala +++ b/src/test/scala/dev/mongocamp/driver/mongodb/test/UniversityDatabase.scala @@ -6,7 +6,6 @@ import dev.mongocamp.driver.mongodb.model._ import dev.mongocamp.driver.mongodb.server.LocalServer import dev.mongocamp.driver.mongodb.GridFSDAO import dev.mongocamp.driver.mongodb.MongoDAO -import io.circe.generic.auto._ object UniversityDatabase { // create local test server (mongodb-java-server)