# HackMyCart The most hackable Web Shop! ## How to use ### Prepare development environment 1. Install node.js ```bash sudo apt install npm # If outdated version: sudo npm install -g n sudo n stable ``` 2. Download + extract the project 3. Open the root folder with VS Code (recommended) 4. Open the bash inside VS Code, navigate to the `software/` folder and install all necessary packages: ```bash npm i ``` ### Test/development There are multiple commands to test parts or the whole project: - `npm run dev`: Starts the Vue frontend only - `npm run server`: Starts the ExpressJs backend only - `npm run serve`: Starts front- and backend The frontend runs on `http://localhost:5173/` and the backend on `http://localhost:3000/` ### Compile for production TODO ## Structure ### Database ![database-erm](misc/images/database.png) ### Backend API endpoints The application host it's data in a SQLite database. The access is managed by an [ExpressJs](https://expressjs.com/) server which offers many REST-API endpoints for the frontend. The REST-API server runs on port 3000. --- #### Validate
POST /accounts/login (Login for user) ##### Parameters > | name | type | data type | description | > | --- | --- | --- | --- | > | username | required | string | Username of the account | > | password | required | string | Password of the account | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `AccountObject` + `Addresses`, `Payments`, `AccountRole` | > | `400` | `application/json` | `{code: 400, message: "Bad Request"}` | > | `401` | `application/json` | `{code: 401, message: "Unauthorized"}` |
--- #### Listing existing
GET /bands (Get all bands) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` |
GET /bands/:id (Get all information about one band) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | `id` | required | string | ID of product in the database | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Band` + `Array` + `Array` |
GET /shows/:id (Get all information about one show) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | `id` | required | string | ID of product in the database | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Show` + `Tour` + `Location` + `City` |
GET /tours (Get all tours) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` + `Band` + `Show` + `Location` + `City` |
GET /genres (Get all genres) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` |
GET /locations (Get all locations) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` + `City` |
GET /orders/:id (Get all orders of an user) ##### Parameters > | name | type | data type | description | > | --- | --- | --- | --- | > | `id` | required | string | ID of userAccount in the database | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `ProductModel` + `Order`, `OrderItem`, `Product` |
GET /categories/ (Get all Categories) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` |
GET /brands (Get all Brands) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `Array` |
--- #### Creating new
POST /accounts/ (Create a new account) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | None | required | object (JSON) | Model of an Account | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `201` | `application/json` | `AccountModel` | > | `400` | `application/json` | `{code: 400, message: "Username too short!"}` | > | `400` | `application/json` | `{code: 400, message: "Password too short!"}` | > | `409` | `application/json` | `{code: 409, message: "Username already in use"}` |
POST /products/ (Create a new product) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | None | required | object (JSON) | Model of a Product | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `201` | `application/json` | `ProductModel` | > | `400` | `application/json` | `{code: 400, message: "..."}` |
POST /orders/ (Create a new order) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | None | required | object (JSON) | Model of an Order | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `201` | `application/json` | `OrderModel` |
POST /categories/ (Create a new category) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | None | required | object (JSON) | Model of a Category | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `201` | `application/json` | `OrderModel` | > | `400` | `application/json` | `{code: 400, message: "..."}` |
--- #### Updating existing
PATCH /accounts/ (Update data of an existing account) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | None | required | object (JSON) | Model of an Account | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | AccountModel | > | `400` | `application/json` | `{code: 400, message: "..."}` |
--- #### Delete existing
DELETE /product/:id (Delete a product) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | `id` | required | string | ID of product in the database | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `ProductModel` | > | `400` | `application/json` | `{code: 400, message: "..."}` |
DELETE /categories/:id (Delete a category) ##### Parameters > | name | type | data type | description | > | :---: | --- | --- | --- | > | `id` | required | string | ID of category in the database | ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | `application/json` | `CategoryModel` | > | `400` | `application/json` | `{code: 400, message: "..."}` |
--- #### Miscs
GET /api/ (Check if server runs) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | None | None |
GET /resetDatabase/ (Reset the database to it's default values) ##### Parameters > None ##### Responses > | http code | content-type | response | > | :---: | --- | --- | > | `200` | None | None |