diff --git a/api/src/main/java/com/databasir/api/DocumentController.java b/api/src/main/java/com/databasir/api/DocumentController.java index 05d42b5..554d2c1 100644 --- a/api/src/main/java/com/databasir/api/DocumentController.java +++ b/api/src/main/java/com/databasir/api/DocumentController.java @@ -74,7 +74,10 @@ public class DocumentController { public ResponseEntity getDocumentFiles(@PathVariable Integer projectId, @RequestParam(required = false) Long version, - @RequestParam DocumentFileType fileType) { + @RequestParam(required = false) + List tableIds, + @RequestParam + DocumentFileType fileType) { HttpHeaders headers = new HttpHeaders(); String projectName = projectService.getOne(projectId).getName(); String fileName = projectName + "." + fileType.getFileExtension(); @@ -84,7 +87,7 @@ public class DocumentController { headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return ResponseEntity.ok() .headers(headers) - .body(out -> documentService.export(projectId, version, fileType, out)); + .body(out -> documentService.export(projectId, version, tableIds, fileType, out)); } @GetMapping(Routes.Document.EXPORT_TYPES) diff --git a/core/src/main/java/com/databasir/core/domain/document/generator/plantuml/BasePlantUmlFileGenerator.java b/core/src/main/java/com/databasir/core/domain/document/generator/plantuml/BasePlantUmlFileGenerator.java index 2a52c19..b0f8177 100644 --- a/core/src/main/java/com/databasir/core/domain/document/generator/plantuml/BasePlantUmlFileGenerator.java +++ b/core/src/main/java/com/databasir/core/domain/document/generator/plantuml/BasePlantUmlFileGenerator.java @@ -4,7 +4,6 @@ import com.databasir.common.SystemException; import com.databasir.core.domain.document.data.DatabaseDocumentResponse; import com.databasir.core.domain.document.data.TableDocumentResponse; import com.databasir.core.domain.document.generator.DocumentFileGenerator; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.sourceforge.plantuml.FileFormatOption; import net.sourceforge.plantuml.SourceStringReader; @@ -34,13 +33,24 @@ public abstract class BasePlantUmlFileGenerator implements DocumentFileGenerator protected abstract FileFormatOption fileFormatOption(); - @RequiredArgsConstructor public class ErDsl { private final DocumentFileGenerateContext context; private Set foreignKeyRelations = new HashSet<>(16); + private Set tables = new HashSet<>(16); + + public ErDsl(DocumentFileGenerateContext context) { + this.context = context; + Set tables = context.getDatabaseDocument() + .getTables() + .stream() + .map(TableDocumentResponse::getName) + .collect(Collectors.toSet()); + this.tables = tables; + } + public String toDsl() { DatabaseDocumentResponse databaseDocument = context.getDatabaseDocument(); StringBuilder dslBuilder = new StringBuilder(1024); @@ -115,19 +125,22 @@ public abstract class BasePlantUmlFileGenerator implements DocumentFileGenerator dslBuilder.append("}"); dslBuilder.append(LINE); - table.getForeignKeys().forEach(fk -> { - String fkTableName = fk.getFkTableName(); - String fkColumnName = fk.getFkColumnName(); - String pkTableName = fk.getPkTableName(); - String pkColumnName = fk.getPkColumnName(); - StringBuilder relationBuilder = new StringBuilder(); - relationBuilder.append(fkTableName).append("::").append(fkColumnName) - .append(" --> ") - .append(pkTableName).append("::").append(pkColumnName) - .append(" : ") - .append(Objects.requireNonNullElse(fk.getFkName(), "")); - foreignKeyRelations.add(relationBuilder.toString()); - }); + table.getForeignKeys() + .stream() + .filter(fk -> tables.contains(fk.getFkTableName()) && tables.contains(fk.getPkTableName())) + .forEach(fk -> { + String fkTableName = fk.getFkTableName(); + String fkColumnName = fk.getFkColumnName(); + String pkTableName = fk.getPkTableName(); + String pkColumnName = fk.getPkColumnName(); + StringBuilder relationBuilder = new StringBuilder(); + relationBuilder.append(fkTableName).append("::").append(fkColumnName) + .append(" --> ") + .append(pkTableName).append("::").append(pkColumnName) + .append(" : ") + .append(Objects.requireNonNullElse(fk.getFkName(), "")); + foreignKeyRelations.add(relationBuilder.toString()); + }); return dslBuilder.toString(); } } diff --git a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java index a1ea136..9eb63bf 100644 --- a/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java +++ b/core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java @@ -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.event.DocumentUpdated; 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.infrastructure.connection.DatabaseConnectionService; import com.databasir.core.infrastructure.converter.JsonConverter; @@ -526,19 +527,34 @@ public class DocumentService { public void export(Integer projectId, Long version, + List tableIds, DocumentFileType type, OutputStream out) { - getOneByProjectId(projectId, version) - .ifPresent(doc -> { - var context = DocumentFileGenerator.DocumentFileGenerateContext.builder() - .documentFileType(type) - .databaseDocument(doc) - .build(); - documentFileGenerators.stream() - .filter(g -> g.support(type)) - .findFirst() - .ifPresent(generator -> generator.generate(context, out)); - }); + DatabaseDocumentResponse doc; + if (tableIds == null || CollectionUtils.isEmpty(tableIds)) { + doc = getOneByProjectId(projectId, version) + .orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception); + } else { + DatabaseDocumentPojo databaseDoc; + if (version == null) { + databaseDoc = databaseDocumentDao.selectNotArchivedByProjectId(projectId) + .orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception); + } else { + databaseDoc = databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, version) + .orElseThrow(DomainErrors.DOCUMENT_VERSION_IS_INVALID::exception); + } + Integer databaseDocId = databaseDoc.getId(); + List 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 getTableAndColumns(Integer projectId, Long version) { diff --git a/dao/src/main/java/com/databasir/dao/impl/DatabaseDocumentDao.java b/dao/src/main/java/com/databasir/dao/impl/DatabaseDocumentDao.java index 97d0ed1..e3faa6d 100644 --- a/dao/src/main/java/com/databasir/dao/impl/DatabaseDocumentDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/DatabaseDocumentDao.java @@ -43,6 +43,14 @@ public class DatabaseDocumentDao extends BaseDao { .fetchOptionalInto(DatabaseDocumentPojo.class); } + public Optional 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) { DatabaseDocumentRecord record = getDslContext().newRecord(DATABASE_DOCUMENT, toPojo); record.changed(DATABASE_DOCUMENT.ID, false); diff --git a/databasir-frontend b/databasir-frontend index 7bac0c7..05b6e67 160000 --- a/databasir-frontend +++ b/databasir-frontend @@ -1 +1 @@ -Subproject commit 7bac0c7f123c89a1e70c82d43f2c7c7d061dd943 +Subproject commit 05b6e6761238bcda003a787cb66c51a002c810c7