Repository navigation
Expand file tree
/
Copy pathmain.py
More file actions
118 lines (98 loc) · 4.38 KB
/
Copy pathmain.py
File metadata and controls
118 lines (98 loc) · 4.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field
from typing import Annotated
from database import criar_tabela, criar_tabela_usuarios, listar_produtos, buscar_produtos_nome, adicionar_produto, buscar_produto_id, atualizar_produto_db, excluir_produto_db, buscar_produtos_estoque, buscar_usuario_username, verificar_senha
import jwt
from jwt.exceptions import InvalidTokenError
from fastapi.security import HTTPBearer
import os
from dotenv import load_dotenv
load_dotenv()
app = FastAPI(title='API')
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:63342", "https://pedrosilva370.github.io"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
criar_tabela()
criar_tabela_usuarios()
security = HTTPBearer()
SECRET_KEY = os.getenv("SECRET_KEY")
class ProdutoCriacao(BaseModel):
nome: Annotated[str, Field(min_length=3, max_length=50, description="Nome do produto")]
preco: Annotated[float, Field(gt=0, le=10000, description="Preço do produto em reais")]
estoque: Annotated[int, Field(ge=0, description="Quantidade disponível em estoque")]
class ProdutoResposta(BaseModel):
id: Annotated[int, Field(ge=0, description="ID do produto")]
nome: Annotated[str, Field(min_length=3, max_length=50, description="Nome do produto")]
preco: Annotated[float, Field(gt=0, le=10000, description="Preço do produto em reais")]
estoque: Annotated[int, Field(ge=0, description="Quantidade disponível em estoque")]
class Login(BaseModel):
username: str
senha: str
def criar_token(username):
return jwt.encode({'sub': username}, SECRET_KEY, algorithm='HS256')
def verificar_token(token):
try:
return jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
except InvalidTokenError:
raise HTTPException(status_code=401, detail="Token inválido")
def verificar_autenticacao(credentials = Depends(security)):
token = credentials.credentials
return verificar_token(token)
@app.get('/')
def inicio():
return {'message': 'API funcionando!'}
@app.post('/login')
def login(dados: Login):
usuario = buscar_usuario_username(dados.username)
if not usuario:
raise HTTPException(status_code=401, detail="Usuário ou senha inválidos")
if not verificar_senha(dados.senha, usuario["senha"]):
raise HTTPException(status_code=401, detail="Usuário ou senha inválidos")
return criar_token(dados.username)
@app.get('/produtos', response_model=list[ProdutoResposta])
def produtos(nome=None):
if nome is None:
return listar_produtos()
else:
resultado = buscar_produtos_nome(nome)
if resultado:
return resultado
raise HTTPException(status_code=404, detail="Produto não encontrado")
@app.get('/produtos/{id}', response_model=ProdutoResposta)
def produto(id: int):
resultado = buscar_produto_id(id)
if resultado:
return resultado
raise HTTPException(status_code=404, detail="Produto não encontrado")
@app.get('/sobre')
def sobre(usuario = Depends(verificar_autenticacao)):
return {"nome": "API REST de Loja", "versao": "1.0"}
@app.post('/produtos', response_model=ProdutoResposta)
def criar_produto(produto: ProdutoCriacao, usuario = Depends(verificar_autenticacao)):
novo_produto = adicionar_produto(produto.nome, produto.preco, produto.estoque)
return buscar_produto_id(novo_produto)
@app.put('/produtos/{id}', response_model=ProdutoResposta)
def atualizar_produto(id:int, novo_produto: ProdutoCriacao, usuario = Depends(verificar_autenticacao)):
resultado = buscar_produto_id(id)
if resultado:
atualizar_produto_db(id, novo_produto.nome, novo_produto.preco, novo_produto.estoque)
return buscar_produto_id(id)
raise HTTPException(status_code=404, detail="Produto não encontrado")
@app.delete('/produtos/{id}')
def excluir_produto(id:int, usuario = Depends(verificar_autenticacao)):
resultado = buscar_produto_id(id)
if resultado:
excluir_produto_db(id)
return {'message': 'Produto excluído com sucesso!'}
return {'message': 'Produto não encontrado'}
@app.get('/produtos/estoque/{quantidade}')
def armazenamento(quantidade: int):
resultado = buscar_produtos_estoque(quantidade)
if resultado:
return resultado
return {'message': 'Nenhum produto encontrado com essa quantidade de estoque'}