Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add employees/working-days endpoint #45

Merged
merged 3 commits into from
Feb 1, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>
}
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
}
Loading