Skip to content

Commit 86923c9

Browse files
author
jianggang
committed
feat: refactor approval settings
1 parent e219f0a commit 86923c9

9 files changed

Lines changed: 36 additions & 19 deletions

File tree

src/main/java/com/featureprobe/api/dto/ApprovalSettings.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ public class ApprovalSettings {
99

1010
private String environmentKey;
1111

12+
private String environmentName;
13+
1214
private Boolean enable;
1315

1416
private List<String> reviewers;
1517

18+
private boolean locked;
19+
1620
}

src/main/java/com/featureprobe/api/mapper/EnvironmentMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public interface EnvironmentMapper {
2525
Environment requestToEntity(EnvironmentCreateRequest createRequest);
2626

2727
@Mapping(target = "environmentKey", source = "key")
28+
@Mapping(target = "environmentName", source = "name")
2829
@Mapping(target = "enable", source = "enableApproval")
2930
@Mapping(target = "reviewers", expression = "java(toReviewerList(environment.getReviewers()))")
3031
ApprovalSettings entityToApprovalSettings(Environment environment);

src/main/java/com/featureprobe/api/repository/TargetingSketchRepository.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,21 @@
55
import org.springframework.data.jpa.repository.JpaRepository;
66
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
77
import org.springframework.stereotype.Repository;
8-
98
import java.util.List;
10-
import java.util.Optional;
119
import java.util.Set;
1210

1311
@Repository
1412
public interface TargetingSketchRepository extends JpaRepository<TargetingSketch, Long>,
1513
JpaSpecificationExecutor<TargetingSketch> {
1614

17-
Optional<TargetingSketch> findByApprovalId(Long approvalId);
18-
1915
List<TargetingSketch> findByApprovalIdIn(Set<Long> approvalIds);
2016

2117
List<TargetingSketch> findByProjectKeyAndEnvironmentKeyAndStatusAndToggleKeyIn(String projectKey,
2218
String environmentKey,
2319
SketchStatusEnum status,
2420
List<String> toggleKeys);
21+
22+
boolean existsByProjectKeyAndEnvironmentKeyAndStatus(String projectKey, String environmentKey,
23+
SketchStatusEnum status);
2524

2625
}

src/main/java/com/featureprobe/api/service/MetricService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
@AllArgsConstructor
5555
public class MetricService {
5656

57-
private static final ExecutorService taskExecutor = new ThreadPoolExecutor(12, 50,
57+
private static final ExecutorService taskExecutor = new ThreadPoolExecutor(3, 50,
5858
30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000));
5959

6060
private EnvironmentRepository environmentRepository;
@@ -89,11 +89,8 @@ public MetricResponse query(String projectKey, String environmentKey, String tog
8989
queryLastHours);
9090
List<AccessEventPoint> aggregatedAccessEventPoints = aggregatePointByMetricType(variationVersionMap,
9191
accessEventPoints, metricType);
92-
9392
List<VariationAccessCounter> accessCounters = summaryAccessEvents(aggregatedAccessEventPoints);
94-
Targeting latestTargeting = targetingRepository.findByProjectKeyAndEnvironmentKeyAndToggleKey(projectKey,
95-
environmentKey, toggleKey).get();
96-
appendLatestVariations(accessCounters, latestTargeting, metricType);
93+
appendLatestVariations(accessCounters, targeting, metricType);
9794
boolean isAccess = eventRepository.existsBySdkKeyAndToggleKey(serverSdkKey, toggleKey);
9895
return new MetricResponse(isAccess, accessEventPoints, sortAccessCounters(accessCounters));
9996
}

src/main/java/com/featureprobe/api/service/ProjectService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.featureprobe.api.auth.TokenHelper;
44
import com.featureprobe.api.base.enums.ResourceType;
5+
import com.featureprobe.api.base.enums.SketchStatusEnum;
56
import com.featureprobe.api.base.enums.ValidateTypeEnum;
67
import com.featureprobe.api.base.exception.ResourceConflictException;
78
import com.featureprobe.api.base.exception.ResourceNotFoundException;
@@ -18,6 +19,7 @@
1819
import com.featureprobe.api.mapper.ProjectMapper;
1920
import com.featureprobe.api.repository.EnvironmentRepository;
2021
import com.featureprobe.api.repository.ProjectRepository;
22+
import com.featureprobe.api.repository.TargetingSketchRepository;
2123
import com.featureprobe.api.util.SdkKeyGenerateUtil;
2224
import com.featureprobe.sdk.server.FPUser;
2325
import com.featureprobe.sdk.server.FeatureProbe;
@@ -45,6 +47,8 @@ public class ProjectService {
4547

4648
private EnvironmentRepository environmentRepository;
4749

50+
private TargetingSketchRepository targetingSketchRepository;
51+
4852
private FeatureProbe featureProbe;
4953

5054
@PersistenceContext
@@ -90,8 +94,14 @@ public void createPreference(String projectKey, PreferenceCreateRequest createRe
9094

9195
public List<ApprovalSettings> approvalSettingsList(String projectKey) {
9296
List<Environment> environments = environmentRepository.findAllByProjectKey(projectKey);
93-
return environments.stream().map(environment ->
97+
List<ApprovalSettings> approvalSettingsList = environments.stream().map(environment ->
9498
EnvironmentMapper.INSTANCE.entityToApprovalSettings(environment)).collect(Collectors.toList());
99+
for (ApprovalSettings approvalSettings : approvalSettingsList) {
100+
boolean locked = targetingSketchRepository.existsByProjectKeyAndEnvironmentKeyAndStatus(projectKey,
101+
approvalSettings.getEnvironmentKey(), SketchStatusEnum.PENDING);
102+
approvalSettings.setLocked(locked);
103+
}
104+
return approvalSettingsList;
95105
}
96106

97107
private void archiveAllEnvironments(List<Environment> environments) {

src/test/groovy/com/featureprobe/api/service/GuestServiceSpec.groovy

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import com.featureprobe.api.entity.Project
99
import com.featureprobe.api.repository.EnvironmentRepository
1010
import com.featureprobe.api.repository.MemberRepository
1111
import com.featureprobe.api.repository.ProjectRepository
12+
import com.featureprobe.api.repository.TargetingSketchRepository
1213
import com.featureprobe.sdk.server.FeatureProbe
1314
import org.hibernate.internal.SessionImpl
14-
import org.hibernate.query.internal.QueryImpl
1515
import org.hibernate.query.spi.NativeQueryImplementor
1616
import spock.lang.Specification
1717

@@ -28,6 +28,8 @@ class GuestServiceSpec extends Specification{
2828

2929
EnvironmentRepository environmentRepository
3030

31+
TargetingSketchRepository targetingSketchRepository
32+
3133
EntityManager entityManager
3234

3335
ProjectService projectService
@@ -41,8 +43,9 @@ class GuestServiceSpec extends Specification{
4143
entityManager = Mock(SessionImpl)
4244
projectRepository = Mock(ProjectRepository)
4345
environmentRepository = Mock(EnvironmentRepository)
46+
targetingSketchRepository = Mock(TargetingSketchRepository)
4447
FeatureProbe featureProbe = new FeatureProbe("_")
45-
projectService = new ProjectService(projectRepository, environmentRepository, featureProbe, entityManager)
48+
projectService = new ProjectService(projectRepository, environmentRepository, targetingSketchRepository, featureProbe, entityManager)
4649
guestService = new GuestService(appConfig, memberRepository, entityManager, projectService)
4750
}
4851

src/test/groovy/com/featureprobe/api/service/MetricServiceSpec.groovy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,11 @@ class MetricServiceSpec extends Specification {
7070

7171
then:
7272
1 * environmentRepository.findByProjectKeyAndKey(projectKey, envKey) >> Optional.of(new Environment(serverSdkKey: serverSdkKey))
73-
1 * targetingRepository.findByProjectKeyAndEnvironmentKeyAndToggleKey(projectKey, envKey, toggleKey) >> Optional.of(new Targeting(id: 1))
73+
1 * targetingRepository.findByProjectKeyAndEnvironmentKeyAndToggleKey(projectKey, envKey, toggleKey) >> Optional.of(new Targeting(id: 1, content: "{}"))
7474
2 * metricsCacheRepository.findBySdkKeyAndToggleKeyAndStartDateAndEndDateAndType(serverSdkKey, toggleKey, _, _, MetricsCacheTypeEnum.METRICS) >> Optional.empty()
7575
3 * eventRepository.findBySdkKeyAndToggleKeyAndStartDateGreaterThanEqualAndEndDateLessThanEqual(serverSdkKey, toggleKey,
7676
_, _) >> []
7777
1 * variationHistoryRepository.findByProjectKeyAndEnvironmentKeyAndToggleKey(projectKey, envKey, toggleKey) >> []
78-
1 * targetingRepository.findByProjectKeyAndEnvironmentKeyAndToggleKey(projectKey, envKey, toggleKey) >> Optional.of(new Targeting(content: "{}"))
7978
1 * eventRepository.existsBySdkKeyAndToggleKey(serverSdkKey, toggleKey) >> true
8079
0 == response.summary.size()
8180
response.isAccess

src/test/groovy/com/featureprobe/api/service/ProjectServiceSpec.groovy

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.featureprobe.api.entity.Environment
1111
import com.featureprobe.api.entity.Project
1212
import com.featureprobe.api.repository.EnvironmentRepository
1313
import com.featureprobe.api.repository.ProjectRepository
14+
import com.featureprobe.api.repository.TargetingSketchRepository
1415
import com.featureprobe.sdk.server.FeatureProbe
1516
import org.hibernate.internal.SessionImpl
1617
import org.springframework.security.core.context.SecurityContextHolder
@@ -29,6 +30,8 @@ class ProjectServiceSpec extends Specification {
2930

3031
EnvironmentRepository environmentRepository
3132

33+
TargetingSketchRepository targetingSketchRepository
34+
3235
ProjectQueryRequest queryRequest
3336

3437
ProjectCreateRequest createRequest
@@ -49,9 +52,10 @@ class ProjectServiceSpec extends Specification {
4952
keyword = "feature"
5053
projectRepository = Mock(ProjectRepository)
5154
environmentRepository = Mock(EnvironmentRepository)
55+
targetingSketchRepository = Mock(TargetingSketchRepository)
5256
entityManager = Mock(SessionImpl)
5357
featureProbe = new FeatureProbe("_")
54-
projectService = new ProjectService(projectRepository, environmentRepository, featureProbe, entityManager)
58+
projectService = new ProjectService(projectRepository, environmentRepository, targetingSketchRepository, featureProbe, entityManager)
5559
queryRequest = new ProjectQueryRequest(keyword: keyword)
5660
createRequest = new ProjectCreateRequest(name: projectName, key: projectKey)
5761
projectUpdateRequest = new ProjectUpdateRequest(name: "project_test_update", description: projectKey, archived: true)
@@ -155,6 +159,7 @@ class ProjectServiceSpec extends Specification {
155159
def list = projectService.approvalSettingsList(projectKey)
156160
then:
157161
1 * environmentRepository.findAllByProjectKey(projectKey) >> [new Environment(key: "dev", enableApproval: true, reviewers: "[\"Admin\"]")]
162+
1 * targetingSketchRepository.existsByProjectKeyAndEnvironmentKeyAndStatus(_, _, _) >> true
158163
1 == list.size()
159164
}
160165

src/test/groovy/com/featureprobe/api/service/UserPasswordAuthenticationSpec.groovy

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@ import com.featureprobe.api.auth.UserPasswordAuthenticationProvider
44
import com.featureprobe.api.auth.UserPasswordAuthenticationToken
55
import com.featureprobe.api.base.enums.RoleEnum
66
import com.featureprobe.api.entity.Member
7-
import com.featureprobe.api.repository.MemberRepository
87
import com.featureprobe.api.repository.OperationLogRepository
98
import spock.lang.Specification
109

1110
class UserPasswordAuthenticationSpec extends Specification{
1211

13-
def MemberService memberService
12+
MemberService memberService
1413

1514
OperationLogService operationLogService
1615

1716
OperationLogRepository operationLogRepository
1817

19-
def UserPasswordAuthenticationProvider userPasswordAuthenticationProvider
18+
UserPasswordAuthenticationProvider userPasswordAuthenticationProvider
2019

21-
def UserPasswordAuthenticationToken token
20+
UserPasswordAuthenticationToken token
2221

2322
def setup() {
2423
this.memberService = Mock(MemberService)

0 commit comments

Comments
 (0)