mirror of
https://github.com/dalbodeule/snap-admin.git
synced 2025-12-15 04:41:58 +09:00
WIP CSV export
This commit is contained in:
83
src/main/java/tech/ailef/dbadmin/external/controller/DataExportController.java
vendored
Normal file
83
src/main/java/tech/ailef/dbadmin/external/controller/DataExportController.java
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
package tech.ailef.dbadmin.external.controller;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.commons.csv.CSVFormat;
|
||||
import org.apache.commons.csv.CSVPrinter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import tech.ailef.dbadmin.external.DbAdmin;
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbAdminRepository;
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbField;
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbObject;
|
||||
import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema;
|
||||
import tech.ailef.dbadmin.external.dto.QueryFilter;
|
||||
import tech.ailef.dbadmin.external.exceptions.DbAdminException;
|
||||
import tech.ailef.dbadmin.external.misc.Utils;
|
||||
|
||||
@Controller
|
||||
@RequestMapping(value= {"/${dbadmin.baseUrl}/export", "/${dbadmin.baseUrl}/export/"})
|
||||
public class DataExportController {
|
||||
|
||||
@Autowired
|
||||
private DbAdmin dbAdmin;
|
||||
|
||||
@Autowired
|
||||
private DbAdminRepository repository;
|
||||
|
||||
@GetMapping("/{className}")
|
||||
@ResponseBody
|
||||
public ResponseEntity<byte[]> export(@PathVariable String className,
|
||||
@RequestParam(required=false) String query,
|
||||
@RequestParam MultiValueMap<String, String> otherParams) {
|
||||
|
||||
DbObjectSchema schema = dbAdmin.findSchemaByClassName(className);
|
||||
|
||||
Set<QueryFilter> queryFilters = Utils.computeFilters(schema, otherParams);
|
||||
|
||||
System.out.println("QF = " + queryFilters);
|
||||
|
||||
List<DbObject> results = repository.search(schema, query, queryFilters);
|
||||
|
||||
String result = toCsv(results, schema.getSortedFields());
|
||||
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
|
||||
"attachment; filename=\"export_" + schema.getClass().getSimpleName() + ".csv\"")
|
||||
.body(result.getBytes());
|
||||
}
|
||||
|
||||
private String toCsv(List<DbObject> items, List<DbField> fields) {
|
||||
if (items.isEmpty()) return "";
|
||||
|
||||
StringWriter sw = new StringWriter();
|
||||
|
||||
CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
|
||||
// .setHeader(HEADERS)
|
||||
.build();
|
||||
|
||||
try (final CSVPrinter printer = new CSVPrinter(sw, csvFormat)) {
|
||||
for (DbObject item : items) {
|
||||
printer.printRecord(fields.stream().map(f -> {
|
||||
return item.get(f).getFormattedValue();
|
||||
}));
|
||||
}
|
||||
|
||||
return sw.toString();
|
||||
} catch (IOException e) {
|
||||
throw new DbAdminException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -48,7 +48,7 @@ import tech.ailef.dbadmin.external.exceptions.DbAdminException;
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping(value = {"/${dbadmin.baseUrl}/download", "/${dbadmin.baseUrl}/download/"})
|
||||
public class DownloadController {
|
||||
public class FileDownloadController {
|
||||
@Autowired
|
||||
private DbAdminRepository repository;
|
||||
|
||||
@@ -101,6 +101,12 @@ public class CustomJpaRepository extends SimpleJpaRepository {
|
||||
.setFirstResult((page - 1) * pageSize).getResultList();
|
||||
}
|
||||
|
||||
|
||||
public List<Object> search(String query, Set<QueryFilter> filters) {
|
||||
return search(query, 1, Integer.MAX_VALUE, null, null, filters);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public int update(DbObjectSchema schema, Map<String, String> params, Map<String, MultipartFile> files) {
|
||||
|
||||
@@ -87,6 +87,17 @@ public class DbAdminRepository {
|
||||
public long count(DbObjectSchema schema, String query, Set<QueryFilter> queryFilters) {
|
||||
return schema.getJpaRepository().count(query, queryFilters);
|
||||
}
|
||||
|
||||
public List<DbObject> search(DbObjectSchema schema, String query, Set<QueryFilter> queryFilters) {
|
||||
CustomJpaRepository jpaRepository = schema.getJpaRepository();
|
||||
|
||||
long maxElement = count(schema, query, queryFilters);
|
||||
|
||||
return jpaRepository.search(query, queryFilters).stream()
|
||||
.map(o -> new DbObject(o, schema))
|
||||
.toList();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -227,6 +227,16 @@ public class DbField {
|
||||
&& getPrimitiveField().getAnnotation(ManyToMany.class) == null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether this field is exportable into a CSV file.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public boolean isExportable() {
|
||||
return !isBinary();
|
||||
}
|
||||
|
||||
|
||||
public boolean isGeneratedValue() {
|
||||
return getPrimitiveField().getAnnotation(GeneratedValue.class) != null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user