frest 0.1.5.post2
Write REST API quickly
Requires Python: >=3.6

# frest
How to create a REST API very quickly.

## Installation
Install **frest** by pip package (you must have Python>=3.6). In this example I'm using [virtualev](https://pypi.org/project/virtualenv/), a tool for virtual environment creation.
```
$ virtualenv env
$ source env/bin/activate
(env) $ pip install frest
```

## Use
#### Create a project
```
(env) $ frest --init project                                                                                                                                                
  
   __               _    
  / _|             | |   
 | |_ _ __ ___  ___| |_ 
 |  _| '__/ _ \/ __| __| 
 | | | | |  __/\__ \ |_  
 |_| |_|  \___||___/\__|
    


Create project/... OK
Create project/__init__.py... OK

```
It will create a project tree folder like this one:
* database.py
	A file with DATABASE_URI, database path, default is `sqlite:///database.db`.
* mail.py
	A file with mail configuration: server, port, password etc.
* app.py
	A file with routes and mail/database configuration.
* wsgi.py
	File used for production.

#### Create first app
Inside `project` folder, we start to create a new app. For example, we want to store books inside our database.
```
(env) $ cd project/
(env) $ frest --startapp book
```

It will print something like this:
```
   __               _    
  / _|             | |   
 | |_ _ __ ___  ___| |_ 
 |  _| '__/ _ \/ __| __| 
 | | | | |  __/\__ \ |_  
 |_| |_|  \___||___/\__|
    


Create scheme/... OK
Create scheme/book... OK
Create scheme/book/__init__.py... OK
Create model for book...
Fields id, created_at, updated_at are default on every new model, you can delete it from model file

Create field? (Y/n): 
```
Now we have to define a model for our `book`, using 6 data types: integer, string, text, datetime, float, bool.
This is an example of our `book` with **name** and **pubblication date**:
```
Choose field name: name
Choose field type: int, str, text, datetime, float, bool str
Choose string size: 20
Field is nullable? (Y/n): n
Create new field? (Y/n): 
Choose field name: pubblication_date
Choose field type: int, str, text, datetime, float, bool datetime
Field is nullable? (Y/n): n
Create new field? (Y/n): n
Create scheme/book/models.py... OK
Create scheme/book/forms.py... OK
Create scheme/book/routes.py... OK
```

Now, our book it will be inside `scheme/book`.

#### Move scheme routes inside app
Edit `project/app.py` and put your routes inside.
```
[...]
from frest.auth.routes import api as api_users
from scheme.book.routes import api as api_books
[...]
app.register_blueprint(api_books)
[...]
```

#### Database creation
Open python interpreter, import db and create.
```
from app import db
db.create_all()
```
Now exit and check your scheme inside database. It will be something like this.
```
CREATE TABLE user (
	"userId" INTEGER NOT NULL, 
	email VARCHAR(30), 
	password VARCHAR(30), 
	is_admin BOOLEAN, 
	name VARCHAR(30), 
	created_at DATETIME, 
	PRIMARY KEY ("userId"), 
	CHECK (is_admin IN (0, 1))
);
CREATE TABLE book (
	"bookId" INTEGER NOT NULL, 
	name VARCHAR(20) NOT NULL, 
	pubblication_date DATETIME NOT NULL, 
	created_at DATETIME, 
	updated_at DATETIME, 
	PRIMARY KEY ("bookId")
);
CREATE TABLE token (
	"tokenId" INTEGER NOT NULL, 
	string VARCHAR(20), 
	created_at DATETIME, 
	expired BOOLEAN, 
	user_id INTEGER NOT NULL, 
	PRIMARY KEY ("tokenId"), 
	CHECK (expired IN (0, 1)), 
	FOREIGN KEY(user_id) REFERENCES user ("userId")
);
```

#### Start app
Inside `project` file you have to run `python app.py` and it's done.

## TODO

 - [ ] Migrations of database in case of edits
 - [ ] Put automatically `routes` inside app file
 - [ ] More datatype
 - [ ] Relantionships (1-to-1, 1-to-n, n-to-n)