Skip to content

Commit

Permalink
[backend/frontend] Use Mixin
Browse files Browse the repository at this point in the history
  • Loading branch information
RomuDeuxfois committed Aug 2, 2024
1 parent 26b68f1 commit 68115ee
Show file tree
Hide file tree
Showing 17 changed files with 178 additions and 109 deletions.
22 changes: 6 additions & 16 deletions openbas-api/src/main/java/io/openbas/rest/mapper/MapperApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,35 +23,24 @@
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.reactive.function.UnsupportedMediaTypeException;

import javax.print.attribute.standard.Media;
import java.io.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.MessageFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipOutputStream;

import static io.openbas.database.model.User.ROLE_ADMIN;
import static io.openbas.database.model.User.ROLE_USER;
Expand Down Expand Up @@ -95,18 +84,19 @@ public ImportMapper createImportMapper(@RequestBody @Valid final ImportMapperAdd

@Secured(ROLE_ADMIN)
@PostMapping(value="/api/mappers/export")
public void exportMappers(@RequestBody @Valid final ExportMapperInput exportMapperInput,
HttpServletResponse response) {
List<ImportMapperAddInput> mappers = mapperService.exportMappers(exportMapperInput.getIdsToExport());
public void exportMappers(
@RequestBody @Valid final ExportMapperInput exportMapperInput,
HttpServletResponse response) {
try {
String jsonMappers = mapperService.exportMappers(exportMapperInput.getIdsToExport());
String rightNow = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());
String filename = MessageFormat.format("mappers_{0}.json", rightNow);

Check warning on line 93 in openbas-api/src/main/java/io/openbas/rest/mapper/MapperApi.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/rest/mapper/MapperApi.java#L91-L93

Added lines #L91 - L93 were not covered by tests

response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename);
response.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpServletResponse.SC_OK);

Check warning on line 97 in openbas-api/src/main/java/io/openbas/rest/mapper/MapperApi.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/rest/mapper/MapperApi.java#L95-L97

Added lines #L95 - L97 were not covered by tests

response.getOutputStream().write(mapper.writeValueAsString(mappers).getBytes(StandardCharsets.UTF_8));
response.getOutputStream().write(jsonMappers.getBytes(StandardCharsets.UTF_8));
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.openbas.rest.mapper.export;

import com.fasterxml.jackson.annotation.JsonIncludeProperties;

public class MapperExportMixins {

private MapperExportMixins() {

}

@JsonIncludeProperties(value = {
"import_mapper_name",
"import_mapper_inject_type_column",
"import_mapper_inject_importers",
})
public static class ImportMapper {

Check warning on line 16 in openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java#L16

Added line #L16 was not covered by tests
}

@JsonIncludeProperties(value = {
"inject_importer_type_value",
"inject_importer_injector_contract",
"inject_importer_rule_attributes",
})
public static class InjectImporter {

Check warning on line 24 in openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java#L24

Added line #L24 was not covered by tests
}

@JsonIncludeProperties(value = {
"rule_attribute_columns",
"rule_attribute_name",
"rule_attribute_default_value",
"rule_attribute_additional_config",
})
public static class RuleAttribute {

Check warning on line 33 in openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/rest/mapper/export/MapperExportMixins.java#L33

Added line #L33 was not covered by tests
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
public class ImportMapperAddInput {

@NotBlank(message = MANDATORY_MESSAGE)
@JsonProperty("mapper_name")
@JsonProperty("import_mapper_name")
private String name;

@Pattern(regexp="^[A-Z]{1,2}$")
@JsonProperty("mapper_inject_type_column")
@JsonProperty("import_mapper_inject_type_column")
@NotBlank
private String injectTypeColumn;

@JsonProperty("mapper_inject_importers")
@JsonProperty("import_mapper_inject_importers")
@NotNull
private List<InjectImporterAddInput> importers = new ArrayList<>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
public class ImportMapperUpdateInput {

@NotBlank(message = MANDATORY_MESSAGE)
@JsonProperty("mapper_name")
@JsonProperty("import_mapper_name")
private String name;

@Pattern(regexp="^[A-Z]{1,2}$")
@JsonProperty("mapper_inject_type_column")
@JsonProperty("import_mapper_inject_type_column")
@NotBlank
private String injectTypeColumn;

@JsonProperty("mapper_inject_importers")
@JsonProperty("import_mapper_inject_importers")
@NotNull
private List<InjectImporterUpdateInput> importers = new ArrayList<>();
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class InjectImporterAddInput {
private String injectTypeValue;

@NotBlank(message = MANDATORY_MESSAGE)
@JsonProperty("inject_importer_injector_contract_id")
@JsonProperty("inject_importer_injector_contract")
private String injectorContractId;

@JsonProperty("inject_importer_rule_attributes")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class InjectImporterUpdateInput {
private String injectTypeValue;

@NotBlank(message = MANDATORY_MESSAGE)
@JsonProperty("inject_importer_injector_contract_id")
@JsonProperty("inject_importer_injector_contract")
private String injectorContractId;

@JsonProperty("inject_importer_rule_attributes")
Expand Down
53 changes: 25 additions & 28 deletions openbas-api/src/main/java/io/openbas/service/MapperService.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package io.openbas.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.openbas.database.model.ImportMapper;
import io.openbas.database.model.InjectImporter;
import io.openbas.database.model.InjectorContract;
import io.openbas.database.model.RuleAttribute;
import io.openbas.database.repository.ImportMapperRepository;
import io.openbas.database.repository.InjectorContractRepository;
import io.openbas.helper.ObjectMapperHelper;
import io.openbas.rest.exception.ElementNotFoundException;
import io.openbas.rest.mapper.export.MapperExportMixins;
import io.openbas.rest.mapper.form.*;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;

import java.time.Instant;
Expand All @@ -18,9 +23,10 @@
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import static java.util.stream.StreamSupport.stream;

@RequiredArgsConstructor
@Service
public class MapperService {
Expand Down Expand Up @@ -102,7 +108,7 @@ public ImportMapper updateImportMapper(String mapperId, ImportMapperUpdateInput
* @return The map of injector contracts by ids
*/
private Map<String, InjectorContract> getMapOfInjectorContracts(List<String> ids) {
return StreamSupport.stream(injectorContractRepository.findAllById(ids).spliterator(), false)
return stream(injectorContractRepository.findAllById(ids).spliterator(), false)
.collect(Collectors.toMap(InjectorContract::getId, Function.identity()));
}

Expand Down Expand Up @@ -177,34 +183,25 @@ private void updateInjectImporter(List<InjectImporterUpdateInput> injectImporter
});
}

public List<ImportMapperAddInput> exportMappers(List<String> idsToExport) {
List<ImportMapper> mappersList = StreamSupport.stream(importMapperRepository.findAllById(idsToExport.stream().map(UUID::fromString).toList()).spliterator(), false).toList();

return mappersList.stream().map(importMapper -> {
ImportMapperAddInput importMapperAddInput = new ImportMapperAddInput();
importMapperAddInput.setName(importMapper.getName());
importMapperAddInput.setInjectTypeColumn(importMapper.getInjectTypeColumn());
importMapperAddInput.setImporters(importMapper.getInjectImporters().stream().map(
injectImporter -> {
InjectImporterAddInput injectImporterAddInput = new InjectImporterAddInput();
injectImporterAddInput.setInjectTypeValue(injectImporter.getImportTypeValue());
injectImporterAddInput.setInjectorContractId(injectImporter.getInjectorContract().getId());
injectImporterAddInput.setRuleAttributes(injectImporter.getRuleAttributes().stream().map(ruleAttribute -> {
RuleAttributeAddInput ruleAttributeAddInput = new RuleAttributeAddInput();
ruleAttributeAddInput.setColumns(ruleAttribute.getColumns());
ruleAttributeAddInput.setName(ruleAttribute.getName());
ruleAttributeAddInput.setDefaultValue(ruleAttribute.getDefaultValue());
ruleAttributeAddInput.setAdditionalConfig(ruleAttribute.getAdditionalConfig());
return ruleAttributeAddInput;
}).toList());
return injectImporterAddInput;
}
).toList());
return importMapperAddInput;
}).toList();
public String exportMappers(@NotNull final List<String> idsToExport) throws JsonProcessingException {
ObjectMapper objectMapper = ObjectMapperHelper.openBASJsonMapper();
List<ImportMapper> mappersList = StreamSupport.stream(
importMapperRepository.findAllById(idsToExport.stream().map(UUID::fromString).toList()).spliterator(), false
).toList();

objectMapper.addMixIn(ImportMapper.class, MapperExportMixins.ImportMapper.class);
objectMapper.addMixIn(InjectImporter.class, MapperExportMixins.InjectImporter.class);
objectMapper.addMixIn(RuleAttribute.class, MapperExportMixins.RuleAttribute.class);

return objectMapper.writeValueAsString(mappersList);
}

public void importMappers(List<ImportMapperAddInput> mappers) {
importMapperRepository.saveAll(mappers.stream().map(this::createImportMapper).toList());
importMapperRepository.saveAll(
mappers.stream()
.map(this::createImportMapper)
.peek((m) -> m.setName(m.getName() + " (Import)"))
.toList()

Check warning on line 204 in openbas-api/src/main/java/io/openbas/service/MapperService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/service/MapperService.java#L200-L204

Added lines #L200 - L204 were not covered by tests
);
}

Check warning on line 206 in openbas-api/src/main/java/io/openbas/service/MapperService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/service/MapperService.java#L206

Added line #L206 was not covered by tests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.openbas.service;

import io.openbas.IntegrationTest;
import io.openbas.database.model.ImportMapper;
import io.openbas.database.repository.ImportMapperRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

class MapperServiceExportTest extends IntegrationTest {

@Autowired
private ImportMapperRepository importMapperRepository;

@Autowired
private MapperService mapperService;

@DisplayName("Test exporting a mapper")
@Test
void exportMapper() throws Exception {
// -- PREPARE --
ImportMapper mapper = new ImportMapper();
mapper.setName("Test Mapper");
mapper.setInjectTypeColumn("injectType");
mapper.setInjectImporters(new ArrayList<>());
ImportMapper mapperSaved = this.importMapperRepository.save(mapper);

// -- EXECUTE --
String json = this.mapperService.exportMappers(List.of(mapperSaved.getId()));

// -- ASSERT --
assertEquals("[{"
+ "\"import_mapper_name\":\"Test Mapper\","
+ "\"import_mapper_inject_type_column\":\"injectType\","
+ "\"import_mapper_inject_importers\":[]"
+ "}]", json);

// -- CLEAN --
this.importMapperRepository.delete(mapperSaved);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ void updateSpecificMapperWithUpdatedElements() throws Exception {
when(importMapperRepository.findById(any())).thenReturn(Optional.of(importMapper));
when(importMapperRepository.save(any())).thenReturn(importMapper);
when(injectorContractRepository.findAllById(any())).thenReturn(importMapper.getInjectImporters().stream().map(InjectImporter::getInjectorContract).toList());
// -- EXECUTE --

// -- EXECUTE --
ImportMapper response = mapperService.updateImportMapper(importMapper.getId(), importMapperInput);

Expand Down
4 changes: 2 additions & 2 deletions openbas-front/src/actions/mapper/mapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ export type InjectImporterStore = Omit<InjectImporter, 'inject_importer_injector
inject_importer_injector_contract: string;
};

export type ImportMapperStore = Omit<ImportMapper, 'inject_importers'> & {
inject_importers: InjectImporterStore[];
export type ImportMapperStore = Omit<ImportMapper, 'import_mapper_inject_importers'> & {
import_mapper_inject_importers: InjectImporterStore[];
};
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ const useStyles = makeStyles(() => ({
}));

const inlineStyles: Record<string, CSSProperties> = {
mapper_name: {
import_mapper_name: {
width: '30%',
cursor: 'default',
},
Expand All @@ -57,7 +57,7 @@ const XlsMappers = () => {
// Headers
const headers = [
{
field: 'mapper_name',
field: 'import_mapper_name',
label: 'Name',
isSortable: true,
value: (mapper: RawPaginationImportMapper) => mapper.import_mapper_name,
Expand Down
Loading

0 comments on commit 68115ee

Please sign in to comment.