move redis to separate RedisClient, update for files uploading

This commit is contained in:
merelendor 2023-04-03 01:07:01 +03:00
parent 22075a959e
commit 684a6e1891
19 changed files with 269 additions and 103 deletions

View File

@ -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()", );

View File

@ -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 && (
<div className="dosc_list medium-icon" style={{ position: "relative", border: "1px dashed rgb(28, 1, 169)", width: "32%", height: "100px", borderRadius: "4px", display: "flex", alignItems: "center", justifyContent: "center", }}>
<div className="row" style={{ alignItems: "center", justifyContent: "center", display: "flex", flexDirection: "row", flex: 1, marginBottom: "0px" }}>
<div style={{ display: "flex", justifyContent: "center", alignItems: "center", }}>
<SpinnerCircular size={ 50 } thickness={ 100 } speed={ 100 } color="rgba(28, 1, 169, 1)" secondaryColor="rgba(236, 239, 244, 1)" />
</div>
</div>
</div>
) }
{ !checking && (
<Dropzone onDrop={ (acceptedFiles) => this._handle_onAddFile(acceptedFiles) }>
{ ({getRootProps, getInputProps}) => (

View File

@ -555,6 +555,7 @@ class Form_3_Signer extends QuestionnaireForm
) }
<FilesList
//group="head_person"
name="head_person_files"
files={ head_person_files }
onAddFile={ this._handle_onAddFile }
@ -663,6 +664,7 @@ class Form_3_Signer extends QuestionnaireForm
</div>
<FilesList
//group="individual_executive"
name="individual_executive_files"
files={ individual_executive_files }
onAddFile={ this._handle_onAddFile }
@ -947,6 +949,7 @@ class Form_3_Signer extends QuestionnaireForm
</div>
<FilesList
//group="signatory_person"
name="signatory_person_files"
files={ signatory_person_files }
onAddFile={ this._handle_onAddFile }

43
lib/RedisClient/index.js Normal file
View File

@ -0,0 +1,43 @@
import Redis from 'ioredis';
if(global.redis === undefined)
{
console.log("REDIS NOT SET", process.env.REDIS_URL, "\n\n\n");
global.redis = new Redis(process.env.REDIS_URL, { connectionName: process.env.REDIS_CLIENT_NAME });
}
export default class RedisClient
{
constructor()
{
console.log("REDIS CLIENT", "constructor");
}
static async get(key)
{
return await global.redis.get(key);
}
static async set(key, value, ex, lifetime)
{
console.log("REDIS CLIENT", "set", { key, value, ex, lifetime });
if(lifetime !== undefined)
{
return await global.redis.set(key, value, ex, lifetime);
}
else if (ex !== undefined)
{
return await global.redis.set(key, value, ex);
}
else
{
return await global.redis.set(key, value);
}
}
static async keys(keys)
{
return await global.redis.keys(keys);
}
//cons
}

View File

@ -8,10 +8,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);
@ -52,7 +51,7 @@ export default async function handler(req, res)
response.code = code;
const key = md5(`sms_code_${ phone }`);
await redis.set(key, JSON.stringify(response), 'EX', 300);
await RedisClient.set(key, JSON.stringify(response), 'EX', 300);
const smsResult = await SmsCenter.send(phone, code)
.then(() =>

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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);

View File

@ -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);
});
}

View File

@ -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
}
}

View File

@ -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();
}
}
});
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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",

View File

@ -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

View File

@ -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)
{

View File

@ -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

View File

@ -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();
}
});

View File

@ -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)