diff --git a/client.mjs b/client.mjs index a05a777..f2a8b2c 100644 --- a/client.mjs +++ b/client.mjs @@ -6,7 +6,9 @@ export class Client { * @return {Promise} username * */ async getUser() { - throw new Error("Not implemented"); + return fetch('api/user').then(async res => { + return (await res.json())['username']; + }) } /** @@ -17,7 +19,12 @@ export class Client { * @return {Promise} username * */ async loginUser(username) { - throw new Error("Not implemented"); + return fetch(`api/login?username=${username}`).then(async res => { + let json = await res.json(); + let username = json['username']; + console.log("client/login: " + username) + return username; + }) } /** @@ -26,7 +33,7 @@ export class Client { * @return {void} * */ async logoutUser() { - throw new Error("Not implemented"); + await fetch('api/logout'); } /** @@ -49,8 +56,8 @@ export class Client { * @property {string} summary * @return {Promise} * */ - async getInfo() { - throw new Error("Not implemented"); + async getInfo() { //let response = + return (await fetch('https://api.spacexdata.com/v3/info')).json(); } /** @@ -63,7 +70,7 @@ export class Client { * @return {Promise} * */ async getHistory() { - throw new Error("Not implemented"); + return (await fetch('https://api.spacexdata.com/v3/history')).json(); } /** @@ -80,7 +87,7 @@ export class Client { * @return {Promise} * */ async getHistoryEvent(id) { - throw new Error("Not implemented"); + return (await fetch(`https://api.spacexdata.com/v3/history/${id}`)).json(); } /** @@ -93,7 +100,7 @@ export class Client { * @return {Promise} * */ async getRockets() { - throw new Error("Not implemented"); + return (await fetch('https://api.spacexdata.com/v3/rockets')).json(); } /** @@ -118,7 +125,7 @@ export class Client { * @return {Promise} * */ async getRocket(id) { - throw new Error("Not implemented"); + return (await fetch(`https://api.spacexdata.com/v3/rocket/${id}`)).json(); } /** @@ -135,7 +142,7 @@ export class Client { * @return {Promise} * */ async getRoadster() { - throw new Error("Not implemented"); + return (await fetch('https://api.spacexdata.com/v3/roadster')).json(); } /** @@ -152,7 +159,7 @@ export class Client { * @return {Promise} * */ async getSentToMars() { - throw new Error("Not implemented"); + throw new Error("Not implemented"); } /** @@ -170,7 +177,7 @@ export class Client { * @return {Promise} * */ async sendToMars(item) { - throw new Error("Not implemented"); + throw new Error("Not implemented"); } /** @@ -181,6 +188,6 @@ export class Client { * @return {Promise} * */ async cancelSendingToMars(item) { - throw new Error("Not implemented"); + throw new Error("Not implemented"); } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 87f8931..462df9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,52 +31,17 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -322,12 +287,19 @@ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "requires": { - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } } }, "cookie-signature": { @@ -335,6 +307,22 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -517,9 +505,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -611,9 +599,9 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "ipaddr.js": { "version": "1.9.1", @@ -698,6 +686,14 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, "keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -846,9 +842,9 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "object-assign": { "version": "4.1.1", @@ -1161,6 +1157,11 @@ "nopt": "~1.0.10" } }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", diff --git a/package.json b/package.json index 42f1001..372b49c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ }, "dependencies": { "body-parser": "^1.19.0", - "cookie-parser": "^1.4.5", + "cookie-parser": "^1.4.6", + "cookies": "^0.8.0", "express": "^4.17.1", "node-fetch": "^2.6.1", "nodemon": "^2.0.6" diff --git a/server.mjs b/server.mjs index 75d9cbe..4b45cd2 100644 --- a/server.mjs +++ b/server.mjs @@ -10,6 +10,20 @@ const rootDir = process.cwd(); const port = 3000; const app = express(); +app.use(express.static('spa/build')); //1 +app.use(cookieParser()); //5 +app.use(bodyParser.json()); + +//7 +app.use((req, res, next) => { + const cancelRedirect = ['api', 'static', 'login', 'client.mjs']; + const route = req.url.split("/")[1]; + + if (!req.cookies.username && !cancelRedirect.includes(route)) + res.redirect("/login"); + else next(); +}); + app.get("/client.mjs", (_, res) => { res.header("Cache-Control", "private, no-cache, no-store, must-revalidate"); res.sendFile(path.join(rootDir, "client.mjs"), { @@ -18,10 +32,46 @@ app.get("/client.mjs", (_, res) => { }); }); +app.get('', (req, res) => { + res.sendFile(path.join(rootDir, "spa/build/index.html")); +}); + app.get("/", (_, res) => { res.send(":)"); }); -app.listen(port, () => { - console.log(`App listening on port ${port}`); +app.get("/api/login", (req,res)=>{ + console.log("api/login: start" ); + let username = req.query.username; + console.log("api/login: " + username); + res.cookie('username', username); + res.json({'username':username}); +}); + +app.get("/api/user", (req, res) => { + let username = req.cookies.username; + console.log("api/user: " + username); + res.json({'username':username}); +}); + +app.get("/api/logout", (req, res)=>{ + console.log('api/logout: start'); + res.clearCookie('username'); + res.redirect('/'); +}) + +app.get('/*', (req, res) => { + res.redirect('/'); }); + + +//3 task +https.createServer( + { + key: fs.readFileSync("certs/server.key"), + cert: fs.readFileSync("certs/server.cert"), + }, + app +).listen(port, function () { + console.log(`Я работаю на ${port}`); +}); \ No newline at end of file