diff --git a/actions/questionnaireActions.js b/actions/questionnaireActions.js
index e3d98cd..f12de2b 100644
--- a/actions/questionnaireActions.js
+++ b/actions/questionnaireActions.js
@@ -4,6 +4,7 @@ import Router from 'next/router';
import moment from 'moment';
import { nSQL } from "@nano-sql/core";
import fileDownload from 'js-file-download';
+import { eachSeries, each } from "async";
import * as actionTypes from '../constants/actionTypes';
@@ -63,6 +64,35 @@ export const updateQuestionnaire = ({ dispatch, questionnaire }) =>
});
}
+export const uploadAttachmentFile = (file) =>
+{
+ console.log("ACTION", "questionnaireActions", "uploadAttachmentFile()", { file });
+
+ return new Promise((resolve, reject) =>
+ {
+ let data = new FormData();
+ data.append('file', file);
+
+ axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/questionnaire/file/upload`, data,
+ {
+ headers: {
+ "Content-Type": "multipart/form-data",
+ },
+ withCredentials: true,
+ })
+ .then(async (response) =>
+ {
+ console.log("questionnaireActions", "uploadAttachmentFile()", "response.data", response.data);
+ resolve(response.data);
+ })
+ .catch((error) =>
+ {
+ console.error(error);
+ reject();
+ });
+ });
+}
+
export const downloadQuestionnaire = (download = true) =>
{
console.log("ACTION", "questionnaireActions", "downloadQuestionnaire()", );
diff --git a/components/questionnaire/forms/FilesList.js b/components/questionnaire/forms/FilesList.js
index a28b322..935544e 100644
--- a/components/questionnaire/forms/FilesList.js
+++ b/components/questionnaire/forms/FilesList.js
@@ -8,13 +8,18 @@ import numeral from "numeral";
import pluralize from 'pluralize-ru';
import { SpinnerCircular } from 'spinners-react';
import Dropzone from 'react-dropzone';
+import { each, concat, concatSeries } from 'async';
+
+import { uploadAttachmentFile } from "../../../actions";
export default class FilesList extends React.Component
{
constructor(props)
{
super(props);
- this.state = {};
+ this.state = {
+ loading: false,
+ };
}
_handle_onAddFile = (files) =>
@@ -22,7 +27,28 @@ export default class FilesList extends React.Component
console.log("_handle_onAddFile", files);
const { name, onAddFile } = this.props;
- onAddFile(name, files);
+ concatSeries(files, (file, callback) =>
+ {
+ this.setState({ loading: true }, () =>
+ {
+ uploadAttachmentFile(file)
+ .then((saved) =>
+ {
+ console.log("FilesList", "_handle_onAddFile()", { saved });
+ callback(null, [ saved ]);
+ })
+ .catch((error) =>
+ {
+ console.error(error);
+ callback(null, []);
+ });
+ });
+ }, (error, saved_files) =>
+ {
+ console.log("saved_files", saved_files);
+ onAddFile(name, saved_files);
+ this.setState({ loading: false });
+ });
}
_handle_onRemoveFile = (file_name) =>
@@ -55,6 +81,7 @@ export default class FilesList extends React.Component
render()
{
const { files, checking } = this.props;
+ const { loading } = this.state;
console.log("FilesList", "files", files);
@@ -77,6 +104,16 @@ export default class FilesList extends React.Component
)
}) }
+ { loading && (
+
+ ) }
+
{ !checking && (
this._handle_onAddFile(acceptedFiles) }>
{ ({getRootProps, getInputProps}) => (
diff --git a/components/questionnaire/forms/Form_3_Signer/index.js b/components/questionnaire/forms/Form_3_Signer/index.js
index 1a04667..f8d756f 100644
--- a/components/questionnaire/forms/Form_3_Signer/index.js
+++ b/components/questionnaire/forms/Form_3_Signer/index.js
@@ -555,6 +555,7 @@ class Form_3_Signer extends QuestionnaireForm
) }
diff --git a/pages/api/auth/phone/code.js b/pages/api/auth/phone/code.js
index d7a4ff5..0bb0c3f 100644
--- a/pages/api/auth/phone/code.js
+++ b/pages/api/auth/phone/code.js
@@ -7,8 +7,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -19,7 +18,7 @@ export default async function handler(req, res)
phone = phone.replace(/[^0-9.]/g, '');
const key = md5(`sms_code_${ phone }`);
- let existed_data = await redis.get(key);
+ let existed_data = await RedisClient.get(key);
if(existed_data !== null)
{
diff --git a/pages/api/change/phone/code.js b/pages/api/change/phone/code.js
index fc4f57f..fea12e4 100644
--- a/pages/api/change/phone/code.js
+++ b/pages/api/change/phone/code.js
@@ -8,8 +8,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -20,7 +19,7 @@ export default async function handler(req, res)
phone = phone.replace(/[^0-9.]/g, '');
const key = md5(`phone_change_sms_code_${ phone }`);
- let existed_data = await redis.get(key);
+ let existed_data = await RedisClient.get(key);
if(existed_data !== null)
{
diff --git a/pages/api/change/phone/send.js b/pages/api/change/phone/send.js
index 871e3cc..cb1ddbd 100644
--- a/pages/api/change/phone/send.js
+++ b/pages/api/change/phone/send.js
@@ -9,10 +9,9 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../../lib/cors';
+import RedisClient from '../../../../lib/RedisClient';
const SmsCenter = require('../../../../lib/SmsCenter');
-const redis = new Redis(process.env.REDIS_URL);
-
export default async function handler(req, res)
{
await cors(req, res);
@@ -23,7 +22,7 @@ export default async function handler(req, res)
for(let i = 0; i < 6; i++) { code = `${code}${Math.floor(Math.random()*10)}`; }
const key = md5(`phone_change_sms_code_${ phone }`);
- await redis.set(key, JSON.stringify({
+ await RedisClient.set(key, JSON.stringify({
email, phone, code
}), 'EX', 300);
diff --git a/pages/api/file/image.js b/pages/api/file/image.js
index f394f7b..44aa15d 100644
--- a/pages/api/file/image.js
+++ b/pages/api/file/image.js
@@ -36,13 +36,13 @@ export default async function handler(req, res)
}
catch(e)
{
- console.error(e);
+ //console.error(e);
res.status(500);
}
})
.catch((error) =>
{
- console.error(error);
+ //console.error(error);
res.status(500);
});
}
diff --git a/pages/api/questionnaire/file/upload.js b/pages/api/questionnaire/file/upload.js
new file mode 100644
index 0000000..d6eeac9
--- /dev/null
+++ b/pages/api/questionnaire/file/upload.js
@@ -0,0 +1,81 @@
+// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
+import fs from 'fs';
+import axios from 'axios';
+import { Cookies } from 'react-cookie';
+import cookie from 'cookie';
+import moment from 'moment';
+import jwt from 'jsonwebtoken';
+import Redis from 'ioredis';
+import md5 from 'md5';
+import { inspect } from 'util';
+import multer from 'multer';
+
+import { cors } from '../../../../lib/cors';
+import RedisClient from '../../../../lib/RedisClient';
+
+const storage = multer.memoryStorage();
+const upload = multer({ storage: storage });
+
+export default async function handler(req, res)
+{
+ console.log("API", "questionnaire", "get");
+ await cors(req, res);
+
+ return new Promise((resolve) =>
+ {
+ if(req.headers.cookie !== undefined)
+ {
+ const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
+
+ if(cookies.jwt !== undefined && cookies.jwt !== null)
+ {
+ var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
+ var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
+
+ upload.single("file")(req, {}, async (err) =>
+ {
+ try
+ {
+ console.log(req);
+ const { file, body } = req;
+
+ const id = md5(`${ file.buffer }`);
+ const local_filename = `${ client_jwt_decoded.acc_number }_${ id }`;
+
+ const file_payload = {
+ id: id,
+ name: file.originalname,
+ filename: local_filename,
+ };
+
+ fs.writeFileSync(`${ __dirname }/../../../../../../upload`, buffer, () =>
+ {
+ console.log("multer.upload.single", { file });
+ console.log({ file_payload });
+ res.status(200).json(file_payload);
+ resolve();
+ });
+ }
+ catch(upload_single_error)
+ {
+ console.error("upload_single_error");
+ console.error(upload_single_error);
+ res.status(500).send();
+ resolve();
+ }
+ });
+ }
+ else
+ {
+ res.status(403).send();
+ resolve();
+ }
+ }
+ });
+}
+
+export const config = {
+ api: {
+ bodyParser: false
+ }
+}
\ No newline at end of file
diff --git a/pages/api/questionnaire/save.js b/pages/api/questionnaire/save.js
new file mode 100644
index 0000000..8f435d6
--- /dev/null
+++ b/pages/api/questionnaire/save.js
@@ -0,0 +1,48 @@
+// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
+import fs from 'fs';
+import axios from 'axios';
+import { Cookies } from 'react-cookie';
+import cookie from 'cookie';
+import moment from 'moment';
+import jwt from 'jsonwebtoken';
+import Redis from 'ioredis';
+import md5 from 'md5';
+import { inspect } from 'util';
+
+import { cors } from '../../../lib/cors';
+import RedisClient from '../../../lib/RedisClient';
+
+export default async function handler(req, res)
+{
+ console.log("API", "questionnaire", "save");
+ await cors(req, res);
+
+ return new Promise(async (resolve) =>
+ {
+ if(req.headers.cookie !== undefined)
+ {
+ const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
+
+ if(cookies.jwt !== undefined && cookies.jwt !== null)
+ {
+ var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
+ var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
+
+ console.log(req.body);
+ const { questionnaire } = req.body;
+ //console.log("file", { file });
+
+ const key = md5(`questionnaire_${ client_jwt_decoded.acc_number }`);
+ await RedisClient.set(key, JSON.stringify(questionnaire));
+
+ res.status(200).send();
+ resolve();
+ }
+ else
+ {
+ res.status(403).send();
+ resolve();
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/pages/api/questionnaire/sign.js b/pages/api/questionnaire/sign.js
deleted file mode 100644
index 5354ea1..0000000
--- a/pages/api/questionnaire/sign.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
-import axios from 'axios';
-import { Cookies } from 'react-cookie';
-import cookie from 'cookie';
-import moment from 'moment';
-import jwt from 'jsonwebtoken';
-import { cors } from '../../../lib/cors';
-import { inspect } from 'util';
-
-export default async function handler(req, res)
-{
- console.log("API", "questionnaire", "get");
- console.log(req.body);
- console.log("-".repeat(50));
- await cors(req, res);
-
- if(req.headers.cookie !== undefined)
- {
- const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
-
- if(cookies.jwt !== undefined && cookies.jwt !== null)
- {
- var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
- var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
-
- res.status(200);
- }
- else
- {
- res.status(403);
- }
- }
-}
\ No newline at end of file
diff --git a/pages/api/questionnaire/upload.js b/pages/api/questionnaire/upload.js
deleted file mode 100644
index 5354ea1..0000000
--- a/pages/api/questionnaire/upload.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
-import axios from 'axios';
-import { Cookies } from 'react-cookie';
-import cookie from 'cookie';
-import moment from 'moment';
-import jwt from 'jsonwebtoken';
-import { cors } from '../../../lib/cors';
-import { inspect } from 'util';
-
-export default async function handler(req, res)
-{
- console.log("API", "questionnaire", "get");
- console.log(req.body);
- console.log("-".repeat(50));
- await cors(req, res);
-
- if(req.headers.cookie !== undefined)
- {
- const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
-
- if(cookies.jwt !== undefined && cookies.jwt !== null)
- {
- var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
- var crm_jwt = jwt.sign({ acc_number: client_jwt_decoded.acc_number }, process.env.JWT_SECRET_CRM, { noTimestamp: true });
-
- res.status(200);
- }
- else
- {
- res.status(403);
- }
- }
-}
\ No newline at end of file
diff --git a/pages/api/recovery/check.js b/pages/api/recovery/check.js
index d208e7b..fe9a4bd 100644
--- a/pages/api/recovery/check.js
+++ b/pages/api/recovery/check.js
@@ -8,8 +8,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -48,7 +47,7 @@ export default async function handler(req, res)
if(response.status === "success")
{
const key = md5(`email_code_${ email }`);
- await redis.set(key, JSON.stringify({ code }), 'EX', 300);
+ await RedisClient.set(key, JSON.stringify({ code }), 'EX', 300);
res.status(200).json({
status: "success",
diff --git a/pages/api/recovery/code.js b/pages/api/recovery/code.js
index dc44f9b..8cbe187 100644
--- a/pages/api/recovery/code.js
+++ b/pages/api/recovery/code.js
@@ -7,8 +7,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -17,7 +16,7 @@ export default async function handler(req, res)
let token = "";
const key = md5(`email_code_${ email }`);
- let existed_data = await redis.get(key);
+ let existed_data = await RedisClient.get(key);
if(existed_data !== null)
{
@@ -25,7 +24,7 @@ export default async function handler(req, res)
if(existed_data_json.code === code)
{
- await redis.set(key, JSON.stringify({ code }), 'EX', 900);
+ await RedisClient.set(key, JSON.stringify({ code }), 'EX', 900);
res.status(200).json({ status: "success" });
}
else
diff --git a/pages/api/recovery/password.js b/pages/api/recovery/password.js
index 1fe49b0..e077062 100644
--- a/pages/api/recovery/password.js
+++ b/pages/api/recovery/password.js
@@ -7,8 +7,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -17,7 +16,7 @@ export default async function handler(req, res)
let token = "";
const key = md5(`email_code_${ email }`);
- let existed_data = await redis.get(key);
+ let existed_data = await RedisClient.get(key);
if(existed_data !== null)
{
diff --git a/pages/api/support/appeals.js b/pages/api/support/appeals.js
index ecc3234..125076e 100644
--- a/pages/api/support/appeals.js
+++ b/pages/api/support/appeals.js
@@ -8,8 +8,7 @@ import Redis from 'ioredis';
import { inspect } from 'util';
import { cors } from '../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -29,7 +28,7 @@ export default async function handler(req, res)
console.log("client_jwt_decoded");
console.log(client_jwt_decoded);
- const read = await redis.keys(`${ client_jwt_decoded.acc_number }_appeal_*`);
+ const read = await RedisClient.keys(`${ client_jwt_decoded.acc_number }_appeal_*`);
console.log("API", "support", "appeals", "read", read);
try
diff --git a/pages/api/support/attachment.js b/pages/api/support/attachment.js
index 8cc9c3a..1b96dba 100644
--- a/pages/api/support/attachment.js
+++ b/pages/api/support/attachment.js
@@ -4,11 +4,12 @@ import { Cookies } from 'react-cookie';
import cookie from 'cookie';
import moment from 'moment';
import jwt from 'jsonwebtoken';
-import { cors } from '../../../lib/cors';
import { inspect } from 'util';
import FormData from 'form-data';
import multer from 'multer';
+import { cors } from '../../../lib/cors';
+
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });
@@ -17,8 +18,6 @@ export default async function handler(req, res)
console.log("API", "support", "attachment");
await cors(req, res);
- console.log("req.query", req.query);
-
return new Promise((resolve) =>
{
if(req.headers.cookie !== undefined)
@@ -83,13 +82,13 @@ export default async function handler(req, res)
}
else
{
- res.status(403);
+ res.status(403).send();
resolve();
}
}
else
{
- res.status(403);
+ res.status(403).send();
resolve();
}
});
diff --git a/pages/api/support/read.js b/pages/api/support/read.js
index f1a9f36..4d89032 100644
--- a/pages/api/support/read.js
+++ b/pages/api/support/read.js
@@ -8,8 +8,7 @@ import Redis from 'ioredis';
import md5 from 'md5';
import { cors } from '../../../lib/cors';
-
-const redis = new Redis(process.env.REDIS_URL);
+import RedisClient from '../../../lib/RedisClient';
export default async function handler(req, res)
{
@@ -36,7 +35,7 @@ export default async function handler(req, res)
const key = `${ client_jwt_decoded.acc_number }_appeal_${ appeals[i].number }_${ appeals[i].status }`;
console.log("API", "support", "read", "key", key);
- await redis.set(key, appeals[i].status);
+ await RedisClient.set(key, appeals[i].status);
}
}
catch(exception)