Skip to content

Commit e6c5c54

Browse files
committed
update flow yaml in business
1 parent fd6ceaf commit e6c5c54

File tree

6 files changed

+162
-1
lines changed

6 files changed

+162
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.flowci.flow.business;
22

33
public interface FetchFlowYamlContent {
4+
/**
5+
* Fetch yaml content
6+
* @param id flow id
7+
* @return YAML with Base64 format
8+
*/
49
String invoke(Long id);
510
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.flowci.flow.business;
2+
3+
public interface UpdateFlowYamlContent {
4+
/**
5+
* Update flow YAML
6+
* @param id flow id
7+
* @param b64Yaml YAML with Base64 format
8+
*/
9+
void invoke(Long id, String b64Yaml);
10+
}

src/main/java/com/flowci/flow/business/impl/FetchFlowYamlContentImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import lombok.extern.slf4j.Slf4j;
88
import org.springframework.stereotype.Component;
99

10+
import java.util.Base64;
11+
1012
import static java.lang.String.format;
1113

1214
@Slf4j
@@ -22,6 +24,7 @@ public String invoke(Long id) {
2224
if (optional.isEmpty()) {
2325
throw new NotAvailableException(format("flow %s not found", id));
2426
}
25-
return optional.get().getYaml();
27+
var yaml = optional.get().getYaml();
28+
return Base64.getEncoder().encodeToString(yaml.getBytes());
2629
}
2730
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.flowci.flow.business.impl;
2+
3+
import com.flowci.common.RequestContextHolder;
4+
import com.flowci.common.exception.NotAvailableException;
5+
import com.flowci.flow.business.UpdateFlowYamlContent;
6+
import com.flowci.flow.repo.FlowYamlRepo;
7+
import com.flowci.yaml.business.ParseYamlV2;
8+
import lombok.AllArgsConstructor;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.util.Base64;
13+
14+
import static java.lang.String.format;
15+
16+
@Slf4j
17+
@Component
18+
@AllArgsConstructor
19+
public class UpdateFlowYamlContentImpl implements UpdateFlowYamlContent {
20+
21+
private final ParseYamlV2 parseYamlV2;
22+
23+
private final FlowYamlRepo flowYamlRepo;
24+
25+
private final RequestContextHolder requestContextHolder;
26+
27+
@Override
28+
public void invoke(Long id, String b64Yaml) {
29+
var yaml = new String(Base64.getDecoder().decode(b64Yaml));
30+
var ignore = parseYamlV2.invoke(yaml);
31+
32+
var optional = flowYamlRepo.findById(id);
33+
if (optional.isEmpty()) {
34+
throw new NotAvailableException(format("flow %s not found", id));
35+
}
36+
37+
var flowYaml = optional.get();
38+
flowYaml.setYaml(yaml);
39+
flowYaml.setUpdatedBy(requestContextHolder.getUserId());
40+
flowYamlRepo.save(flowYaml);
41+
}
42+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.flowci.flow.business;
2+
3+
import com.flowci.SpringTest;
4+
import com.flowci.TestUtils;
5+
import com.flowci.flow.model.FlowYaml;
6+
import org.junit.jupiter.api.Test;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
9+
import java.util.Base64;
10+
import java.util.Optional;
11+
12+
import static org.instancio.Select.field;
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.mockito.ArgumentMatchers.any;
15+
import static org.mockito.Mockito.when;
16+
17+
class FetchFlowYamlContentTest extends SpringTest {
18+
19+
@Autowired
20+
private MockRepositoriesConfig repositoriesConfig;
21+
22+
@Autowired
23+
private FetchFlowYamlContent fetchFlowYamlContent;
24+
25+
@Test
26+
void whenFetching_thenReturnYamlEncodedWithBase64() {
27+
var expectedYaml = "some yaml";
28+
var mockFlowYaml = TestUtils.newDummyInstance(FlowYaml.class)
29+
.set(field(FlowYaml::getYaml), expectedYaml)
30+
.create();
31+
32+
var mockFlowYamlRepo = repositoriesConfig.getFlowYamlRepo();
33+
when(mockFlowYamlRepo.findById(any())).thenReturn(Optional.of(mockFlowYaml));
34+
35+
var base64Yaml = fetchFlowYamlContent.invoke(1L);
36+
assertEquals(Base64.getEncoder().encodeToString(expectedYaml.getBytes()), base64Yaml);
37+
}
38+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.flowci.flow.business;
2+
3+
import com.flowci.SpringTest;
4+
import com.flowci.common.RequestContextHolder;
5+
import com.flowci.flow.model.FlowYaml;
6+
import com.flowci.yaml.business.ParseYamlV2;
7+
import com.flowci.yaml.model.FlowV2;
8+
import org.junit.jupiter.api.Test;
9+
import org.mockito.ArgumentCaptor;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.test.mock.mockito.MockBean;
12+
13+
import java.util.Base64;
14+
import java.util.Optional;
15+
16+
import static com.flowci.TestUtils.newDummyInstance;
17+
import static org.instancio.Select.field;
18+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.mockito.ArgumentMatchers.any;
21+
import static org.mockito.ArgumentMatchers.eq;
22+
import static org.mockito.Mockito.mock;
23+
import static org.mockito.Mockito.when;
24+
25+
class UpdateFlowYamlContentTest extends SpringTest {
26+
27+
@Autowired
28+
private UpdateFlowYamlContent updateFlowYamlContent;
29+
30+
@Autowired
31+
private MockRepositoriesConfig mockRepositoriesConfig;
32+
33+
@MockBean
34+
private ParseYamlV2 mockParseYamlV2;
35+
36+
@MockBean
37+
private RequestContextHolder mockRequestContextHolder;
38+
39+
@Test
40+
void givenYaml_whenUpdating_thenUpdated() {
41+
var mockUserId = 10L;
42+
var mockFlowId = 20L;
43+
44+
var mockFlowYaml = newDummyInstance(FlowYaml.class)
45+
.set(field(FlowYaml::getId), mockFlowId)
46+
.set(field(FlowYaml::getYaml), "yaml")
47+
.set(field(FlowYaml::getUpdatedBy), 1L)
48+
.create();
49+
50+
when(mockRequestContextHolder.getUserId()).thenReturn(mockUserId);
51+
when(mockParseYamlV2.invoke(any())).thenReturn(mock(FlowV2.class));
52+
53+
var flowYamlCaptor = ArgumentCaptor.forClass(FlowYaml.class);
54+
var mockFlowYamlRepo = mockRepositoriesConfig.getFlowYamlRepo();
55+
when(mockFlowYamlRepo.findById(eq(mockFlowId))).thenReturn(Optional.of(mockFlowYaml));
56+
when(mockFlowYamlRepo.save(flowYamlCaptor.capture())).thenReturn(mockFlowYaml);
57+
58+
var base64Yaml = Base64.getEncoder().encodeToString("updated yaml".getBytes());
59+
assertDoesNotThrow(() -> updateFlowYamlContent.invoke(mockFlowId, base64Yaml));
60+
assertEquals("updated yaml", flowYamlCaptor.getValue().getYaml());
61+
assertEquals(mockUserId, flowYamlCaptor.getValue().getUpdatedBy());
62+
}
63+
}

0 commit comments

Comments
 (0)