Install pyenv
Python Version 3.10.5
1:
pyenv install 3.10.5
2:
pyenv virtualenv 3.10.5 book-api
3:
git clone git@github.com:tiagoriego/book-api.git
4:
cd book-api
echo book-api > .python-version
Install Packages
pip install -r requirements.txt
openssl rand -hex 32
SECRET_KEY="insert here"
docker-compose up -d
Restart when necessary
docker restart postgres_container
books
users
links
Books
CREATE TABLE public.books (
id varchar(255) NOT NULL,
author varchar(255) NOT NULL,
dimensions varchar(255) NOT NULL,
format varchar(255) NOT NULL,
isbn varchar(255) NOT NULL,
"language" varchar(255) NOT NULL,
paperback varchar(255) NOT NULL,
publication_date varchar(255) NOT NULL,
publisher varchar(255) NOT NULL,
title varchar(255) NOT NULL,
created_at timestamp NOT NULL,
updated_at timestamp NOT NULL,
CONSTRAINT books_pkey PRIMARY KEY (id)
);
Users
CREATE TABLE public.users (
id varchar(255) NOT NULL,
full_name varchar(255) NOT NULL,
email varchar(255) NOT NULL,
username varchar(255) NOT NULL,
hashed_password varchar(255) NOT NULL,
disabled bool NOT NULL,
created_at timestamp NOT NULL,
updated_at timestamp NOT NULL,
CONSTRAINT users_pkey PRIMARY KEY (id)
);
CREATE UNIQUE INDEX users_email_idx ON public.users USING btree (email);
CREATE UNIQUE INDEX users_username_idx ON public.users USING btree (username);
Links
CREATE TABLE public.links (
id varchar(255) NOT NULL,
book_id varchar(255) NOT NULL,
name varchar(255) NOT NULL,
url varchar(400) NOT NULL,
created_at timestamp NOT NULL,
updated_at timestamp NOT NULL,
CONSTRAINT links_pkey PRIMARY KEY (id)
);
ALTER TABLE public.links ADD CONSTRAINT books_fkey FOREIGN KEY (book_id) REFERENCES public.books(id) ON DELETE CASCADE;
engine=create_engine(DB_CONNECTION, echo=True)
cd src/app
uvicorn main:app --reload
uvicorn main:app --port 3000 --reload
pytest
Ex.
platform linux -- Python 3.10.5, pytest-7.2.0, pluggy-1.0.0
rootdir: /home/user/projects/python/book-api/src/app
plugins: anyio-3.6.2
collected 8 items
test/test_main.py ..... [100%]
==================== 8 passed in 1.06s ==============
curl --location --request POST 'localhost:{port}/users/' \
--header 'x-api-key: {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{
"full_name": "Foobar",
"email": "foo@bar.com",
"username": "foobar",
"password": "123456"
}'
http://localhost:{port}/docs
API
Books
Login
Users
Health