update sendDeviceInfo (RAM-Flash SPE)
This commit is contained in:
parent
9ede38fb6f
commit
8b0d67a965
|
|
@ -19,6 +19,8 @@ export const sendDeviceInfora = async () => {
|
||||||
const memDefault = allKeyValue
|
const memDefault = allKeyValue
|
||||||
.filter((i) => i.$attributes.key === "MEMORY_DEFAULT")
|
.filter((i) => i.$attributes.key === "MEMORY_DEFAULT")
|
||||||
.map((obj) => obj.$attributes.value);
|
.map((obj) => obj.$attributes.value);
|
||||||
|
|
||||||
|
console.log(memDefault)
|
||||||
let listInformation = [];
|
let listInformation = [];
|
||||||
let dataFile = await LogDetectFile.all();
|
let dataFile = await LogDetectFile.all();
|
||||||
|
|
||||||
|
|
@ -178,7 +180,7 @@ export const sendDeviceInfora = async () => {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (PID !== "" && SN !== "") {
|
if (PID !== "" && SN !== "") {
|
||||||
const memDefaultForPID =
|
let memDefaultForPID =
|
||||||
memDefault.filter((i) =>
|
memDefault.filter((i) =>
|
||||||
PID.includes(i.split(":")[0])
|
PID.includes(i.split(":")[0])
|
||||||
)[0] !== undefined
|
)[0] !== undefined
|
||||||
|
|
@ -198,6 +200,14 @@ export const sendDeviceInfora = async () => {
|
||||||
|
|
||||||
if(mathches && stringMem[0]?.includes("CHASSIS")){
|
if(mathches && stringMem[0]?.includes("CHASSIS")){
|
||||||
console.log(mathches)
|
console.log(mathches)
|
||||||
|
memDefaultForPID =
|
||||||
|
memDefault.filter((i) =>
|
||||||
|
mathches[0].trim().includes(i.split(":")[0])
|
||||||
|
)[0] !== undefined
|
||||||
|
? memDefault.filter((i) =>
|
||||||
|
mathches[0].trim().includes(i.split(":")[0])
|
||||||
|
)[0]
|
||||||
|
: mathches[0].trim() + ":N/A:N/A";
|
||||||
PID = mathches[0].trim();
|
PID = mathches[0].trim();
|
||||||
SN = showInventoryContent.filter((i)=>i.includes(mathches[0].trim()))[0]?.split("SN:")[1]?.replace(/,/g, "").trim();
|
SN = showInventoryContent.filter((i)=>i.includes(mathches[0].trim()))[0]?.split("SN:")[1]?.replace(/,/g, "").trim();
|
||||||
VID = showInventoryContent.filter((i)=>i.includes(mathches[0].trim()))[0]?.split("VID:")[1]
|
VID = showInventoryContent.filter((i)=>i.includes(mathches[0].trim()))[0]?.split("VID:")[1]
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import { Routes, Route, Switch, useParams } from "react-router-dom";
|
||||||
import ShowLog from "./components/ShowLog/ShowLog";
|
import ShowLog from "./components/ShowLog/ShowLog";
|
||||||
import ListLog from "./components/ListLog/ListLog";
|
import ListLog from "./components/ListLog/ListLog";
|
||||||
import ScreenShot from "./components/ScreenShot/ScreenShot";
|
import ScreenShot from "./components/ScreenShot/ScreenShot";
|
||||||
|
import PrivateLog from "./pages/PrivateLog";
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="App">
|
||||||
|
|
@ -17,6 +18,7 @@ function App() {
|
||||||
<Route path="/logs/:name" element={<ShowLog />}></Route>
|
<Route path="/logs/:name" element={<ShowLog />}></Route>
|
||||||
<Route path="/logs" element={<ListLog />}></Route>
|
<Route path="/logs" element={<ListLog />}></Route>
|
||||||
<Route path="/screenShot/:name" element={<ScreenShot />}></Route>
|
<Route path="/screenShot/:name" element={<ScreenShot />}></Route>
|
||||||
|
<Route path="/private-log" element={<PrivateLog />}></Route>
|
||||||
</Routes>
|
</Routes>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@ export const addKeyValue = API + "/addValue";
|
||||||
export const editValue = API + "/editValue";
|
export const editValue = API + "/editValue";
|
||||||
export const getLog = API + "/log/showLog";
|
export const getLog = API + "/log/showLog";
|
||||||
export const getListLog = API + "/getAllLogDetect";
|
export const getListLog = API + "/getAllLogDetect";
|
||||||
|
export const listOnFolder = API + "/private-log/getFileOnFolder";
|
||||||
|
export const getContentFile = API + "/private-log/readFile";
|
||||||
|
|
@ -0,0 +1,258 @@
|
||||||
|
import axios from "axios";
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { getContentFile, listOnFolder } from "../api/apiLog";
|
||||||
|
|
||||||
|
const PrivateLog = () => {
|
||||||
|
const [listInFolderPM2, setListInFolderPM2] = useState([]);
|
||||||
|
const [listInFolderLogs, setListInFolderLogs] = useState([]);
|
||||||
|
const [listInFolderAPI, setListInFolderAPI] = useState([]);
|
||||||
|
const [pathBeforePM2, setPathBeforePM2] = useState("/home/pm2_backup");
|
||||||
|
const [pathBeforeLogs, setPathBeforeLogs] = useState("/home/logs");
|
||||||
|
const [pathBeforeAPI, setPathBeforeAPI] = useState(
|
||||||
|
"/home/Log_service/app/store/logsAPI"
|
||||||
|
);
|
||||||
|
const [searchPM2, setSearchPM2] = useState("");
|
||||||
|
const [searchLogs, setSearchLogs] = useState("");
|
||||||
|
const [searchAPI, setSearchAPI] = useState("");
|
||||||
|
const [content, setContent] = useState("");
|
||||||
|
const [choose, setChoose] = useState(1);
|
||||||
|
const [fileChoose, setFileChoose] = useState("");
|
||||||
|
|
||||||
|
const getAllInFolder = async (path, save) => {
|
||||||
|
try {
|
||||||
|
const res = await axios.post(listOnFolder, { folerPath: path });
|
||||||
|
save(res.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getContent = async (pathFile) => {
|
||||||
|
try {
|
||||||
|
const res = await axios.post(getContentFile, { filePath: pathFile });
|
||||||
|
setContent(res.data);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getAllInFolder(pathBeforePM2, setListInFolderPM2);
|
||||||
|
getAllInFolder(pathBeforeLogs, setListInFolderLogs);
|
||||||
|
getAllInFolder(pathBeforeAPI, setListInFolderAPI);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<button onClick={()=>setChoose(1)}>PM2</button>
|
||||||
|
<button onClick={()=>setChoose(2)}>API</button>
|
||||||
|
<button onClick={()=>setChoose(3)}>Logs Test</button>
|
||||||
|
<div style={{ display: "flex" }}>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: "30%",
|
||||||
|
height: "100vh",
|
||||||
|
overflow: "auto",
|
||||||
|
padding: 10,
|
||||||
|
display:choose===1?"block":"none"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 0",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
position: "fixed",
|
||||||
|
display: "flex",
|
||||||
|
backgroundColor: "white",
|
||||||
|
width: "25%",
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
getAllInFolder(pathBeforePM2, setListInFolderPM2);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
. .PM2{" "}
|
||||||
|
</div>
|
||||||
|
{listInFolderPM2.map((u) => (
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
key={u.name}
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 1vh",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
backgroundColor:fileChoose===u.name?"#ffdea9":"white"
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
if (u.type === "directory") {
|
||||||
|
setPathBeforePM2(
|
||||||
|
u.name
|
||||||
|
?.split("/")
|
||||||
|
?.slice(0, u.name.split("/").length - 1)
|
||||||
|
.join("/")
|
||||||
|
);
|
||||||
|
getAllInFolder(u.name, setListInFolderPM2);
|
||||||
|
} else {
|
||||||
|
getContent(u.name);
|
||||||
|
setFileChoose(u.name)
|
||||||
|
console.log(u);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{u.type==="file"?"f - ": "d - "}{u.name?.split("/")[u.name.split("/").length - 1]}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: "30%",
|
||||||
|
height: "100vh",
|
||||||
|
overflow: "auto",
|
||||||
|
padding: 10,
|
||||||
|
display:choose===2?"block":"none"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 0",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
position: "fixed",
|
||||||
|
display: "flex",
|
||||||
|
backgroundColor: "white",
|
||||||
|
width: "25%",
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
getAllInFolder(pathBeforeAPI, setPathBeforeAPI);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
. .API{" "}
|
||||||
|
</div>
|
||||||
|
{listInFolderAPI.map((u) => (
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
key={u.name}
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 1vh",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
backgroundColor:fileChoose===u.name?"#ffdea9":"white"
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
if (u.type === "directory") {
|
||||||
|
setPathBeforeAPI(
|
||||||
|
u.name
|
||||||
|
?.split("/")
|
||||||
|
?.slice(0, u.name.split("/").length - 1)
|
||||||
|
.join("/")
|
||||||
|
);
|
||||||
|
getAllInFolder(u.name, setPathBeforeAPI);
|
||||||
|
} else {
|
||||||
|
getContent(u.name);
|
||||||
|
setFileChoose(u.name)
|
||||||
|
console.log(u);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{u.type==="file"?"f - ": "d - "}{u.name?.split("/")[u.name.split("/").length - 1]}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
width: "30%",
|
||||||
|
height: "100vh",
|
||||||
|
overflow: "auto",
|
||||||
|
padding: 10,
|
||||||
|
display:choose===3?"block":"none"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 0",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
position: "fixed",
|
||||||
|
display: "flex",
|
||||||
|
backgroundColor: "white",
|
||||||
|
width: "25%",
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
getAllInFolder(pathBeforeLogs, setListInFolderLogs);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={{ width: "20%" }}>. .Logs</div>
|
||||||
|
<div>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
onKeyUp={(e) => {
|
||||||
|
console.log(e.target.value);
|
||||||
|
setSearchLogs(e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style={{ marginTop: "2vh" }}>
|
||||||
|
{listInFolderLogs
|
||||||
|
.filter((i) => i.name.includes(searchLogs))
|
||||||
|
.map((u) => (
|
||||||
|
<div
|
||||||
|
key={u.name}
|
||||||
|
style={{
|
||||||
|
cursor: "pointer",
|
||||||
|
margin: "1vh 1vh",
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
fontWeight: 750,
|
||||||
|
backgroundColor:fileChoose===u.name?"#ffdea9":"white"
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
if (u.type === "directory") {
|
||||||
|
setPathBeforeLogs(
|
||||||
|
u.name
|
||||||
|
?.split("/")
|
||||||
|
?.slice(0, u.name.split("/").length - 1)
|
||||||
|
.join("/")
|
||||||
|
);
|
||||||
|
getAllInFolder(u.name, setListInFolderLogs);
|
||||||
|
} else {
|
||||||
|
getContent(u.name);
|
||||||
|
setFileChoose(u.name)
|
||||||
|
console.log(u);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{u.type==="file"?"f - ": "d - "}{u.name?.split("/")[u.name.split("/").length - 1]}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<textarea
|
||||||
|
style={{
|
||||||
|
border: "solid 1px gray",
|
||||||
|
width: "70%",
|
||||||
|
height: "100vh",
|
||||||
|
color: "#70e300",
|
||||||
|
backgroundColor: "black",
|
||||||
|
fontWeight: 500,
|
||||||
|
fontSize: "0.7rem",
|
||||||
|
}}
|
||||||
|
value={content}
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PrivateLog;
|
||||||
170
start/routes.ts
170
start/routes.ts
|
|
@ -33,176 +33,6 @@ import Cache from "@ioc:Kaperskyguru/Adonis-Cache";
|
||||||
|
|
||||||
runtimeCheckLogs(Env.get("FOLDER_LOGS"));
|
runtimeCheckLogs(Env.get("FOLDER_LOGS"));
|
||||||
|
|
||||||
// setTimeout(async() => {
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// LogDetectFile.all()
|
|
||||||
// console.log("first")
|
|
||||||
// }, 2000);
|
|
||||||
|
|
||||||
//ERP get index serial number
|
|
||||||
|
|
||||||
Route.post("/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber")
|
Route.post("/api/getIndexSerialNumber", "ErpsController.getIndexSerialNumber")
|
||||||
.middleware("checkToken").middleware(
|
.middleware("checkToken").middleware(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue