Skip to content

Commit

Permalink
⚡ Scheduler fix + controller
Browse files Browse the repository at this point in the history
  • Loading branch information
AlbatovK committed Mar 24, 2024
1 parent 876afb0 commit 74cba14
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class Tender(
var tenderNumOuter: String?,
@Field(type = FieldType.Text, name = "user_id")
var userId: String?,
@Field(type = FieldType.Text, name = "meta_data")
var metaData: String?
)

fun TenderDto.toDomainObject() =
Expand All @@ -57,5 +59,6 @@ fun TenderDto.toDomainObject() =
tenderInnerLink = this.TenderLinkInner,
tenderName = this.TenderName,
tenderNumOuter = this.TenderNumOuter,
userId = this.User_id
userId = this.User_id,
metaData = this.searchFragmentXML?.fragment?.joinToString() ?: ""
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ package com.albatros.springsecurity.data.model.database

import com.albatros.springsecurity.data.model.dto.TenderProviderDto
import jakarta.persistence.Entity
import jakarta.persistence.Id
import org.springframework.validation.annotation.Validated

@Entity
@Validated
class TenderProvider(
@Id
var tenderId: Int,
var etpName: String,
var etpLink: String
) : AbstractEntity()
)

fun TenderProviderDto.toDomainObject() =
TenderProvider(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,16 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
import org.springframework.stereotype.Repository

@Repository
interface TenderRepository : ElasticsearchRepository<Tender, String>
interface TenderRepository : ElasticsearchRepository<Tender, String> {
fun findAllByTenderId(tenderId: String): List<Tender>

fun findAllByCustomerContainsIgnoreCase(customer: String): List<Tender>

fun findAllByRegionContainsIgnoreCase(region: String): List<Tender>

fun findAllByCategory(category: String): List<Tender>

fun findAllByEtpEqualsIgnoreCase(etp: String): List<Tender>

fun findAllByTenderNameContainingIgnoreCase(query: String): List<Tender>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.albatros.springsecurity.data.service

import com.albatros.springsecurity.data.model.dto.TenderDto
import com.albatros.springsecurity.data.model.dto.TenderInfoDto
import com.albatros.springsecurity.data.model.dto.TenderProviderDto

interface TenderApiService {

fun getAllTenderProviders(mode: String = "eauc"): MutableList<TenderProviderDto>?

fun getTendersByProviders(providerId: Int): List<TenderDto>?

fun getTenderInfoById(tenderId: Int): MutableList<TenderInfoDto>?
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package com.albatros.springsecurity.data.service
package com.albatros.springsecurity.data.service.impl

import com.albatros.springsecurity.config.webclient.TenderApiConfig
import com.albatros.springsecurity.data.model.dto.TenderDto
import com.albatros.springsecurity.data.model.dto.TenderInfoDto
import com.albatros.springsecurity.data.model.dto.TenderProviderDto
import com.albatros.springsecurity.data.service.TenderApiService
import org.springframework.cache.annotation.Cacheable
import org.springframework.http.MediaType
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import reactor.core.publisher.Mono

@Service
class TenderApiService(
class TenderApiServiceImpl(
private val tenderApiConfig: TenderApiConfig,
private val webClient: WebClient
) {
) : TenderApiService {

fun getAllTenderProviders(mode: String = "eauc"): MutableList<TenderProviderDto>? = webClient
override fun getAllTenderProviders(mode: String): MutableList<TenderProviderDto>? = webClient
.get()
.uri("/export?mode=$mode&api_code=${tenderApiConfig.apiKey}&dtype=json")
.accept(MediaType.APPLICATION_JSON)
Expand All @@ -24,18 +26,23 @@ class TenderApiService(
.collectList()
.block()

fun getTendersByProviders(providerId: Int): List<TenderDto>? = webClient
override fun getTendersByProviders(providerId: Int): List<TenderDto>? = webClient
.get()
.uri("/export?e$providerId=$providerId&api_code=${tenderApiConfig.apiKey}&dtype=json")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToFlux(TenderDto::class.java)
.collectList()
.onErrorResume {
Mono.just(
emptyList<TenderDto>()
)
}
.block()
?.drop(1)

@Cacheable(value = ["TenderInfo"], key = "#tenderId")
fun getTenderInfoById(tenderId: Int): MutableList<TenderInfoDto>? = webClient
override fun getTenderInfoById(tenderId: Int): MutableList<TenderInfoDto>? = webClient
.get()
.uri("/export?id=$tenderId&dtype=json")
.accept(MediaType.APPLICATION_JSON)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,43 @@
package com.albatros.springsecurity.presentation.controller

import com.albatros.springsecurity.data.model.database.Tender
import com.albatros.springsecurity.data.repository.TenderRepository
import com.albatros.springsecurity.data.service.TenderApiService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api")
class TenderController(
private val tenderService: TenderApiService
private val apiService: TenderApiService,
private val tenderRepository: TenderRepository
) {

@GetMapping("providers/")
fun getAll() = tenderService.getAllTenderProviders()
@GetMapping("/provider/")
fun getAll() = apiService.getAllTenderProviders()

@GetMapping("tenders/{id}")
fun getTendersByProviderId(@PathVariable id: Int) = tenderService.getTendersByProviders(id)
@GetMapping("/provider/{id}/tender")
fun getTendersByProviderId(@PathVariable id: Int) = apiService.getTendersByProviders(id)

@GetMapping("tenders/{id}/info")
fun getTenderInfoById(@PathVariable id: Int) = tenderService.getTenderInfoById(id)
@GetMapping("/tender/customer")
fun findAllByCustomerContainsIgnoreCase(@RequestParam customer: String): List<Tender> =
tenderRepository.findAllByCustomerContainsIgnoreCase(customer)

@GetMapping("/tender/region")
fun findAllByRegionContainsIgnoreCase(@RequestParam region: String): List<Tender> =
tenderRepository.findAllByRegionContainsIgnoreCase(region)

@GetMapping("/tender/category")
fun findAllByCategory(@RequestParam category: String): List<Tender> = tenderRepository.findAllByCategory(category)

@GetMapping("/tender/etp")
fun findAllByEtpEqualsIgnoreCase(@RequestParam etp: String): List<Tender> =
tenderRepository.findAllByEtpEqualsIgnoreCase(etp)

@GetMapping("/tender/name")
fun findAllByTenderNameContainingIgnoreCase(@RequestParam(value = "query") query: String): List<Tender> =
tenderRepository.findAllByTenderNameContainingIgnoreCase(query)
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,29 @@ class Scheduler(
private val logger: Logger = LoggerFactory.getLogger(Scheduler::class.java)

@Async
@Scheduled(fixedDelay = 100_000)
fun scheduleTenderProvidersData() {
logger.debug("Collecting providers data from external sources.")
@Scheduled(fixedDelay = 1_000_000)
fun scheduleTendersData() {

logger.info("Collecting providers data from external sources.")
apiService.getAllTenderProviders()?.let {
tenderProviderRepository.saveAll(
it.map(TenderProviderDto::toDomainObject)
)
}

logger.debug("Collection stopped.")
}
logger.info("Collection stopped.")

@Async
@Scheduled(fixedDelay = 100_000)
fun scheduleTendersData() {
logger.debug("Collecting tenders data from external sources.")
logger.info("Collecting tenders data from external sources.")

tenderProviderRepository.findAll().forEach { provider ->
logger.info("Collecting for provider ${provider.etpName}.")
apiService.getTendersByProviders(provider.tenderId)?.let {
tenderRepository.saveAll(
it.map(TenderDto::toDomainObject)
)
}
}

logger.debug("Collection stopped.")
logger.info("Collection stopped.")
}
}

0 comments on commit 74cba14

Please sign in to comment.