diff --git a/src/main/kotlin/com/restapi/Test.kt b/src/main/kotlin/com/restapi/Test.kt new file mode 100644 index 0000000..a1aef92 --- /dev/null +++ b/src/main/kotlin/com/restapi/Test.kt @@ -0,0 +1,74 @@ +package com.restapi + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonDeserializer +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import com.restapi.controllers.QueryParam +import com.restapi.controllers.RawQuery + +class FDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, p1: DeserializationContext?): F { + //custom logic to do thia + val node = p.readValueAsTree() + + if (node.isObject) { + if (node.has("name")) { + return F.P(name = node.get("name").textValue()) + } else if (node.has("num")) { + return F.Q(num = node.get("num").textValue()) + } else if (node.has("tag")) { + return F.D(tag = node.get("tag").textValue()) + } + + } else { + //incorrect + } + throw IllegalArgumentException() + } + +} +val om = jacksonObjectMapper() + +@JsonDeserialize(using = FDeserializer::class) +sealed interface F { + data class P(val name: String) : F + data class Q(val num: String) : F + data class D(val tag: String) : F +} + +val j = """ + {"name":"a"} +""".trimIndent() + +val j2 = """ + {"num":"a"} +""".trimIndent() + +val j3 = """ + {"tag":"a"} +""".trimIndent() + +val j4 = """ + { + "sql":"aaaa", + "params": { + "a":"b", + "c": { + "type":"STRING", + "value":"aaaa" + } + + } + } +""".trimIndent() + +fun main() { + println(om.readValue(j)) + println(om.readValue(j2)) + println(om.readValue(j3)) + println(om.readValue(j4)) +} \ No newline at end of file diff --git a/src/main/kotlin/com/restapi/controllers/Filters.kt b/src/main/kotlin/com/restapi/controllers/Filters.kt index b2ad26c..7745f7f 100644 --- a/src/main/kotlin/com/restapi/controllers/Filters.kt +++ b/src/main/kotlin/com/restapi/controllers/Filters.kt @@ -1,66 +1,74 @@ package com.restapi.controllers import com.restapi.domain.* -import com.restapi.domain.Quotation import com.restapi.domain.Session.database import java.time.LocalDate //constants const val IGNORE = "%" -val baseDate :LocalDate = LocalDate.of(1500, 1,1, ) -val maxDate :LocalDate = LocalDate.of(3000, 1 ,1) +val baseDate: LocalDate = LocalDate.of(1500, 1, 1) +val maxDate: LocalDate = LocalDate.of(3000, 1, 1) const val RATING_MAX = 10.0 const val RATING_MIN = 0.0 + //common filters would be used by most of the handlers //require a list of vendor ids to be passed -data class CommonFilters ( - val fromDate :LocalDate = baseDate, - val toDate :LocalDate = maxDate, - val vendor :List? = null, - val sortAsc :Boolean = true, - val sortBy :String = IGNORE +data class CommonFilters( + val fromDate: LocalDate = baseDate, + val toDate: LocalDate = maxDate, + val vendor: List? = null, + val sortAsc: Boolean = true, + val sortBy: String = IGNORE ) -interface CustomFilters{} -data class POFilters ( - val poNumLike :String = IGNORE, - val totalAmountExceeds :Long = Long.MIN_VALUE, - val totalAmountLessThan :Long = Long.MAX_VALUE, + +interface CustomFilters {} + +data class POFilters( + val poNumLike: String = IGNORE, + val totalAmountExceeds: Long = Long.MIN_VALUE, + val totalAmountLessThan: Long = Long.MAX_VALUE, val validAfter: LocalDate = baseDate, val validBefore: LocalDate = maxDate, - val refQuotation :String = IGNORE, + val refQuotation: String = IGNORE, ) : CustomFilters -data class ProductFilters ( - val nameLike :String = IGNORE, - val hsnLike :String = IGNORE, - val uom :UOM = UOM.ALL, + +data class ProductFilters( + val nameLike: String = IGNORE, + val hsnLike: String = IGNORE, + val uom: UOM = UOM.ALL, ) : CustomFilters -data class DocumentFilters ( - val nameLike :String = IGNORE, - val typeOfDoc :DocType = DocType.ALL, - val docDateFrom :LocalDate = baseDate, - val docDataTo :LocalDate = maxDate, -) :CustomFilters -data class RFQFilters ( - val validBefore :LocalDate = maxDate, - val validAfter :LocalDate = baseDate, - val reqForQuoteNumLike :String = IGNORE, -) -data class QuoteFilters ( - val quoteNumLike :String = IGNORE, - val validBefore :LocalDate = maxDate, - val validAfter :LocalDate = baseDate, - val totalAmountExceeds :Long = Long.MIN_VALUE, - val totalAmountLessThan :Long = Long.MAX_VALUE, -) :CustomFilters -data class VendorFilters ( - val nameLike :String = IGNORE, - val msmeLike :String = IGNORE, - val gstNumLike :String = IGNORE, - val addressLike :String = IGNORE, - val ratingExceeds :Double = RATING_MIN, - val ratingLessThan :Double = RATING_MAX, -) :CustomFilters -fun applyVendorHelper(q :io.ebean.ExpressionList, vids :List?) { + +data class DocumentFilters( + val nameLike: String = IGNORE, + val typeOfDoc: DocType = DocType.ALL, + val docDateFrom: LocalDate = baseDate, + val docDataTo: LocalDate = maxDate, +) : CustomFilters + +data class RFQFilters( + val validBefore: LocalDate = maxDate, + val validAfter: LocalDate = baseDate, + val reqForQuoteNumLike: String = IGNORE, +): CustomFilters + +data class QuoteFilters( + val quoteNumLike: String = IGNORE, + val validBefore: LocalDate = maxDate, + val validAfter: LocalDate = baseDate, + val totalAmountExceeds: Long = Long.MIN_VALUE, + val totalAmountLessThan: Long = Long.MAX_VALUE, +) : CustomFilters + +data class VendorFilters( + val nameLike: String = IGNORE, + val msmeLike: String = IGNORE, + val gstNumLike: String = IGNORE, + val addressLike: String = IGNORE, + val ratingExceeds: Double = RATING_MIN, + val ratingLessThan: Double = RATING_MAX, +) : CustomFilters + +fun applyVendorHelper(q: io.ebean.ExpressionList, vids: List?) { if (vids.isNullOrEmpty()) return // q.apply { // q.`in`("vendor", vids) @@ -69,35 +77,40 @@ fun applyVendorHelper(q :io.ebean.ExpressionList, vids :List?) { // println(vids[0]) q.eq("vendor_sys_pk", vids[0]) } -fun applySortHelper(q :io.ebean.ExpressionList, sortBy :String, asc :Boolean) { - if(sortBy == IGNORE) return; + +fun applySortHelper(q: io.ebean.ExpressionList, sortBy: String, asc: Boolean) { + if (sortBy == IGNORE) return; val order = if (asc) "ASC" else "DESC" q.orderBy("$sortBy $order") } -fun applyFromToHelper(q :io.ebean.ExpressionList, fromDate: LocalDate, toDate: LocalDate, colName :String) { + +fun applyFromToHelper(q: io.ebean.ExpressionList, fromDate: LocalDate, toDate: LocalDate, colName: String) { q.ge(colName, fromDate) .le(colName, toDate) } -fun applyCommonFilters(q :io.ebean.ExpressionList, commonFilters: CommonFilters) { + +fun applyCommonFilters(q: io.ebean.ExpressionList, commonFilters: CommonFilters) { applyVendorHelper(q, commonFilters.vendor) applySortHelper(q, commonFilters.sortBy, commonFilters.sortAsc) } -fun searchQuotes(commonFilters: CommonFilters, quoteFilters: QuoteFilters) : List { + +fun searchQuotes(commonFilters: CommonFilters, quoteFilters: QuoteFilters): List { val q = database.find(Quotation::class.java) .where() .ge("quoteDate", commonFilters.fromDate) .le("quoteDate", commonFilters.toDate) - .ge("validTill",quoteFilters.validAfter) + .ge("validTill", quoteFilters.validAfter) .le("validTill", quoteFilters.validBefore) .ge("totalAmount", quoteFilters.totalAmountExceeds) .le("totalAmount", quoteFilters.totalAmountLessThan) - .ilike("quoteNum", "%" + quoteFilters.quoteNumLike + "%") + .ilike("quoteNum", "%" + quoteFilters.quoteNumLike + "%") applyFromToHelper(q, commonFilters.fromDate, commonFilters.toDate, "quoteDate") applyVendorHelper(q, commonFilters.vendor) applySortHelper(q, commonFilters.sortBy, commonFilters.sortAsc) return q.findList() } -fun searchVendors(commonFilters: CommonFilters, vendorFilters: VendorFilters) : List { + +fun searchVendors(commonFilters: CommonFilters, vendorFilters: VendorFilters): List { val q = database.find(Vendor::class.java) .where() .ge("rating", vendorFilters.ratingExceeds) @@ -109,11 +122,12 @@ fun searchVendors(commonFilters: CommonFilters, vendorFilters: VendorFilters) : applySortHelper(q, commonFilters.sortBy, commonFilters.sortAsc) return q.findList() } -fun searchDocs(commonFilters: CommonFilters, documentFilters: DocumentFilters) : List { + +fun searchDocs(commonFilters: CommonFilters, documentFilters: DocumentFilters): List { val q = database.find(Document::class.java) .where() .apply { - if(documentFilters.typeOfDoc != DocType.ALL){ + if (documentFilters.typeOfDoc != DocType.ALL) { this.eq("docType", documentFilters.typeOfDoc) } } @@ -122,7 +136,8 @@ fun searchDocs(commonFilters: CommonFilters, documentFilters: DocumentFilters) : applyVendorHelper(q, commonFilters.vendor) return q.findList() } -fun searchPos(commonFilters: CommonFilters, poFilters: POFilters?) : List { + +fun searchPos(commonFilters: CommonFilters, poFilters: POFilters?): List { val poFilters = poFilters ?: POFilters() val q = database.find(PurchaseOrder::class.java) .where() @@ -137,7 +152,8 @@ fun searchPos(commonFilters: CommonFilters, poFilters: POFilters?) : List { + +fun searchRFQ(commonFilters: CommonFilters, rfqFilters: RFQFilters): List { val q = database.find(ReqForQuote::class.java) .where() .ge("validTill", rfqFilters.validAfter)