# 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)