segue o meu main.py
from flask import Blueprint, jsonify, request, current_app
from app.models.user import LoginPayload
from pydantic import ValidationError
from app import db
from bson import ObjectId # converte a string para o id do Mongo
from app.models.products import *
from app.decorators import token_required
from datetime import datetime, timedelta, timezone
import jwt
request = permite pegar as informação no body via requicisão da rota login
Blueprint = Responsável por organizar todo grupo de rotas relacionadas
jsonifyS = Converte todos os dicionários python em um dicionário json
main_bp = Blueprint('main_bp', name)
Requisito Funcional: O sistema deve permitir que um usuário se autentique para obter um token
@main_bp.route('/login', methods=['POST'])
def login():
try:
raw_data = request.get_json()
# ** = desaclopa o dicionário em argumentos palavra-chave que serão atribuidos automaticamente nos atributos de classe
user_data = LoginPayload(**raw_data)
except ValidationError as e:
return jsonify({"error": e.errors()}), 400
except Exception as e:
return jsonify({"error": "Corpo da requisição inválido ou não é um JSON"})
if user_data.username == "admin" and user_data.password == "supersecret":
token = jwt.encode(
{
"user_id": user_data.username,
"exp": datetime.now(timezone.utc) + timedelta(minutes=30)
},
current_app.config['SECRET_KEY'],
algorithm='HS256'
)
return jsonify({'access_token': token}), 200
return jsonify({"error": "Credenciais invalidas"}), 401
RF: O sistema deve permitir listagem de todos os produtos
@token_required
@main_bp.route('/products', methods=['GET'])
def get_products(token):
products_cursor = db.products.find({})
products_list = [ProductDBModel(**product).model_dump(by_alias=True, exclude_none=True) for product in products_cursor]
return jsonify(products_list)
RF: O sistema deve permitir a criação de um novo produto
@main_bp.route('/products', methods=['POST'])
@token_required
def create_product(token):
db = get_db()
try:
product = Product(**request.get_json())
except ValidationError as e:
return jsonify({"error": e.errors()}), 400
result = db.products.insert_one(product.model_dump())
return jsonify({"message":"Esta é a rota de criação de produto",
"id": str(result.inserted_id)
}), 201
RF: O sistema deve permitir a visualização dos detalhes de um unico produto
@main_bp.route('/products/string:product_id', methods=['GET'])
def get_product_by_id(product_id):
try:
oid = ObjectId(product_id)
except Exception as e:
return jsonify({"error":f"Erro ao transformar o {product_id} em ObjectID: {e}"})
product = db.products.find_one({'_id':oid})
if product:
product_model = ProductDBModel(**product).model_dump(by_alias=True, exclude_none=None)
return jsonify(product)
else:
return jsonify({"error":f"Produto com o id: {product_id} - Não encontrado"})
RF: O sistema deve permitir a atualização de um unico produto e produto existente
@main_bp.route('/product/int:product_id', methods=['PUT'])
def update_product(product_id):
return jsonify({"message":f"Esta é a rota de atualizacao do produto com o id {product_id}"})
RF: O sistema deve permitir a delecao de um unico produto e produto existente
@main_bp.route('/product/int:product_id', methods=['DELELE'])
def delete_product(product_id):
return jsonify({"message":f"Esta é a rota de delecao do produto com o id {product_id}"})
RF: O sistema deve permitir a importação de vendas através de um arquivo
@main_bp.route('/sales/upload', methods=['POST'])
def upload_sales(product_id):
return jsonify({"message":"Esta é a rota de upload do arquivo de vendas"})
@main_bp.route('/')
def index():
return jsonify({"message":"Bem vindo ao StyleSync"})