유명현

Merge branch 'feature/line-bot-v3' into 'main'

Feature/line bot v3

다음과 같은 기능이 구현되었습니다.
- DB에 유저-키워드 등록
- node-schedule을 이용해 1시간에 한번, 등록된 매물을 유저에게 carousel message로 알림

See merge request !19
...@@ -10,12 +10,6 @@ sequelize ...@@ -10,12 +10,6 @@ sequelize
10 .sync({ force: false }) 10 .sync({ force: false })
11 .then(() => { 11 .then(() => {
12 console.log("database connection complete"); 12 console.log("database connection complete");
13 - database.addKeyword("rtx3060", "junseok");
14 - database.getKeywordsByUserId("junseok");
15 - database.deleteKeyword("phobyjun", "rtx3080");
16 - database.getAllUsers();
17 - database.getUsersByKeyword("rtx3060");
18 - database.getAllKeywords();
19 }) 13 })
20 .catch((err) => { 14 .catch((err) => {
21 console.log("database connection failed"); 15 console.log("database connection failed");
......
1 +const { marketMultiSearch } = require("../search/marketSearch");
2 +const setCarouselMessage = require("../message/setCarouselMessage");
3 +// Database APIs
4 +const db = require("../../apis/database");
5 +// API List
6 +// database.addKeyword = async function(keyword, userId)
7 +// database.deleteKeyword = async function(userId, keyword)
8 +// database.getKeywordsByUserId = async function(userId)
9 +// database.getUsersByKeyword = async function(keyword)
10 +// database.getAllUsers = async function()
11 +// database.getAllKeywords = async function()
12 +
13 +const checkMamul = (client) => {
14 + db.getAllKeywords().then((keywords) => {
15 + for (let i = 0, pending = Promise.resolve(); i < keywords.length; i++) {
16 + pending = db.getUsersByKeyword(keywords[i]).then((userIds) => {
17 + marketMultiSearch(keywords[i]).then((res) => {
18 + client.multicast(userIds, [setCarouselMessage(res)]);
19 + });
20 + });
21 + }
22 + });
23 +};
24 +
25 +module.exports = { checkMamul };
1 +// Line chatbot + Message generate functions
1 const line = require("@line/bot-sdk"); 2 const line = require("@line/bot-sdk");
2 const setFlexMessage = require("./message/setFlexMessage"); 3 const setFlexMessage = require("./message/setFlexMessage");
3 const setCarouselMessage = require("./message/setCarouselMessage"); 4 const setCarouselMessage = require("./message/setCarouselMessage");
4 -const fs = require("fs"); 5 +
6 +// Market Search
5 const { daangnSingleSearch } = require("./search/daangnSearch"); 7 const { daangnSingleSearch } = require("./search/daangnSearch");
6 const { daangnMultiSearch } = require("./search/daangnSearch"); 8 const { daangnMultiSearch } = require("./search/daangnSearch");
7 const { joongnaSingleSearch } = require("./search/joongnaSearch"); 9 const { joongnaSingleSearch } = require("./search/joongnaSearch");
...@@ -10,12 +12,36 @@ const { bunjangSingleSearch } = require("./search/bunjangSearch"); ...@@ -10,12 +12,36 @@ const { bunjangSingleSearch } = require("./search/bunjangSearch");
10 const { bunjangMultiSearch } = require("./search/bunjangSearch"); 12 const { bunjangMultiSearch } = require("./search/bunjangSearch");
11 const { marketMultiSearch } = require("./search/marketSearch"); 13 const { marketMultiSearch } = require("./search/marketSearch");
12 14
15 +// File search - Will be deleted (Unused)
16 +const fs = require("fs");
17 +
18 +// Cron for Mamul Notification
19 +const schedule = require("node-schedule");
20 +const job = schedule.scheduleJob("0 */1 * * *", () => {
21 + checkMamul(client);
22 +});
23 +
24 +// Database APIs
25 +const db = require("../apis/database");
26 +// API List
27 +// database.addKeyword = async function(keyword, userId)
28 +// database.deleteKeyword = async function(userId, keyword)
29 +// database.getKeywordsByUserId = async function(userId)
30 +// database.getUsersByKeyword = async function(keyword)
31 +// database.getAllUsers = async function()
32 +// database.getAllKeywords = async function()
33 +
34 +// Import credentials for Line chatbot
13 require("dotenv").config({ path: __dirname + "/../.env" }); 35 require("dotenv").config({ path: __dirname + "/../.env" });
14 const config = { 36 const config = {
15 channelAccessToken: process.env.channelAccessToken, 37 channelAccessToken: process.env.channelAccessToken,
16 channelSecret: process.env.channelSecret, 38 channelSecret: process.env.channelSecret,
17 }; 39 };
18 40
41 +// Cron for Mamul Notification
42 +const { checkMamul } = require("./checkMamul/checkMamul");
43 +
44 +// Line chat bot client & event
19 const client = new line.Client(config); 45 const client = new line.Client(config);
20 46
21 let waitNewMamulList = []; // 매물 키워드 입력 기다리는 목록 47 let waitNewMamulList = []; // 매물 키워드 입력 기다리는 목록
...@@ -28,7 +54,7 @@ function handleEvent(event) { ...@@ -28,7 +54,7 @@ function handleEvent(event) {
28 var found = waitNewMamulList.indexOf(event.source.userId); 54 var found = waitNewMamulList.indexOf(event.source.userId);
29 if (found == -1) { 55 if (found == -1) {
30 waitNewMamulList.push(event.source.userId); 56 waitNewMamulList.push(event.source.userId);
31 - console.log(waitNewMamulList); 57 + console.log(`waitNewMamulList Changed : ${waitNewMamulList}`);
32 return Promise.resolve( 58 return Promise.resolve(
33 client.replyMessage(event.replyToken, { 59 client.replyMessage(event.replyToken, {
34 type: "text", 60 type: "text",
...@@ -54,7 +80,7 @@ function handleEvent(event) { ...@@ -54,7 +80,7 @@ function handleEvent(event) {
54 "1000000", 80 "1000000",
55 "https://dnvefa72aowie.cloudfront.net/origin/article/202205/94cdd237258671d5806a70f64ab2b3c7dcd790da0384b394ef5809fe10c08ced.webp?q=95&s=1440x1440&t=inside", 81 "https://dnvefa72aowie.cloudfront.net/origin/article/202205/94cdd237258671d5806a70f64ab2b3c7dcd790da0384b394ef5809fe10c08ced.webp?q=95&s=1440x1440&t=inside",
56 "https://www.daangn.com/articles/403755360", 82 "https://www.daangn.com/articles/403755360",
57 - "test설명" 83 + "채굴X, 흡연X, 반려동물X 입니다.\n직거래 희망하며, 쿨거래시 네고 1만원 가능합니다."
58 ), 84 ),
59 }) 85 })
60 ); 86 );
...@@ -75,9 +101,13 @@ function handleEvent(event) { ...@@ -75,9 +101,13 @@ function handleEvent(event) {
75 waitNewMamulList.splice(found, 1); 101 waitNewMamulList.splice(found, 1);
76 console.log(waitNewMamulList[found]); 102 console.log(waitNewMamulList[found]);
77 return Promise.resolve( 103 return Promise.resolve(
104 + db.addKeyword(event.message.text, event.source.userId),
78 client.replyMessage(event.replyToken, { 105 client.replyMessage(event.replyToken, {
79 type: "text", 106 type: "text",
80 - text: "매물이 등록되었습니다!\n등록된 매물: " + event.message.text, 107 + text: `매물이 등록되었습니다!\n등록된 매물: ${event.message.text}`,
108 + }),
109 + marketMultiSearch(event.message.text).then((res) => {
110 + client.pushMessage(event.source.userId, setCarouselMessage(res));
81 }) 111 })
82 ); 112 );
83 } 113 }
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
14 "dotenv": "^16.0.1", 14 "dotenv": "^16.0.1",
15 "express": "^4.18.1", 15 "express": "^4.18.1",
16 "mysql2": "^2.3.3", 16 "mysql2": "^2.3.3",
17 + "node-schedule": "^2.1.0",
17 "nodemon": "^2.0.16", 18 "nodemon": "^2.0.16",
18 "sequelize": "^6.20.0" 19 "sequelize": "^6.20.0"
19 } 20 }
...@@ -508,6 +509,18 @@ ...@@ -508,6 +509,18 @@
508 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 509 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
509 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 510 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
510 }, 511 },
512 + "node_modules/cron-parser": {
513 + "version": "3.5.0",
514 + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-3.5.0.tgz",
515 + "integrity": "sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==",
516 + "dependencies": {
517 + "is-nan": "^1.3.2",
518 + "luxon": "^1.26.0"
519 + },
520 + "engines": {
521 + "node": ">=0.8"
522 + }
523 + },
511 "node_modules/crypto-random-string": { 524 "node_modules/crypto-random-string": {
512 "version": "2.0.0", 525 "version": "2.0.0",
513 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 526 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
...@@ -548,6 +561,21 @@ ...@@ -548,6 +561,21 @@
548 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 561 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
549 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 562 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
550 }, 563 },
564 + "node_modules/define-properties": {
565 + "version": "1.1.4",
566 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
567 + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
568 + "dependencies": {
569 + "has-property-descriptors": "^1.0.0",
570 + "object-keys": "^1.1.1"
571 + },
572 + "engines": {
573 + "node": ">= 0.4"
574 + },
575 + "funding": {
576 + "url": "https://github.com/sponsors/ljharb"
577 + }
578 + },
551 "node_modules/delayed-stream": { 579 "node_modules/delayed-stream": {
552 "version": "1.0.0", 580 "version": "1.0.0",
553 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 581 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
...@@ -911,6 +939,17 @@ ...@@ -911,6 +939,17 @@
911 "node": ">=4" 939 "node": ">=4"
912 } 940 }
913 }, 941 },
942 + "node_modules/has-property-descriptors": {
943 + "version": "1.0.0",
944 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
945 + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
946 + "dependencies": {
947 + "get-intrinsic": "^1.1.1"
948 + },
949 + "funding": {
950 + "url": "https://github.com/sponsors/ljharb"
951 + }
952 + },
914 "node_modules/has-symbols": { 953 "node_modules/has-symbols": {
915 "version": "1.0.3", 954 "version": "1.0.3",
916 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 955 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
...@@ -1094,6 +1133,21 @@ ...@@ -1094,6 +1133,21 @@
1094 "url": "https://github.com/sponsors/sindresorhus" 1133 "url": "https://github.com/sponsors/sindresorhus"
1095 } 1134 }
1096 }, 1135 },
1136 + "node_modules/is-nan": {
1137 + "version": "1.3.2",
1138 + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
1139 + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
1140 + "dependencies": {
1141 + "call-bind": "^1.0.0",
1142 + "define-properties": "^1.1.3"
1143 + },
1144 + "engines": {
1145 + "node": ">= 0.4"
1146 + },
1147 + "funding": {
1148 + "url": "https://github.com/sponsors/ljharb"
1149 + }
1150 + },
1097 "node_modules/is-npm": { 1151 "node_modules/is-npm": {
1098 "version": "5.0.0", 1152 "version": "5.0.0",
1099 "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", 1153 "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
...@@ -1178,6 +1232,11 @@ ...@@ -1178,6 +1232,11 @@
1178 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1232 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1179 "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1233 "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
1180 }, 1234 },
1235 + "node_modules/long-timeout": {
1236 + "version": "0.1.1",
1237 + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz",
1238 + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ="
1239 + },
1181 "node_modules/lowercase-keys": { 1240 "node_modules/lowercase-keys": {
1182 "version": "1.0.1", 1241 "version": "1.0.1",
1183 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1242 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
...@@ -1197,6 +1256,14 @@ ...@@ -1197,6 +1256,14 @@
1197 "node": ">=10" 1256 "node": ">=10"
1198 } 1257 }
1199 }, 1258 },
1259 + "node_modules/luxon": {
1260 + "version": "1.28.0",
1261 + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
1262 + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==",
1263 + "engines": {
1264 + "node": "*"
1265 + }
1266 + },
1200 "node_modules/make-dir": { 1267 "node_modules/make-dir": {
1201 "version": "3.1.0", 1268 "version": "3.1.0",
1202 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1269 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
...@@ -1380,6 +1447,19 @@ ...@@ -1380,6 +1447,19 @@
1380 "node": ">= 0.6" 1447 "node": ">= 0.6"
1381 } 1448 }
1382 }, 1449 },
1450 + "node_modules/node-schedule": {
1451 + "version": "2.1.0",
1452 + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.0.tgz",
1453 + "integrity": "sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==",
1454 + "dependencies": {
1455 + "cron-parser": "^3.5.0",
1456 + "long-timeout": "0.1.1",
1457 + "sorted-array-functions": "^1.3.0"
1458 + },
1459 + "engines": {
1460 + "node": ">=6"
1461 + }
1462 + },
1383 "node_modules/nodemon": { 1463 "node_modules/nodemon": {
1384 "version": "2.0.16", 1464 "version": "2.0.16",
1385 "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", 1465 "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz",
...@@ -1459,6 +1539,14 @@ ...@@ -1459,6 +1539,14 @@
1459 "url": "https://github.com/sponsors/ljharb" 1539 "url": "https://github.com/sponsors/ljharb"
1460 } 1540 }
1461 }, 1541 },
1542 + "node_modules/object-keys": {
1543 + "version": "1.1.1",
1544 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1545 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1546 + "engines": {
1547 + "node": ">= 0.4"
1548 + }
1549 + },
1462 "node_modules/on-finished": { 1550 "node_modules/on-finished": {
1463 "version": "2.4.1", 1551 "version": "2.4.1",
1464 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1552 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
...@@ -1927,6 +2015,11 @@ ...@@ -1927,6 +2015,11 @@
1927 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2015 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1928 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 2016 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
1929 }, 2017 },
2018 + "node_modules/sorted-array-functions": {
2019 + "version": "1.3.0",
2020 + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
2021 + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="
2022 + },
1930 "node_modules/sqlstring": { 2023 "node_modules/sqlstring": {
1931 "version": "2.3.3", 2024 "version": "2.3.3",
1932 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", 2025 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
...@@ -2655,6 +2748,15 @@ ...@@ -2655,6 +2748,15 @@
2655 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 2748 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
2656 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 2749 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
2657 }, 2750 },
2751 + "cron-parser": {
2752 + "version": "3.5.0",
2753 + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-3.5.0.tgz",
2754 + "integrity": "sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==",
2755 + "requires": {
2756 + "is-nan": "^1.3.2",
2757 + "luxon": "^1.26.0"
2758 + }
2759 + },
2658 "crypto-random-string": { 2760 "crypto-random-string": {
2659 "version": "2.0.0", 2761 "version": "2.0.0",
2660 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 2762 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
...@@ -2686,6 +2788,15 @@ ...@@ -2686,6 +2788,15 @@
2686 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 2788 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
2687 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 2789 "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
2688 }, 2790 },
2791 + "define-properties": {
2792 + "version": "1.1.4",
2793 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
2794 + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
2795 + "requires": {
2796 + "has-property-descriptors": "^1.0.0",
2797 + "object-keys": "^1.1.1"
2798 + }
2799 + },
2689 "delayed-stream": { 2800 "delayed-stream": {
2690 "version": "1.0.0", 2801 "version": "1.0.0",
2691 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 2802 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
...@@ -2952,6 +3063,14 @@ ...@@ -2952,6 +3063,14 @@
2952 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3063 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2953 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 3064 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
2954 }, 3065 },
3066 + "has-property-descriptors": {
3067 + "version": "1.0.0",
3068 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
3069 + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
3070 + "requires": {
3071 + "get-intrinsic": "^1.1.1"
3072 + }
3073 + },
2955 "has-symbols": { 3074 "has-symbols": {
2956 "version": "1.0.3", 3075 "version": "1.0.3",
2957 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 3076 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
...@@ -3070,6 +3189,15 @@ ...@@ -3070,6 +3189,15 @@
3070 "is-path-inside": "^3.0.2" 3189 "is-path-inside": "^3.0.2"
3071 } 3190 }
3072 }, 3191 },
3192 + "is-nan": {
3193 + "version": "1.3.2",
3194 + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
3195 + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
3196 + "requires": {
3197 + "call-bind": "^1.0.0",
3198 + "define-properties": "^1.1.3"
3199 + }
3200 + },
3073 "is-npm": { 3201 "is-npm": {
3074 "version": "5.0.0", 3202 "version": "5.0.0",
3075 "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", 3203 "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
...@@ -3136,6 +3264,11 @@ ...@@ -3136,6 +3264,11 @@
3136 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 3264 "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
3137 "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 3265 "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
3138 }, 3266 },
3267 + "long-timeout": {
3268 + "version": "0.1.1",
3269 + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz",
3270 + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ="
3271 + },
3139 "lowercase-keys": { 3272 "lowercase-keys": {
3140 "version": "1.0.1", 3273 "version": "1.0.1",
3141 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 3274 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
...@@ -3149,6 +3282,11 @@ ...@@ -3149,6 +3282,11 @@
3149 "yallist": "^4.0.0" 3282 "yallist": "^4.0.0"
3150 } 3283 }
3151 }, 3284 },
3285 + "luxon": {
3286 + "version": "1.28.0",
3287 + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
3288 + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ=="
3289 + },
3152 "make-dir": { 3290 "make-dir": {
3153 "version": "3.1.0", 3291 "version": "3.1.0",
3154 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 3292 "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
...@@ -3287,6 +3425,16 @@ ...@@ -3287,6 +3425,16 @@
3287 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 3425 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
3288 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 3426 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
3289 }, 3427 },
3428 + "node-schedule": {
3429 + "version": "2.1.0",
3430 + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.0.tgz",
3431 + "integrity": "sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==",
3432 + "requires": {
3433 + "cron-parser": "^3.5.0",
3434 + "long-timeout": "0.1.1",
3435 + "sorted-array-functions": "^1.3.0"
3436 + }
3437 + },
3290 "nodemon": { 3438 "nodemon": {
3291 "version": "2.0.16", 3439 "version": "2.0.16",
3292 "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz", 3440 "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.16.tgz",
...@@ -3342,6 +3490,11 @@ ...@@ -3342,6 +3490,11 @@
3342 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", 3490 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
3343 "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" 3491 "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
3344 }, 3492 },
3493 + "object-keys": {
3494 + "version": "1.1.1",
3495 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
3496 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
3497 + },
3345 "on-finished": { 3498 "on-finished": {
3346 "version": "2.4.1", 3499 "version": "2.4.1",
3347 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 3500 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
...@@ -3675,6 +3828,11 @@ ...@@ -3675,6 +3828,11 @@
3675 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3828 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
3676 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 3829 "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
3677 }, 3830 },
3831 + "sorted-array-functions": {
3832 + "version": "1.3.0",
3833 + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
3834 + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="
3835 + },
3678 "sqlstring": { 3836 "sqlstring": {
3679 "version": "2.3.3", 3837 "version": "2.3.3",
3680 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", 3838 "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
20 "dotenv": "^16.0.1", 20 "dotenv": "^16.0.1",
21 "express": "^4.18.1", 21 "express": "^4.18.1",
22 "mysql2": "^2.3.3", 22 "mysql2": "^2.3.3",
23 + "node-schedule": "^2.1.0",
23 "nodemon": "^2.0.16", 24 "nodemon": "^2.0.16",
24 "sequelize": "^6.20.0" 25 "sequelize": "^6.20.0"
25 } 26 }
......