diff --git a/backend/app/categories/controller.py b/backend/app/categories/controller.py index 101d480..660ccfc 100644 --- a/backend/app/categories/controller.py +++ b/backend/app/categories/controller.py @@ -1,14 +1,14 @@ -from typing import List, Union, Dict +from typing import Dict, List, Union from fastapi import APIRouter, Depends, HTTPException from motor.motor_asyncio import AsyncIOMotorClient -from app.utils.token import verify_token -from app.utils.mongodb import get_database -from app.models.base import ObjectID -from app.models.responses import ResponseBase, ItemInResponse, ItemsInResponse -from app.models.category import Movie, Anime, Show, Music - +from ..models.base import ObjectID +from ..models.category import Anime, Category, Movie, Music, Show +from ..models.responses import (CategorysInResponse, ItemInResponse, + ItemsInResponse, ResponseBase) +from ..utils.mongodb import get_database +from ..utils.token import verify_token router = APIRouter() diff --git a/backend/app/core/controller.py b/backend/app/core/controller.py index 5bc7252..d63745d 100644 --- a/backend/app/core/controller.py +++ b/backend/app/core/controller.py @@ -1,19 +1,24 @@ import hashlib -import urllib import logging import random +import urllib + +import jwt +import ujson from cas import CASClient from fastapi import APIRouter, Depends, HTTPException -import jwt from motor.motor_asyncio import AsyncIOMotorClient from starlette.responses import RedirectResponse -import ujson -from app.utils.cas import get_cas -from app.utils.token import verify_token -from app.utils.mongodb import get_database from config import SECRET_KEY +from ..models.category import Category +from ..models.responses import (CategorysInResponse, ResponseBase, + UsersInResponse) +from ..models.user import User +from ..utils.cas import get_cas +from ..utils.mongodb import get_database +from ..utils.token import verify_token router = APIRouter() @@ -37,6 +42,34 @@ async def login_route(next: str = "/", ticket: str = None, cas_client: CASClient } else: logging.debug(f"CAS verify ticket response: user: {_user}") - # TODO add additional login functionality here - redirect_url = f"{next}#/?user={_user}" - return RedirectResponse(url=redirect_url) + if await db["core"]["users"].find_one({"username": _user}): + _res = await db["core"]["users"].update_one({ + "last_login": attributes["authenticationDate"] + }) + else: + _res = await db["core"]["users"].insert_one({ + "username": _user, + "last_login": attributes["authenticationDate"], + "first_login": attributes["authenticationDate"], + }) + + jwt_token = jwt.encode({'username': _user}, str( + SECRET_KEY), algorithm="HS256").decode() + return ResponseBase(data={ + "token": jwt_token + }) + + +@router.get("/categories", response_model=CategorysInResponse, dependencies=[Depends(verify_token)], tags=["fetch", "categories"]) +async def get_category_list(db: AsyncIOMotorClient = Depends(get_database)) -> CategorysInResponse: + """Returns list of categories available""" + categories = [Category(**category) async for + category in db["core"]["categories"].find()] + return CategorysInResponse(data=categories) + + +@router.get("/users", response_model=UsersInResponse, dependencies=[Depends(verify_token)], tags=["fetch", "users", "testing"]) +async def get_users_route(db: AsyncIOMotorClient = Depends(get_database)) -> UsersInResponse: + """Get user information for logged in user""" + users = [User(**user) async for user in db["core"]["users"].find()] + return UsersInResponse(data=users) diff --git a/backend/app/models/category.py b/backend/app/models/category.py index 7472d09..d73d427 100644 --- a/backend/app/models/category.py +++ b/backend/app/models/category.py @@ -9,7 +9,7 @@ class Category(Base): """Category definiton""" - _id: CategoryEnum + id: CategoryEnum = Field(None, alias="_id") class ItemBase(Base): diff --git a/backend/app/models/responses.py b/backend/app/models/responses.py index f8d88d2..a308ab1 100644 --- a/backend/app/models/responses.py +++ b/backend/app/models/responses.py @@ -1,14 +1,15 @@ -from typing import List, Optional, Union +from typing import List, Optional, Union, Dict from .base import Base, ObjectID -from .category import Anime, Movie, Music, Show, Book +from .category import Anime, Movie, Music, Show, Book, Category from .user import User, Like class ResponseBase(Base): """Base return response""" success: bool = True - error: Optional[List] = None + error: Optional[List] + data: Optional[Union[List, Dict[str, str]]] class ItemInResponse(ResponseBase): @@ -31,3 +32,7 @@ class UsersInResponse(ResponseBase): class LikeInResponse(ResponseBase): data: Like + + +class CategorysInResponse(ResponseBase): + data: List[Category] diff --git a/backend/app/models/user.py b/backend/app/models/user.py index 22f5070..f8a4ce1 100644 --- a/backend/app/models/user.py +++ b/backend/app/models/user.py @@ -22,6 +22,5 @@ class Like(Base): class User(Base): id: ObjectID = Field(None, alias="_id") username: str - password: SecretStr ratings: List[UserRating] = list() likes: List[Like] = list() diff --git a/backend/app/user/controller.py b/backend/app/user/controller.py index edc020c..46d55df 100644 --- a/backend/app/user/controller.py +++ b/backend/app/user/controller.py @@ -3,11 +3,11 @@ from fastapi import APIRouter, Depends, HTTPException from motor.motor_asyncio import AsyncIOMotorClient -from app.utils.token import verify_token -from app.utils.mongodb import get_database -from app.models.base import ObjectID -from app.models.user import User, LikeEnum -from app.models.responses import UserInResponse, UsersInResponse, LikeInResponse +from ..models.base import ObjectID +from ..models.responses import LikeInResponse, UserInResponse, UsersInResponse +from ..models.user import LikeEnum, User +from ..utils.mongodb import get_database +from ..utils.token import verify_token router = APIRouter() @@ -15,16 +15,9 @@ @router.post("/signup", tags=["signup", "auth", "testing"]) async def signup_route(user: User, db: AsyncIOMotorClient = Depends(get_database)): """Signup route (for testing)""" - # TODO signup functionality return {"success": True} -@router.get("/", response_model=UsersInResponse, dependencies=[Depends(verify_token)], tags=["fetch", "bulk"]) -async def get_users_route(db: AsyncIOMotorClient = Depends(get_database)) -> UsersInResponse: - """Get user information for logged in user""" - # TODO fetch users functionality - return {"success": True} - @router.get("/{user_id}", response_model=UserInResponse, tags=["fetch"]) async def get_user_route(user_id: ObjectID, diff --git a/backend/app/utils/token.py b/backend/app/utils/token.py index 80f1304..9829c99 100644 --- a/backend/app/utils/token.py +++ b/backend/app/utils/token.py @@ -7,7 +7,7 @@ from config import SECRET_KEY -async def verify_token(authorization: str = Header(None)): +async def verify_token(authorization: str = Header("Authorization")): """Verify JWT token for protected routes""" # NOTE: remove if extra jwt auth not required try: