https://github.com/biosan/appuntidb
Database back-end for Project Note – "Reti di Calcolatori" course project
https://github.com/biosan/appuntidb
amqp flask flask-restful pika sqlachemy tornado university-project websocket
Last synced: 12 months ago
JSON representation
Database back-end for Project Note – "Reti di Calcolatori" course project
- Host: GitHub
- URL: https://github.com/biosan/appuntidb
- Owner: biosan
- License: apache-2.0
- Created: 2018-01-19T17:42:59.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-09-13T11:57:12.000Z (over 7 years ago)
- Last Synced: 2025-01-13T09:46:47.848Z (about 1 year ago)
- Topics: amqp, flask, flask-restful, pika, sqlachemy, tornado, university-project, websocket
- Language: Python
- Homepage:
- Size: 85 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Project Note Database Back-end
## Introduction
This repository contains Appunti-DB, the database back-end for Project Note, a platform for note sharing.
Appunti-DB is written in Python using Flask framework running on Tornado WSGI server, everything is packed in a Docker container that allow fast, reproducible and dependency-less deployment.
## Architecture
```
+-------------------------------------+
| My Code |
|--------+ +-----------|
| Pika | | WebSocket |
+-------------------------------------+
| | |
| V |
| +---------------+ |
| | Flask-Restful | |
| +---------------+ |
| | |
| V |
| +-----------+ |
| | Flask | |
| +-----------+ |
| | |
|AMQP |HTTP |WebSocket
| | |
V V V
+------+ +-------------------------+
| Pika | | Tornado WSGI |
+------+ +-------------------------+
+======================================+
| Supervisord |
+======================================+
+======================================+
| Docker |
+======================================+
```
### Libraries and dependencies
- **Flask**
- `Flask-Restful`- to reduce Flask boilerplate for API-only services)
- `Flask-Script`- allow CLI-like management of Flask
- `Flask-HTTPAuth` - add support for HTTP simple auth used for user authentication
- `Flask-Migrate` - integrate Flask, Alembic (and SQLAlchemy)
- `Flask-SQLAlchemy` - integration of SQLAlchemy ORM inside Flask
- **Database** *(PostgreSQL)*
- `PsycoPG2-binary` - PostgreSQL driver (compiled binary)
- `SQLAlchemy`` - Python's best ORM
- `Alembic`` - migrations manager for SQLAlchemy
- **Security**
- `Passlib` - easy, fast and reliable library for password hashing
- `argon2pure` - pure Python implementation of Argon2 password hashing algorithm (must switch to C compiled version for better performance)
- **Production Performance**
- `Tornado` - add WebSocket support and high performance (concorrent workers)
- `gevent` - enable Tornado concurrency
- **AMQP**
- `pika` - library for AMQP protocol
- `requests` - Pythonic HTTP library to send requests to main Flask/Tornado server
## API Reference
### **GET** - /db/api/v0.1/users
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/users"
```
### **POST** - /db/api/v0.1/users
#### CURL
```sh
curl -X POST "https://appunti-db.herokuapp.com/db/api/v0.1/users" \
-H "Content-Type: application/json; charset=utf-8" \
--data-raw "$body" \
-u "test":"$password"
```
#### Header Parameters
- **Content-Type** should respect the following schema:
```
{
"type": "string",
"enum": [
"application/json; charset=utf-8"
],
"default": "application/json; charset=utf-8"
}
```
#### Body Parameters
- **body** should respect the following schema:
```
{
"type": "string",
"default": "{\"username\":\"test\",\"mail\":\"test@test.com\",\"password\":\"\"}"
}
```
#### Security
- Basic Authentication
- **username**: test
- **password**: $password
### **GET** - /db/api/v0.1/users/rRZCgStOp0g/auth
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/users/rRZCgStOp0g/auth" \
-u "rRZCgStOp0g":"$password"
```
#### Path Parameters
- **RequestVariable** should respect the following schema:
```
{
"type": "string",
"default": "rRZCgStOp0g"
}
```
#### Security
- Basic Authentication
- **username**: rRZCgStOp0g
- **password**: $password
### **DELETE** - /db/api/v0.1/users/rRZCgStOp0g
#### CURL
```sh
curl -X DELETE "https://appunti-db.herokuapp.com/db/api/v0.1/users/rRZCgStOp0g" \
-u "rRZCgStOp0g":"$password"
```
#### Path Parameters
- **RequestVariable** should respect the following schema:
```
{
"type": "string",
"default": "rRZCgStOp0g"
}
```
#### Security
- Basic Authentication
- **username**: rRZCgStOp0g
- **password**: $password
### **GET** - /db/api/v0.1/search
#### Description
Search all stored notes.
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/search\
?query=Fisica"
```
#### Query Parameters
- **query** should respect the following schema:
```
{
"type": "string",
"enum": [
"Fisica"
],
"default": "Fisica"
}
```
### **GET** - /db/api/v0.1/notes
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/notes"
```
### **POST** - /db/api/v0.1/notes
#### CURL
```sh
curl -X POST "https://appunti-db.herokuapp.com/db/api/v0.1/notes" \
-H "Content-Type: application/json; charset=utf-8" \
--data-raw "$body" \
-u "test":"$password"
```
#### Header Parameters
- **Content-Type** should respect the following schema:
```
{
"type": "string",
"enum": [
"application/json; charset=utf-8"
],
"default": "application/json; charset=utf-8"
}
```
#### Body Parameters
- **body** should respect the following schema:
```
{
"type": "string",
"default": "{\"name\":\"Test Note 1234\",\"owner\":\"rRZCgStOp0g\",\"teacher\":\"Sibilia\",\"subject\":\"fisica\",\"university\":\"sapienza\",\"year\":\"2016\",\"tags\":[\"exercises\"],\"language\":\"ita\"}"
}
```
#### Security
- Basic Authentication
- **username**: test
- **password**: $password
### **DELETE** - /db/api/v0.1/notes/82f8AjF3WzE
#### CURL
```sh
curl -X DELETE "https://appunti-db.herokuapp.com/db/api/v0.1/notes/82f8AjF3WzE" \
-u "test":"$password"
```
#### Path Parameters
- **ResponseBodyPath** should respect the following schema:
```
{
"type": "string",
"default": "82f8AjF3WzE"
}
```
#### Security
- Basic Authentication
- **username**: test
- **password**: $password
### **GET** - /db/api/v0.1/amqp/SIo7LfcujeQ/1/0002
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/amqp/SIo7LfcujeQ/1/0002"
```
### **POST** - /db/api/v0.1/files/82f8AjF3WzE
#### CURL
```sh
curl -X POST "https://appunti-db.herokuapp.com/db/api/v0.1/files/82f8AjF3WzE" \
-H "Content-Type: multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__" \
--data-raw "enctype"="multipart/form-data" \
--data-raw "file1"="$file1" \
-u "test":"$password"
```
#### Path Parameters
- **RequestVariable** should respect the following schema:
```
{
"type": "string",
"default": "82f8AjF3WzE"
}
```
#### Header Parameters
- **Content-Type** should respect the following schema:
```
{
"type": "string",
"enum": [
"multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__"
],
"default": "multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__"
}
```
#### Body Parameters
- **enctype** should respect the following schema:
```
{
"type": "string",
"enum": [
"multipart/form-data"
],
"default": "multipart/form-data"
}
```
- **file1** should respect the following schema:
```
{
"type": "string",
"enum": [
""
]
}
```
#### Security
- Basic Authentication
- **username**: test
- **password**: $password
### **GET** - /db/api/v0.1/files/82f8AjF3WzE/1
#### CURL
```sh
curl -X GET "https://appunti-db.herokuapp.com/db/api/v0.1/files/82f8AjF3WzE/1"
```
#### Path Parameters
- **RequestVariable** should respect the following schema:
```
{
"type": "string",
"default": "82f8AjF3WzE"
}
```
- **RequestVariable_2** should respect the following schema:
```
{
"type": "string",
"default": "1"
}
```
### **PUT** - /db/api/v0.1/files/82f8AjF3WzE
#### CURL
```sh
curl -X PUT "https://appunti-db.herokuapp.com/db/api/v0.1/files/82f8AjF3WzE" \
-H "Content-Type: multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__" \
--data-raw "enctype"="multipart/form-data" \
--data-raw "file_to_append"="$file_to_append" \
-u "test":"$password"
```
#### Path Parameters
- **RequestVariable** should respect the following schema:
```
{
"type": "string",
"default": "82f8AjF3WzE"
}
```
#### Header Parameters
- **Content-Type** should respect the following schema:
```
{
"type": "string",
"enum": [
"multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__"
],
"default": "multipart/form-data; charset=utf-8; boundary=__X_PAW_BOUNDARY__"
}
```
#### Body Parameters
- **enctype** should respect the following schema:
```
{
"type": "string",
"enum": [
"multipart/form-data"
],
"default": "multipart/form-data"
}
```
- **file_to_append** should respect the following schema:
```
{
"type": "string",
"enum": [
""
]
}
```
#### Security
- Basic Authentication
- **username**: test
- **password**: $password
## Building container
To build the container run this inside this repo
```
docker build -t db_api .
```
To run it
```
docker run db_api -p INT_PORT:EXT_PORT
```
### Environment variables
```
-e B2_APPLICATION_KEY='XXXXXXXXX...XXXXXXXX'
-e B2_ACCOUNT_ID='XXXX...XXXX'
-e AMQP_BROKER_URL='amqp://USERNAME:PASSWORD@URL'
-e APPLICATION_MODE='PRODUCTION or TESTING or DEVELOPMENT'
-e DATABASE_URL='postgres://USERNAME:PASSWORD@URL'
-e ADDRESS='0.0.0.0'
-e PORT='INT_PORT'
```