diff --git a/README.md b/README.md new file mode 100644 index 0000000..dfe748d --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +## Architecture + +![client-server interaction graph](./assets/client-server-interaction.svg) + +## Dependencies + +1. Node.js +1. npm +1. Python 3.6+ + +## Setup + +For setting up the frontend, `setup.sh` will run `npm install` in the `frontend` folder. + +For setting up the backend, `setup.sh` will initialize a new virtual environment and setup a dummy sqlite file for testing purposes. + +## Dev + +Run `setup.sh` and then run `dev.sh` + +## Production + +TODO \ No newline at end of file diff --git a/assets/client-server-interaction.drawio b/assets/client-server-interaction.drawio new file mode 100644 index 0000000..75995a7 --- /dev/null +++ b/assets/client-server-interaction.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/assets/client-server-interaction.svg b/assets/client-server-interaction.svg new file mode 100644 index 0000000..b308b42 --- /dev/null +++ b/assets/client-server-interaction.svg @@ -0,0 +1,3 @@ + + +
Links editor page
Links editor page
caffeine
caffeine
Response /srv/www-csc-links/index.html
Response /srv/www-csc-links/index.html
GET /
GET /
Links page
Links page
GET /links.json
GET /links.json
Response /srv/www-csc-links/links.json (does not include click count)
Response /srv/www-csc-links/links.json (does not include click co...
Consider / to be https://csclub.uwaterloo.ca/links
Consider / to be https://csclub.uwaterloo.ca/...
ONLY when a link is clicked:
POST /api/click with { "url": <url>, "name": <name> } as payload
ONLY when a link is clicked:...
200 OK
200 OK
Backend
(python)
Backend...
GET /editor/links (authenticated)
GET /editor/links (authenticated)
Response /srv/www-csc-links/editor/index.html
Response /srv/www-csc-links/editor/index.html
Dynamically generated links with click count
Dynamically generated links with click count
GET /editor (authenticated)
GET /editor (authenticated)
sqlite
sqlite
POST /editor/links (authenticated) with updated JSON recvd from /editor/links
POST /editor/links (authenticated) with updated JSON recvd from /editor...
200 OK
200 OK
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/common.sh b/common.sh new file mode 100755 index 0000000..11c8e58 --- /dev/null +++ b/common.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' + +function prefix_stdout_stderr() { + exec > >(trap "" INT TERM; sed "s/^/`printf "$1"`/") + exec 2> >(trap "" INT TERM; sed "s/^/`printf "$1"`/" >&2) +} + +function run_frontend_backend() { + $1 & + pid_frontend=$! + + $2 & + pid_backend=$! + + trap_ctrlc() { + echo "" + kill $pid_frontend + echo "frontend exit code: $?" + kill $pid_backend + echo "backend exit code: $?" + } + + trap trap_ctrlc INT + + wait +} \ No newline at end of file diff --git a/dev.sh b/dev.sh index 6dfb557..06b2b59 100755 --- a/dev.sh +++ b/dev.sh @@ -1,15 +1,10 @@ #!/usr/bin/env bash -PURPLE='\033[0;35m' -CYAN='\033[0;36m' -NC='\033[0m' +set -e -function prefix_stdout_stderr() { - exec > >(trap "" INT TERM; sed "s/^/`printf "$1"`/") - exec 2> >(trap "" INT TERM; sed "s/^/`printf "$1"`/" >&2) -} +source ./common.sh -function start_frontend() { +function dev_frontend() { prefix_stdout_stderr "${PURPLE}frontend: ${NC}" cd ./frontend @@ -17,31 +12,13 @@ function start_frontend() { npm run dev } -function start_backend() { +function dev_backend() { prefix_stdout_stderr "${CYAN}backend: ${NC}" cd ./backend source venv/bin/activate - echo $(which python) - python main.py } -start_frontend & -pid_frontend=$! - -start_backend & -pid_backend=$! - -trap_ctrlc() { - echo "" - kill $pid_frontend - echo "frontend exit code: $?" - kill $pid_backend - echo "backend exit code: $?" -} - -trap trap_ctrlc INT - -wait +run_frontend_backend "dev_frontend" "dev_backend" diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..94424eb --- /dev/null +++ b/setup.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +set -e + +source ./common.sh + +function setup_frontend() { + prefix_stdout_stderr "${PURPLE}frontend: ${NC}" + + cd ./frontend + + echo "Installing dependencies..." + npm i + + echo "Done!" +} + +function setup_backend() { + prefix_stdout_stderr "${CYAN}backend: ${NC}" + + cd ./backend + + echo "Deleting old virtual environment..." + rm -rf ./venv + + echo "Deleting sqlite database..." + rm ./links.db + + echo "Creating new virtual environment..." + python3 -m venv venv + source venv/bin/activate + + echo "Installing dependencies..." + pip install -r requirements.txt + + echo "Creating a dummy sqlite database at 'backend/links.db'..." + python setup_db.py + + echo "Done!" +} + +run_frontend_backend "setup_frontend" "setup_backend"