diff --git a/media-store/app/.env.development b/media-store/app/.env.development deleted file mode 100644 index f89b5dcd..00000000 --- a/media-store/app/.env.development +++ /dev/null @@ -1 +0,0 @@ -API=http://localhost:4004/ \ No newline at end of file diff --git a/media-store/app/src/api-service.js b/media-store/app/src/api-service.js index ea188deb..532afe9a 100644 --- a/media-store/app/src/api-service.js +++ b/media-store/app/src/api-service.js @@ -3,7 +3,8 @@ import axios from "axios"; // in dev mode using provided api // in prod mode using proxy -const API = process.env.API || "api/"; +const API = + process.env.NODE_ENV === "development" ? "http://localhost:4004/" : "api/"; const BROWSE_TRACKS_SERVICE = `${API}browse-tracks`; const INVOICES_SERVICE = `${API}browse-invoices`; diff --git a/media-store/app/src/pages/login/Login.js b/media-store/app/src/pages/login/Login.js index 13dbf307..20eb28b5 100644 --- a/media-store/app/src/pages/login/Login.js +++ b/media-store/app/src/pages/login/Login.js @@ -5,8 +5,6 @@ import { useHistory } from "react-router-dom"; import { useGlobals } from "../../GlobalContext"; import { useErrors } from "../../useErrors"; -const USER_SERVICE = "http://localhost:4004/users"; - const layout = { labelCol: { span: 8, diff --git a/media-store/app/src/pages/manage-store/AddAlbumForm.js b/media-store/app/src/pages/manage-store/AddAlbumForm.js index 0e0494ca..2e2810aa 100644 --- a/media-store/app/src/pages/manage-store/AddAlbumForm.js +++ b/media-store/app/src/pages/manage-store/AddAlbumForm.js @@ -1,6 +1,6 @@ import React, { useEffect } from "react"; import { Form, Input, Select } from "antd"; -// import { useSearch } from "@umijs/hooks"; +import { useSearch } from "@umijs/hooks"; import { useErrors } from "../../useErrors"; import { fetchArtistsByName } from "../../api-service"; @@ -20,16 +20,16 @@ const getArtists = function (value) { const AddAlbumForm = () => { const { handleError } = useErrors(); - // const { - // data: artists, - // loading: isArtistsLoading, - // onChange: onChangeArtistInput, - // cancel: onArtistCancel, - // } = useSearch(getArtists.bind({ handleError })); + const { + data: artists, + loading: isArtistsLoading, + onChange: onChangeArtistInput, + cancel: onArtistCancel, + } = useSearch(getArtists.bind({ handleError })); - // useEffect(() => { - // onChangeArtistInput(); - // }, []); + useEffect(() => { + onChangeArtistInput(); + }, []); return ( <> @@ -38,7 +38,7 @@ const AddAlbumForm = () => { - {/* */} + ); diff --git a/media-store/app/src/pages/person/MyInvoices.js b/media-store/app/src/pages/person/MyInvoices.js index 6a1719f5..a696d2cc 100644 --- a/media-store/app/src/pages/person/MyInvoices.js +++ b/media-store/app/src/pages/person/MyInvoices.js @@ -24,6 +24,7 @@ const INVOICE_STATUS = { }; const CANCELLED_STATUS = -1; const DATE_TIME_FORMAT_PATTERN = "LLLL"; +const UTC_DATE_TIME_FORMAT = "YYYY-MM-DDThh:mm:ss"; const INVOICE_ITEMS_COLUMNS = [ { title: "Track name", @@ -45,16 +46,16 @@ const INVOICE_ITEMS_COLUMNS = [ const LEVERAGE_DURATION = 1; // in hours const STATUSES = { submitted: 1, shipped: 2, canceled: -1 }; -const isLeverageTimeExpired = (invoiceDate) => { +const isLeverageTimeExpired = (utcNowTimestamp, invoiceDate) => { const duration = moment.duration( - moment(moment().utc().format()).diff(invoiceDate) + moment(utcNowTimestamp).diff(moment(invoiceDate).valueOf()) ); return duration.asHours() > LEVERAGE_DURATION; }; -const chooseStatus = (invoiceDate, statusFromDb) => { +const chooseStatus = (utcNowTimestamp, invoiceDate, statusFromDb) => { if ( - isLeverageTimeExpired(invoiceDate) && + isLeverageTimeExpired(utcNowTimestamp, invoiceDate) && statusFromDb !== STATUSES.canceled ) { return INVOICE_STATUS[STATUSES.shipped]; @@ -67,7 +68,13 @@ const ExtraHeader = ({ ID, invoiceDate, status: initialStatus }) => { const { handleError } = useErrors(); const [loadingHeaderId, setLoadingHeaderId] = useState(); const [status, setStatus] = useState(initialStatus); - const statusConfig = chooseStatus(invoiceDate, status); + + const statusConfig = useMemo(() => { + const utcNowTimestamp = moment( + moment().utc().format(UTC_DATE_TIME_FORMAT) + ).valueOf(); + return chooseStatus(utcNowTimestamp, invoiceDate, status); + }, [status]); const onCancelInvoice = (event, ID) => { event.stopPropagation(); diff --git a/media-store/app/src/pages/tracks/Track.js b/media-store/app/src/pages/tracks/Track.js index c71a9fb5..9d9ef94e 100644 --- a/media-store/app/src/pages/tracks/Track.js +++ b/media-store/app/src/pages/tracks/Track.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useRef } from "react"; import { Card, Button } from "antd"; import { PlusOutlined, MinusOutlined } from "@ant-design/icons"; import { useGlobals } from "../../GlobalContext"; diff --git a/media-store/srv/browse-invoices-service.js b/media-store/srv/browse-invoices-service.js index 756f6821..b17411b2 100644 --- a/media-store/srv/browse-invoices-service.js +++ b/media-store/srv/browse-invoices-service.js @@ -3,11 +3,12 @@ const moment = require("moment"); const LEVERAGE_DURATION = 1; // in hours. should be the same in the frontend const CANCEL_STATUS = -1; +const UTC_DATE_TIME_FORMAT = "YYYY-MM-DDThh:mm:ss"; // the same function there is in the frontend -const isLeverageTimeExpired = (invoiceDate) => { +const isLeverageTimeExpired = (utcNowTimestamp, invoiceDate) => { const duration = moment.duration( - moment(moment().utc().format()).diff(invoiceDate) + moment(utcNowTimestamp).diff(moment(invoiceDate).valueOf()) ); return duration.asHours() > LEVERAGE_DURATION; }; @@ -23,33 +24,27 @@ module.exports = async function () { this.on("invoice", async (req) => { const { tracks } = req.data; const customerId = req.user.attr.ID; - const invoiceDate = moment().utc().valueOf(); const total = tracks.reduce( (acc, { unitPrice }) => acc + Number(unitPrice), 0 ); - - const { ID: lastInvoiceItemId } = await db.run( - SELECT.one(InvoiceItems).columns("ID").orderBy({ ID: "desc" }) - ); - const { ID: lastInvoiceId } = await db.run( - SELECT.one(Invoices).columns("ID").orderBy({ ID: "desc" }) - ); + const utcNowDateTime = moment().utc().format(UTC_DATE_TIME_FORMAT); const transaction = await db.tx(req); - await transaction.run( + const { + results: [{ lastID: invoiceID }], + } = await transaction.run( INSERT.into(Invoices) - .columns("ID", "customer_ID", "total", "invoiceDate") - .values(lastInvoiceId + 1, customerId, total, invoiceDate) + .columns("customer_ID", "total", "invoiceDate") + .values(customerId, total, utcNowDateTime) ); await transaction.run( INSERT.into(InvoiceItems) - .columns("ID", "invoice_ID", "track_ID", "unitPrice") + .columns("invoice_ID", "track_ID", "unitPrice") .rows( - tracks.map(({ ID, unitPrice }, index) => [ - lastInvoiceItemId + (index + 1), - lastInvoiceId + 1, - ID, + tracks.map(({ ID: trackID, unitPrice }) => [ + invoiceID, + trackID, unitPrice, ]) ) @@ -59,6 +54,7 @@ module.exports = async function () { this.on("cancelInvoice", async (req) => { const { ID } = req.data; + const currentInvoice = await db.run( SELECT.one(Invoices) .where({ @@ -74,7 +70,10 @@ module.exports = async function () { ); } - if (isLeverageTimeExpired(currentInvoice.invoiceDate)) { + const utcNowTimestamp = moment( + moment().utc().format(UTC_DATE_TIME_FORMAT) + ).valueOf(); + if (isLeverageTimeExpired(utcNowTimestamp, currentInvoice.invoiceDate)) { req.reject(400, "Leverage time was expired"); } diff --git a/media-store/srv/user-service.js b/media-store/srv/user-service.js index ce0e06ce..2196f9d4 100644 --- a/media-store/srv/user-service.js +++ b/media-store/srv/user-service.js @@ -28,9 +28,9 @@ module.exports = async function () { } const userEqualPassword = await new Promise((resolve, reject) => bcrypt.compare(password, userFromDb.password, (err, res) => { - if (err) { + if (err || res === false) { reject(err); - } else if (res) { + } else { resolve(res); } })