@tasenor/common-plugins 1.10.36 → 1.10.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-ci.log +2 -8
- package/dist/GitBackup/backend/index.d.ts +11 -3
- package/dist/GitBackup/backend/index.js +41 -5
- package/dist/GitBackup/backend/index.js.map +1 -1
- package/dist/GitBackup/common/types.d.ts +10 -0
- package/dist/GitBackup/common/types.js +2 -0
- package/dist/GitBackup/common/types.js.map +1 -0
- package/dist/GitBackup/ui/index.js +8 -0
- package/dist/GitBackup/ui/index.js.map +1 -1
- package/package.json +5 -5
- package/src/GitBackup/backend/index.ts +52 -9
- package/src/GitBackup/common/types.ts +11 -0
- package/src/GitBackup/ui/index.tsx +10 -9
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-ci.log
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @tasenor/common-plugins@1.10.
|
|
2
|
+
> @tasenor/common-plugins@1.10.36 ci /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
|
|
3
3
|
> pnpm run lint
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @tasenor/common-plugins@1.10.
|
|
6
|
+
> @tasenor/common-plugins@1.10.36 lint /home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins
|
|
7
7
|
> eslint 'src/**/*.{ts,tsx}' 'data/**/*.mjs'
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
/home/ci/tasenor-qa/tasenor-bookkeeper/packages/tasenor-common-plugins/src/GitBackup/ui/index.tsx
|
|
11
|
-
7:10 warning 't' is defined but never used @typescript-eslint/no-unused-vars
|
|
12
|
-
|
|
13
|
-
✖ 1 problem (0 errors, 1 warning)
|
|
14
|
-
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { KnexDatabase, ToolPlugin } from '@tasenor/common-node';
|
|
2
|
-
import {
|
|
2
|
+
import { GitBackupCommit } from '../common/types';
|
|
3
3
|
declare class GitBackup extends ToolPlugin {
|
|
4
4
|
constructor();
|
|
5
5
|
/**
|
|
@@ -29,14 +29,22 @@ declare class GitBackup extends ToolPlugin {
|
|
|
29
29
|
/**
|
|
30
30
|
* Get a list of commits.
|
|
31
31
|
*/
|
|
32
|
-
collectCommits(db: KnexDatabase, limit: number): Promise<
|
|
32
|
+
collectCommits(db: KnexDatabase, limit: number): Promise<GitBackupCommit[]>;
|
|
33
33
|
/**
|
|
34
34
|
* Execute backup making for a database.
|
|
35
35
|
*/
|
|
36
36
|
makeBackup(db: KnexDatabase, message: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Read in database from the give giot hash.
|
|
39
|
+
*/
|
|
40
|
+
restoreBackup(db: KnexDatabase, commit: string): Promise<boolean>;
|
|
37
41
|
/**
|
|
38
42
|
* Write the data from the database to the directory.
|
|
39
43
|
*/
|
|
40
|
-
dump
|
|
44
|
+
private dump;
|
|
45
|
+
/**
|
|
46
|
+
* Read the data to the database from the directory.
|
|
47
|
+
*/
|
|
48
|
+
private restore;
|
|
41
49
|
}
|
|
42
50
|
export default GitBackup;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { GitRepo, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node';
|
|
1
|
+
import { BookkeeperImporter, GitRepo, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node';
|
|
2
2
|
import { error, log, note, validGitRepoName } from '@tasenor/common';
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
|
-
|
|
5
|
+
// TODO: Master branch should be configurable.
|
|
6
|
+
// Branch.
|
|
7
|
+
const BRANCH = 'main';
|
|
8
|
+
// Mainly for temporary testing with file:/// repository.
|
|
9
|
+
const ALLOW_BAD_REPOSITORY = false;
|
|
6
10
|
class GitBackup extends ToolPlugin {
|
|
7
11
|
constructor() {
|
|
8
12
|
super();
|
|
@@ -55,8 +59,8 @@ class GitBackup extends ToolPlugin {
|
|
|
55
59
|
*/
|
|
56
60
|
async PUT(db, data) {
|
|
57
61
|
if (typeof data === 'object' && data !== null && !!data.commit) {
|
|
58
|
-
|
|
59
|
-
return { success
|
|
62
|
+
const success = await this.restoreBackup(db, data.commit);
|
|
63
|
+
return { success };
|
|
60
64
|
}
|
|
61
65
|
return { success: false };
|
|
62
66
|
}
|
|
@@ -99,6 +103,7 @@ class GitBackup extends ToolPlugin {
|
|
|
99
103
|
error(`Failed to establish git repository instance '${repository}' into ${workDir}.`);
|
|
100
104
|
return null;
|
|
101
105
|
}
|
|
106
|
+
repo.branch = BRANCH;
|
|
102
107
|
repo.configure({
|
|
103
108
|
name: 'Tasenor',
|
|
104
109
|
email: 'communications.tasenor@gmail.com',
|
|
@@ -112,7 +117,6 @@ class GitBackup extends ToolPlugin {
|
|
|
112
117
|
* Get a list of commits.
|
|
113
118
|
*/
|
|
114
119
|
async collectCommits(db, limit) {
|
|
115
|
-
// TODO: Would it work if we define types in ../common instead of unknown[]?
|
|
116
120
|
const setup = await this.setupRepository(db);
|
|
117
121
|
if (!setup) {
|
|
118
122
|
return [];
|
|
@@ -144,9 +148,31 @@ class GitBackup extends ToolPlugin {
|
|
|
144
148
|
}
|
|
145
149
|
const { subDirectory, repo, backupDir } = setup;
|
|
146
150
|
log(`Making a backup into '${subDirectory}' of DB '${db.client.config.connection.database}'.`);
|
|
151
|
+
await repo.update();
|
|
147
152
|
await this.dump(db, backupDir);
|
|
148
153
|
return repo.put(message, subDirectory);
|
|
149
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Read in database from the give giot hash.
|
|
157
|
+
*/
|
|
158
|
+
async restoreBackup(db, commit) {
|
|
159
|
+
const setup = await this.setupRepository(db);
|
|
160
|
+
if (!setup) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const { repo, backupDir } = setup;
|
|
164
|
+
log(`Restoting a backup into '${backupDir}' for DB '${db.client.config.connection.database}' from hash '${commit}'.`);
|
|
165
|
+
await repo.update();
|
|
166
|
+
try {
|
|
167
|
+
await repo.git.checkout(commit);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
error(`Checking out the hash '${commit}' failed: ${err}`);
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
await this.restore(db, backupDir);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
150
176
|
/**
|
|
151
177
|
* Write the data from the database to the directory.
|
|
152
178
|
*/
|
|
@@ -158,6 +184,9 @@ class GitBackup extends ToolPlugin {
|
|
|
158
184
|
}
|
|
159
185
|
const exportDir = path.join(dir, 'export');
|
|
160
186
|
fs.mkdirSync(exportDir, { recursive: true });
|
|
187
|
+
// This dump.sql is not really needed, but it is kind of safety net for failures
|
|
188
|
+
// in export and import code. It helps to rebuild database manually, if all else
|
|
189
|
+
// fails.
|
|
161
190
|
// TODO: Check for pg_dump crash. What if that happens?
|
|
162
191
|
const { host, port, database, user, password } = db.client.config.connection;
|
|
163
192
|
const url = `postgresql://${user}:${password}@${host}:${port}/${database}`;
|
|
@@ -165,6 +194,13 @@ class GitBackup extends ToolPlugin {
|
|
|
165
194
|
const exporter = new TasenorExporter();
|
|
166
195
|
await exporter.dump(db, exportDir);
|
|
167
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Read the data to the database from the directory.
|
|
199
|
+
*/
|
|
200
|
+
async restore(db, dir) {
|
|
201
|
+
const importer = new BookkeeperImporter();
|
|
202
|
+
await importer.restoreUser(db, path.join(dir, 'export'));
|
|
203
|
+
}
|
|
168
204
|
}
|
|
169
205
|
export default GitBackup;
|
|
170
206
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/backend/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/GitBackup/common/types.ts"],"names":[],"mappings":""}
|
|
@@ -3,6 +3,7 @@ import { Note, IconButton, SubPanel, ToolPlugin, Dialog, Localize } from '@tasen
|
|
|
3
3
|
import { makeObservable, observable, runInAction } from 'mobx';
|
|
4
4
|
import { Trans, useTranslation } from 'react-i18next';
|
|
5
5
|
import { Box, Table, TableBody, TableCell, TableContainer, TableRow, TextField, Typography } from '@mui/material';
|
|
6
|
+
import { useNavigate } from 'react-router-dom';
|
|
6
7
|
function MakeBackupIcon(props) {
|
|
7
8
|
const { disabled, onMakeBackup } = props;
|
|
8
9
|
const [askMessage, setAskMessage] = useState(false);
|
|
@@ -20,6 +21,8 @@ function BackupCommitList(props) {
|
|
|
20
21
|
const [fetched, setFetched] = useState(false);
|
|
21
22
|
const [restore, setRestore] = useState(null);
|
|
22
23
|
const { t } = useTranslation();
|
|
24
|
+
// TODO: Use from common-ui once more useful.
|
|
25
|
+
const navigate = useNavigate();
|
|
23
26
|
useEffect(() => {
|
|
24
27
|
if (!store.db) {
|
|
25
28
|
return;
|
|
@@ -35,6 +38,11 @@ function BackupCommitList(props) {
|
|
|
35
38
|
store.request(`/db/${store.db}/tools/${GitBackup.code}`, 'PUT', { commit: commit.hash }).then((res) => {
|
|
36
39
|
if (res && res.success) {
|
|
37
40
|
store.addMessage(t('Backup restored successfully.'));
|
|
41
|
+
runInAction(() => {
|
|
42
|
+
store.setDb(null).then(() => {
|
|
43
|
+
navigate(`/${store.db}`);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
38
46
|
}
|
|
39
47
|
else {
|
|
40
48
|
store.addError(t('Restoring backup failed.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/ui/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/GitBackup/ui/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tasenor/common-plugins",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.37",
|
|
4
4
|
"description": "Shared common plugins of Tasenor project",
|
|
5
5
|
"repository": "git@github.com:dataplugoy/tasenor-bookkeeper.git",
|
|
6
6
|
"author": "Tommi Ronkainen <tommi.ronkainen@gmail.com>",
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
"dayjs": "1.10.8",
|
|
14
14
|
"sprintf-js": "^1.1.2",
|
|
15
15
|
"tsx": "^4.7.0",
|
|
16
|
-
"@tasenor/common": "1.10.
|
|
17
|
-
"@tasenor/common
|
|
18
|
-
"@tasenor/common-
|
|
16
|
+
"@tasenor/common-node": "1.10.37",
|
|
17
|
+
"@tasenor/common": "1.10.37",
|
|
18
|
+
"@tasenor/common-ui": "1.10.37"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@mui/icons-material": "^5.14.1",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"react-i18next": "^13.0.2",
|
|
32
32
|
"react-router-dom": "^6.14.1",
|
|
33
33
|
"typescript": "^5.1.6",
|
|
34
|
-
"@tasenor/config": "1.10.
|
|
34
|
+
"@tasenor/config": "1.10.37",
|
|
35
35
|
"eslint-config-tasenor": "0.0.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { GitRepo, KnexDatabase, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node'
|
|
2
|
-
import { DirectoryPath, Email, error, FilePath, log, note, PluginCode, Url, validGitRepoName, Version } from '@tasenor/common'
|
|
1
|
+
import { BookkeeperImporter, GitRepo, KnexDatabase, systemPiped, TasenorExporter, ToolPlugin } from '@tasenor/common-node'
|
|
2
|
+
import { DirectoryPath, Email, error, FilePath, log, note, PluginCode, Timestring, Url, validGitRepoName, Version } from '@tasenor/common'
|
|
3
3
|
import fs from 'fs'
|
|
4
4
|
import path from 'path'
|
|
5
|
+
import { GitBackupCommit } from '../common/types'
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
// TODO: Master branch should be configurable.
|
|
8
|
+
// Branch.
|
|
9
|
+
const BRANCH = 'main'
|
|
10
|
+
|
|
11
|
+
// Mainly for temporary testing with file:/// repository.
|
|
12
|
+
const ALLOW_BAD_REPOSITORY = false
|
|
7
13
|
|
|
8
14
|
class GitBackup extends ToolPlugin {
|
|
9
15
|
constructor() {
|
|
@@ -66,8 +72,8 @@ class GitBackup extends ToolPlugin {
|
|
|
66
72
|
*/
|
|
67
73
|
async PUT(db: KnexDatabase, data): Promise<unknown> {
|
|
68
74
|
if (typeof data === 'object' && data !== null && !!data.commit) {
|
|
69
|
-
|
|
70
|
-
return { success
|
|
75
|
+
const success = await this.restoreBackup(db, data.commit)
|
|
76
|
+
return { success }
|
|
71
77
|
}
|
|
72
78
|
return { success: false }
|
|
73
79
|
}
|
|
@@ -127,6 +133,7 @@ class GitBackup extends ToolPlugin {
|
|
|
127
133
|
error(`Failed to establish git repository instance '${repository}' into ${workDir}.`)
|
|
128
134
|
return null
|
|
129
135
|
}
|
|
136
|
+
repo.branch = BRANCH
|
|
130
137
|
repo.configure({
|
|
131
138
|
name: 'Tasenor',
|
|
132
139
|
email: 'communications.tasenor@gmail.com' as Email,
|
|
@@ -141,8 +148,7 @@ class GitBackup extends ToolPlugin {
|
|
|
141
148
|
/**
|
|
142
149
|
* Get a list of commits.
|
|
143
150
|
*/
|
|
144
|
-
async collectCommits(db: KnexDatabase, limit: number): Promise<
|
|
145
|
-
// TODO: Would it work if we define types in ../common instead of unknown[]?
|
|
151
|
+
async collectCommits(db: KnexDatabase, limit: number): Promise<GitBackupCommit[]> {
|
|
146
152
|
const setup = await this.setupRepository(db)
|
|
147
153
|
if (!setup) {
|
|
148
154
|
return []
|
|
@@ -155,7 +161,7 @@ class GitBackup extends ToolPlugin {
|
|
|
155
161
|
const gitLog = await repo.git.log({ maxCount: limit })
|
|
156
162
|
return gitLog.all.map(e => ({
|
|
157
163
|
hash: e.hash,
|
|
158
|
-
date: e.date,
|
|
164
|
+
date: e.date as Timestring,
|
|
159
165
|
message: e.message,
|
|
160
166
|
author: `${e.author_name} ${e.author_email ? '<' + e.author_email + '>' : ''}`.trim()
|
|
161
167
|
}))
|
|
@@ -177,14 +183,39 @@ class GitBackup extends ToolPlugin {
|
|
|
177
183
|
const { subDirectory, repo, backupDir } = setup
|
|
178
184
|
|
|
179
185
|
log(`Making a backup into '${subDirectory}' of DB '${db.client.config.connection.database}'.`)
|
|
186
|
+
await repo.update()
|
|
180
187
|
await this.dump(db, backupDir)
|
|
181
188
|
return repo.put(message, subDirectory)
|
|
182
189
|
}
|
|
183
190
|
|
|
191
|
+
/**
|
|
192
|
+
* Read in database from the give giot hash.
|
|
193
|
+
*/
|
|
194
|
+
async restoreBackup(db: KnexDatabase, commit: string): Promise<boolean> {
|
|
195
|
+
|
|
196
|
+
const setup = await this.setupRepository(db)
|
|
197
|
+
if (!setup) {
|
|
198
|
+
return false
|
|
199
|
+
}
|
|
200
|
+
const { repo, backupDir } = setup
|
|
201
|
+
|
|
202
|
+
log(`Restoting a backup into '${backupDir}' for DB '${db.client.config.connection.database}' from hash '${commit}'.`)
|
|
203
|
+
await repo.update()
|
|
204
|
+
try {
|
|
205
|
+
await repo.git.checkout(commit)
|
|
206
|
+
} catch (err) {
|
|
207
|
+
error(`Checking out the hash '${commit}' failed: ${err}`)
|
|
208
|
+
return false
|
|
209
|
+
}
|
|
210
|
+
await this.restore(db, backupDir)
|
|
211
|
+
|
|
212
|
+
return true
|
|
213
|
+
}
|
|
214
|
+
|
|
184
215
|
/**
|
|
185
216
|
* Write the data from the database to the directory.
|
|
186
217
|
*/
|
|
187
|
-
async dump(db: KnexDatabase, dir: DirectoryPath) {
|
|
218
|
+
private async dump(db: KnexDatabase, dir: DirectoryPath) {
|
|
188
219
|
|
|
189
220
|
note(`Creating backup into '${dir}'.`)
|
|
190
221
|
|
|
@@ -194,6 +225,10 @@ class GitBackup extends ToolPlugin {
|
|
|
194
225
|
}
|
|
195
226
|
const exportDir = path.join(dir, 'export') as DirectoryPath
|
|
196
227
|
fs.mkdirSync(exportDir, { recursive: true })
|
|
228
|
+
|
|
229
|
+
// This dump.sql is not really needed, but it is kind of safety net for failures
|
|
230
|
+
// in export and import code. It helps to rebuild database manually, if all else
|
|
231
|
+
// fails.
|
|
197
232
|
// TODO: Check for pg_dump crash. What if that happens?
|
|
198
233
|
const { host, port, database, user, password } = db.client.config.connection
|
|
199
234
|
const url = `postgresql://${user}:${password}@${host}:${port}/${database}`
|
|
@@ -202,6 +237,14 @@ class GitBackup extends ToolPlugin {
|
|
|
202
237
|
const exporter = new TasenorExporter()
|
|
203
238
|
await exporter.dump(db, exportDir)
|
|
204
239
|
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Read the data to the database from the directory.
|
|
243
|
+
*/
|
|
244
|
+
private async restore(db: KnexDatabase, dir: DirectoryPath): Promise<void> {
|
|
245
|
+
const importer = new BookkeeperImporter()
|
|
246
|
+
await importer.restoreUser(db, path.join(dir, 'export') as DirectoryPath)
|
|
247
|
+
}
|
|
205
248
|
}
|
|
206
249
|
|
|
207
250
|
export default GitBackup
|
|
@@ -3,8 +3,9 @@ import { Note, IconButton, SubPanel, ToolPlugin, Dialog, Localize } from '@tasen
|
|
|
3
3
|
import { makeObservable, observable, runInAction } from 'mobx'
|
|
4
4
|
import { Trans, useTranslation } from 'react-i18next'
|
|
5
5
|
import { Box, Table, TableBody, TableCell, TableContainer, TableRow, TextField, Typography } from '@mui/material'
|
|
6
|
-
import { Store
|
|
7
|
-
import {
|
|
6
|
+
import { Store } from '@tasenor/common'
|
|
7
|
+
import { GitBackupCommit } from '../common/types'
|
|
8
|
+
import { useNavigate } from 'react-router-dom'
|
|
8
9
|
|
|
9
10
|
interface MakeBackupIconProps {
|
|
10
11
|
disabled: boolean
|
|
@@ -34,13 +35,6 @@ function MakeBackupIcon(props: MakeBackupIconProps): React.ReactNode {
|
|
|
34
35
|
</>
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
interface GitBackupCommit {
|
|
38
|
-
hash: string
|
|
39
|
-
date: Timestring
|
|
40
|
-
message: string
|
|
41
|
-
author: string
|
|
42
|
-
}
|
|
43
|
-
|
|
44
38
|
interface BackupCommitListProps {
|
|
45
39
|
store: Store
|
|
46
40
|
backups: number
|
|
@@ -52,6 +46,8 @@ function BackupCommitList(props: BackupCommitListProps): React.ReactNode {
|
|
|
52
46
|
const [fetched, setFetched] = useState(false)
|
|
53
47
|
const [restore, setRestore] = useState<GitBackupCommit|null>(null)
|
|
54
48
|
const { t } = useTranslation()
|
|
49
|
+
// TODO: Use from common-ui once more useful.
|
|
50
|
+
const navigate = useNavigate()
|
|
55
51
|
|
|
56
52
|
useEffect(() => {
|
|
57
53
|
if (!store.db) {
|
|
@@ -69,6 +65,11 @@ function BackupCommitList(props: BackupCommitListProps): React.ReactNode {
|
|
|
69
65
|
store.request<{ commits: GitBackupCommit[] }>(`/db/${store.db}/tools/${GitBackup.code}`, 'PUT', { commit: commit.hash }).then((res) => {
|
|
70
66
|
if (res && res.success) {
|
|
71
67
|
store.addMessage(t('Backup restored successfully.'))
|
|
68
|
+
runInAction(() => {
|
|
69
|
+
store.setDb(null).then(() => {
|
|
70
|
+
navigate(`/${store.db}`)
|
|
71
|
+
})
|
|
72
|
+
})
|
|
72
73
|
} else {
|
|
73
74
|
store.addError(t('Restoring backup failed.'))
|
|
74
75
|
}
|