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)