Skip to content

Commit

Permalink
list build by status
Browse files Browse the repository at this point in the history
  • Loading branch information
gy2006 committed Jan 19, 2025
1 parent 6d5be56 commit c49a0a8
Show file tree
Hide file tree
Showing 14 changed files with 123 additions and 34 deletions.
35 changes: 35 additions & 0 deletions src/main/java/com/flowci/build/BuildController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.flowci.build;

import com.flowci.build.business.ListBuilds;
import com.flowci.build.model.Build;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/v2/builds")
@Tag(name = "build")
@AllArgsConstructor
public class BuildController {

private final ListBuilds listBuilds;

@Operation(description = "list builds")
@GetMapping
public List<Build> getBuildsByStatus(@RequestParam("status") Build.Status status,
@RequestParam(required = false, name = "page", defaultValue = "0")
@Valid @Min(0)
Integer page,
@RequestParam(required = false, name = "size", defaultValue = "20")
@Valid @Min(20)
Integer size) {
return listBuilds.invoke(status, PageRequest.of(page, size));
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/flowci/build/FlowBuildController.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

@RestController
@RequestMapping("/v2/flows")
@Tag(name = "build for flows")
@Tag(name = "flow")
@AllArgsConstructor
public class FlowBuildController {

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/flowci/build/business/FetchBuild.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.flowci.build.business;

import com.flowci.build.model.Build;

public interface FetchBuild {
Build invoke(Long buildId);
}
11 changes: 11 additions & 0 deletions src/main/java/com/flowci/build/business/ListBuilds.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.flowci.build.business;

import com.flowci.build.model.Build;
import org.springframework.data.domain.PageRequest;

import java.util.List;

public interface ListBuilds {
List<Build> invoke(PageRequest pageRequest);
List<Build> invoke(Build.Status status, PageRequest pageRequest);
}
24 changes: 24 additions & 0 deletions src/main/java/com/flowci/build/business/impl/FetchBuildImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.flowci.build.business.impl;

import com.flowci.build.business.FetchBuild;
import com.flowci.build.model.Build;
import com.flowci.build.repo.BuildRepo;
import com.flowci.common.exception.NotAvailableException;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@AllArgsConstructor
public class FetchBuildImpl implements FetchBuild {

private final BuildRepo buildRepo;

@Override
public Build invoke(Long buildId) {
var optional = buildRepo.findById(buildId);
if (optional.isEmpty()) {
throw new NotAvailableException("Build not found");
}
return optional.get();
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/flowci/build/business/impl/ListBuildsImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.flowci.build.business.impl;

import com.flowci.build.business.ListBuilds;
import com.flowci.build.model.Build;
import com.flowci.build.repo.BuildRepo;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@AllArgsConstructor
public class ListBuildsImpl implements ListBuilds {

private final BuildRepo buildRepo;

@Override
public List<Build> invoke(PageRequest pageRequest) {
return buildRepo.findAll(pageRequest).getContent();
}

@Override
public List<Build> invoke(Build.Status status, PageRequest pageRequest) {
return buildRepo.findAllByStatusOrderByCreatedAtDesc(status, pageRequest);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.flowci.build.business.impl;

import com.flowci.build.business.CreateBuild;
import com.flowci.build.business.FetchBuild;
import com.flowci.build.business.TriggerBuild;
import com.flowci.build.business.WaitForAgent;
import com.flowci.build.model.Build;
Expand All @@ -16,12 +17,13 @@ public class TriggerBuildImpl implements TriggerBuild {

private final CreateBuild createBuild;
private final WaitForAgent waitForAgent;
private final FetchBuild fetchBuild;

@Override
@Transactional
public Build invoke(Long flowId, Build.Trigger trigger, @Nullable Variables inputs) {
var build = createBuild.invoke(flowId, trigger, inputs);
waitForAgent.invoke(build.getId());
return build;
return fetchBuild.invoke(build.getId());
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/flowci/build/repo/BuildRepo.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.flowci.build.repo;

import com.flowci.build.model.Build;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public interface BuildRepo extends JpaRepository<Build, Long> {

List<Build> findAllByStatusOrderByCreatedAtDesc(Build.Status status, Pageable pageable);

@Transactional
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query("update Build b set b.status = ?2 where b.id= ?1")
Expand Down
14 changes: 2 additions & 12 deletions src/main/java/com/flowci/flow/FlowController.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

Expand Down Expand Up @@ -48,16 +46,8 @@ public Flow getFlow(@PathVariable("id") @Valid @ValidId String id) {
@GetMapping
public List<Flow> getFlows(@RequestParam(required = false, name = "parentId", defaultValue = "10000")
@Valid @ValidId
String parentId,

@RequestParam(required = false, name = "page", defaultValue = "0")
@Valid @Min(0)
Integer page,

@RequestParam(required = false, name = "size", defaultValue = "20")
@Valid @Min(20)
Integer size) {
return listFlows.invoke(parseLong(parentId), PageRequest.of(page, size));
String parentId) {
return listFlows.invoke(parseLong(parentId));
}

@Operation(description = "create a new flow")
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/flowci/flow/business/ListFlows.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@

import com.flowci.flow.model.Flow;
import jakarta.annotation.Nullable;
import org.springframework.data.domain.PageRequest;

import java.util.List;

public interface ListFlows {
List<Flow> invoke(@Nullable Long parentId, PageRequest pageRequest);
List<Flow> invoke(@Nullable Long parentId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import jakarta.annotation.Nullable;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
Expand All @@ -24,15 +23,14 @@ public class ListFlowsImpl implements ListFlows {
private final RequestContextHolder requestContextHolder;

@Override
public List<Flow> invoke(@Nullable Long parentId, PageRequest pageRequest) {
public List<Flow> invoke(@Nullable Long parentId) {
if (parentId == null) {
parentId = Flow.ROOT_ID;
}

var list = flowRepo.findAllByParentIdAndUserIdOrderByCreatedAt(
parentId,
requestContextHolder.getUserId(),
pageRequest
requestContextHolder.getUserId()
);

var r = new ArrayList<Flow>(list.size() + 1);
Expand Down
7 changes: 1 addition & 6 deletions src/main/java/com/flowci/flow/repo/FlowRepo.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.flowci.flow.repo;

import com.flowci.flow.model.Flow;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
Expand All @@ -18,9 +17,5 @@ public interface FlowRepo extends JpaRepository<Flow, Long> {
"where f.id in (select fu.flowId from FlowUser fu where fu.userId = ?2) " +
"and f.parentId = ?1 " +
"order by f.createdAt")
List<Flow> findAllByParentIdAndUserIdOrderByCreatedAt(
Long parentId,
Long userId,
Pageable pageable
);
List<Flow> findAllByParentIdAndUserIdOrderByCreatedAt(Long parentId, Long userId);
}
5 changes: 2 additions & 3 deletions src/test/java/com/flowci/flow/business/ListFlowsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ void givenParentId_whenFetching_thenReturnAllFlowsUnderTheParent() {
var userIdCaptor = ArgumentCaptor.forClass(Long.class);
when(flowRepoMock.findAllByParentIdAndUserIdOrderByCreatedAt(
parentIdCaptor.capture(),
userIdCaptor.capture(),
any(Pageable.class))
userIdCaptor.capture())
).thenReturn(List.of(newDummyInstance(Flow.class).create()));

// mock fetch root flow
Expand All @@ -57,7 +56,7 @@ void givenParentId_whenFetching_thenReturnAllFlowsUnderTheParent() {
// verify the parent should be root id as default
assertEquals(Flow.ROOT_ID, parentIdCaptor.getValue());
verify(flowRepoMock, times(1)).findAllByParentIdAndUserIdOrderByCreatedAt(
parentIdCaptor.capture(), userIdCaptor.capture(), any(Pageable.class));
parentIdCaptor.capture(), userIdCaptor.capture());

// verify the root flow also fetched
verify(fetchFlow, times(1)).invoke(eq(Flow.ROOT_ID));
Expand Down
7 changes: 2 additions & 5 deletions src/test/java/com/flowci/flow/repo/FlowRepoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.PageRequest;

import static com.flowci.TestUtils.newDummyInstance;
import static org.instancio.Select.field;
Expand Down Expand Up @@ -64,12 +63,10 @@ void whenFindFlowsByParentIdAndUserId_thenReturnListOfFlows() {
flowUserRepo.save(user1);
flowUserRepo.save(user2);

var flowsForUser1 = flowRepo.findAllByParentIdAndUserIdOrderByCreatedAt(
flow.getParentId(), user1.getUserId(), PageRequest.of(0, 1));
var flowsForUser1 = flowRepo.findAllByParentIdAndUserIdOrderByCreatedAt(flow.getParentId(), user1.getUserId());
assertEquals(1, flowsForUser1.size());

var flowsForUser2 = flowRepo.findAllByParentIdAndUserIdOrderByCreatedAt(
flow.getParentId(), user2.getUserId(), PageRequest.of(0, 1));
var flowsForUser2 = flowRepo.findAllByParentIdAndUserIdOrderByCreatedAt(flow.getParentId(), user2.getUserId());
assertEquals(1, flowsForUser2.size());
}

Expand Down

0 comments on commit c49a0a8

Please sign in to comment.