mirror of
https://github.com/vran-dev/databasir.git
synced 2025-09-17 00:57:11 +08:00
Merge pull request #209 from vran-dev/issue-208
feature: support export specified tables
This commit is contained in:
@@ -74,7 +74,10 @@ public class DocumentController {
|
|||||||
public ResponseEntity<StreamingResponseBody> getDocumentFiles(@PathVariable Integer projectId,
|
public ResponseEntity<StreamingResponseBody> getDocumentFiles(@PathVariable Integer projectId,
|
||||||
@RequestParam(required = false)
|
@RequestParam(required = false)
|
||||||
Long version,
|
Long version,
|
||||||
@RequestParam DocumentFileType fileType) {
|
@RequestParam(required = false)
|
||||||
|
List<Integer> tableIds,
|
||||||
|
@RequestParam
|
||||||
|
DocumentFileType fileType) {
|
||||||
HttpHeaders headers = new HttpHeaders();
|
HttpHeaders headers = new HttpHeaders();
|
||||||
String projectName = projectService.getOne(projectId).getName();
|
String projectName = projectService.getOne(projectId).getName();
|
||||||
String fileName = projectName + "." + fileType.getFileExtension();
|
String fileName = projectName + "." + fileType.getFileExtension();
|
||||||
@@ -84,7 +87,7 @@ public class DocumentController {
|
|||||||
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
|
||||||
return ResponseEntity.ok()
|
return ResponseEntity.ok()
|
||||||
.headers(headers)
|
.headers(headers)
|
||||||
.body(out -> documentService.export(projectId, version, fileType, out));
|
.body(out -> documentService.export(projectId, version, tableIds, fileType, out));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(Routes.Document.EXPORT_TYPES)
|
@GetMapping(Routes.Document.EXPORT_TYPES)
|
||||||
|
@@ -1 +1 @@
|
|||||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir</title><script defer="defer" type="module" src="/js/chunk-vendors.661f96f0.js"></script><script defer="defer" type="module" src="/js/app.98502fba.js"></script><link href="/css/chunk-vendors.113af7af.css" rel="stylesheet"><link href="/css/app.ee11d130.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors-legacy.fc4c9525.js" nomodule></script><script defer="defer" src="/js/app-legacy.25171435.js" nomodule></script></head><body><noscript><strong>We're sorry but databasir doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir</title><script defer="defer" type="module" src="/js/chunk-vendors.661f96f0.js"></script><script defer="defer" type="module" src="/js/app.7bd4174c.js"></script><link href="/css/chunk-vendors.113af7af.css" rel="stylesheet"><link href="/css/app.ee11d130.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors-legacy.fc4c9525.js" nomodule></script><script defer="defer" src="/js/app-legacy.9cbae090.js" nomodule></script></head><body><noscript><strong>We're sorry but databasir doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
File diff suppressed because one or more lines are too long
1
api/src/main/resources/static/js/170.aa97c575.js.map
Normal file
1
api/src/main/resources/static/js/170.aa97c575.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -4,7 +4,6 @@ import com.databasir.common.SystemException;
|
|||||||
import com.databasir.core.domain.document.data.DatabaseDocumentResponse;
|
import com.databasir.core.domain.document.data.DatabaseDocumentResponse;
|
||||||
import com.databasir.core.domain.document.data.TableDocumentResponse;
|
import com.databasir.core.domain.document.data.TableDocumentResponse;
|
||||||
import com.databasir.core.domain.document.generator.DocumentFileGenerator;
|
import com.databasir.core.domain.document.generator.DocumentFileGenerator;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.sourceforge.plantuml.FileFormatOption;
|
import net.sourceforge.plantuml.FileFormatOption;
|
||||||
import net.sourceforge.plantuml.SourceStringReader;
|
import net.sourceforge.plantuml.SourceStringReader;
|
||||||
@@ -34,13 +33,24 @@ public abstract class BasePlantUmlFileGenerator implements DocumentFileGenerator
|
|||||||
|
|
||||||
protected abstract FileFormatOption fileFormatOption();
|
protected abstract FileFormatOption fileFormatOption();
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class ErDsl {
|
public class ErDsl {
|
||||||
|
|
||||||
private final DocumentFileGenerateContext context;
|
private final DocumentFileGenerateContext context;
|
||||||
|
|
||||||
private Set<String> foreignKeyRelations = new HashSet<>(16);
|
private Set<String> foreignKeyRelations = new HashSet<>(16);
|
||||||
|
|
||||||
|
private Set<String> tables = new HashSet<>(16);
|
||||||
|
|
||||||
|
public ErDsl(DocumentFileGenerateContext context) {
|
||||||
|
this.context = context;
|
||||||
|
Set<String> tables = context.getDatabaseDocument()
|
||||||
|
.getTables()
|
||||||
|
.stream()
|
||||||
|
.map(TableDocumentResponse::getName)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
this.tables = tables;
|
||||||
|
}
|
||||||
|
|
||||||
public String toDsl() {
|
public String toDsl() {
|
||||||
DatabaseDocumentResponse databaseDocument = context.getDatabaseDocument();
|
DatabaseDocumentResponse databaseDocument = context.getDatabaseDocument();
|
||||||
StringBuilder dslBuilder = new StringBuilder(1024);
|
StringBuilder dslBuilder = new StringBuilder(1024);
|
||||||
@@ -115,19 +125,22 @@ public abstract class BasePlantUmlFileGenerator implements DocumentFileGenerator
|
|||||||
dslBuilder.append("}");
|
dslBuilder.append("}");
|
||||||
dslBuilder.append(LINE);
|
dslBuilder.append(LINE);
|
||||||
|
|
||||||
table.getForeignKeys().forEach(fk -> {
|
table.getForeignKeys()
|
||||||
String fkTableName = fk.getFkTableName();
|
.stream()
|
||||||
String fkColumnName = fk.getFkColumnName();
|
.filter(fk -> tables.contains(fk.getFkTableName()) && tables.contains(fk.getPkTableName()))
|
||||||
String pkTableName = fk.getPkTableName();
|
.forEach(fk -> {
|
||||||
String pkColumnName = fk.getPkColumnName();
|
String fkTableName = fk.getFkTableName();
|
||||||
StringBuilder relationBuilder = new StringBuilder();
|
String fkColumnName = fk.getFkColumnName();
|
||||||
relationBuilder.append(fkTableName).append("::").append(fkColumnName)
|
String pkTableName = fk.getPkTableName();
|
||||||
.append(" --> ")
|
String pkColumnName = fk.getPkColumnName();
|
||||||
.append(pkTableName).append("::").append(pkColumnName)
|
StringBuilder relationBuilder = new StringBuilder();
|
||||||
.append(" : ")
|
relationBuilder.append(fkTableName).append("::").append(fkColumnName)
|
||||||
.append(Objects.requireNonNullElse(fk.getFkName(), ""));
|
.append(" --> ")
|
||||||
foreignKeyRelations.add(relationBuilder.toString());
|
.append(pkTableName).append("::").append(pkColumnName)
|
||||||
});
|
.append(" : ")
|
||||||
|
.append(Objects.requireNonNullElse(fk.getFkName(), ""));
|
||||||
|
foreignKeyRelations.add(relationBuilder.toString());
|
||||||
|
});
|
||||||
return dslBuilder.toString();
|
return dslBuilder.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@ import com.databasir.core.domain.document.data.*;
|
|||||||
import com.databasir.core.domain.document.data.TableDocumentResponse.ForeignKeyDocumentResponse;
|
import com.databasir.core.domain.document.data.TableDocumentResponse.ForeignKeyDocumentResponse;
|
||||||
import com.databasir.core.domain.document.event.DocumentUpdated;
|
import com.databasir.core.domain.document.event.DocumentUpdated;
|
||||||
import com.databasir.core.domain.document.generator.DocumentFileGenerator;
|
import com.databasir.core.domain.document.generator.DocumentFileGenerator;
|
||||||
|
import com.databasir.core.domain.document.generator.DocumentFileGenerator.DocumentFileGenerateContext;
|
||||||
import com.databasir.core.domain.document.generator.DocumentFileType;
|
import com.databasir.core.domain.document.generator.DocumentFileType;
|
||||||
import com.databasir.core.infrastructure.connection.DatabaseConnectionService;
|
import com.databasir.core.infrastructure.connection.DatabaseConnectionService;
|
||||||
import com.databasir.core.infrastructure.converter.JsonConverter;
|
import com.databasir.core.infrastructure.converter.JsonConverter;
|
||||||
@@ -526,19 +527,34 @@ public class DocumentService {
|
|||||||
|
|
||||||
public void export(Integer projectId,
|
public void export(Integer projectId,
|
||||||
Long version,
|
Long version,
|
||||||
|
List<Integer> tableIds,
|
||||||
DocumentFileType type,
|
DocumentFileType type,
|
||||||
OutputStream out) {
|
OutputStream out) {
|
||||||
getOneByProjectId(projectId, version)
|
DatabaseDocumentResponse doc;
|
||||||
.ifPresent(doc -> {
|
if (tableIds == null || CollectionUtils.isEmpty(tableIds)) {
|
||||||
var context = DocumentFileGenerator.DocumentFileGenerateContext.builder()
|
doc = getOneByProjectId(projectId, version)
|
||||||
.documentFileType(type)
|
.orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception);
|
||||||
.databaseDocument(doc)
|
} else {
|
||||||
.build();
|
DatabaseDocumentPojo databaseDoc;
|
||||||
documentFileGenerators.stream()
|
if (version == null) {
|
||||||
.filter(g -> g.support(type))
|
databaseDoc = databaseDocumentDao.selectNotArchivedByProjectId(projectId)
|
||||||
.findFirst()
|
.orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception);
|
||||||
.ifPresent(generator -> generator.generate(context, out));
|
} else {
|
||||||
});
|
databaseDoc = databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, version)
|
||||||
|
.orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception);
|
||||||
|
}
|
||||||
|
Integer databaseDocId = databaseDoc.getId();
|
||||||
|
List<TableDocumentResponse> tableDocs = getTableDetails(projectId, databaseDocId, tableIds);
|
||||||
|
doc = documentResponseConverter.of(databaseDoc, tableDocs);
|
||||||
|
}
|
||||||
|
var context = DocumentFileGenerateContext.builder()
|
||||||
|
.documentFileType(type)
|
||||||
|
.databaseDocument(doc)
|
||||||
|
.build();
|
||||||
|
documentFileGenerators.stream()
|
||||||
|
.filter(g -> g.support(type))
|
||||||
|
.findFirst()
|
||||||
|
.ifPresent(generator -> generator.generate(context, out));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TableResponse> getTableAndColumns(Integer projectId, Long version) {
|
public List<TableResponse> getTableAndColumns(Integer projectId, Long version) {
|
||||||
|
@@ -43,6 +43,14 @@ public class DatabaseDocumentDao extends BaseDao<DatabaseDocumentPojo> {
|
|||||||
.fetchOptionalInto(DatabaseDocumentPojo.class);
|
.fetchOptionalInto(DatabaseDocumentPojo.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> selectIdByProjectIdAndVersion(Integer projectId,
|
||||||
|
Long version) {
|
||||||
|
return getDslContext()
|
||||||
|
.select(DATABASE_DOCUMENT.ID).from(DATABASE_DOCUMENT)
|
||||||
|
.where(DATABASE_DOCUMENT.PROJECT_ID.eq(projectId).and(DATABASE_DOCUMENT.VERSION.eq(version)))
|
||||||
|
.fetchOptionalInto(Integer.class);
|
||||||
|
}
|
||||||
|
|
||||||
public void update(DatabaseDocumentPojo toPojo) {
|
public void update(DatabaseDocumentPojo toPojo) {
|
||||||
DatabaseDocumentRecord record = getDslContext().newRecord(DATABASE_DOCUMENT, toPojo);
|
DatabaseDocumentRecord record = getDslContext().newRecord(DATABASE_DOCUMENT, toPojo);
|
||||||
record.changed(DATABASE_DOCUMENT.ID, false);
|
record.changed(DATABASE_DOCUMENT.ID, false);
|
||||||
|
Submodule databasir-frontend updated: 7bac0c7f12...05b6e67612
Reference in New Issue
Block a user