From 747ae14da291137711783996d23b2b7f6139e57c Mon Sep 17 00:00:00 2001 From: vran Date: Sat, 19 Mar 2022 15:01:15 +0800 Subject: [PATCH] feat: support version diff (#52) * feat: implementation diff processor * fix: checkstyle * feat: ignore sync if without change * fix: checkstyle * feat:add databasir diff api * feat:update frontend resources --- .../com/databasir/api/DocumentController.java | 8 + .../main/java/com/databasir/api/Routes.java | 2 + .../resources/static/css/321.d892cf8e.css | 1 + .../resources/static/css/907.1437368b.css | 1 - api/src/main/resources/static/index.html | 2 +- ...acy.72d604e3.js => 117-legacy.f00c6326.js} | 2 +- ...04e3.js.map => 117-legacy.f00c6326.js.map} | 2 +- ...acy.e055efed.js => 139-legacy.a43600d3.js} | 2 +- ...efed.js.map => 139-legacy.a43600d3.js.map} | 2 +- .../js/{139.299d5af2.js => 139.909d89d2.js} | 2 +- ...39.299d5af2.js.map => 139.909d89d2.js.map} | 2 +- .../static/js/321-legacy.b0227d64.js | 33 + .../static/js/321-legacy.b0227d64.js.map | 1 + .../main/resources/static/js/321.243dc4e3.js | 33 + .../resources/static/js/321.243dc4e3.js.map | 1 + ...acy.6051dcfc.js => 355-legacy.023e4ab2.js} | 2 +- ...dcfc.js.map => 355-legacy.023e4ab2.js.map} | 2 +- .../js/{355.0fcf5559.js => 355.19f5321e.js} | 2 +- ...55.0fcf5559.js.map => 355.19f5321e.js.map} | 2 +- ...acy.5a5a02e8.js => 459-legacy.f2817ef6.js} | 2 +- ...02e8.js.map => 459-legacy.f2817ef6.js.map} | 2 +- .../js/{459.22e837b8.js => 459.d9a5fc8a.js} | 2 +- ...59.22e837b8.js.map => 459.d9a5fc8a.js.map} | 2 +- ...acy.19860010.js => 469-legacy.3e02203b.js} | 2 +- ...0010.js.map => 469-legacy.3e02203b.js.map} | 2 +- .../js/{469.bd114b11.js => 469.8c3ea567.js} | 2 +- ...69.bd114b11.js.map => 469.8c3ea567.js.map} | 2 +- .../js/{564.07fcac27.js => 564.abfed23d.js} | 2 +- ...64.07fcac27.js.map => 564.abfed23d.js.map} | 2 +- ...acy.d38041af.js => 596-legacy.d1261d0e.js} | 2 +- ...41af.js.map => 596-legacy.d1261d0e.js.map} | 2 +- .../js/{596.e58d33aa.js => 596.eb4080a7.js} | 2 +- ...96.e58d33aa.js.map => 596.eb4080a7.js.map} | 2 +- ...acy.94f86cce.js => 719-legacy.85eb5e28.js} | 2 +- ...6cce.js.map => 719-legacy.85eb5e28.js.map} | 2 +- .../js/{719.ab8ac0bb.js => 719.df03c200.js} | 2 +- ...19.ab8ac0bb.js.map => 719.df03c200.js.map} | 2 +- ...acy.56f0845e.js => 754-legacy.2b22ae65.js} | 2 +- ...845e.js.map => 754-legacy.2b22ae65.js.map} | 2 +- .../js/{754.3b3a23fa.js => 754.d037cc5e.js} | 2 +- ...54.3b3a23fa.js.map => 754.d037cc5e.js.map} | 2 +- ...acy.3c829294.js => 865-legacy.fc2fd7b3.js} | 2 +- ...9294.js.map => 865-legacy.fc2fd7b3.js.map} | 2 +- .../js/{865.ef6dc5a3.js => 865.ebbb1893.js} | 2 +- ...65.ef6dc5a3.js.map => 865.ebbb1893.js.map} | 2 +- .../static/js/907-legacy.cb70ee94.js | 33 - .../static/js/907-legacy.cb70ee94.js.map | 1 - .../main/resources/static/js/907.2782ffff.js | 33 - .../resources/static/js/907.2782ffff.js.map | 1 - ...gacy.618121ce.js => 99-legacy.6cfcb3aa.js} | 2 +- ...121ce.js.map => 99-legacy.6cfcb3aa.js.map} | 2 +- .../js/{99.c134b829.js => 99.79a6a4f8.js} | 2 +- ...{99.c134b829.js.map => 99.79a6a4f8.js.map} | 2 +- ...acy.e6a59dc2.js => app-legacy.3d5e4b5d.js} | 4 +- ...9dc2.js.map => app-legacy.3d5e4b5d.js.map} | 2 +- .../js/{app.e0747db1.js => app.08e3c996.js} | 4 +- ...pp.e0747db1.js.map => app.08e3c996.js.map} | 2 +- .../databasir/core/domain/DomainErrors.java | 1 + .../document/converter/BaseConverter.java | 9 - .../converter/DatabaseMetaConverter.java | 71 +++ .../converter/DocumentPojoConverter.java | 4 +- .../document/converter/NullToEmpty.java | 14 - .../document/service/DocumentService.java | 54 +- .../dao/tables/TableColumnDocument.java | 2 +- .../databasir/dao/tables/TableDocument.java | 4 +- .../dao/tables/TableForeignKeyDocument.java | 13 +- .../pojos/TableForeignKeyDocumentPojo.java | 19 + .../TableForeignKeyDocumentRecord.java | 166 +++-- .../java/com/databasir/dao/converter/.gitkeep | 0 .../main/resources/db/migration/V1__init.sql | 13 +- plugin/build.gradle | 2 + .../java/com/databasir/core/diff/Diffs.java | 17 + .../com/databasir/core/diff/data/Diff.java | 11 + .../databasir/core/diff/data/DiffType.java | 9 + .../databasir/core/diff/data/FieldDiff.java | 24 + .../databasir/core/diff/data/RootDiff.java | 15 + .../diff/processor/ColumnDiffProcessor.java | 14 + .../diff/processor/DatabaseDiffProcessor.java | 81 +++ .../core/diff/processor/DiffProcessor.java | 94 +++ .../processor/ForeignKeyDiffProcessor.java | 24 + .../diff/processor/IndexDiffProcessor.java | 14 + .../diff/processor/TableDiffProcessor.java | 158 +++++ .../diff/processor/TriggerDiffProcessor.java | 14 + .../databasir/core/meta/data/ColumnMeta.java | 6 +- .../core/meta/data/DatabaseMeta.java | 4 + .../core/meta/data/ForeignKeyMeta.java | 8 +- .../databasir/core/meta/data/IndexMeta.java | 6 +- .../databasir/core/meta/data/TableMeta.java | 8 +- .../databasir/core/meta/data/TriggerMeta.java | 6 +- .../jdbc/JdbcForeignKeyMetaRepository.java | 2 + .../core/render/markdown/MarkdownRender.java | 2 +- plugin/src/test/java/App.java | 40 -- .../core/diff/service/DiffsTest.java | 597 ++++++++++++++++++ .../diffsTest/diffDatabaseAdded/current.json | 466 ++++++++++++++ .../diffsTest/diffDatabaseAdded/original.json | 3 + .../diffDatabaseModified/current.json | 470 ++++++++++++++ .../diffDatabaseModified/original.json | 470 ++++++++++++++ .../diffDatabaseRemoved/current.json | 3 + .../diffDatabaseRemoved/original.json | 466 ++++++++++++++ .../diffsTest/diffDatabaseSame/current.json | 466 ++++++++++++++ .../diffsTest/diffDatabaseSame/original.json | 466 ++++++++++++++ .../ut/diffsTest/diffTableAdded/current.json | 466 ++++++++++++++ .../ut/diffsTest/diffTableAdded/original.json | 328 ++++++++++ .../diffTableFieldsAdded/current.json | 514 +++++++++++++++ .../diffTableFieldsAdded/original.json | 466 ++++++++++++++ .../diffTableFieldsModified/current.json | 474 ++++++++++++++ .../diffTableFieldsModified/original.json | 472 ++++++++++++++ .../diffTableFieldsRemoved/current.json | 428 +++++++++++++ .../diffTableFieldsRemoved/original.json | 474 ++++++++++++++ .../diffsTest/diffTableModified/current.json | 470 ++++++++++++++ .../diffsTest/diffTableModified/original.json | 470 ++++++++++++++ .../diffsTest/diffTableRemoved/current.json | 332 ++++++++++ .../diffsTest/diffTableRemoved/original.json | 470 ++++++++++++++ 113 files changed, 9668 insertions(+), 274 deletions(-) create mode 100644 api/src/main/resources/static/css/321.d892cf8e.css delete mode 100644 api/src/main/resources/static/css/907.1437368b.css rename api/src/main/resources/static/js/{117-legacy.72d604e3.js => 117-legacy.f00c6326.js} (99%) rename api/src/main/resources/static/js/{117-legacy.72d604e3.js.map => 117-legacy.f00c6326.js.map} (99%) rename api/src/main/resources/static/js/{139-legacy.e055efed.js => 139-legacy.a43600d3.js} (99%) rename api/src/main/resources/static/js/{139-legacy.e055efed.js.map => 139-legacy.a43600d3.js.map} (99%) rename api/src/main/resources/static/js/{139.299d5af2.js => 139.909d89d2.js} (99%) rename api/src/main/resources/static/js/{139.299d5af2.js.map => 139.909d89d2.js.map} (99%) create mode 100644 api/src/main/resources/static/js/321-legacy.b0227d64.js create mode 100644 api/src/main/resources/static/js/321-legacy.b0227d64.js.map create mode 100644 api/src/main/resources/static/js/321.243dc4e3.js create mode 100644 api/src/main/resources/static/js/321.243dc4e3.js.map rename api/src/main/resources/static/js/{355-legacy.6051dcfc.js => 355-legacy.023e4ab2.js} (99%) rename api/src/main/resources/static/js/{355-legacy.6051dcfc.js.map => 355-legacy.023e4ab2.js.map} (99%) rename api/src/main/resources/static/js/{355.0fcf5559.js => 355.19f5321e.js} (99%) rename api/src/main/resources/static/js/{355.0fcf5559.js.map => 355.19f5321e.js.map} (99%) rename api/src/main/resources/static/js/{459-legacy.5a5a02e8.js => 459-legacy.f2817ef6.js} (99%) rename api/src/main/resources/static/js/{459-legacy.5a5a02e8.js.map => 459-legacy.f2817ef6.js.map} (99%) rename api/src/main/resources/static/js/{459.22e837b8.js => 459.d9a5fc8a.js} (99%) rename api/src/main/resources/static/js/{459.22e837b8.js.map => 459.d9a5fc8a.js.map} (99%) rename api/src/main/resources/static/js/{469-legacy.19860010.js => 469-legacy.3e02203b.js} (99%) rename api/src/main/resources/static/js/{469-legacy.19860010.js.map => 469-legacy.3e02203b.js.map} (99%) rename api/src/main/resources/static/js/{469.bd114b11.js => 469.8c3ea567.js} (99%) rename api/src/main/resources/static/js/{469.bd114b11.js.map => 469.8c3ea567.js.map} (99%) rename api/src/main/resources/static/js/{564.07fcac27.js => 564.abfed23d.js} (99%) rename api/src/main/resources/static/js/{564.07fcac27.js.map => 564.abfed23d.js.map} (99%) rename api/src/main/resources/static/js/{596-legacy.d38041af.js => 596-legacy.d1261d0e.js} (98%) rename api/src/main/resources/static/js/{596-legacy.d38041af.js.map => 596-legacy.d1261d0e.js.map} (98%) rename api/src/main/resources/static/js/{596.e58d33aa.js => 596.eb4080a7.js} (98%) rename api/src/main/resources/static/js/{596.e58d33aa.js.map => 596.eb4080a7.js.map} (98%) rename api/src/main/resources/static/js/{719-legacy.94f86cce.js => 719-legacy.85eb5e28.js} (99%) rename api/src/main/resources/static/js/{719-legacy.94f86cce.js.map => 719-legacy.85eb5e28.js.map} (99%) rename api/src/main/resources/static/js/{719.ab8ac0bb.js => 719.df03c200.js} (99%) rename api/src/main/resources/static/js/{719.ab8ac0bb.js.map => 719.df03c200.js.map} (99%) rename api/src/main/resources/static/js/{754-legacy.56f0845e.js => 754-legacy.2b22ae65.js} (99%) rename api/src/main/resources/static/js/{754-legacy.56f0845e.js.map => 754-legacy.2b22ae65.js.map} (99%) rename api/src/main/resources/static/js/{754.3b3a23fa.js => 754.d037cc5e.js} (99%) rename api/src/main/resources/static/js/{754.3b3a23fa.js.map => 754.d037cc5e.js.map} (99%) rename api/src/main/resources/static/js/{865-legacy.3c829294.js => 865-legacy.fc2fd7b3.js} (97%) rename api/src/main/resources/static/js/{865-legacy.3c829294.js.map => 865-legacy.fc2fd7b3.js.map} (97%) rename api/src/main/resources/static/js/{865.ef6dc5a3.js => 865.ebbb1893.js} (97%) rename api/src/main/resources/static/js/{865.ef6dc5a3.js.map => 865.ebbb1893.js.map} (98%) delete mode 100644 api/src/main/resources/static/js/907-legacy.cb70ee94.js delete mode 100644 api/src/main/resources/static/js/907-legacy.cb70ee94.js.map delete mode 100644 api/src/main/resources/static/js/907.2782ffff.js delete mode 100644 api/src/main/resources/static/js/907.2782ffff.js.map rename api/src/main/resources/static/js/{99-legacy.618121ce.js => 99-legacy.6cfcb3aa.js} (98%) rename api/src/main/resources/static/js/{99-legacy.618121ce.js.map => 99-legacy.6cfcb3aa.js.map} (99%) rename api/src/main/resources/static/js/{99.c134b829.js => 99.79a6a4f8.js} (99%) rename api/src/main/resources/static/js/{99.c134b829.js.map => 99.79a6a4f8.js.map} (99%) rename api/src/main/resources/static/js/{app-legacy.e6a59dc2.js => app-legacy.3d5e4b5d.js} (94%) rename api/src/main/resources/static/js/{app-legacy.e6a59dc2.js.map => app-legacy.3d5e4b5d.js.map} (99%) rename api/src/main/resources/static/js/{app.e0747db1.js => app.08e3c996.js} (96%) rename api/src/main/resources/static/js/{app.e0747db1.js.map => app.08e3c996.js.map} (98%) delete mode 100644 core/src/main/java/com/databasir/core/domain/document/converter/BaseConverter.java create mode 100644 core/src/main/java/com/databasir/core/domain/document/converter/DatabaseMetaConverter.java delete mode 100644 core/src/main/java/com/databasir/core/domain/document/converter/NullToEmpty.java delete mode 100644 dao/src/main/java/com/databasir/dao/converter/.gitkeep create mode 100644 plugin/src/main/java/com/databasir/core/diff/Diffs.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/data/Diff.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/data/DiffType.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/data/FieldDiff.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/data/RootDiff.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/ColumnDiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/DatabaseDiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/DiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/ForeignKeyDiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/IndexDiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/TableDiffProcessor.java create mode 100644 plugin/src/main/java/com/databasir/core/diff/processor/TriggerDiffProcessor.java delete mode 100644 plugin/src/test/java/App.java create mode 100644 plugin/src/test/java/com/databasir/core/diff/service/DiffsTest.java create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseAdded/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseAdded/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseModified/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseModified/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseRemoved/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseRemoved/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseSame/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffDatabaseSame/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableAdded/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableAdded/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsAdded/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsAdded/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsModified/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsModified/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsRemoved/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableFieldsRemoved/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableModified/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableModified/original.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableRemoved/current.json create mode 100644 plugin/src/test/resources/ut/diffsTest/diffTableRemoved/original.json diff --git a/api/src/main/java/com/databasir/api/DocumentController.java b/api/src/main/java/com/databasir/api/DocumentController.java index 52f78e2..a050d39 100644 --- a/api/src/main/java/com/databasir/api/DocumentController.java +++ b/api/src/main/java/com/databasir/api/DocumentController.java @@ -1,6 +1,7 @@ package com.databasir.api; import com.databasir.common.JsonData; +import com.databasir.core.diff.data.RootDiff; import com.databasir.core.domain.document.data.DatabaseDocumentResponse; import com.databasir.core.domain.document.data.DatabaseDocumentSimpleResponse; import com.databasir.core.domain.document.data.DatabaseDocumentVersionResponse; @@ -39,6 +40,13 @@ public class DocumentController { return JsonData.ok(); } + @GetMapping(Routes.Document.DIFF) + public JsonData diff(@PathVariable Integer projectId, + @RequestParam(name = "originalVersion") Long originalVersion, + @RequestParam(required = false) Long currentVersion) { + return JsonData.ok(documentService.diff(projectId, originalVersion, currentVersion)); + } + @GetMapping(Routes.Document.GET_ONE) public JsonData getByProjectId(@PathVariable Integer projectId, @RequestParam(required = false) Long version) { diff --git a/api/src/main/java/com/databasir/api/Routes.java b/api/src/main/java/com/databasir/api/Routes.java index c33819c..b700e66 100644 --- a/api/src/main/java/com/databasir/api/Routes.java +++ b/api/src/main/java/com/databasir/api/Routes.java @@ -82,6 +82,8 @@ public interface Routes { String GET_TABLE_DETAIL = BASE + "/projects/{projectId}/documents/{documentId}/table_documents"; + String DIFF = BASE + "/projects/{projectId}/diff_documents"; + String EXPORT = BASE + "/projects/{projectId}/document_files"; } diff --git a/api/src/main/resources/static/css/321.d892cf8e.css b/api/src/main/resources/static/css/321.d892cf8e.css new file mode 100644 index 0000000..d99b812 --- /dev/null +++ b/api/src/main/resources/static/css/321.d892cf8e.css @@ -0,0 +1 @@ +@-webkit-keyframes running-line{to{stroke-dashoffset:-1000}}@keyframes running-line{to{stroke-dashoffset:-1000}}.text{font-size:14px;line-height:1.3rem}.item{margin-top:10px;margin-right:40px}.remark-card{margin-bottom:30px}.remark-header{display:flex;justify-content:space-between;align-items:center}.remark-header .remark-user{color:#6d6d6d}.remark-header .remark-time{color:#6d6d6d;font-size:.8rem;margin-left:10px}.remark-content{white-space:pre-wrap;text-align:left}.badge-item{margin-top:18px;margin-bottom:6px}.h2{font-size:24px;color:#606266;margin-top:13px;margin-bottom:13px}.h2,.h3{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Arial,sans-serif}.h3{font-size:20px;color:#909399;margin-top:18px;margin-bottom:18px}.removed-item{background-color:#fef0f0!important;color:#f56c6c}.added-item{background-color:#f0f9eb!important;color:#67c23a}.modified-item{background-color:#fdf6ec!important;color:#e6a23c}.modified-original-item{background-color:#fdf6ec!important;color:#a8abb2}.span-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;display:flex;align-items:left;justify-content:space-between;font-size:14px}.doc-toc-aside{overflow-wrap:break-word;text-overflow:ellipsis;bottom:0;top:100px;position:fixed;overflow-y:hidden;overflow-x:hidden;max-width:var(--el-aside-width);width:var(--el-aside-width);border-width:0 1px 0 0;border-color:#ddd;border-style:solid}.doc-toc-aside:hover{overflow-y:auto;scrollbar-width:thin} \ No newline at end of file diff --git a/api/src/main/resources/static/css/907.1437368b.css b/api/src/main/resources/static/css/907.1437368b.css deleted file mode 100644 index 8e248db..0000000 --- a/api/src/main/resources/static/css/907.1437368b.css +++ /dev/null @@ -1 +0,0 @@ -@-webkit-keyframes running-line{to{stroke-dashoffset:-1000}}@keyframes running-line{to{stroke-dashoffset:-1000}}.text{font-size:14px;line-height:1.3rem}.item{margin-top:10px;margin-right:40px}.remark-card{margin-bottom:30px}.remark-header{display:flex;justify-content:space-between;align-items:center}.remark-header .remark-user{color:#6d6d6d}.remark-header .remark-time{color:#6d6d6d;font-size:.8rem;margin-left:10px}.remark-content{white-space:pre-wrap;text-align:left}.span-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;display:flex;align-items:left;justify-content:space-between;font-size:14px}.doc-toc-aside{overflow-wrap:break-word;text-overflow:ellipsis;bottom:0;top:100px;position:fixed;overflow-y:hidden;overflow-x:hidden;max-width:var(--el-aside-width);width:var(--el-aside-width);border-width:0 1px 0 0;border-color:#ddd;border-style:solid}.doc-toc-aside:hover{overflow-y:auto;scrollbar-width:thin} \ No newline at end of file diff --git a/api/src/main/resources/static/index.html b/api/src/main/resources/static/index.html index 5b02826..962944d 100644 --- a/api/src/main/resources/static/index.html +++ b/api/src/main/resources/static/index.html @@ -1 +1 @@ -databasir-frontend
\ No newline at end of file +databasir-frontend
\ No newline at end of file diff --git a/api/src/main/resources/static/js/117-legacy.72d604e3.js b/api/src/main/resources/static/js/117-legacy.f00c6326.js similarity index 99% rename from api/src/main/resources/static/js/117-legacy.72d604e3.js rename to api/src/main/resources/static/js/117-legacy.f00c6326.js index c9c6c23..e081baf 100644 --- a/api/src/main/resources/static/js/117-legacy.72d604e3.js +++ b/api/src/main/resources/static/js/117-legacy.f00c6326.js @@ -1,2 +1,2 @@ (self["webpackChunkdatabasir_frontend"]=self["webpackChunkdatabasir_frontend"]||[]).push([[117],{1589:function(e,t,r){var n=r(7854),a=r(1400),o=r(6244),u=r(6135),l=n.Array,i=Math.max;e.exports=function(e,t,r){for(var n=o(e),c=a(t,n),s=a(void 0===r?n:r,n),d=l(i(s-c,0)),f=0;c