diff --git a/ras/api/modules/crud.py b/ras/api/modules/crud.py index 512caab..77e0c47 100644 --- a/ras/api/modules/crud.py +++ b/ras/api/modules/crud.py @@ -18,26 +18,22 @@ conn = engine.connect() @api_view(['GET']) def getAllBooks(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - books = getBooksData(request.headers.get('userid')) - - data = books.apply(lambda row: { - "id": row['id'], - "name": row['name'], - "author": row['author'], - "genre": row['genre'], - "readed": row['readed'], - "rating": row['rating'] - }, axis=1).tolist() - - return Response(data) - else: - return JsonResponse({'error': 'No user detected'}, safe=False) - else: - return JsonResponse({'error': 'Unauthorized'}, safe=False) + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not isLoggedIn: + return JsonResponse({'error': 'Unauthorized'}, safe=False) + + books = getBooksData(request.headers.get('userid')) + data = books.to_dict(orient='records') + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ------------------------------- # Add a book into the database @@ -45,20 +41,32 @@ def getAllBooks(request): @api_view(['POST']) def addBook(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - userid = request.headers.get('userid') - book = request.body - book = json.loads(book) + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) - conn.execute(text("INSERT INTO api_books (userid, name, author, genre, readed, rating) VALUES ('" + str(userid) + "', '" + str(book['name']) + "', '" + str(book['author']) + "', '" + str(book['genre']) + "', '" + str(book['readed']) + "', " + str(book['rating']) + ")")) - return JsonResponse("OK", safe=False) - else: - return JsonResponse({'error': 'No user detected'}, safe=False) - else: - return JsonResponse({'error': 'Unauthorized'}, safe=False) + if not isLoggedIn: + return JsonResponse({'error': 'Unauthorized'}, safe=False) + + userid = request.headers.get('userid') + book_data = json.loads(request.body) + query = text("INSERT INTO api_books (userid, name, author, genre, readed, rating) VALUES (:userid, :name, :author, :genre, :readed, :rating)") + conn.execute(query, { + 'userid': userid, + 'name': book_data['name'], + 'author': book_data['author'], + 'genre': book_data['genre'], + 'readed': book_data['readed'], + 'rating': book_data['rating'] + }) + + return JsonResponse("OK", safe=False) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ------------------------------- # Update a book in the database @@ -66,21 +74,32 @@ def addBook(request): @api_view(['PUT']) def updateBook(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - book = request.POST.get('book') - book = json.loads(book) - bookid = request.headers.get('bookid') + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) - conn.execute(text("UPDATE api_books set name='" + str(book['name']) + "', author='" + str(book['author']) + "', genre='" + str(book['genre']) + "', readed='" + str(book['readed']) + "', rating='" + str(book['rating']) + "' WHERE id=" + str(bookid))) - return JsonResponse("OK", safe=False) - else: - return JsonResponse({'error': 'No user detected'}, safe=False) - else: - return JsonResponse({'error': 'Unauthorized'}, safe=False) + if not isLoggedIn: + return JsonResponse({'error': 'Unauthorized'}, safe=False) + + book_data = json.loads(request.POST.get('book')) + bookid = request.headers.get('bookid') + query = text("UPDATE api_books SET name=:name, author=:author, genre=:genre, readed=:readed, rating=:rating WHERE id=:bookid") + conn.execute(query, { + 'name': book_data['name'], + 'author': book_data['author'], + 'genre': book_data['genre'], + 'readed': book_data['readed'], + 'rating': book_data['rating'], + 'bookid': bookid + }) + return JsonResponse("OK", safe=False) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ------------------------------- # Delete a book in the database @@ -88,15 +107,23 @@ def updateBook(request): @api_view(['DELETE']) def deleteBook(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - bookid = request.headers.get('bookid') - - conn.execute(text("DELETE FROM api_books WHERE id = " + str(bookid))) - return JsonResponse("OK", safe=False) - else: - return JsonResponse({'error': 'No user detected'}, safe=False) - else: - return JsonResponse({'error': 'Unauthorized'}, safe=False) \ No newline at end of file + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not isLoggedIn: + return JsonResponse({'error': 'Unauthorized'}, safe=False) + + bookid = request.headers.get('bookid') + query = text("DELETE FROM api_books WHERE id=:bookid") + conn.execute(query, { + 'bookid': bookid + }) + + return JsonResponse("OK", safe=False) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) \ No newline at end of file diff --git a/ras/api/modules/pandas.py b/ras/api/modules/pandas.py index adaeb59..f79af14 100644 --- a/ras/api/modules/pandas.py +++ b/ras/api/modules/pandas.py @@ -11,20 +11,25 @@ from .functions import isAuthorized, getBooksData, filterData @api_view(['GET']) def getYears(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - df = filterData(getBooksData(request.headers.get('userid'))) - df['readed'] = pd.to_datetime(df['readed'], errors='coerce') - df['year']= df['readed'].dt.year - years = df.groupby('year')['year'].count().reset_index(name="count") + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) - return Response(years['year']) - else: + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid'))) + df['readed'] = pd.to_datetime(df['readed'], errors='coerce') + df['year']= df['readed'].dt.year + years = df.groupby('year')['year'].count().reset_index(name="count") + + return Response(years['year']) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ------------------------------------------------------------------ # Get books of selected year and filter it per month and per genre @@ -32,28 +37,27 @@ def getYears(request): @api_view(['GET']) def books_per_genre_per_month(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - if request.META.get('HTTP_YEAR'): - df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) - booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count") - booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False) - - data = booksPerMonth.apply(lambda row: { - 'genre': row['genre'], - 'readed': row['readed'], - 'count': row['count'] - }, axis=1).tolist() + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) - return Response(data) - else: - return JsonResponse({'error': 'No year in header'}, safe=False) - else: + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not request.META.get('HTTP_YEAR'): + return JsonResponse({'error': 'No year in header'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) + booksPerMonth = df.groupby(['genre', 'readed']).size().reset_index(name='count') + booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False) + data = booksPerMonth.to_dict(orient='records') + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # --------------------------------------------- # Get genres of selected year with percentages @@ -61,27 +65,27 @@ def books_per_genre_per_month(request): @api_view(['GET']) def countGenres(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - if request.META.get('HTTP_YEAR'): - df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) - genres = df.groupby('genre')['genre'].count().reset_index(name="count") - genres = genres.sort_values(by='count', ascending=False) - - data = genres.apply(lambda row: { - 'genre': row['genre'], - 'count': int(row['count']) - }, axis=1).tolist() - - return Response(data) - else: - return JsonResponse({'error': 'No year in header'}, safe=False) - else: + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not request.META.get('HTTP_YEAR'): + return JsonResponse({'error': 'No year in header'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) + genres = df.groupby('genre')['genre'].count().reset_index(name="count") + genres = genres.sort_values(by='count', ascending=False) + data = [{"genre": genre, "count": int(count)} for genre, count in zip(genres['genre'], genres['count'])] + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ---------------- # Get year stats @@ -89,31 +93,35 @@ def countGenres(request): @api_view(['GET']) def getStats(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - if request.META.get('HTTP_YEAR'): - data = [] - df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) - df = df.dropna() - statsTotalBooks = df['name'].count() - statsTotalGenres = df['genre'].nunique() - avgratingsperyear = round((df['rating'].sum() / df['rating'].count()), 0) + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) - data.append({ - 'totalbooks': statsTotalBooks, - 'totalgenres': statsTotalGenres, - 'avgyearrating': avgratingsperyear - }) - - return Response(data[0]) - else: - return JsonResponse({'error': 'No year in header'}, safe=False) - else: + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not request.META.get('HTTP_YEAR'): + return JsonResponse({'error': 'No year in header'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) + df = df.dropna() + statsTotalBooks = df['name'].count() + statsTotalGenres = df['genre'].nunique() + avgratingsperyear = round(df['rating'].mean(), 0) + + data = { + 'totalbooks': statsTotalBooks, + 'totalgenres': statsTotalGenres, + 'avgyearrating': avgratingsperyear + } + + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ------------------------------------------------ # Get books of selected year and group by ratings @@ -121,27 +129,26 @@ def getStats(request): @api_view(['GET']) def avg_ratings_per_month(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - if request.META.get('HTTP_YEAR'): - df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) - avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") - - data = avgratingspermonth.apply(lambda row: { - 'date': row['readed'], - 'rating': int(row['rating']) - }, axis=1).tolist() - - return Response(data) - else: - return JsonResponse({'error': 'No year in header'}, safe=False) - else: + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) - + + if not request.META.get('HTTP_YEAR'): + return JsonResponse({'error': 'No year in header'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) + avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") + data = [{"date": date, "rating": int(rating)} for date, rating in zip(avgratingspermonth['readed'], avgratingspermonth['rating'])] + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) # ----------------------------- # Get ratings of selected year @@ -149,24 +156,24 @@ def avg_ratings_per_month(request): @api_view(['GET']) def countRatings(request): - if(request.headers.get('Authorization')): - isLoggedIn = isAuthorized(request.headers.get('Authorization')); + try: + authorization_token = request.headers.get('Authorization') + isLoggedIn = isAuthorized(authorization_token) - if(isLoggedIn): - if request.META.get('HTTP_YEAR'): - df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) - countratings = df.groupby('rating')['rating'].count().reset_index(name="count") - countratings = countratings.sort_values(by='rating', ascending=False) - - data = countratings.apply(lambda row: { - 'rating': int(row['rating']), - 'count': int(row['count']) - }, axis=1).tolist() - - return Response(data) - else: - return JsonResponse({'error': 'No year in header'}, safe=False) - else: + if not authorization_token: + return JsonResponse({'error': 'No authorization token'}, safe=False) + + if not isLoggedIn: return JsonResponse({'error': 'Unauthorized'}, safe=False) - else: - return JsonResponse({'error': 'No authorization token'}, safe=False) \ No newline at end of file + + if not request.META.get('HTTP_YEAR'): + return JsonResponse({'error': 'No year in header'}, safe=False) + + df = filterData(getBooksData(request.headers.get('userid')), request.META.get('HTTP_YEAR')) + countratings = df.groupby('rating')['rating'].count().reset_index(name="count") + countratings = countratings.sort_values(by='rating', ascending=False) + data = [{"rating": int(rating), "count": int(count)} for rating, count in zip(countratings['rating'], countratings['count'])] + return Response(data) + + except Exception as e: + return JsonResponse({'error': 'An error occurred: {}'.format(str(e))}, safe=False) \ No newline at end of file