intermediate-component-sa 1.1.0 → 1.1.1
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/app.server.js +7 -0
- package/client/css/main.css +1 -0
- package/{src/client → client}/index.html +6 -40
- package/client/js/app.js +1 -0
- package/client/js/shims.js +17 -0
- package/{src/client → client}/tsconfig.json +0 -0
- package/package.json +75 -340
- package/{src/server/config/app.config.ts → server/config/app.config.js} +47 -57
- package/server/config/jwt.config.js +4 -0
- package/{src/server/config/logger.config.ts → server/config/logger.config.js} +142 -161
- package/server/config/mssql.config.js +32 -0
- package/server/config/redis.config.js +8 -0
- package/server/config/server.config.js +12 -0
- package/server/config/templates.config.js +23 -0
- package/server/crypt.js +29 -0
- package/server/customRequest.js +370 -0
- package/server/index.js +125 -0
- package/server/interfaces/cleaner.interface.js +2 -0
- package/server/interfaces/supervisor.interface.js +2 -0
- package/{src/server/routes-centralized.ts → server/routes-centralized.js} +37 -36
- package/server/routes.js +7 -0
- package/server/services/index.js +8 -0
- package/server/services/routes.service.js +18 -0
- package/server/shared/file-manager.js +616 -0
- package/server/shared/http.shared.js +39 -0
- package/server/shared/promises.shared.js +14 -0
- package/server/shared/security.shared.js +52 -0
- package/{src/server → server}/ssl/star_inconcertcc_com.key +0 -0
- package/{src/server → server}/ssl/star_inconcertcc_com.pem +0 -0
- package/CHANGELOG.md +0 -11
- package/README.md +0 -1
- package/build-dev.bat +0 -2
- package/build-prod-aot.bat +0 -2
- package/build-prod-rollup-aot.bat +0 -2
- package/build-prod.bat +0 -2
- package/config.ts +0 -4
- package/gulpfile.ts +0 -172
- package/index.js +0 -12
- package/karma.conf.js +0 -124
- package/postgrator-test.json +0 -9
- package/postgrator.json +0 -9
- package/src/app.server.ts +0 -4
- package/src/client/app/app.component.ts +0 -37
- package/src/client/app/app.html +0 -6
- package/src/client/app/app.module.ts +0 -36
- package/src/client/app/app.routing.ts +0 -7
- package/src/client/app/hot_loader_main.ts +0 -14
- package/src/client/app/main-aot.ts +0 -8
- package/src/client/app/main.ts +0 -8
- package/src/client/app/rxjs-operators.ts +0 -15
- package/src/server/config/jwt.config.ts +0 -4
- package/src/server/config/mssql.config.ts +0 -30
- package/src/server/config/redis.config.ts +0 -10
- package/src/server/config/server.config.ts +0 -20
- package/src/server/config/templates.config.ts +0 -41
- package/src/server/crypt.ts +0 -37
- package/src/server/customRequest.ts +0 -609
- package/src/server/index.ts +0 -231
- package/src/server/interfaces/cleaner.interface.ts +0 -3
- package/src/server/interfaces/supervisor.interface.ts +0 -3
- package/src/server/routes.ts +0 -6
- package/src/server/services/index.ts +0 -10
- package/src/server/services/routes.service.ts +0 -11
- package/src/server/shared/file-manager.ts +0 -1007
- package/src/server/shared/http.shared.ts +0 -49
- package/src/server/shared/promises.shared.ts +0 -13
- package/src/server/shared/security.shared.ts +0 -90
- package/src/server/tsconfig.json +0 -38
- package/tools/build.js.prod.ts +0 -40
- package/tools/config/project.config.ts +0 -718
- package/tools/config.ts +0 -4
- package/tools/database/SchemaZen.exe +0 -0
- package/tools/database/generate-all-data-scripts.bat +0 -32
- package/tools/database/generate-database-scripts.bat +0 -36
- package/tools/debug.ts +0 -17
- package/tools/env/base.ts +0 -8
- package/tools/env/dev.ts +0 -9
- package/tools/env/env-config.interface.ts +0 -1
- package/tools/env/prod.ts +0 -10
- package/tools/manual_typings/project/sample.package.d.ts +0 -3
- package/tools/manual_typings/seed/angular2-hot-loader.d.ts +0 -9
- package/tools/manual_typings/seed/autoprefixer.d.ts +0 -13
- package/tools/manual_typings/seed/colorguard.d.ts +0 -15
- package/tools/manual_typings/seed/connect-livereload.d.ts +0 -5
- package/tools/manual_typings/seed/cssnano.d.ts +0 -18
- package/tools/manual_typings/seed/doiuse.d.ts +0 -16
- package/tools/manual_typings/seed/express-history-api-fallback.d.ts +0 -18
- package/tools/manual_typings/seed/istream.d.ts +0 -10
- package/tools/manual_typings/seed/karma.d.ts +0 -12
- package/tools/manual_typings/seed/merge-stream.d.ts +0 -8
- package/tools/manual_typings/seed/open.d.ts +0 -8
- package/tools/manual_typings/seed/postcss-reporter.d.ts +0 -20
- package/tools/manual_typings/seed/slash.d.ts +0 -5
- package/tools/manual_typings/seed/stylelint.d.ts +0 -16
- package/tools/manual_typings/seed/systemjs-builder.d.ts +0 -10
- package/tools/manual_typings/seed/tildify.d.ts +0 -5
- package/tools/manual_typings/seed/tiny-lr.d.ts +0 -10
- package/tools/manual_typings/seed/walk.d.ts +0 -10
- package/tools/scripts/install.speech-analytic.sh +0 -35
- package/tools/tasks/build.app.server.ts +0 -57
- package/tools/tasks/build.assets.dev.ts +0 -19
- package/tools/tasks/build.assets.prod.ts +0 -31
- package/tools/tasks/build.bundles.app.aot.ts +0 -31
- package/tools/tasks/build.bundles.app.rollup.aot.ts +0 -101
- package/tools/tasks/build.bundles.app.ts +0 -31
- package/tools/tasks/build.bundles.ts +0 -45
- package/tools/tasks/build.database.scripts.runner.ts +0 -137
- package/tools/tasks/build.database.scripts.ts +0 -27
- package/tools/tasks/build.flags.ts +0 -9
- package/tools/tasks/build.fonts.ts +0 -9
- package/tools/tasks/build.html_css.ts +0 -126
- package/tools/tasks/build.index.dev.ts +0 -68
- package/tools/tasks/build.index.prod.ts +0 -64
- package/tools/tasks/build.js.dev.ts +0 -66
- package/tools/tasks/build.js.prod.aot.ts +0 -44
- package/tools/tasks/build.js.prod.rollup.aot.ts +0 -50
- package/tools/tasks/build.js.prod.ts +0 -40
- package/tools/tasks/build.packages.prod.ts +0 -19
- package/tools/tasks/build.server.dev.ts +0 -59
- package/tools/tasks/build.server.prod.ts +0 -31
- package/tools/tasks/build.server.statics.ts +0 -24
- package/tools/tasks/build.skins.ts +0 -51
- package/tools/tasks/build.sme.prod.aot.ts +0 -6
- package/tools/tasks/build.sme.prod.rollup.aot.ts +0 -6
- package/tools/tasks/build.sme.prod.ts +0 -6
- package/tools/tasks/build.tar.prod.ts +0 -17
- package/tools/tasks/build.test.database.scripts.ts +0 -52
- package/tools/tasks/clean.dev.ts +0 -7
- package/tools/tasks/clean.prod.ts +0 -7
- package/tools/tasks/compile.ahead.prod.ts +0 -65
- package/tools/tasks/copy.client.js.prod.rollup.aot.ts +0 -33
- package/tools/tasks/copy.client.js.prod.ts +0 -18
- package/tools/tasks/copy.server.assets.ts +0 -38
- package/tools/tasks/copy.server.js.prod.ts +0 -16
- package/tools/tasks/css-lint.ts +0 -58
- package/tools/tasks/e2e.ts +0 -32
- package/tools/tasks/karma.run.ts +0 -18
- package/tools/tasks/karma.watch.ts +0 -9
- package/tools/tasks/minify.server.statics.ts +0 -52
- package/tools/tasks/server.prod.ts +0 -6
- package/tools/tasks/server.start.ts +0 -6
- package/tools/tasks/test.database.ts +0 -6
- package/tools/tasks/transpile.bundles.rollup.aot.ts +0 -43
- package/tools/tasks/tslint.ts +0 -64
- package/tools/tasks/watch.file.changes.dev.ts +0 -37
- package/tools/tasks/watch.key.press.dev.ts +0 -116
- package/tools/tasks/webdriver.ts +0 -6
- package/tools/utils/project/sample_util.ts +0 -18
- package/tools/utils/project.utils.ts +0 -4
- package/tools/utils/seed/build_optimizer.ts +0 -26
- package/tools/utils/seed/clean.ts +0 -35
- package/tools/utils/seed/code_change_tools.ts +0 -38
- package/tools/utils/seed/karma.start.ts +0 -10
- package/tools/utils/seed/server.ts +0 -43
- package/tools/utils/seed/sme.ts +0 -51
- package/tools/utils/seed/tasks_tools.ts +0 -70
- package/tools/utils/seed/template_locals.ts +0 -64
- package/tools/utils/seed/tsproject.ts +0 -25
- package/tools/utils/seed.utils.ts +0 -11
- package/tools/utils.ts +0 -5
- package/tsconfig.json +0 -33
- package/tslint.json +0 -120
- package/utils.ts +0 -5
|
@@ -1,1007 +0,0 @@
|
|
|
1
|
-
import * as log4js from 'log4js';
|
|
2
|
-
import * as moment from 'moment';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as fs from 'fs';
|
|
5
|
-
import * as ncp from 'ncp';
|
|
6
|
-
import * as mkdirp from 'mkdirp';
|
|
7
|
-
import * as rimraf from 'rimraf';
|
|
8
|
-
import * as multer from 'multer';
|
|
9
|
-
import * as extract from 'extract-zip';
|
|
10
|
-
import * as child_process from 'child_process';
|
|
11
|
-
let fse = require('fs-extra');
|
|
12
|
-
let zipFolder: any = require('zip-folder');
|
|
13
|
-
let mv = require('mv');
|
|
14
|
-
|
|
15
|
-
// Importo configuraciones
|
|
16
|
-
import { FILE_UPLOAD_LIMIT } from '../config/app.config';
|
|
17
|
-
|
|
18
|
-
import { DummyPromise } from './promises.shared';
|
|
19
|
-
|
|
20
|
-
// Funcion para ejecutar comandos de consola
|
|
21
|
-
let exec = child_process.exec;
|
|
22
|
-
|
|
23
|
-
// Obtengo logger
|
|
24
|
-
let logger = log4js.getLogger('ServerScripts');
|
|
25
|
-
|
|
26
|
-
//funcion pipe asincronico
|
|
27
|
-
export function PipeWriteFile(response: any, file: any): Promise<boolean> {
|
|
28
|
-
//declaro bluebird para tener accesos a la funcion finally
|
|
29
|
-
let Promise = require('bluebird');
|
|
30
|
-
let ended = false;
|
|
31
|
-
return new Promise(function (resolve: any, reject: any) {
|
|
32
|
-
//creamos el pipe para el response
|
|
33
|
-
response.pipe(file);
|
|
34
|
-
//si todo resulta correcto
|
|
35
|
-
function nice_ending() {
|
|
36
|
-
if (!ended) {
|
|
37
|
-
ended = true;
|
|
38
|
-
resolve(true);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
//en caso de error
|
|
42
|
-
function error_ending() {
|
|
43
|
-
if (!ended) {
|
|
44
|
-
ended = true;
|
|
45
|
-
reject(false);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
file.on('finish', nice_ending);
|
|
49
|
-
file.on('end', nice_ending);
|
|
50
|
-
file.on('error', error_ending);
|
|
51
|
-
file.on('close', error_ending);
|
|
52
|
-
}).finally(() => file.close());
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function DeleteFileSync(file: any) {
|
|
56
|
-
var fs = require('fs');
|
|
57
|
-
fs.unlinkSync(file);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function FileProperty(filePath: string): Promise<any[]> {
|
|
61
|
-
// Armo promesa para devolver
|
|
62
|
-
return new Promise(function (resolve, reject) {
|
|
63
|
-
// Chequeo si el archivo existe
|
|
64
|
-
try {
|
|
65
|
-
// Array con el resultado de la funcion
|
|
66
|
-
let result: any = {};
|
|
67
|
-
// Verifico que el path recibido corresponda a un directorio existente
|
|
68
|
-
if (fs.existsSync(filePath) && fs.lstatSync(filePath).isFile()) {
|
|
69
|
-
// Para cada archivo obtengo sus propiedades
|
|
70
|
-
let fileStat = fs.lstatSync(filePath);
|
|
71
|
-
let creationDate = moment(fileStat.birthtime);
|
|
72
|
-
let updateDate = moment(fileStat.mtime);
|
|
73
|
-
// Armo el objeto y lo agrego al array
|
|
74
|
-
result = {
|
|
75
|
-
path: filePath,
|
|
76
|
-
isFile: fileStat.isFile(),
|
|
77
|
-
creationDate: creationDate,
|
|
78
|
-
updateDate: updateDate
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// Resuelvo con el resultado
|
|
82
|
-
resolve(result);
|
|
83
|
-
} catch (e) {
|
|
84
|
-
// Algo fallo, lanzo error
|
|
85
|
-
reject(e);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function ListFolderContent(folderPath: string): Promise<any[]> {
|
|
91
|
-
|
|
92
|
-
// Armo promesa para devolver
|
|
93
|
-
return new Promise(function (resolve, reject) {
|
|
94
|
-
// Chequeo si el archivo existe
|
|
95
|
-
try {
|
|
96
|
-
// Array con el resultado de la funcion
|
|
97
|
-
let result: any[] = [];
|
|
98
|
-
|
|
99
|
-
// Verifico que el path recibido corresponda a un directorio existente
|
|
100
|
-
if (fs.existsSync(folderPath) && fs.lstatSync(folderPath).isDirectory()) {
|
|
101
|
-
|
|
102
|
-
// Obtengo la lista de archivos del directorio
|
|
103
|
-
let files: string[] = fs.readdirSync(folderPath);
|
|
104
|
-
|
|
105
|
-
// Recorro el array obtenido
|
|
106
|
-
files.forEach(
|
|
107
|
-
fileName => {
|
|
108
|
-
// Para cada archivo obtengo sus propiedades
|
|
109
|
-
let filePath = path.join(folderPath, fileName);
|
|
110
|
-
let fileStat = fs.lstatSync(filePath);
|
|
111
|
-
let creationDate = moment(fileStat.birthtime);
|
|
112
|
-
let updateDate = moment(fileStat.mtime);
|
|
113
|
-
// Armo el objeto y lo agrego al array
|
|
114
|
-
result.push(
|
|
115
|
-
{
|
|
116
|
-
name: fileName,
|
|
117
|
-
path: filePath,
|
|
118
|
-
isFolder: fileStat.isDirectory(),
|
|
119
|
-
creationDate: creationDate,
|
|
120
|
-
updateDate: updateDate,
|
|
121
|
-
}
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
// Resuelvo con el resultado
|
|
127
|
-
resolve(result);
|
|
128
|
-
} catch (e) {
|
|
129
|
-
// Algo fallo, lanzo error
|
|
130
|
-
reject(e);
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export function CreateFolder(folderName: string): Promise<boolean> {
|
|
136
|
-
|
|
137
|
-
// Verifico si el directorio a crear existe
|
|
138
|
-
return ExistInFileSystem(folderName)
|
|
139
|
-
.then(
|
|
140
|
-
result => {
|
|
141
|
-
// Si existe ya salgo
|
|
142
|
-
if (result) return true;
|
|
143
|
-
|
|
144
|
-
// Si la carpeta no existe la creo
|
|
145
|
-
return new Promise<boolean>(function (resolve, reject) {
|
|
146
|
-
try {
|
|
147
|
-
mkdirp(folderName, function (err) {
|
|
148
|
-
// Si no hay errores devuelvo true
|
|
149
|
-
resolve(err === null || err === undefined);
|
|
150
|
-
});
|
|
151
|
-
} catch (e) {
|
|
152
|
-
// Algo fallo, lanzo error
|
|
153
|
-
reject(e);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
export function ExistInFileSystem(fileSystemPath: string): Promise<boolean> {
|
|
161
|
-
|
|
162
|
-
// Armo promesa para devolver
|
|
163
|
-
return new Promise(function (resolve, reject) {
|
|
164
|
-
// Chequeo si el archivo existe
|
|
165
|
-
try {
|
|
166
|
-
fs.stat(fileSystemPath, function (err, stat) {
|
|
167
|
-
// Si no hay errores el archivo existe
|
|
168
|
-
resolve(err === null || err === undefined);
|
|
169
|
-
});
|
|
170
|
-
} catch (e) {
|
|
171
|
-
// Algo fallo, lanzo error
|
|
172
|
-
reject(e);
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export function TouchPath(fileSystemPath: string): Promise<boolean> {
|
|
178
|
-
|
|
179
|
-
// Armo promesa para devolver
|
|
180
|
-
return new Promise(function (resolve, reject) {
|
|
181
|
-
// Actualizo fecha de modificacion y acceso
|
|
182
|
-
try {
|
|
183
|
-
// Obtengo la fecha actual
|
|
184
|
-
let now: Date = moment().toDate();
|
|
185
|
-
// Actualizo fechas
|
|
186
|
-
fs.utimes(fileSystemPath, now, now, function (err) {
|
|
187
|
-
// Si no hay errores el archivo existe
|
|
188
|
-
resolve(err === null || err === undefined);
|
|
189
|
-
});
|
|
190
|
-
} catch (e) {
|
|
191
|
-
// Algo fallo, lanzo error
|
|
192
|
-
reject(e);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export function CopyFile(sourcePath: string, targetPath: string): Promise<boolean> {
|
|
198
|
-
|
|
199
|
-
// Armo promesa para devolver
|
|
200
|
-
return new Promise(function (resolve, reject) {
|
|
201
|
-
try {
|
|
202
|
-
// Copiamos archivo al destino
|
|
203
|
-
fse.copy(sourcePath, targetPath, function (err) {
|
|
204
|
-
// Si no hay errores el archivo se copio
|
|
205
|
-
resolve(err === null || err === undefined);
|
|
206
|
-
});
|
|
207
|
-
} catch (e) {
|
|
208
|
-
// Algo fallo, lanzo error
|
|
209
|
-
reject(e);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export function CopyFolder(sourcePath: string, targetPath: string): Promise<boolean> {
|
|
215
|
-
|
|
216
|
-
// Verifico que la carpeta de destino exista
|
|
217
|
-
return new Promise<boolean>(function (resolve, reject) {
|
|
218
|
-
try {
|
|
219
|
-
fs.stat(targetPath, function (err, stat) {
|
|
220
|
-
// Si no hay errores el archivo existe
|
|
221
|
-
resolve(err === null || err === undefined);
|
|
222
|
-
});
|
|
223
|
-
} catch (e) {
|
|
224
|
-
// Algo fallo, lanzo error
|
|
225
|
-
reject(e);
|
|
226
|
-
}
|
|
227
|
-
}).then(
|
|
228
|
-
resultExists => {
|
|
229
|
-
// Si ya existe sigo
|
|
230
|
-
if (resultExists) return true;
|
|
231
|
-
|
|
232
|
-
// Si la carpeta no existe la creo
|
|
233
|
-
return new Promise<boolean>(function (resolve, reject) {
|
|
234
|
-
try {
|
|
235
|
-
mkdirp(targetPath, function (err) {
|
|
236
|
-
// Si no hay errores devuelvo true
|
|
237
|
-
resolve(err === null || err === undefined);
|
|
238
|
-
});
|
|
239
|
-
} catch (e) {
|
|
240
|
-
// Algo fallo, lanzo error
|
|
241
|
-
reject(e);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
).then(
|
|
246
|
-
resultMkDir => {
|
|
247
|
-
// Copio la carpeta origen hacia la ruta destino
|
|
248
|
-
return new Promise<boolean>(function (resolve, reject) {
|
|
249
|
-
try {
|
|
250
|
-
ncp.ncp(sourcePath, targetPath, function (err) {
|
|
251
|
-
// Si no hay errores devuelvo true
|
|
252
|
-
resolve(err === null || err === undefined);
|
|
253
|
-
});
|
|
254
|
-
} catch (e) {
|
|
255
|
-
// Algo fallo, lanzo error
|
|
256
|
-
reject(e);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
export function MoveFolder(sourceFolder: string, destFolder: string): Promise<boolean> {
|
|
264
|
-
|
|
265
|
-
// Verifico que el directorio a mover exista
|
|
266
|
-
return ExistInFileSystem(sourceFolder)
|
|
267
|
-
.then(
|
|
268
|
-
result => {
|
|
269
|
-
// Si no existe no sigo
|
|
270
|
-
if (!result) throw 'El directorio \'' + sourceFolder + '\' no existe';
|
|
271
|
-
|
|
272
|
-
// Armo promesa para devolver
|
|
273
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
274
|
-
// Elimino la carpeta recursivamente con rimraf
|
|
275
|
-
try {
|
|
276
|
-
fs.rename(sourceFolder, destFolder, function (err) {
|
|
277
|
-
// Si no hay errores devuelvo true
|
|
278
|
-
resolve(err === null || err === undefined);
|
|
279
|
-
});
|
|
280
|
-
} catch (e) {
|
|
281
|
-
// Algo fallo, lanzo error
|
|
282
|
-
reject(e);
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export function MoveFolderOtherDevice(sourceFolder: string, destFolder: string): Promise<boolean> {
|
|
290
|
-
|
|
291
|
-
// Verifico que el directorio a mover exista
|
|
292
|
-
return ExistInFileSystem(sourceFolder)
|
|
293
|
-
.then(
|
|
294
|
-
result => {
|
|
295
|
-
// Si no existe no sigo
|
|
296
|
-
if (!result) throw 'El directorio \'' + sourceFolder + '\' no existe';
|
|
297
|
-
|
|
298
|
-
// Armo promesa para devolver
|
|
299
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
300
|
-
// Elimino la carpeta recursivamente con rimraf
|
|
301
|
-
try {
|
|
302
|
-
mv(sourceFolder, destFolder, function (err) {
|
|
303
|
-
// Si no hay errores devuelvo true
|
|
304
|
-
resolve(err === null || err === undefined);
|
|
305
|
-
});
|
|
306
|
-
} catch (e) {
|
|
307
|
-
// Algo fallo, lanzo error
|
|
308
|
-
reject(e);
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
export function DeleteFolder(folderPath: any): Promise<boolean> {
|
|
316
|
-
|
|
317
|
-
// Armo promesa para devolver
|
|
318
|
-
return new Promise(function (resolve, reject) {
|
|
319
|
-
// Elimino la carpeta recursivamente con rimraf
|
|
320
|
-
try {
|
|
321
|
-
rimraf(folderPath, function (err) {
|
|
322
|
-
// Si no hay errores devuelvo true
|
|
323
|
-
resolve(err === null || err === undefined);
|
|
324
|
-
});
|
|
325
|
-
} catch (e) {
|
|
326
|
-
// Algo fallo, lanzo error
|
|
327
|
-
reject(e);
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
export function DeleteFile(filePath: any): Promise<boolean> {
|
|
333
|
-
|
|
334
|
-
// Armo promesa para devolver
|
|
335
|
-
return new Promise(function (resolve, reject) {
|
|
336
|
-
// Elimino el archivo
|
|
337
|
-
try {
|
|
338
|
-
fs.unlink(filePath, function (err) {
|
|
339
|
-
// Si no hay errores devuelvo true
|
|
340
|
-
resolve(err === null || err === undefined);
|
|
341
|
-
});
|
|
342
|
-
} catch (e) {
|
|
343
|
-
// Algo fallo, lanzo error
|
|
344
|
-
reject(e);
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
export function ReadFileContent(fileName: string, encode: string, safe?: boolean): Promise<string> {
|
|
350
|
-
|
|
351
|
-
logger.info('ReadFileContent: ', fileName);
|
|
352
|
-
// Armo promesa para devolver
|
|
353
|
-
return new Promise(function (resolve, reject) {
|
|
354
|
-
// Leo el contenido del archivo
|
|
355
|
-
try {
|
|
356
|
-
fs.readFile(fileName, encode, function (err: any, data: any) {
|
|
357
|
-
//logger.info('ReadFileContent - readFile - fileName: ', fileName);
|
|
358
|
-
if (err) {
|
|
359
|
-
if (safe) {
|
|
360
|
-
return resolve(null);
|
|
361
|
-
} else {
|
|
362
|
-
//logger.info('ReadFileContent - readFile - err: ', err);
|
|
363
|
-
return reject(err);
|
|
364
|
-
}
|
|
365
|
-
} else {
|
|
366
|
-
return resolve(data);
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
} catch (e) {
|
|
370
|
-
logger.info('ReadFileContent - error: ', e);
|
|
371
|
-
// Algo fallo, lanzo error
|
|
372
|
-
if (safe)
|
|
373
|
-
resolve(null);
|
|
374
|
-
else
|
|
375
|
-
reject(e);
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
export function FileToBase64(file: any) {
|
|
381
|
-
return new Promise(function (resolve, reject) {
|
|
382
|
-
try {
|
|
383
|
-
// Lee data binaria.
|
|
384
|
-
var buffer = fs.readFileSync(file);
|
|
385
|
-
// Convierte la data binaria a cadena codificada en base64.
|
|
386
|
-
return resolve(new Buffer(buffer).toString('base64'));
|
|
387
|
-
} catch (e) {
|
|
388
|
-
reject(e);
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
export function BufferFile(file: any) {
|
|
394
|
-
return new Promise(function (resolve, reject) {
|
|
395
|
-
try {
|
|
396
|
-
// Lee data binaria.
|
|
397
|
-
var buffer = fs.readFileSync(file);
|
|
398
|
-
// Convierte la data binaria a cadena codificada en base64.
|
|
399
|
-
return resolve(buffer);
|
|
400
|
-
} catch (e) {
|
|
401
|
-
reject(e);
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
export function WriteFileContent(fileName: string, data: string, encode: string, safe?: boolean): Promise<boolean> {
|
|
407
|
-
|
|
408
|
-
// Armo promesa para devolver
|
|
409
|
-
return new Promise(function (resolve, reject) {
|
|
410
|
-
// Escribo el contenido del archivo
|
|
411
|
-
try {
|
|
412
|
-
fs.writeFile(fileName, data, { encoding: encode }, function (err: any) {
|
|
413
|
-
if (err) {
|
|
414
|
-
if (safe)
|
|
415
|
-
return resolve(null);
|
|
416
|
-
else
|
|
417
|
-
return reject(err);
|
|
418
|
-
} else {
|
|
419
|
-
return resolve(true);
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
} catch (e) {
|
|
423
|
-
// Algo fallo, lanzo error
|
|
424
|
-
if (safe)
|
|
425
|
-
resolve(null);
|
|
426
|
-
else
|
|
427
|
-
reject(e);
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
export function ZipFolder(srcFolder: string, zipFilePath: string): Promise<boolean> {
|
|
433
|
-
|
|
434
|
-
// Armo promesa para devolver
|
|
435
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
436
|
-
// Comprimo la carpeta en el filename recibido
|
|
437
|
-
try {
|
|
438
|
-
zipFolder(srcFolder, zipFilePath, function (err: any) {
|
|
439
|
-
// Si no hay errores devuelvo true
|
|
440
|
-
resolve(err === null || err === undefined);
|
|
441
|
-
});
|
|
442
|
-
} catch (e) {
|
|
443
|
-
// Algo fallo, lanzo error
|
|
444
|
-
reject(e);
|
|
445
|
-
}
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
export function UnZipFolder(zipFilePath: string, destinationPath?: string): Promise<boolean> {
|
|
450
|
-
|
|
451
|
-
// Si el path de destino no existe uso el mismo nombre del archivo
|
|
452
|
-
destinationPath = destinationPath || zipFilePath;
|
|
453
|
-
|
|
454
|
-
// Armo promesa para devolver
|
|
455
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
456
|
-
// Descomprimo el archivo en carpeta con rl propio filename
|
|
457
|
-
try {
|
|
458
|
-
extract(
|
|
459
|
-
zipFilePath,
|
|
460
|
-
{
|
|
461
|
-
dir: destinationPath
|
|
462
|
-
},
|
|
463
|
-
function (err) {
|
|
464
|
-
if (err) {
|
|
465
|
-
return reject(err);
|
|
466
|
-
} else {
|
|
467
|
-
return resolve(true);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
);
|
|
471
|
-
} catch (e) {
|
|
472
|
-
// Algo fallo, lanzo error
|
|
473
|
-
reject(e);
|
|
474
|
-
}
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
export function UnRarFolder(rarFilePath: string, destinationPath?: string): Promise<boolean> {
|
|
479
|
-
|
|
480
|
-
// Si el path de destino no existe uso el mismo nombre del archivo
|
|
481
|
-
destinationPath = destinationPath || rarFilePath;
|
|
482
|
-
|
|
483
|
-
// Creo el directorio para descomprimor
|
|
484
|
-
return CreateFolder(destinationPath)
|
|
485
|
-
.then(
|
|
486
|
-
result => {
|
|
487
|
-
// Si existe ya salgo
|
|
488
|
-
if (!result) throw 'No se pudo crear el directorio \'' + destinationPath + '\'';
|
|
489
|
-
|
|
490
|
-
// Armo promesa para devolver
|
|
491
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
492
|
-
// Descomprimo el archivo en carpeta con rl propio filename
|
|
493
|
-
try {
|
|
494
|
-
// Armo el comando para descomprimir el rar
|
|
495
|
-
let cmd: string = 'unrar x "' + rarFilePath + '" "' + destinationPath + '"';
|
|
496
|
-
|
|
497
|
-
// Ejecuto el comando y obtengo el resultado
|
|
498
|
-
exec(cmd, function (err: any, stdout: string, stderr: string) {
|
|
499
|
-
if (err) {
|
|
500
|
-
return reject(err);
|
|
501
|
-
} else {
|
|
502
|
-
return resolve(true);
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
} catch (e) {
|
|
506
|
-
// Algo fallo, lanzo error
|
|
507
|
-
reject(e);
|
|
508
|
-
}
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
export function GetFolderTree(folderPath: string, extensionExclude?: string[], extensionFilter?: string[]): Promise<any[]> {
|
|
515
|
-
|
|
516
|
-
// Armo promesa para devolver
|
|
517
|
-
return new Promise(function (resolve, reject) {
|
|
518
|
-
|
|
519
|
-
// Si los filtros me vienen vacios los inicializo
|
|
520
|
-
extensionExclude = extensionExclude || [];
|
|
521
|
-
extensionFilter = extensionFilter || [];
|
|
522
|
-
|
|
523
|
-
// Funcion para buscar archivos recurisvamente
|
|
524
|
-
let walk = function (dir: string, obj: any[], done: any) {
|
|
525
|
-
|
|
526
|
-
// Busco los elementos en el directorio
|
|
527
|
-
fs.readdir(dir, function (err, list) {
|
|
528
|
-
|
|
529
|
-
// Si hay errores no sigo
|
|
530
|
-
if (err) return done(err);
|
|
531
|
-
|
|
532
|
-
// Obtengo cantidad de elementos encontrados
|
|
533
|
-
let pending = list.length;
|
|
534
|
-
// Si no hay elementos ya salgo
|
|
535
|
-
if (!pending) return done(null);
|
|
536
|
-
|
|
537
|
-
// Recorro elementos obtenidos
|
|
538
|
-
list.forEach(function (fileName) {
|
|
539
|
-
|
|
540
|
-
// Obtengo la ruta del elemento
|
|
541
|
-
let filePath: string = path.resolve(dir, fileName);
|
|
542
|
-
|
|
543
|
-
// Obtengo propiedades del elemento
|
|
544
|
-
fs.stat(filePath, function (err, stat) {
|
|
545
|
-
|
|
546
|
-
// Evaluo si el elemento es un directorio
|
|
547
|
-
if (stat && stat.isDirectory()) {
|
|
548
|
-
|
|
549
|
-
// Armo el el objeto directorio
|
|
550
|
-
let objDirectory: any = {
|
|
551
|
-
name: fileName,
|
|
552
|
-
relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
|
|
553
|
-
fullPath: filePath,
|
|
554
|
-
type: 'directory',
|
|
555
|
-
children: []
|
|
556
|
-
};
|
|
557
|
-
|
|
558
|
-
// Agrego el directorio al arbol
|
|
559
|
-
obj.push(objDirectory);
|
|
560
|
-
|
|
561
|
-
// Llamo a la funcion recursivamente
|
|
562
|
-
walk(filePath, objDirectory.children, function (err: any, res: any[]) {
|
|
563
|
-
// Obtengo el size del directorio completo
|
|
564
|
-
objDirectory.size = objDirectory.children.reduce((prev: number, cur: any) => prev + cur.size, 0);
|
|
565
|
-
// Chequeo si quedan mas elementos para procesar
|
|
566
|
-
if (!--pending) done(null);
|
|
567
|
-
});
|
|
568
|
-
} else {
|
|
569
|
-
// Obtengo la extension del archivo
|
|
570
|
-
let fileExtension: string = path.extname(fileName).toLowerCase().slice(1);
|
|
571
|
-
|
|
572
|
-
// Flag para saber si hay que agregarlo o no
|
|
573
|
-
let skipFile: boolean = false;
|
|
574
|
-
// Si tengo exclusion de extensiones y la extension esta incluida activo el skip
|
|
575
|
-
if (fileExtension && extensionExclude.length && extensionExclude.indexOf(fileExtension) >= 0) skipFile = true;
|
|
576
|
-
// Si tengo filtro de extensiones y la extension no esta incluida activo el skip
|
|
577
|
-
if (extensionFilter.length && (extensionFilter.indexOf(fileExtension) === -1 || !fileExtension)) skipFile = true;
|
|
578
|
-
|
|
579
|
-
// Si no esta el skip lo agrego a la lista
|
|
580
|
-
if (!skipFile) {
|
|
581
|
-
// Armo el el objeto directorio
|
|
582
|
-
let objFile: any = {
|
|
583
|
-
name: fileName,
|
|
584
|
-
type: 'file',
|
|
585
|
-
extension: fileExtension,
|
|
586
|
-
relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
|
|
587
|
-
fullPath: filePath,
|
|
588
|
-
size: stat.size
|
|
589
|
-
};
|
|
590
|
-
// Agrego el archivo al arbol
|
|
591
|
-
obj.push(objFile);
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Chequeo si quedan mas elementos para procesar
|
|
595
|
-
if (!--pending) done(null);
|
|
596
|
-
}
|
|
597
|
-
});
|
|
598
|
-
});
|
|
599
|
-
});
|
|
600
|
-
};
|
|
601
|
-
|
|
602
|
-
// Obtengo el nombre de la carpeta
|
|
603
|
-
let folderName: string = path.basename(folderPath);
|
|
604
|
-
// Armo el el objeto del directorio principal
|
|
605
|
-
let objMainDirectory: any = {
|
|
606
|
-
name: folderName,
|
|
607
|
-
type: 'directory',
|
|
608
|
-
relativePath: path.relative(folderPath, folderPath).replace(/\\/g, '/'),
|
|
609
|
-
fullPath: folderPath,
|
|
610
|
-
children: []
|
|
611
|
-
};
|
|
612
|
-
|
|
613
|
-
// Objeto arbol que voy a devolver
|
|
614
|
-
let folderTree: any = [];
|
|
615
|
-
// Agrego el directorio al arbol
|
|
616
|
-
folderTree.push(objMainDirectory);
|
|
617
|
-
|
|
618
|
-
// Lanzo el walker y le paso la referencia a la carpeta principal
|
|
619
|
-
walk(folderPath, objMainDirectory.children, function (err: any, results: any[]) {
|
|
620
|
-
// Si hubo algun error hago el reject de la promesa
|
|
621
|
-
if (err) return reject(err);
|
|
622
|
-
// Obtengo el size del directorio completo
|
|
623
|
-
objMainDirectory.size = objMainDirectory.children.reduce((prev: number, cur: any) => prev + cur.size, 0);
|
|
624
|
-
//Devuelvo el objeto arbol completo
|
|
625
|
-
resolve(folderTree);
|
|
626
|
-
});
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
export function GetFolderFiles(folderPath: string, extensionExclude?: string[], extensionFilter?: string[], recursive?: boolean): Promise<any[]> {
|
|
631
|
-
|
|
632
|
-
// Armo promesa para devolver
|
|
633
|
-
return new Promise(function (resolve, reject) {
|
|
634
|
-
|
|
635
|
-
// Si los filtros me vienen vacios los inicializo
|
|
636
|
-
extensionExclude = extensionExclude || [];
|
|
637
|
-
extensionFilter = extensionFilter || [];
|
|
638
|
-
recursive = (recursive === true);
|
|
639
|
-
|
|
640
|
-
// Funcion para buscar archivos recurisvamente
|
|
641
|
-
let walk = function (dir: string, obj: any[], done: any) {
|
|
642
|
-
|
|
643
|
-
// Busco los elementos en el directorio
|
|
644
|
-
fs.readdir(dir, function (err, list) {
|
|
645
|
-
|
|
646
|
-
// Si hay errores no sigo
|
|
647
|
-
if (err) return done(err);
|
|
648
|
-
|
|
649
|
-
// Obtengo cantidad de elementos encontrados
|
|
650
|
-
let pending = list.length;
|
|
651
|
-
// Si no hay elementos ya salgo
|
|
652
|
-
if (!pending) return done(null);
|
|
653
|
-
|
|
654
|
-
// Recorro elementos obtenidos
|
|
655
|
-
list.forEach(function (fileName) {
|
|
656
|
-
|
|
657
|
-
// Obtengo la ruta del elemento
|
|
658
|
-
let filePath: string = path.resolve(dir, fileName);
|
|
659
|
-
|
|
660
|
-
// Obtengo propiedades del elemento
|
|
661
|
-
fs.stat(filePath, function (err, stat) {
|
|
662
|
-
|
|
663
|
-
// Evaluo si el elemento es un directorio
|
|
664
|
-
if (stat && stat.isDirectory()) {
|
|
665
|
-
|
|
666
|
-
// Armo el el objeto directorio
|
|
667
|
-
let objDirectory: any = {
|
|
668
|
-
name: fileName,
|
|
669
|
-
relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
|
|
670
|
-
fullPath: filePath,
|
|
671
|
-
type: 'directory',
|
|
672
|
-
children: []
|
|
673
|
-
};
|
|
674
|
-
|
|
675
|
-
// Agrego el directorio al arbol
|
|
676
|
-
obj.push(objDirectory);
|
|
677
|
-
|
|
678
|
-
// Segun el valor del flag proceso la carpeta recursivamente o no
|
|
679
|
-
if (recursive) {
|
|
680
|
-
// Llamo a la funcion recursivamente
|
|
681
|
-
walk(filePath, obj, function (err: any, res: any[]) {
|
|
682
|
-
// Chequeo si quedan mas elementos para procesar
|
|
683
|
-
if (!--pending) done(null);
|
|
684
|
-
});
|
|
685
|
-
} else {
|
|
686
|
-
// Chequeo si quedan mas elementos para procesar
|
|
687
|
-
if (!--pending) done(null);
|
|
688
|
-
}
|
|
689
|
-
} else {
|
|
690
|
-
// Obtengo la extension del archivo
|
|
691
|
-
let fileExtension: string = path.extname(fileName).toLowerCase().slice(1);
|
|
692
|
-
|
|
693
|
-
// Flag para saber si hay que agregarlo o no
|
|
694
|
-
let skipFile: boolean = false;
|
|
695
|
-
// Si tengo exclusion de extensiones y la extension esta incluida activo el skip
|
|
696
|
-
if (fileExtension && extensionExclude.length && extensionExclude.indexOf(fileExtension) >= 0) skipFile = true;
|
|
697
|
-
// Si tengo filtro de extensiones y la extension no esta incluida activo el skip
|
|
698
|
-
if (extensionFilter.length && (extensionFilter.indexOf(fileExtension) === -1 || !fileExtension)) skipFile = true;
|
|
699
|
-
|
|
700
|
-
// Si no esta el skip lo agrego a la lista
|
|
701
|
-
if (!skipFile) {
|
|
702
|
-
// Armo el el objeto directorio
|
|
703
|
-
let objFile: any = {
|
|
704
|
-
name: fileName,
|
|
705
|
-
type: 'file',
|
|
706
|
-
extension: fileExtension,
|
|
707
|
-
relativePath: path.relative(folderPath, filePath).replace(/\\/g, '/'),
|
|
708
|
-
fullPath: filePath,
|
|
709
|
-
size: stat.size
|
|
710
|
-
};
|
|
711
|
-
// Agrego el archivo al arbol
|
|
712
|
-
obj.push(objFile);
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// Chequeo si quedan mas elementos para procesar
|
|
716
|
-
if (!--pending) done(null);
|
|
717
|
-
}
|
|
718
|
-
});
|
|
719
|
-
});
|
|
720
|
-
});
|
|
721
|
-
};
|
|
722
|
-
|
|
723
|
-
// Objeto arbol que voy a devolver
|
|
724
|
-
let folderFiles: any[] = [];
|
|
725
|
-
|
|
726
|
-
// Lanzo el walker y le paso la referencia a la carpeta principal
|
|
727
|
-
walk(folderPath, folderFiles, function (err: any, results: any[]) {
|
|
728
|
-
// Verifico si hubo algun error
|
|
729
|
-
if (err) {
|
|
730
|
-
// Obtengo mensajes de error
|
|
731
|
-
let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
|
|
732
|
-
// Escribo a log
|
|
733
|
-
logger.error('Error al consultar archivos de la carpeta snapshot \'' + folderPath + '\': ' + errorMsg);
|
|
734
|
-
// Devuelvo array vacío
|
|
735
|
-
resolve([]);
|
|
736
|
-
} else {
|
|
737
|
-
// Devuelvo el objeto arbol completo
|
|
738
|
-
resolve(folderFiles);
|
|
739
|
-
}
|
|
740
|
-
});
|
|
741
|
-
});
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
export function UploadFileToServer(
|
|
745
|
-
fileName: string, destFolder: string, req: any, res: any,
|
|
746
|
-
types?: string, fieldName?: string, single?: boolean,
|
|
747
|
-
replace?: boolean, fileSizeLimit?: number): Promise<boolean> {
|
|
748
|
-
|
|
749
|
-
// Valores por defecto
|
|
750
|
-
single = (single === false ? single : true);
|
|
751
|
-
fieldName = (fieldName ? fieldName : 'file');
|
|
752
|
-
replace = (replace === false ? replace : true);
|
|
753
|
-
fileSizeLimit = (fileSizeLimit ? fileSizeLimit : FILE_UPLOAD_LIMIT);
|
|
754
|
-
|
|
755
|
-
// Inicializo contador de multer
|
|
756
|
-
req.multerCounter = 0;
|
|
757
|
-
|
|
758
|
-
// Configuro el storage de multer
|
|
759
|
-
let storageEngine: multer.StorageEngine = multer.diskStorage({
|
|
760
|
-
destination: function (req: any, file: any, cb: any) {
|
|
761
|
-
cb(null, destFolder);
|
|
762
|
-
},
|
|
763
|
-
filename: function (req: any, file: any, cb: any) {
|
|
764
|
-
cb(null, fileName || file.originalname);
|
|
765
|
-
}
|
|
766
|
-
});
|
|
767
|
-
|
|
768
|
-
// Armo el filtro de tipo de archivos
|
|
769
|
-
let fileFilter: any = function (req: any, file: any, cb: any) {
|
|
770
|
-
// Incremento contador
|
|
771
|
-
req.multerCounter++;
|
|
772
|
-
// Armo el regex para matchear con el filename
|
|
773
|
-
let typesRegEx: string = '\.(' + (types.toLowerCase() || '.+') + ')$';
|
|
774
|
-
let regEx: RegExp = new RegExp(typesRegEx);
|
|
775
|
-
// Si me llego un tipo verifico que el archivo matchee
|
|
776
|
-
if (types && !file.originalname.toLowerCase().match(regEx)) {
|
|
777
|
-
// Error de tamaño de archivo
|
|
778
|
-
logger.error('El archivo recibido no está dentro de los tipos permitidos (' + types.toLowerCase() + ').');
|
|
779
|
-
// return cb('ERROR_FILE_TYPE_NOT_ALLOWED' + '|' + types.toLowerCase().replace(/\|/g, ' '));
|
|
780
|
-
return cb(new Error('Only ' + types.toLowerCase() + ' files are allowed!'));
|
|
781
|
-
}
|
|
782
|
-
// Segun el valor del flag de replace verifico si el archivo existe
|
|
783
|
-
if (replace) {
|
|
784
|
-
// Paso el filtro, ejecuto callback
|
|
785
|
-
cb(null, true);
|
|
786
|
-
} else {
|
|
787
|
-
// Verifico si el archivo existe
|
|
788
|
-
ExistInFileSystem(path.join(destFolder, file.originalname))
|
|
789
|
-
.then(
|
|
790
|
-
result => {
|
|
791
|
-
// Si el archivo existe devuelvo false
|
|
792
|
-
return cb(null, !result);
|
|
793
|
-
}
|
|
794
|
-
);
|
|
795
|
-
}
|
|
796
|
-
};
|
|
797
|
-
|
|
798
|
-
// Handler para el upload
|
|
799
|
-
let upload: any;
|
|
800
|
-
|
|
801
|
-
// Si segun el caso uso funcion para un archivo o un array
|
|
802
|
-
if (single) {
|
|
803
|
-
upload = multer({
|
|
804
|
-
storage: storageEngine,
|
|
805
|
-
fileFilter: fileFilter,
|
|
806
|
-
limits: { fileSize: fileSizeLimit },
|
|
807
|
-
}).single(fieldName);
|
|
808
|
-
} else {
|
|
809
|
-
upload = multer({
|
|
810
|
-
storage: storageEngine,
|
|
811
|
-
fileFilter: fileFilter,
|
|
812
|
-
limits: { fileSize: fileSizeLimit },
|
|
813
|
-
}).array(fieldName);
|
|
814
|
-
}
|
|
815
|
-
|
|
816
|
-
// Obtengo la ruta temporal del template a subir
|
|
817
|
-
let tempFilename: string = path.join(destFolder, fileName);
|
|
818
|
-
|
|
819
|
-
// Si ya existe el archivo a subir lo elimino
|
|
820
|
-
return DummyPromise()
|
|
821
|
-
.then(
|
|
822
|
-
result => {
|
|
823
|
-
// Si no me llego archivo no borro nada (se usa el nombre original)
|
|
824
|
-
if (!fileName) return true;
|
|
825
|
-
|
|
826
|
-
// Si tengo filename lo borro
|
|
827
|
-
return DeleteFolder(tempFilename);
|
|
828
|
-
}
|
|
829
|
-
).then(
|
|
830
|
-
resultDelete => {
|
|
831
|
-
// Verifico que el delete haya funcionado bien
|
|
832
|
-
if (!resultDelete) throw 'Cannot delete existing file \'' + tempFilename + '\'';
|
|
833
|
-
|
|
834
|
-
// Sigo con una promesa armada a mano (el multer es con callbacks)
|
|
835
|
-
return new Promise<boolean>((resolve, reject) => {
|
|
836
|
-
// Ejecuto el upload
|
|
837
|
-
return upload(req, res, function (err: any) {
|
|
838
|
-
// Verifico errores
|
|
839
|
-
if (err && err.code === 'LIMIT_FILE_SIZE') {
|
|
840
|
-
// Error de tamaño de archivo
|
|
841
|
-
logger.error('El archivo recibido supera el límite permitido (' + fileSizeLimit.toString() + 'bytes).');
|
|
842
|
-
reject('ERROR_FILE_UPLOAD_LIMIT' + '|' + (Math.round(100.00 * fileSizeLimit / 1024 / 1024) / 100.00).toString());
|
|
843
|
-
} else if (err) {
|
|
844
|
-
// Error generico
|
|
845
|
-
logger.error('Error al subir archivo: ' + err);
|
|
846
|
-
reject(err);
|
|
847
|
-
} else {
|
|
848
|
-
// Resultado correcto
|
|
849
|
-
resolve(true);
|
|
850
|
-
}
|
|
851
|
-
});
|
|
852
|
-
});
|
|
853
|
-
}
|
|
854
|
-
);
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
// export function GenerateSnapshot(fileURL: string, fileDest: string, thumbnail?: boolean): Promise<boolean> {
|
|
858
|
-
|
|
859
|
-
// // Armo promesa para devolver
|
|
860
|
-
// return new Promise<boolean>((resolve, reject) => {
|
|
861
|
-
|
|
862
|
-
// // Escribo a log
|
|
863
|
-
// logger.info('Generando snapshot para \'' + fileURL + '\' en \'' + fileDest + '\'');
|
|
864
|
-
|
|
865
|
-
// // Browser y pagina del API de puppeteer
|
|
866
|
-
// let browser: puppeteer.Browser;
|
|
867
|
-
// let page: puppeteer.Page;
|
|
868
|
-
|
|
869
|
-
// // Opciones para inicializar el chromium
|
|
870
|
-
// let puppeteerOpts: puppeteer.LaunchOptions = {
|
|
871
|
-
// args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
872
|
-
// ignoreHTTPSErrors: true,
|
|
873
|
-
// };
|
|
874
|
-
|
|
875
|
-
// // Si tengo configurado un ejecutable para chromium lo uso
|
|
876
|
-
// if (CHROMIUM_EXEC_PATH) puppeteerOpts.executablePath = CHROMIUM_EXEC_PATH;
|
|
877
|
-
|
|
878
|
-
// // Opciones para el snapshot
|
|
879
|
-
// let screenshotOpts: puppeteer.ScreenshotOptions = {
|
|
880
|
-
// path: fileDest,
|
|
881
|
-
// type: (TEMPLATE_PREVIEW_EXT === '.jpg' ? 'jpeg' : 'png'),
|
|
882
|
-
// quality: (thumbnail ? 75 : 100),
|
|
883
|
-
// fullPage: false,
|
|
884
|
-
// omitBackground: false,
|
|
885
|
-
// };
|
|
886
|
-
|
|
887
|
-
// // Viewport del navegador
|
|
888
|
-
// let viewport: puppeteer.Viewport = {
|
|
889
|
-
// width: 1366,
|
|
890
|
-
// height: 768,
|
|
891
|
-
// deviceScaleFactor: (thumbnail ? 0.3 : 1),
|
|
892
|
-
// isMobile: false,
|
|
893
|
-
// hasTouch: false,
|
|
894
|
-
// isLandscape: false,
|
|
895
|
-
// };
|
|
896
|
-
|
|
897
|
-
// // Opciones de navegación
|
|
898
|
-
// let navigationOpts: puppeteer.NavigationOptions = {
|
|
899
|
-
// timeout: 10000
|
|
900
|
-
// };
|
|
901
|
-
|
|
902
|
-
// // Flags de pasos completados
|
|
903
|
-
// let navigationCompleted: boolean = false;
|
|
904
|
-
// let snapshotCompleted: boolean = false;
|
|
905
|
-
// let closeCompleted: boolean = false;
|
|
906
|
-
|
|
907
|
-
// // Inicializo el browser
|
|
908
|
-
// return puppeteer.launch(puppeteerOpts).then(
|
|
909
|
-
// resultBrowser => {
|
|
910
|
-
// // Obtengo el browser
|
|
911
|
-
// browser = resultBrowser;
|
|
912
|
-
|
|
913
|
-
// // Inicializo nueva pagina
|
|
914
|
-
// return browser.newPage();
|
|
915
|
-
// }
|
|
916
|
-
// ).then(
|
|
917
|
-
// resultPage => {
|
|
918
|
-
// // Obtengo la página
|
|
919
|
-
// page = resultPage;
|
|
920
|
-
|
|
921
|
-
// // Establezco el viewport
|
|
922
|
-
// page.setViewport(viewport);
|
|
923
|
-
|
|
924
|
-
// // Navego hacia la URL
|
|
925
|
-
// return page.goto(fileURL, navigationOpts);
|
|
926
|
-
// }
|
|
927
|
-
// ).then(
|
|
928
|
-
// resultGoto => {
|
|
929
|
-
// // Actualizo el flag
|
|
930
|
-
// navigationCompleted = true;
|
|
931
|
-
|
|
932
|
-
// // Hago el screenshot de la página
|
|
933
|
-
// return page.screenshot(screenshotOpts);
|
|
934
|
-
// }
|
|
935
|
-
// ).then(
|
|
936
|
-
// resultScreenshot => {
|
|
937
|
-
// // Actualizo el flag
|
|
938
|
-
// snapshotCompleted = true;
|
|
939
|
-
|
|
940
|
-
// // Cierro el browser
|
|
941
|
-
// return browser.close();
|
|
942
|
-
// }
|
|
943
|
-
// ).then(
|
|
944
|
-
// resultClose => {
|
|
945
|
-
// // Actualizo el flag
|
|
946
|
-
// closeCompleted = true;
|
|
947
|
-
|
|
948
|
-
// // Todo OK, sigo
|
|
949
|
-
// return true;
|
|
950
|
-
// }
|
|
951
|
-
// ).catch(
|
|
952
|
-
// err => {
|
|
953
|
-
// // Obtengo mensajes de error
|
|
954
|
-
// let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
|
|
955
|
-
|
|
956
|
-
// // Escribo a log
|
|
957
|
-
// logger.error('Error al generar snapshot (' + fileDest + '): ' + errorMsg);
|
|
958
|
-
|
|
959
|
-
// // Si no se completo la navegacion saco el snapshot con lo que hay
|
|
960
|
-
// if (page && !navigationCompleted) {
|
|
961
|
-
// // Escribo a log
|
|
962
|
-
// logger.warn('La navegación alcanzó el tiempo limite (' + navigationOpts.timeout.toString() + 'ms). Se generará snapshot con la página parcialmente abierta.');
|
|
963
|
-
|
|
964
|
-
// // Hago el screenshot de la página
|
|
965
|
-
// return page.screenshot(screenshotOpts);
|
|
966
|
-
// } else {
|
|
967
|
-
// // No hago nada
|
|
968
|
-
// return null;
|
|
969
|
-
// }
|
|
970
|
-
// }
|
|
971
|
-
// ).then(
|
|
972
|
-
// resultScreenshot => {
|
|
973
|
-
// // Si el browser esta abierto lo cierro
|
|
974
|
-
// if (browser && !closeCompleted)
|
|
975
|
-
// return browser.close();
|
|
976
|
-
// else
|
|
977
|
-
// return null;
|
|
978
|
-
// }
|
|
979
|
-
// ).then(
|
|
980
|
-
// resultClose => {
|
|
981
|
-
// // Escribo a log
|
|
982
|
-
// logger.info('Snapshot generado exitosamente (' + fileDest + ')');
|
|
983
|
-
|
|
984
|
-
// // Resuelvo con el estado completo del proceso
|
|
985
|
-
// resolve(navigationCompleted && snapshotCompleted && closeCompleted);
|
|
986
|
-
// }
|
|
987
|
-
// ).catch(
|
|
988
|
-
// err => {
|
|
989
|
-
// // Obtengo mensajes de error
|
|
990
|
-
// let errorMsg: string = (typeof err === 'string' ? err : err.message || err.description || '');
|
|
991
|
-
|
|
992
|
-
// // Escribo a log
|
|
993
|
-
// logger.error('Error al generar snapshot (' + fileDest + '): ' + errorMsg);
|
|
994
|
-
|
|
995
|
-
// // Verifico una ultima vez si el close no se hizo
|
|
996
|
-
// if (browser && !closeCompleted) browser.close();
|
|
997
|
-
|
|
998
|
-
// // Algo fallo, devuelvo false
|
|
999
|
-
// resolve(false);
|
|
1000
|
-
// }
|
|
1001
|
-
// );
|
|
1002
|
-
// });
|
|
1003
|
-
// }
|
|
1004
|
-
|
|
1005
|
-
export function JoinPath(route: string, fileName: string): string {
|
|
1006
|
-
return path.join(route, fileName);
|
|
1007
|
-
}
|