diff --git a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt index 3f271e6..c5965e5 100644 --- a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt +++ b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt @@ -63,17 +63,29 @@ open class MigrateMockData : DefaultTask() { "dateFrom" to "2021-01-01", "dateTo" to "2021-01-31", "user" to "employee" - ) to "one-c-jan-01-31.json", + ) to "one-c-get-planned-time-jan-01-31.json", "/one-c/ru/hs/ow_http/getPlannedTime" to mapOf( "dateFrom" to "2021-01-01", "dateTo" to "2021-01-10", "user" to "employee" - ) to "one-c-jan-01-10.json", + ) to "one-c-get-planned-time-jan-01-10.json", "/one-c/ru/hs/ow_http/getPlannedTime" to mapOf( "dateFrom" to "2021-01-11", "dateTo" to "2021-01-31", "user" to "employee" - ) to "one-c-jan-11-31.json", + ) to "one-c-get-planned-time-jan-11-31.json", + "/one-c/ru/hs/ow_http/getWorkingDays" to mapOf( + "dateFrom" to "2021-01-01", + "dateTo" to "2021-01-10" + ) to "one-c-get-working-days-01-10.json", + "/one-c/ru/hs/ow_http/getWorkingDays" to mapOf( + "dateFrom" to "2021-01-01", + "dateTo" to "2021-01-31" + ) to "one-c-get-working-days-01-31.json", + "/one-c/ru/hs/ow_http/getWorkingDays" to mapOf( + "dateFrom" to "2021-01-11", + "dateTo" to "2021-01-31" + ) to "one-c-get-working-days-01-31.json", "/jira1/rest/api/2/user" to mapOf( "username" to "employee", ) to "jira1/jira-employee.json", diff --git a/client/src/main/kotlin/org/octopusden/employee/client/EmployeeServiceClient.kt b/client/src/main/kotlin/org/octopusden/employee/client/EmployeeServiceClient.kt index a726517..cc28204 100644 --- a/client/src/main/kotlin/org/octopusden/employee/client/EmployeeServiceClient.kt +++ b/client/src/main/kotlin/org/octopusden/employee/client/EmployeeServiceClient.kt @@ -1,16 +1,16 @@ package org.octopusden.employee.client +import feign.CollectionFormat +import feign.Param +import feign.RequestLine import org.octopusden.employee.client.common.dto.CustomerDTO import org.octopusden.employee.client.common.dto.Employee +import org.octopusden.employee.client.common.dto.Health import org.octopusden.employee.client.common.dto.RequiredTimeDTO import org.octopusden.employee.client.common.dto.ServerInfo +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import org.octopusden.employee.client.common.exception.NotFoundException import org.octopusden.employee.client.common.feign.LocalDateExpander -import feign.CollectionFormat -import feign.Param -import feign.QueryMap -import feign.RequestLine -import org.octopusden.employee.client.common.dto.Health import java.time.LocalDate interface EmployeeServiceClient { @@ -41,6 +41,12 @@ interface EmployeeServiceClient { @RequestLine("GET customers") fun getCustomers(): Set + @RequestLine("GET employees/working-days") + fun getWorkingDays( + @Param("fromDate", expander = LocalDateExpander::class) fromDate: LocalDate, + @Param("toDate", expander = LocalDateExpander::class) toDate: LocalDate + ): WorkingDaysDTO + @RequestLine("GET actuator/health/oneC") fun oneCHealth(): Health } diff --git a/common/src/main/kotlin/org/octopusden/employee/client/common/dto/WorkingDaysDTO.kt b/common/src/main/kotlin/org/octopusden/employee/client/common/dto/WorkingDaysDTO.kt new file mode 100644 index 0000000..396d081 --- /dev/null +++ b/common/src/main/kotlin/org/octopusden/employee/client/common/dto/WorkingDaysDTO.kt @@ -0,0 +1,3 @@ +package org.octopusden.employee.client.common.dto + +data class WorkingDaysDTO(val workingDays: Int) diff --git a/ft/src/ft/kotlin/org/octopusden/employee/EmployeesControllerTest.kt b/ft/src/ft/kotlin/org/octopusden/employee/EmployeesControllerTest.kt index 97d68aa..ffadb59 100644 --- a/ft/src/ft/kotlin/org/octopusden/employee/EmployeesControllerTest.kt +++ b/ft/src/ft/kotlin/org/octopusden/employee/EmployeesControllerTest.kt @@ -1,12 +1,17 @@ package org.octopusden.employee import org.octopusden.employee.client.common.dto.Employee +import org.octopusden.employee.client.common.dto.WorkingDaysDTO class EmployeesControllerTest : BaseEmployeesControllerTest() { override fun getEmployeeAvailableEarlier(employees: Set): Employee { return client.getEmployeeAvailableEarlier(employees) } + override fun getWorkingDays(fromDate: String, toDate: String): WorkingDaysDTO { + return client.getWorkingDays(fromDate.toLocalDate(), toDate.toLocalDate()) + } + companion object { private val client = TestFtUtils.getSecuredClient() } diff --git a/server/src/main/kotlin/org/octopusden/employee/config/OneCConfig.kt b/server/src/main/kotlin/org/octopusden/employee/config/OneCConfig.kt index 73cde7f..a10b658 100644 --- a/server/src/main/kotlin/org/octopusden/employee/config/OneCConfig.kt +++ b/server/src/main/kotlin/org/octopusden/employee/config/OneCConfig.kt @@ -1,9 +1,6 @@ package org.octopusden.employee.config import com.fasterxml.jackson.databind.ObjectMapper -import org.octopusden.employee.service.onec.client.OneCBasicCredTokenRequestInterceptor -import org.octopusden.employee.service.onec.client.OneCClient -import org.octopusden.employee.service.onec.client.OneCRetry import feign.Feign import feign.Logger import feign.Request @@ -11,6 +8,9 @@ import feign.httpclient.ApacheHttpClient import feign.jackson.JacksonDecoder import feign.jackson.JacksonEncoder import feign.slf4j.Slf4jLogger +import org.octopusden.employee.service.onec.client.OneCBasicCredTokenRequestInterceptor +import org.octopusden.employee.service.onec.client.OneCClient +import org.octopusden.employee.service.onec.client.OneCRetry import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -30,8 +30,6 @@ class OneCConfig( .options(Request.Options(5, TimeUnit.MINUTES, 5, TimeUnit.MINUTES, true)) .encoder(JacksonEncoder(objectMapper)) .decoder(JacksonDecoder(objectMapper)) - .encoder(JacksonEncoder(objectMapper)) - .decoder(JacksonDecoder(objectMapper)) .retryer(OneCRetry()) .requestInterceptor(OneCBasicCredTokenRequestInterceptor(oneCProperties.username, oneCProperties.password)) .logger(Slf4jLogger(OneCClient::class.java)) diff --git a/server/src/main/kotlin/org/octopusden/employee/controller/EmployeesController.kt b/server/src/main/kotlin/org/octopusden/employee/controller/EmployeesController.kt index 0653371..c69b9bb 100644 --- a/server/src/main/kotlin/org/octopusden/employee/controller/EmployeesController.kt +++ b/server/src/main/kotlin/org/octopusden/employee/controller/EmployeesController.kt @@ -2,12 +2,12 @@ package org.octopusden.employee.controller import org.octopusden.employee.client.common.dto.Employee import org.octopusden.employee.service.EmployeeService -import org.springframework.security.access.annotation.Secured import org.springframework.security.access.prepost.PreAuthorize import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController +import java.time.LocalDate @RestController @RequestMapping("employees") @@ -15,4 +15,10 @@ class EmployeesController(private val employeeService: EmployeeService) { @GetMapping("available-earlier") @PreAuthorize("@employeeServicePermissionEvaluator.hasPermission('ACCESS_EMPLOYEE')") fun getEmployeeAvailableEarlier(@RequestParam employees: Set): Employee = employeeService.getEmployeeAvailableEarlier(employees) + + @GetMapping("working-days") + fun getWorkingDaysCount( + @RequestParam("fromDate", required = true) fromDate: LocalDate, + @RequestParam("toDate", required = true) toDate: LocalDate + ) = employeeService.getWorkingDays(fromDate, toDate) } diff --git a/server/src/main/kotlin/org/octopusden/employee/service/EmployeeService.kt b/server/src/main/kotlin/org/octopusden/employee/service/EmployeeService.kt index c79b3e9..2da5b75 100644 --- a/server/src/main/kotlin/org/octopusden/employee/service/EmployeeService.kt +++ b/server/src/main/kotlin/org/octopusden/employee/service/EmployeeService.kt @@ -2,6 +2,7 @@ package org.octopusden.employee.service import org.octopusden.employee.client.common.dto.Employee import org.octopusden.employee.client.common.dto.RequiredTimeDTO +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import java.time.LocalDate interface EmployeeService { @@ -9,4 +10,5 @@ interface EmployeeService { fun getRequiredTime(username: String, fromDate: LocalDate, toDate: LocalDate): RequiredTimeDTO fun isUserAvailable(username: String): Boolean fun getEmployeeAvailableEarlier(employees: Set): Employee + fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO } diff --git a/server/src/main/kotlin/org/octopusden/employee/service/OneCService.kt b/server/src/main/kotlin/org/octopusden/employee/service/OneCService.kt index 540d24b..1d793d1 100644 --- a/server/src/main/kotlin/org/octopusden/employee/service/OneCService.kt +++ b/server/src/main/kotlin/org/octopusden/employee/service/OneCService.kt @@ -2,8 +2,10 @@ package org.octopusden.employee.service import org.octopusden.employee.client.common.dto.Employee import org.octopusden.employee.client.common.dto.RequiredTimeDTO +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import java.time.LocalDate interface OneCService { fun getRequiredTime(employee: Employee, fromDate: LocalDate, toDate: LocalDate): RequiredTimeDTO + fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO } diff --git a/server/src/main/kotlin/org/octopusden/employee/service/impl/EmployeeServiceImpl.kt b/server/src/main/kotlin/org/octopusden/employee/service/impl/EmployeeServiceImpl.kt index 6d66827..ff9bcc4 100644 --- a/server/src/main/kotlin/org/octopusden/employee/service/impl/EmployeeServiceImpl.kt +++ b/server/src/main/kotlin/org/octopusden/employee/service/impl/EmployeeServiceImpl.kt @@ -1,7 +1,9 @@ package org.octopusden.employee.service.impl +import org.apache.http.HttpStatus import org.octopusden.employee.client.common.dto.Employee import org.octopusden.employee.client.common.dto.RequiredTimeDTO +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import org.octopusden.employee.client.common.exception.NotFoundException import org.octopusden.employee.config.EmployeeServiceProperties import org.octopusden.employee.service.EmployeeService @@ -11,7 +13,6 @@ import org.octopusden.employee.service.jira.client.common.JiraClientException import org.octopusden.employee.service.jira.client.common.JiraUser import org.octopusden.employee.service.jira.client.jira1.Jira1Client import org.octopusden.employee.service.jira.client.jira2.Jira2Client -import org.apache.http.HttpStatus import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @@ -76,7 +77,10 @@ class EmployeeServiceImpl( .flatten() .minByOrNull { it.end } ?.let { Employee(it.employee.name, it.employee.active) } ?: throw IllegalStateException() + } + override fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO { + return oneCService.getWorkingDays(fromDate, toDate) } data class UserAbsence(val employee: JiraUser, val start: LocalDate, val end: LocalDate) diff --git a/server/src/main/kotlin/org/octopusden/employee/service/impl/OneCServiceImpl.kt b/server/src/main/kotlin/org/octopusden/employee/service/impl/OneCServiceImpl.kt index f2ae094..26b1ef0 100644 --- a/server/src/main/kotlin/org/octopusden/employee/service/impl/OneCServiceImpl.kt +++ b/server/src/main/kotlin/org/octopusden/employee/service/impl/OneCServiceImpl.kt @@ -2,6 +2,7 @@ package org.octopusden.employee.service.impl import org.octopusden.employee.client.common.dto.Employee import org.octopusden.employee.client.common.dto.RequiredTimeDTO +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import org.octopusden.employee.config.EmployeeServiceProperties import org.octopusden.employee.service.OneCService import org.octopusden.employee.service.onec.client.OneCClient @@ -27,4 +28,8 @@ class OneCServiceImpl( requiredDays.multiply(employeeServiceProperties.workDayHours.toBigDecimal()).toInt() ) } + + override fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO { + return oneCClient.getWorkingDays(fromDate, toDate) + } } diff --git a/server/src/main/kotlin/org/octopusden/employee/service/onec/client/OneCClient.kt b/server/src/main/kotlin/org/octopusden/employee/service/onec/client/OneCClient.kt index 4b6d6b9..015b405 100644 --- a/server/src/main/kotlin/org/octopusden/employee/service/onec/client/OneCClient.kt +++ b/server/src/main/kotlin/org/octopusden/employee/service/onec/client/OneCClient.kt @@ -1,9 +1,10 @@ package org.octopusden.employee.service.onec.client -import org.octopusden.employee.client.common.feign.LocalDateExpander -import org.octopusden.employee.service.onec.client.dto.PlannedTimeDTO import feign.Param import feign.RequestLine +import org.octopusden.employee.client.common.dto.WorkingDaysDTO +import org.octopusden.employee.client.common.feign.LocalDateExpander +import org.octopusden.employee.service.onec.client.dto.PlannedTimeDTO import java.time.LocalDate interface OneCClient { @@ -16,4 +17,10 @@ interface OneCClient { @RequestLine("GET ru/hs/ow_http/ping") fun getHealth() + + @RequestLine("GET ru/hs/ow_http/getWorkingDays?dateFrom={dateFrom}&dateTo={dateTo}") + fun getWorkingDays( + @Param("dateFrom", expander = LocalDateExpander::class) fromDate: LocalDate, + @Param("dateTo", expander = LocalDateExpander::class) toDate: LocalDate + ): WorkingDaysDTO } diff --git a/server/src/test/kotlin/org/octopusden/employee/EmployeesControllerTest.kt b/server/src/test/kotlin/org/octopusden/employee/EmployeesControllerTest.kt index 0ef64e1..a2d47e0 100644 --- a/server/src/test/kotlin/org/octopusden/employee/EmployeesControllerTest.kt +++ b/server/src/test/kotlin/org/octopusden/employee/EmployeesControllerTest.kt @@ -2,10 +2,11 @@ package org.octopusden.employee import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper -import org.octopusden.employee.client.common.dto.Employee import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.extension.ExtendWith +import org.octopusden.employee.client.common.dto.Employee +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest @@ -17,7 +18,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders import org.springframework.test.web.servlet.result.MockMvcResultMatchers -import java.util.* +import java.util.Locale @AutoConfigureMockMvc @ExtendWith(SpringExtension::class) @@ -50,6 +51,17 @@ class EmployeesControllerTest : BaseEmployeesControllerTest() { .response .toObject(object : TypeReference() {}) + override fun getWorkingDays(fromDate: String, toDate: String): WorkingDaysDTO = mvc.perform( + MockMvcRequestBuilders.get("/employees/working-days") + .param("fromDate", fromDate.format(isoLocalDateFormatter)) + .param("toDate", toDate.format(isoLocalDateFormatter)) + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(MockMvcResultMatchers.status().is2xxSuccessful) + .andReturn() + .response + .toObject(object : TypeReference() {}) + private fun MockHttpServletResponse.toObject(typeReference: TypeReference): T = mapper.readValue(this.contentAsByteArray, typeReference) } diff --git a/test-common/src/main/kotlin/org/octopusden/employee/BaseEmployeesControllerTest.kt b/test-common/src/main/kotlin/org/octopusden/employee/BaseEmployeesControllerTest.kt index 0529f56..d5f5e94 100644 --- a/test-common/src/main/kotlin/org/octopusden/employee/BaseEmployeesControllerTest.kt +++ b/test-common/src/main/kotlin/org/octopusden/employee/BaseEmployeesControllerTest.kt @@ -1,11 +1,12 @@ package org.octopusden.employee -import org.octopusden.employee.client.common.dto.Employee import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.TestInstance import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import org.octopusden.employee.client.common.dto.Employee +import org.octopusden.employee.client.common.dto.WorkingDaysDTO import java.util.stream.Stream @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -17,8 +18,18 @@ abstract class BaseEmployeesControllerTest : BaseTest() { Assertions.assertEquals(expectedEmployee, employeeAvailableEarlier) } + @ParameterizedTest + @MethodSource("workingDays") + fun getWorkingDaysTest(dateFrom: String, dateTo: String, expectedWorkingDays: Int) { + val workingDays = getWorkingDays(dateFrom, dateTo) + Assertions.assertEquals(expectedWorkingDays, workingDays.workingDays) + + } + protected abstract fun getEmployeeAvailableEarlier(employees: Set): Employee + protected abstract fun getWorkingDays(fromDate: String, toDate: String): WorkingDaysDTO + // private fun availableEarlier(): Stream = Stream.of( Arguments.of( @@ -28,5 +39,23 @@ abstract class BaseEmployeesControllerTest : BaseTest() { setOf("absent1", "absent2", "employee"), Employee("employee", true) ) ) + + private fun workingDays(): Stream { + return Stream.of( + Arguments.of( + "2021-01-01", + "2021-01-31", + 15 + ), Arguments.of( + "2021-01-11", + "2021-01-31", + 15 + ), Arguments.of( + "2021-01-01", + "2021-01-10", + 0 + ) + ) + } // } diff --git a/test-data/one-c-jan-01-10.json b/test-data/one-c-get-planned-time-jan-01-10.json similarity index 100% rename from test-data/one-c-jan-01-10.json rename to test-data/one-c-get-planned-time-jan-01-10.json diff --git a/test-data/one-c-jan-01-31.json b/test-data/one-c-get-planned-time-jan-01-31.json similarity index 100% rename from test-data/one-c-jan-01-31.json rename to test-data/one-c-get-planned-time-jan-01-31.json diff --git a/test-data/one-c-jan-11-31.json b/test-data/one-c-get-planned-time-jan-11-31.json similarity index 100% rename from test-data/one-c-jan-11-31.json rename to test-data/one-c-get-planned-time-jan-11-31.json diff --git a/test-data/one-c-get-working-days-01-10.json b/test-data/one-c-get-working-days-01-10.json new file mode 100644 index 0000000..88f81d4 --- /dev/null +++ b/test-data/one-c-get-working-days-01-10.json @@ -0,0 +1,5 @@ +{ + "from": "'2021-01-01'", + "to": "'2021-01-10'", + "workingDays": 0 +} diff --git a/test-data/one-c-get-working-days-01-31.json b/test-data/one-c-get-working-days-01-31.json new file mode 100644 index 0000000..8d90ea1 --- /dev/null +++ b/test-data/one-c-get-working-days-01-31.json @@ -0,0 +1,5 @@ +{ + "from": "'2021-01-01'", + "to": "'2021-01-31'", + "workingDays": 15 +} diff --git a/test-data/one-c-get-working-days-11-31.json b/test-data/one-c-get-working-days-11-31.json new file mode 100644 index 0000000..8730598 --- /dev/null +++ b/test-data/one-c-get-working-days-11-31.json @@ -0,0 +1,5 @@ +{ + "from": "'2021-01-11'", + "to": "'2021-01-31'", + "workingDays": 15 +}