diff --git a/Composer/packages/server/src/models/storage/interface.ts b/Composer/packages/server/src/models/storage/interface.ts index e07aa7b049..f09775fb39 100644 --- a/Composer/packages/server/src/models/storage/interface.ts +++ b/Composer/packages/server/src/models/storage/interface.ts @@ -11,6 +11,7 @@ export interface StorageConnection { export interface Stat { isDir: boolean; isFile: boolean; + isWritable: boolean; lastModified: string; size: string; } diff --git a/Composer/packages/server/src/models/storage/localDiskStorage.ts b/Composer/packages/server/src/models/storage/localDiskStorage.ts index 7f3747afc5..675bb7b77a 100644 --- a/Composer/packages/server/src/models/storage/localDiskStorage.ts +++ b/Composer/packages/server/src/models/storage/localDiskStorage.ts @@ -25,9 +25,17 @@ const rename = promisify(fs.rename); export class LocalDiskStorage implements IFileStorage { async stat(path: string): Promise { const fstat = await stat(path); + // test to see if this file is writable + let writable = true; + try { + fs.accessSync(path, fs.constants.W_OK); + } catch (err) { + writable = false; + } return { isDir: fstat.isDirectory(), isFile: fstat.isFile(), + isWritable: writable, lastModified: fstat.mtime.toString(), size: fstat.isFile() ? fstat.size.toString() : '', }; diff --git a/Composer/packages/server/src/services/storage.ts b/Composer/packages/server/src/services/storage.ts index b6c828711d..efbbbd4d22 100644 --- a/Composer/packages/server/src/services/storage.ts +++ b/Composer/packages/server/src/services/storage.ts @@ -95,17 +95,11 @@ class StorageService { // TODO: fix this behavior and the upper layer interface accordingly return JSON.parse(await storageClient.readFile(filePath)); } else { - let writable = true; - try { - fs.accessSync(filePath, fs.constants.W_OK); - } catch (err) { - writable = false; - } return { name: Path.basename(filePath), parent: Path.dirname(filePath), children: await this.getChildren(storageClient, filePath), - writable: writable, + writable: stat.isWritable, }; } }; diff --git a/Composer/plugins/mongoStorage/src/index.ts b/Composer/plugins/mongoStorage/src/index.ts index b07af196dc..8149fc7a49 100644 --- a/Composer/plugins/mongoStorage/src/index.ts +++ b/Composer/plugins/mongoStorage/src/index.ts @@ -82,6 +82,7 @@ class MongoStorage implements IFileStorage { isDir: true, isFile: false, lastModified: file.lastModified, + isWritable: true, size: 1, // TODO: real size }); } else { @@ -89,6 +90,7 @@ class MongoStorage implements IFileStorage { isDir: false, isFile: true, lastModified: file.lastModified, + isWritable: true, size: 1, // TODO: real size }); } @@ -103,6 +105,7 @@ class MongoStorage implements IFileStorage { isDir: true, isFile: false, lastModified: new Date(), + isWritable: true, size: 0, // TODO: ?? }); } else { @@ -113,6 +116,7 @@ class MongoStorage implements IFileStorage { isDir: true, isFile: false, lastModified: file.lastModified, + isWritable: true, size: 0, // TODO: ?? }); } diff --git a/Composer/plugins/mongoStorage/src/interface.ts b/Composer/plugins/mongoStorage/src/interface.ts index 898fe94a88..2343218cac 100644 --- a/Composer/plugins/mongoStorage/src/interface.ts +++ b/Composer/plugins/mongoStorage/src/interface.ts @@ -11,6 +11,7 @@ export interface StorageConnection { export interface Stat { isDir: boolean; isFile: boolean; + isWritable: boolean; lastModified: string; size: string; }