Untitled
unknown
plain_text
2 years ago
4.0 kB
8
Indexable
from flask import Flask, request, jsonify
import uuid
import datetime
import jwt
from functools import wraps
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
# Mock database to store product details
products = []
# Mock user database for authentication
users = [
{"id": 1, "username": "user1", "password": "password1"},
{"id": 2, "username": "user2", "password": "password2"}
]
# JWT token generation function
def generate_token(user_id):
token_payload = {
'user_id': user_id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)
}
token = jwt.encode(token_payload, app.config['SECRET_KEY'], algorithm='HS256')
return token.decode('utf-8')
# Authentication decorator
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
return jsonify({'message': 'Token is missing!'}), 401
try:
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
current_user = next((user for user in users if user["id"] == data["user_id"]), None)
except:
return jsonify({'message': 'Token is invalid!'}), 401
return f(current_user, *args, **kwargs)
return decorated
# User signup API
@app.route('/signup', methods=['POST'])
def signup():
data = request.get_json()
# Mock implementation for simplicity
user = {"id": len(users) + 1, "username": data['username'], "password": data['password']}
users.append(user)
return jsonify({'message': 'User created successfully!'})
# User login API
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
user = next((user for user in users if user['username'] == username and user['password'] == password), None)
if user:
access_token = generate_token(user['id'])
return jsonify({'access_token': access_token})
else:
return jsonify({'message': 'Invalid credentials!'}), 401
# Product CRUD operations
@app.route('/products', methods=['POST'])
@token_required
def create_product(current_user):
data = request.get_json()
product = {
'id': str(uuid.uuid4()),
'name': data['name'],
'price': data['price'],
'product_image': str(uuid.uuid4()), # Use this UUID as a placeholder for the image file
'created_on': datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
}
products.append(product)
return jsonify({'message': 'Product created successfully!', 'product': product})
@app.route('/products/<product_id>', methods=['PUT'])
@token_required
def update_product(current_user, product_id):
product = next((product for product in products if product['id'] == product_id), None)
if product:
data = request.get_json()
product.update(data)
return jsonify({'message': 'Product updated successfully!', 'product': product})
else:
return jsonify({'message': 'Product not found!'}), 404
@app.route('/products/<product_id>', methods=['DELETE'])
@token_required
def delete_product(current_user, product_id):
global products
products = [product for product in products if product['id'] != product_id]
return jsonify({'message': 'Product deleted successfully!'})
@app.route('/products', methods=['GET'])
@token_required
def get_products(current_user):
# Pagination
page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', 10))
start = (page - 1) * per_page
end = start + per_page
# Filter and search by name
name_filter = request.args.get('name')
filtered_products = [product for product in products if name_filter.lower() in product['name'].lower()] if name_filter else products
return jsonify({'products': filtered_products[start:end]})
if __name__ == '__main__':
app.run(debug=True)
Editor is loading...
Leave a Comment