Skip to content

Commit

Permalink
Add employees/working-days endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
aryabokon committed Jan 29, 2024
1 parent 3800810 commit 311e4bb
Show file tree
Hide file tree
Showing 20 changed files with 130 additions and 20 deletions.
18 changes: 15 additions & 3 deletions buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -41,6 +41,12 @@ interface EmployeeServiceClient {
@RequestLine("GET customers")
fun getCustomers(): Set<CustomerDTO>

@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
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import feign.jackson.JacksonDecoder
import feign.jackson.JacksonEncoder
import feign.slf4j.Slf4jLogger
import org.octopusden.employee.client.common.dto.Health
import org.octopusden.employee.client.common.dto.WorkingDaysDTO
import java.nio.charset.Charset
import java.time.LocalDate
import java.util.Base64
Expand Down Expand Up @@ -50,6 +51,9 @@ class ClassicEmployeeServiceClient(

override fun getCustomers(): Set<CustomerDTO> = client.getCustomers()

override fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO =
client.getWorkingDays(fromDate, toDate)

fun updateApiParameters(apiParametersProvider: EmployeeServiceClientParametersProvider) {
client = createClient(apiParametersProvider, mapper)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.octopusden.employee.client.common.dto

data class WorkingDaysDTO(val workingDays: Int)
Original file line number Diff line number Diff line change
@@ -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<String>): 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()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
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
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
Expand All @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,23 @@ 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")
class EmployeesController(private val employeeService: EmployeeService) {
@GetMapping("available-earlier")
@PreAuthorize("@employeeServicePermissionEvaluator.hasPermission('ACCESS_EMPLOYEE')")
fun getEmployeeAvailableEarlier(@RequestParam employees: Set<String>): 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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ 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 {
fun getEmployee(username: String): Employee
fun getRequiredTime(username: String, fromDate: LocalDate, toDate: LocalDate): RequiredTimeDTO
fun isUserAvailable(username: String): Boolean
fun getEmployeeAvailableEarlier(employees: Set<String>): Employee
fun getWorkingDays(fromDate: LocalDate, toDate: LocalDate): WorkingDaysDTO
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -50,6 +51,17 @@ class EmployeesControllerTest : BaseEmployeesControllerTest() {
.response
.toObject(object : TypeReference<Employee>() {})

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<WorkingDaysDTO>() {})

private fun <T> MockHttpServletResponse.toObject(typeReference: TypeReference<T>): T =
mapper.readValue(this.contentAsByteArray, typeReference)
}
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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<String>): Employee

protected abstract fun getWorkingDays(fromDate: String, toDate: String): WorkingDaysDTO

//<editor-fold defaultstate="collapsed" desc="test data">
private fun availableEarlier(): Stream<Arguments> = Stream.of(
Arguments.of(
Expand All @@ -28,5 +39,23 @@ abstract class BaseEmployeesControllerTest : BaseTest() {
setOf("absent1", "absent2", "employee"), Employee("employee", true)
)
)

private fun workingDays(): Stream<Arguments> {
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
)
)
}
//</editor-fold>
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
5 changes: 5 additions & 0 deletions test-data/one-c-get-working-days-01-10.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"from": "'2021-01-01'",
"to": "'2021-01-10'",
"workingDays": 0
}
5 changes: 5 additions & 0 deletions test-data/one-c-get-working-days-01-31.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"from": "'2021-01-01'",
"to": "'2021-01-31'",
"workingDays": 15
}
5 changes: 5 additions & 0 deletions test-data/one-c-get-working-days-11-31.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"from": "'2021-01-11'",
"to": "'2021-01-31'",
"workingDays": 15
}

0 comments on commit 311e4bb

Please sign in to comment.