Browse Source

Merge pull request #1050 from nocodb/fix/meta-sync

fix: handle meta sync properly and keep proper column metadata
pull/1053/head
աɨռɢӄաօռɢ 3 years ago committed by GitHub
parent
commit
621943f424
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 45
      packages/nc-gui/components/project/projectMetadata/sync/disableOrEnableTables.vue
  2. 10
      packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts
  3. 9
      packages/nocodb/src/lib/noco/common/handlers/xcMetaDiffSync.ts
  4. 15
      packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts
  5. 9
      packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts

45
packages/nc-gui/components/project/projectMetadata/sync/disableOrEnableTables.vue

@ -200,8 +200,8 @@
<div class="d-flex">
<v-spacer />
<v-tooltip bottom>
<!-- template #activator="{on}">
<!-- <v-tooltip bottom>-->
<!-- template #activator="{on}">
<v-alert
v-if="isNewOrDeletedModelFound"
dense
@ -232,35 +232,32 @@
Metadata for API creation & management isn't sync with
'{{ dbAliasList[dbsTab].connection.database }}' Database.
</template-->
</v-tooltip>
<!-- </v-tooltip>-->
<v-spacer />
</div>
<!-- <div-->
<!-- v-if="isNewOrDeletedModelFound" -->
<div class="d-flex justify-center">
<!-- <x-btn
<v-btn
v-if="isChanged"
x-large
btn.class="mx-auto primary nc-btn-sync-meta-data"
tooltip="Sync metadata"
@click="syncMetadata"
class="mx-auto primary nc-btn-metasync-sync-now"
@click="syncMetaDiff"
>
<v-icon color="white" class="mr-2 mt-n1">
mdi-database-sync
</v-icon>
Sync Now
</x-btn>-->
</v-btn>
<x-btn
x-large
btn.class="mx-auto primary nc-btn-metasync-sync-now"
tooltip="Sync metadata"
@click="syncMetaDiff"
<v-alert
v-else
dense
outlined
type="success"
>
<v-icon color="white" class="mr-2 mt-n1">
mdi-database-sync
</v-icon>
Sync Now
</x-btn>
Tables metadata is in sync
</v-alert>
</div>
</v-col>
</v-row>
@ -270,17 +267,12 @@
<script>
import { mapGetters } from 'vuex'
// import { isMetaTable } from '@/helpers/xutils'
import XIcon from '@/components/global/xIcon'
import XBtn from '@/components/global/xBtn'
import viewIcons from '~/helpers/viewIcons'
import XBtn from '~/components/global/xBtn'
export default {
name: 'DisableOrEnableTables',
components: {
XBtn,
XIcon
},
components: { XBtn },
props: ['nodes', 'db'],
data: () => ({
viewIcons,
@ -425,6 +417,9 @@ export default {
...mapGetters({
dbAliasList: 'project/GtrDbAliasList'
}),
isChanged() {
return this.diff && this.diff.some(d => d && d.detectedChanges && d.detectedChanges.length)
},
prefix() {
return this.$store.getters['project/GtrProjectPrefix'] || ''
}

10
packages/nocodb/src/lib/noco/common/BaseApiBuilder.ts

@ -726,6 +726,9 @@ export default abstract class BaseApiBuilder<T extends Noco>
this.baseLog(`onTableUpdate : Getting old model meta for '%s'`, tn);
XcCache.del([this.projectId, this.dbAlias, 'table', tn].join('::'));
// get columns list from db
const columnsFromDb = await this.getColumnList(tn);
const relationTableMetas: Set<any> = new Set();
const oldModelRow = await this.xcMeta.metaGet(
@ -752,8 +755,11 @@ export default abstract class BaseApiBuilder<T extends Noco>
const columns =
changeObj.columns
.filter(c => c.altered !== 4)
.map(({ altered: _al, ...rest }) => rest) ||
(await this.getColumnList(tn));
.map(({ altered: _al, ...rest }) => ({
...rest,
// find and overwrite column property from db
...(columnsFromDb?.find(c => c.cn === rest.cn) || {})
})) || (await this.getColumnList(tn));
/* Get all relations */
const relations = await this.relationsSyncAndGet();

9
packages/nocodb/src/lib/noco/common/handlers/xcMetaDiffSync.ts

@ -785,8 +785,13 @@ if (sIndex > -1) {
populateParams.tableNames = populateParams.tableNames?.filter(t => {
return t === populateParams.tableNames.find(t1 => t1.tn === t.tn);
});
await this.xcTablesPopulate(populateParams);
await this.xcTablesPopulate(populateViewsParams);
// invoke only if there is change in at least one table
if (populateParams.tableNames?.length) {
await this.xcTablesPopulate(populateParams);
} else if (populateViewsParams.tableNames?.length) {
await this.xcTablesPopulate(populateViewsParams);
}
if (this instanceof GqlApiBuilder) {
await (this as GqlApiBuilder).reInitializeGraphqlEndpoint();

15
packages/nocodb/src/lib/noco/gql/GqlApiBuilder.ts

@ -190,9 +190,18 @@ export class GqlApiBuilder extends BaseApiBuilder<Noco> implements XcMetaMgr {
await super.onTableCreate(tn, args);
const columns = {
[tn]: args?.columns?.map(({ altered: _al, ...rest }) => rest)
};
// get columns list from db
const columnsFromDb = await this.getColumnList(tn);
const columns = args.columns
? {
[tn]: args.columns?.map(({ altered: _al, ...rest }) => ({
...rest,
// find and overwrite column property from db
...columnsFromDb?.find(c => c.cn === rest.cn)
}))
}
: {};
await this.xcTablesPopulate({
tableNames: [{ tn, _tn: args._tn }],

9
packages/nocodb/src/lib/noco/rest/RestApiBuilder.ts

@ -876,9 +876,16 @@ export class RestApiBuilder extends BaseApiBuilder<Noco> {
): Promise<void> {
await super.onTableCreate(tn, args);
// get columns list from db
const columnsFromDb = await this.getColumnList(tn);
const columns = args.columns
? {
[tn]: args.columns?.map(({ altered: _al, ...rest }) => rest)
[tn]: args.columns?.map(({ altered: _al, ...rest }) => ({
...rest,
// find and overwrite column property from db
...(columnsFromDb?.find(c => c.cn === rest.cn) || {})
}))
}
: {};

Loading…
Cancel
Save