2024-05-28 21:45:04 +02:00
|
|
|
from flask import Flask, request, jsonify
|
|
|
|
|
from flask_cors import CORS
|
|
|
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
|
|
|
import firebase_admin
|
|
|
|
|
from firebase_admin import credentials, auth
|
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
import os
|
|
|
|
|
import requests
|
|
|
|
|
|
|
|
|
|
load_dotenv()
|
|
|
|
|
TMDB_BEARER_TOKEN = os.getenv('TMDB_BEARER_TOKEN')
|
|
|
|
|
|
|
|
|
|
app = Flask(__name__)
|
|
|
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.sqlite3'
|
|
|
|
|
app.config['SQLALCHEY_TRACK_MODIFICATIONS'] = False
|
|
|
|
|
|
|
|
|
|
db = SQLAlchemy(app)
|
|
|
|
|
|
|
|
|
|
CORS(app)
|
|
|
|
|
|
|
|
|
|
cred = credentials.Certificate('movie-recommendation-firebase-adminsdk.json')
|
|
|
|
|
firebase_admin.initialize_app(cred)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class User(db.Model):
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
|
uid = db.Column(db.String(80), unique=True, nullable=False)
|
|
|
|
|
email = db.Column(db.String(80), unique=True, nullable=False)
|
|
|
|
|
is_admin = db.Column(db.Boolean, default=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Rating(db.Model):
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
|
user_id = db.Column(db.Integer, db.ForeignKey('user.uid'), nullable=False)
|
|
|
|
|
movie_id = db.Column(db.Integer, nullable=False)
|
|
|
|
|
value = db.Column(db.Integer, nullable=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with app.app_context():
|
|
|
|
|
db.create_all()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/login', methods=['POST'])
|
|
|
|
|
def login():
|
|
|
|
|
token = request.json.get('token')
|
|
|
|
|
try:
|
|
|
|
|
decoded_token = auth.verify_id_token(token)
|
|
|
|
|
uid = decoded_token['uid']
|
|
|
|
|
print(uid)
|
|
|
|
|
email = decoded_token.get('email')
|
|
|
|
|
|
|
|
|
|
user = User.query.filter_by(uid=uid).first()
|
|
|
|
|
if user is None:
|
|
|
|
|
user = User(uid=uid, email=email)
|
|
|
|
|
|
|
|
|
|
db.session.add(user)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
return jsonify({'message': 'Login successful!', 'email': email, 'is_admin': user.is_admin}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': 'Login failed'}), 401
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/count_user_ratings', methods=['POST'])
|
|
|
|
|
def count_user_ratings():
|
|
|
|
|
token = request.json.get('token')
|
|
|
|
|
try:
|
|
|
|
|
decoded_token = auth.verify_id_token(token)
|
|
|
|
|
user_id = decoded_token['uid']
|
|
|
|
|
|
|
|
|
|
user = User.query.filter_by(uid=user_id).first()
|
|
|
|
|
if user is None:
|
|
|
|
|
return jsonify({'message': 'Error'}), 500
|
|
|
|
|
|
|
|
|
|
rating_count = Rating.query.filter_by(user_id=user_id).count()
|
|
|
|
|
return jsonify({'message': 'Ratings counted!', 'rating_count': rating_count}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/movie/<int:movie_id>', methods=['GET'])
|
|
|
|
|
def get_tmdb_data_movie_id(movie_id):
|
|
|
|
|
url = f'https://api.themoviedb.org/3/movie/{movie_id}'
|
|
|
|
|
|
|
|
|
|
headers = {
|
|
|
|
|
'Authorization': f'Bearer {TMDB_BEARER_TOKEN}'}
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
response = requests.get(url, headers=headers)
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
return jsonify(response.json()), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/movie', methods=['GET'])
|
|
|
|
|
def get_tmdb_data_query():
|
|
|
|
|
query = request.args.get('query')
|
|
|
|
|
|
|
|
|
|
if query:
|
|
|
|
|
url = f'https://api.themoviedb.org/3/search/movie?query={query}'
|
|
|
|
|
else:
|
|
|
|
|
url = 'https://api.themoviedb.org/3/trending/movie/day'
|
|
|
|
|
|
|
|
|
|
headers = {
|
|
|
|
|
'Authorization': f'Bearer {TMDB_BEARER_TOKEN}'}
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
response = requests.get(url, headers=headers)
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
return jsonify(response.json()), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/rating', methods=['POST'])
|
|
|
|
|
def add_rating():
|
|
|
|
|
token = request.json.get('token')
|
|
|
|
|
movie = request.json.get('movie')
|
|
|
|
|
value = request.json.get('value')
|
|
|
|
|
try:
|
|
|
|
|
decoded_token = auth.verify_id_token(token)
|
|
|
|
|
user_id = decoded_token['uid']
|
|
|
|
|
|
|
|
|
|
# user = User.query.filter_by(uid=user_id).first()
|
|
|
|
|
# if user is None:
|
|
|
|
|
# return jsonify({'message': 'Error'}), 500
|
|
|
|
|
|
|
|
|
|
rating = Rating.query.filter_by(
|
|
|
|
|
user_id=user_id, movie_id=movie).first()
|
|
|
|
|
if rating is None:
|
|
|
|
|
rating = Rating(user_id=user_id, movie_id=movie, value=value)
|
|
|
|
|
|
|
|
|
|
db.session.add(rating)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
return jsonify({'message': 'Rating added successfully!'}), 201
|
|
|
|
|
else:
|
|
|
|
|
rating.value = value
|
|
|
|
|
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
return jsonify({'message': 'Rating updated successfully!'}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/rating', methods=['DELETE'])
|
|
|
|
|
def remove_rating():
|
|
|
|
|
token = request.json.get('token')
|
|
|
|
|
movie = request.json.get('movie')
|
|
|
|
|
try:
|
|
|
|
|
decoded_token = auth.verify_id_token(token)
|
|
|
|
|
user_id = decoded_token['uid']
|
|
|
|
|
|
|
|
|
|
# user = User.query.filter_by(uid=user_id).first()
|
|
|
|
|
# if user is None:
|
|
|
|
|
# return jsonify({'message': 'Error'}), 500
|
|
|
|
|
|
|
|
|
|
rating = Rating.query.filter_by(
|
|
|
|
|
user_id=user_id, movie_id=movie).first()
|
|
|
|
|
if rating is None:
|
|
|
|
|
return jsonify({'message': 'Error'}), 500
|
|
|
|
|
|
|
|
|
|
db.session.delete(rating)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
|
return jsonify({'message': 'Rating removed successfully!'}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route('/get_rating', methods=['POST'])
|
|
|
|
|
def get_rating():
|
|
|
|
|
token = request.json.get('token')
|
|
|
|
|
movie = request.json.get('movie')
|
|
|
|
|
try:
|
|
|
|
|
decoded_token = auth.verify_id_token(token)
|
|
|
|
|
user_id = decoded_token['uid']
|
|
|
|
|
|
|
|
|
|
# user = User.query.filter_by(uid=user_id).first()
|
|
|
|
|
# if user is None:
|
|
|
|
|
# return jsonify({'message': 'Error'}), 500
|
|
|
|
|
|
|
|
|
|
rating = Rating.query.filter_by(
|
|
|
|
|
user_id=user_id, movie_id=movie).first()
|
|
|
|
|
if rating is None:
|
|
|
|
|
return jsonify({'message': 'Rating not found!'}), 200
|
|
|
|
|
else:
|
|
|
|
|
return jsonify({'message': 'Rating found!', 'movie': rating.movie_id, 'value': rating.value}), 200
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
return jsonify({'message': str(e)}), 500
|
2024-06-17 01:54:16 +02:00
|
|
|
|
|
|
|
|
app.run(host="0.0.0.0", port=8084)
|