Skip to content

Commit

Permalink
Merge pull request #60 from flavien-hugs/develop
Browse files Browse the repository at this point in the history
update: remove unusing feature
  • Loading branch information
flavien-hugs authored Dec 17, 2024
2 parents 46cb6fe + e2ec8ea commit d45f923
Show file tree
Hide file tree
Showing 14 changed files with 28 additions and 367 deletions.
2 changes: 1 addition & 1 deletion .isort.cfg
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[settings]
known_third_party = beanie,email_validator,fastapi,fastapi_cache,fastapi_jwt,fastapi_pagination,httpx,jinja2,jose,mongomock_motor,motor,pwdlib,pydantic,pydantic_settings,pymongo,pyotp,pytest,pytest_asyncio,slugify,starlette,typer,user_agents,uvicorn,yaml
known_third_party = beanie,email_validator,fastapi,fastapi_cache,fastapi_jwt,fastapi_pagination,httpx,jinja2,jose,mongomock_motor,motor,pwdlib,pydantic,pydantic_settings,pymongo,pyotp,pytest,pytest_asyncio,slugify,starlette,typer,uvicorn,yaml
4 changes: 2 additions & 2 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from src.common.helpers.error_codes import AppErrorCode
from src.common.helpers.exceptions import setup_exception_handlers
from src.config import settings, shutdown_db, startup_db
from src.models import LoginLog, Params, Role, User
from src.models import Params, Role, User
from src.routers import auth_router, param_router, perm_router, role_router, user_router
from src.services import roles, users
from src.shared import blacklist_token
Expand All @@ -33,7 +33,7 @@ class State(TypedDict):

@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncIterator[State]:
await startup_db(app=app, models=[User, Role, Params, LoginLog])
await startup_db(app=app, models=[User, Role, Params])

await load_app_description(mongodb_client=app.mongo_db_client)
await load_permissions(mongodb_client=app.mongo_db_client)
Expand Down
1 change: 0 additions & 1 deletion src/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class AuthBaseConfig(BaseSettings):
USER_MODEL_NAME: str = Field(..., alias="USER_MODEL_NAME")
ROLE_MODEL_NAME: str = Field(..., alias="ROLE_MODEL_NAME")
PARAM_MODEL_NAME: str = Field(..., alias="PARAM_MODEL_NAME")
LOGIN_LOG_MODEL_NAME: str = Field(..., alias="LOGIN_LOG_MODEL_NAME")

# FRONTEND URL CONFIG
FRONTEND_URL: Optional[str] = Field(..., alias="FRONTEND_URL")
Expand Down
3 changes: 2 additions & 1 deletion src/config/swaggers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from functools import lru_cache
from typing import Optional

from pydantic import Field
from pydantic_settings import BaseSettings

Expand All @@ -9,6 +10,6 @@ class EnableEndpointSettings(BaseSettings):
SHOW_CHECK_USER_ATTRIBUTE_ENDPOINT: Optional[bool] = Field(default=1, alias="SHOW_CHECK_USER_ATTRIBUTE_ENDPOINT")


@lru_cache()
@lru_cache
def enable_endpoint() -> EnableEndpointSettings:
return EnableEndpointSettings()
6 changes: 3 additions & 3 deletions src/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .roles import Role
from .users import User, UserOut, LoginLog
from .params import Params
from .roles import Role
from .users import User, UserOut

__all__ = ["User", "Role", "Params", "UserOut", "LoginLog"]
__all__ = ["User", "Role", "Params", "UserOut"]
25 changes: 3 additions & 22 deletions src/models/users.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,22 @@
from typing import Any, Dict, Optional

import pymongo
from beanie import Document, PydanticObjectId
from pydantic import StrictBool
from beanie import Document

from src.config import settings
from src.schemas import CreateUser
from .mixins import DatetimeTimestamp


class User(CreateUser, DatetimeTimestamp, Document):
is_active: Optional[StrictBool] = False
is_primary: Optional[StrictBool] = False
is_active: Optional[bool] = False
is_primary: Optional[bool] = False

class Settings:
name = settings.USER_MODEL_NAME
use_state_management = True
indexes = [pymongo.IndexModel(keys=[("fullname", pymongo.TEXT)])]


class LoginLog(DatetimeTimestamp, Document):
user_id: PydanticObjectId
ip_address: str
device: Optional[str] = None
os: Optional[str] = None
browser: Optional[str] = None
is_tablet: Optional[bool] = False
is_mobile: Optional[bool] = False
is_pc: Optional[bool] = False
is_bot: Optional[bool] = False
is_touch_capable: Optional[bool] = False
is_email_client: Optional[bool] = False

class Settings:
name = settings.LOGIN_LOG_MODEL_NAME
use_state_management = True


class UserOut(User):
extras: Dict[str, Any] = {}
4 changes: 2 additions & 2 deletions src/routers/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ async def register_completed(token: str, bg: BackgroundTasks, payload: UserBaseS


@auth_router.post("/login", summary="Login", status_code=status.HTTP_200_OK)
async def login(bg: BackgroundTasks, request: Request, payload: LoginUser = Body(...)):
return await auth.login(bg, request, payload)
async def login(request: Request, payload: LoginUser = Body(...)):
return await auth.login(request, payload)


if not bool(settings.REGISTER_WITH_EMAIL):
Expand Down
69 changes: 3 additions & 66 deletions src/routers/users.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
from typing import Optional

from beanie import PydanticObjectId
from fastapi import APIRouter, Body, Depends, File, Path, Query, Request, status, UploadFile
from fastapi import APIRouter, Body, Depends, Query, Request, status
from fastapi_pagination.async_paginator import paginate
from motor.motor_asyncio import AsyncIOMotorGridFSBucket
from pymongo import ASCENDING, DESCENDING

from src.config import settings
from src.middleware import AuthorizedHTTPBearer, CheckPermissionsHandler, CheckUserAccessHandler
from src.models import User, UserOut
from src.schemas import CreateUser, UpdatePassword, UpdateUser
from src.services import files, roles, users
from src.shared.utils import AccountAction, customize_page, get_fs, SortEnum
from src.services import roles, users
from src.shared.utils import AccountAction, customize_page, SortEnum

user_router = APIRouter(prefix="/users", tags=["USERS"], redirect_slashes=False)

Expand Down Expand Up @@ -200,65 +199,3 @@ async def activate_user_account(id: PydanticObjectId, action: AccountAction):
)
async def delete_user(id: PydanticObjectId):
return await users.delete_user_account(user_id=PydanticObjectId(id))


if settings.USE_GRIDFS_STORAGE:
user_router.tags = ["USERS: PICTURES"]
user_router.prefix = "/pictures"

@user_router.put(
"",
dependencies=[
Depends(AuthorizedHTTPBearer),
Depends(CheckPermissionsHandler(required_permissions={"auth:can-update-user"})),
],
summary="Upload user picture",
status_code=status.HTTP_200_OK,
)
async def upload(
request: Request,
user_id: PydanticObjectId,
file: UploadFile = File(...),
description: Optional[str] = Body(None, description="Description of the file"),
fs: AsyncIOMotorGridFSBucket = Depends(get_fs),
):
result = await files.upload_file(request=request, user_id=user_id, description=description, file=file, fs=fs)
return result

@user_router.get(
"/{id}",
dependencies=[
Depends(AuthorizedHTTPBearer),
Depends(CheckPermissionsHandler(required_permissions={"auth:can-read-user"})),
],
summary="Download user picture",
status_code=status.HTTP_200_OK,
)
@user_router.get(
"/{id}/view",
summary="Show user picture",
status_code=status.HTTP_200_OK,
)
async def download(
request: Request, id: str = Path(..., description="File ID"), fs: AsyncIOMotorGridFSBucket = Depends(get_fs)
):
if request.url.path.endswith("/show"):
return await files.get_file(id=id, fs=fs)
else:
return await files.download_file(id=id, fs=fs)

@user_router.delete(
"/{id}",
dependencies=[
Depends(AuthorizedHTTPBearer),
Depends(CheckPermissionsHandler(required_permissions={"auth:can-update-user"})),
],
summary="Delete user picture",
status_code=status.HTTP_204_NO_CONTENT,
)
async def delete_picture(
user_id: PydanticObjectId,
id: str = Path(..., description="File ID"),
fs: AsyncIOMotorGridFSBucket = Depends(get_fs),
):
return await files.delete_file(id=id, user_id=user_id, fs=fs)
5 changes: 2 additions & 3 deletions src/schemas/__init__.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
from .auth import (
ChangePassword,
UpdatePassword,
ChangePasswordWithOTPCode,
EmailModelMixin,
LoginUser,
ManageAccount,
RequestChangePassword,
UpdatePassword,
VerifyOTP,
)
from .mixins import FilterParams, SendEmailMessage, SendSmsMessage
from .params import ParamsModel
from .response import ResponseModelData
from .roles import RoleModel
from .users import CreateUser, Metadata, PhonenumberModel, UpdateUser, UserBaseSchema
from .users import CreateUser, PhonenumberModel, UpdateUser, UserBaseSchema

__all__ = [
"UserBaseSchema",
Expand All @@ -32,6 +32,5 @@
"FilterParams",
"SendEmailMessage",
"SendSmsMessage",
"Metadata",
"ChangePasswordWithOTPCode",
]
7 changes: 2 additions & 5 deletions src/services/auth/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Optional

from beanie import PydanticObjectId
from fastapi import BackgroundTasks, Request, status
from fastapi import Request, status
from fastapi.encoders import jsonable_encoder
from starlette.responses import JSONResponse

Expand All @@ -13,7 +13,6 @@
from src.models import User
from src.schemas import ChangePassword, LoginUser
from src.services.roles import get_one_role
from src.services.tracker import tracking
from src.services.users import get_one_user
from src.shared import blacklist_token
from src.shared.error_codes import AuthErrorCode, UserErrorCode
Expand All @@ -40,7 +39,7 @@ async def _validate_user_status(user: User) -> None:
)


async def login(bg: BackgroundTasks, request: Request, payload: LoginUser) -> JSONResponse:
async def login(request: Request, payload: LoginUser) -> JSONResponse:
is_email = settings.REGISTER_WITH_EMAIL
identifier: Optional[str] = payload.email if is_email else payload.phonenumber

Expand Down Expand Up @@ -74,8 +73,6 @@ async def login(bg: BackgroundTasks, request: Request, payload: LoginUser) -> JS
"user": user_data,
}

await tracking.insert_log(task=bg, request=request, user_id=user.id)

return JSONResponse(content=jsonable_encoder(response_data), status_code=status.HTTP_200_OK)


Expand Down
2 changes: 1 addition & 1 deletion src/services/auth/email.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
ChangePassword,
UserBaseSchema,
)
from src.services.users import check_if_email_exist
from src.shared import mail_service
from src.shared.error_codes import UserErrorCode
from src.shared.utils import password_hash
from src.services.users import check_if_email_exist

template_loader = PackageLoader("src", "templates")
template_env = Environment(loader=template_loader, autoescape=select_autoescape(["html", "txt"]))
Expand Down
Loading

0 comments on commit d45f923

Please sign in to comment.