HackMyCart
The most hackable Web Shop!
How to use
Prepare development environment
- Install node.js
- Download + extract the project
- Open the root folder with VS Code (recommended)
- Open the bash inside VS Code and install all necessary packages:
Test/development
There are multiple commands to test parts or the whole project:
npm run vite:dev: Start Vue frontend only
npm run server:dev: Start ExpressJs backend only
npm run fullstack:dev: Start front- and backend
The frontend runs on http://localhost:5173/ and the backend on http://localhost:3000/
Build
npm run vite:build: Build Vue frontend only
npm run server:build: Build ExpressJs backend only
npm run fullstack:build: Build front- and backend
npm run electron:build: Build front- and backend to an Electron desktop application
npm run builder:build: Build an installer file of the Electron application for current operating system. Electron-build has to run first!
npm run builder:win: Build an installer file of the Electron application for Windows operating systems. Electron-build has to run first!
Structure
Database

Backend API endpoints
The application host it's data in a SQLite database. The access is managed by an ExpressJs server which offers many REST-API endpoints for the frontend. The REST-API server runs on port 3000.
Listing existing
GET /accounts/ (Get all Accounts)
Parameters
None
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Account + AccountRole> |
Example Response
GET /api/files (Get all public files)
Parameters
None
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<{folder: String, files: Array<{name: String, size: Number, url: String}> }> |
Example Response
GET /bands/ (Get all bands)
Parameters
| name |
type |
data type |
description |
sort |
optional |
string |
Sort by number of concerts ascending (asc) or descending (desc) |
count |
optional |
number |
Number of items to responde |
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<> |
Example Response
GET /events?city=cityName&genre=genreName&count=nrOfItems&sort=sortDirection (Get all events, filtered by city and genre)
Parameters
| name |
type |
data type |
description |
cityName |
optional |
string |
Name of the city to filter for |
genreName |
optional |
string |
Name of the genre to filter for |
nrOfItems |
optional |
number |
Limits number of results |
sortDirection |
optional |
string |
Sort by number of concerts, 'asc' or 'desc' |
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Event + Array<Concert + Location + City> + Band & Genre> |
GET /locations?count=nrOfItems&sort=sortDirection (Get all locations)
Parameters
| name |
type |
data type |
description |
nrOfItems |
optional |
number |
Limits number of results |
sortDirection |
optional |
string |
Sort by number of concerts, 'asc' or 'desc' |
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Location + City + Array<Concert + Event>> |
Down here: todo!
GET /bands (Get all bands)
Parameters
None
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Band> |
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<Rating> + Array<Member> |
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<Tours> + Band + Show + Location + City |
GET /genres (Get all genres)
Parameters
None
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Genre> |
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<Categories> |
GET /brands (Get all Brands)
Parameters
None
Responses
| http code |
content-type |
response |
200 |
application/json |
Array<Brand> |
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 /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 |
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
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 |
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"} |