diff --git a/.gitignore b/.gitignore index 3f19c4d..011ea12 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ coverage # Build and package files/folders build *.sqlite -out/ \ No newline at end of file +out/ +database.svg \ No newline at end of file diff --git a/software/backend/data/categories.json b/software/backend/data/categories.json index 3ced7fd..9491af6 100644 --- a/software/backend/data/categories.json +++ b/software/backend/data/categories.json @@ -1,8 +1,24 @@ { "data": [ - { "id": 0, "icon": "mdi-chip", "name": "Electronic" }, - { "id": 1, "icon": "mdi-soccer", "name": "Sports" }, - { "id": 2, "icon": "mdi-tshirt-crew", "name": "Clothes" }, - { "id": 3, "icon": "mdi-bookshelf", "name": "Books" } + { + "id": 0, + "icon": "mdi-chip", + "name": "Electronic" + }, + { + "id": 1, + "icon": "mdi-soccer", + "name": "Sports" + }, + { + "id": 2, + "icon": "mdi-tshirt-crew", + "name": "Clothes" + }, + { + "id": 3, + "icon": "mdi-bookshelf", + "name": "Books" + } ] } \ No newline at end of file diff --git a/software/backend/data/orderItems.json b/software/backend/data/orderItems.json new file mode 100644 index 0000000..d79a094 --- /dev/null +++ b/software/backend/data/orderItems.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "id": 0, + "orderId": 0, + "productId": 0, + "quantity": 2 + }, + { + "id": 1, + "orderId": 1, + "productId": 6, + "quantity": 1 + }, + { + "id": 2, + "orderId": 2, + "productId": 3, + "quantity": 3 + }, + { + "id": 3, + "orderId": 2, + "productId": 2, + "quantity": 1 + } + ] +} \ No newline at end of file diff --git a/software/backend/data/orderedItems.json b/software/backend/data/orderedItems.json deleted file mode 100644 index df6300c..0000000 --- a/software/backend/data/orderedItems.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "data": [ - { - "orderId": 0, - "productId": 4, - "quantity": 2, - "totalPrice": 0 - } - ] -} \ No newline at end of file diff --git a/software/backend/data/orders.json b/software/backend/data/orders.json index cc44c8e..08383ea 100644 --- a/software/backend/data/orders.json +++ b/software/backend/data/orders.json @@ -1,16 +1,19 @@ { "data": [ - { "id": 0, "accountId": 0, "totalPrice": 0 }, - { "id": 1, "accountId": 1, "totalPrice": 0 }, - { "id": 2, "accountId": 1, "totalPrice": 0 }, - { "id": 3, "accountId": 2, "totalPrice": 0 }, - { "id": 4, "accountId": 2, "totalPrice": 0 }, - { "id": 5, "accountId": 3, "totalPrice": 0 }, - { "id": 6, "accountId": 3, "totalPrice": 0 }, - { "id": 7, "accountId": 3, "totalPrice": 0 }, - { "id": 8, "accountId": 4, "totalPrice": 0 }, - { "id": 9, "accountId": 5, "totalPrice": 0 }, - { "id": 10, "accountId": 6, "totalPrice": 0 }, - { "id": 11, "accountId": 6, "totalPrice": 0 } - ] + { + "id": 0, + "accountId": 0, + "totalPrice": 0 + }, + { + "id": 1, + "accountId": 3, + "totalPrice": 0 + }, + { + "id": 2, + "accountId": 3, + "totalPrice": 0 + } + ] } \ No newline at end of file diff --git a/software/backend/database.ts b/software/backend/database.ts index 5f38cdb..0123fe2 100644 --- a/software/backend/database.ts +++ b/software/backend/database.ts @@ -2,8 +2,8 @@ import { Sequelize } from "sequelize-typescript" // Models import { Category } from "./models/category.model" -import { OrderedItem } from "./models/orderedItem.model" import { Order } from "./models/order.model" +import { OrderItem } from "./models/orderItem.model" import { Product } from "./models/product.model" import { Account } from "./models/account.model" @@ -18,7 +18,7 @@ export const sequelize = new Sequelize({ username: dbUser, password: dbPassword, storage: "database.sqlite", - models: [ Category, Product, Account, Order, OrderedItem ] + models: [ Category, Product, Account, Order, OrderItem ] }) export function startDatabase() { diff --git a/software/backend/models/order.model.ts b/software/backend/models/order.model.ts index 2ed5f74..7a494d3 100644 --- a/software/backend/models/order.model.ts +++ b/software/backend/models/order.model.ts @@ -1,7 +1,6 @@ import { Table, Column, Model, BelongsTo, ForeignKey, HasMany, BelongsToMany } from 'sequelize-typescript'; import { Account } from './account.model'; -import { OrderedItem } from './orderedItem.model'; -import { Product } from './product.model'; +import { OrderItem } from './orderItem.model'; @Table export class Order extends Model { @@ -12,10 +11,11 @@ export class Order extends Model { @Column totalPrice: number + // Relations @BelongsTo(() => Account) - user: Account + account: Account - @BelongsToMany(() => Product, () => OrderedItem) - orderedItems: OrderedItem -} \ No newline at end of file + @HasMany(() => OrderItem) + orderItem: OrderItem[] +} diff --git a/software/backend/models/orderItem.model.ts b/software/backend/models/orderItem.model.ts new file mode 100644 index 0000000..02a0dce --- /dev/null +++ b/software/backend/models/orderItem.model.ts @@ -0,0 +1,25 @@ +import { Model, BelongsTo, Column, ForeignKey, HasMany, HasOne, Table } from "sequelize-typescript"; +import { Product } from "./product.model"; +import { Order } from "./order.model"; + +@Table +export class OrderItem extends Model { + @Column + @ForeignKey(() => Order) + orderId: number + + @Column + quantity: number + + @Column + @ForeignKey(() => Product) + productId: number + + + // Relations + @BelongsTo(() => Order) + order: Order + + @BelongsTo(() => Product) + product: Product +} diff --git a/software/backend/models/orderedItem.model.ts b/software/backend/models/orderedItem.model.ts deleted file mode 100644 index eae41b9..0000000 --- a/software/backend/models/orderedItem.model.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Table, Column, Model, BelongsTo, ForeignKey, HasMany } from 'sequelize-typescript'; -import { Order } from './order.model'; -import { Product } from './product.model'; - -@Table -export class OrderedItem extends Model { - @Column - @ForeignKey(() => Order) - orderId: number - - @Column - @ForeignKey(() => Product) - productId: number - - @Column - quantity: number - - @Column - totalPrice: number -} \ No newline at end of file diff --git a/software/backend/models/product.model.ts b/software/backend/models/product.model.ts index ba11600..4b91dac 100644 --- a/software/backend/models/product.model.ts +++ b/software/backend/models/product.model.ts @@ -1,7 +1,6 @@ -import { Table, Column, Model, ForeignKey, BelongsTo, BelongsToMany } from 'sequelize-typescript'; +import { Table, Column, Model, ForeignKey, BelongsTo, BelongsToMany, HasMany } from 'sequelize-typescript'; import { Category } from './category.model'; -import { OrderedItem } from './orderedItem.model'; -import { Order } from './order.model'; +import { OrderItem } from './orderItem.model'; @Table export class Product extends Model { @@ -34,6 +33,6 @@ export class Product extends Model { @BelongsTo(() => Category) category: Category - @BelongsToMany(() => Order,() => OrderedItem) - orderedItem: OrderedItem + @HasMany(() => OrderItem) + order: OrderItem } \ No newline at end of file diff --git a/software/backend/routes/order.routes.ts b/software/backend/routes/order.routes.ts index 7b89e92..dc27bb2 100644 --- a/software/backend/routes/order.routes.ts +++ b/software/backend/routes/order.routes.ts @@ -1,12 +1,18 @@ import { Router, Request, Response, NextFunction } from "express"; import { Order } from "../models/order.model"; +import { Product } from "../models/product.model"; +import { OrderItem } from "../models/orderItem.model"; export const order = Router() order.get("/", (req: Request, res: Response, next: NextFunction) => { - Order.findAll() + Order.findAll({ + where: { accountId: req.query.accountId }, + include: [ + { model: OrderItem, include: [ Product ] } + ] + }) .then(orders => { - res.json(orders) + res.send(orders) }) - .catch(next) }) \ No newline at end of file diff --git a/software/backend/routes/orderItem.routes.ts b/software/backend/routes/orderItem.routes.ts new file mode 100644 index 0000000..d37a3b4 --- /dev/null +++ b/software/backend/routes/orderItem.routes.ts @@ -0,0 +1,6 @@ +import { Product } from "../models/product.model"; +import { OrderItem } from "../models/orderItem.model"; +import { Router, Request, Response, NextFunction } from "express"; + +export const orderItem = Router() + diff --git a/software/backend/routes/orderedItem.routes.ts b/software/backend/routes/orderedItem.routes.ts deleted file mode 100644 index f1ca2f8..0000000 --- a/software/backend/routes/orderedItem.routes.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Router, Request, Response, NextFunction } from "express"; -import { OrderedItem } from "../models/orderedItem.model"; - -export const orderedItem = Router() - -orderedItem.get("/", (req: Request, res: Response, next: NextFunction) => { - OrderedItem.findAll() - .then(orderedItems => { - res.json(orderedItems) - }) - .catch(next) -}) \ No newline at end of file diff --git a/software/backend/scripts/databaseHelper.ts b/software/backend/scripts/databaseHelper.ts index 90003b1..41b254b 100644 --- a/software/backend/scripts/databaseHelper.ts +++ b/software/backend/scripts/databaseHelper.ts @@ -1,6 +1,6 @@ import { Category } from '../models/category.model' -import { OrderedItem } from '../models/orderedItem.model' import { Order } from '../models/order.model' +import { OrderItem } from '../models/orderItem.model' import { Product } from '../models/product.model' import { Account } from '../models/account.model' @@ -8,15 +8,15 @@ import categories from "./../data/categories.json" import products from "./../data/products.json" import accounts from "./../data/accounts.json" import orders from "./../data/orders.json" -import orderedItems from "./../data/orderedItems.json" +import orderItems from "./../data/orderItems.json" /** * Delete all datasets in every database table */ export function deleteAllTables() { Category.destroy({ truncate: true }) - OrderedItem.destroy({ truncate: true }) Order.destroy({ truncate: true }) + OrderItem.destroy({truncate: true }) Product.destroy({ truncate: true }) Account.destroy({ truncate: true }) } @@ -29,5 +29,5 @@ export function prepopulateDatabase() { Product.bulkCreate(products.data) Account.bulkCreate(accounts.data) Order.bulkCreate(orders.data) - OrderedItem.bulkCreate(orderedItems.data) + OrderItem.bulkCreate(orderItems.data) } \ No newline at end of file diff --git a/software/backend/server.ts b/software/backend/server.ts index 04d5252..a420b00 100644 --- a/software/backend/server.ts +++ b/software/backend/server.ts @@ -6,8 +6,8 @@ import { startDatabase } from './database' import { category } from './routes/category.routes' import { product } from './routes/product.routes' import { order } from './routes/order.routes' -import { orderedItem } from './routes/orderedItem.routes' import { account } from './routes/account.routes' +import { orderItem } from './routes/orderItem.routes' const app = express() const port = 3000 @@ -26,8 +26,8 @@ app.use("/api", api) app.use("/categories", category) app.use("/products", product) app.use("/orders", order) -app.use("/ordereditems", orderedItem) app.use("/accounts", account) +app.use("/orderItems", orderItem) // Static files const path = require('path') diff --git a/software/package-lock.json b/software/package-lock.json index 8755535..da63cf6 100644 --- a/software/package-lock.json +++ b/software/package-lock.json @@ -22,7 +22,7 @@ "sqlite3": "^5.1.7", "ts-node": "^10.9.2", "vue": "^3.4.29", - "vue-i18n": "^9.14.0", + "vue-i18n": "^10.0.0", "vue-router": "^4.4.3", "vuetify": "^3.7.1", "wait-on": "^8.0.0" @@ -521,13 +521,13 @@ } }, "node_modules/@intlify/core-base": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz", - "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.0.tgz", + "integrity": "sha512-o4d4Nve7YzU1YMR5VMqgPr8jDGTgT2pOOUtZa3JwCAhFnm40JYxfHdWToT7OEx6oJCBs/Q8HosJOhsimlF0C0Q==", "license": "MIT", "dependencies": { - "@intlify/message-compiler": "9.14.0", - "@intlify/shared": "9.14.0" + "@intlify/message-compiler": "10.0.0", + "@intlify/shared": "10.0.0" }, "engines": { "node": ">= 16" @@ -537,12 +537,12 @@ } }, "node_modules/@intlify/message-compiler": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz", - "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.0.tgz", + "integrity": "sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==", "license": "MIT", "dependencies": { - "@intlify/shared": "9.14.0", + "@intlify/shared": "10.0.0", "source-map-js": "^1.0.2" }, "engines": { @@ -553,9 +553,9 @@ } }, "node_modules/@intlify/shared": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz", - "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.0.tgz", + "integrity": "sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==", "license": "MIT", "engines": { "node": ">= 16" @@ -4696,13 +4696,13 @@ } }, "node_modules/vue-i18n": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz", - "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.0.tgz", + "integrity": "sha512-KxTfTEuZEGN5Bvgc9F49rgp94XyBFlSIszwF2SQlr3WoxOklySXdUuoVxIw5qPZthV0mJlGP8tjJR7loMJgKrQ==", "license": "MIT", "dependencies": { - "@intlify/core-base": "9.14.0", - "@intlify/shared": "9.14.0", + "@intlify/core-base": "10.0.0", + "@intlify/shared": "10.0.0", "@vue/devtools-api": "^6.5.0" }, "engines": { diff --git a/software/package.json b/software/package.json index 707cac4..a156753 100644 --- a/software/package.json +++ b/software/package.json @@ -31,7 +31,7 @@ "sqlite3": "^5.1.7", "ts-node": "^10.9.2", "vue": "^3.4.29", - "vue-i18n": "^9.14.0", + "vue-i18n": "^10.0.0", "vue-router": "^4.4.3", "vuetify": "^3.7.1", "wait-on": "^8.0.0" diff --git a/software/src/App.vue b/software/src/App.vue index ac189e9..3bd606f 100644 --- a/software/src/App.vue +++ b/software/src/App.vue @@ -4,7 +4,7 @@ import { useUserStore } from './data/stores/userStore'; import { i18n } from './plugins/i18n'; import { ref } from 'vue'; import vuetify from './plugins/vuetify'; -import navigationDrawer from './components/navigationDrawer.vue'; +import navigationItems from './components/navigationItems.vue'; const userStore = useUserStore() const theme = useTheme() @@ -23,7 +23,7 @@ i18n.global.locale = userStore.language - + diff --git a/software/src/components/alertBanner.vue b/software/src/components/alertBanner.vue index 11b63cc..073b845 100644 --- a/software/src/components/alertBanner.vue +++ b/software/src/components/alertBanner.vue @@ -1,15 +1,61 @@