Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions app/core/auth/cruds_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,31 @@ async def revoke_refresh_token_by_client_and_user_id(
)
await db.commit()
return None


async def delete_refresh_token_by_user_id(
db: AsyncSession,
user_id: str,
) -> None:
"""Delete a refresh token from database"""

await db.execute(
delete(models_auth.RefreshToken).where(
models_auth.RefreshToken.user_id == user_id,
),
)
await db.commit()


async def delete_authorization_token_by_user_id(
db: AsyncSession,
user_id: str,
) -> None:
"""Delete a refresh token from database"""

await db.execute(
delete(models_auth.AuthorizationCode).where(
models_auth.AuthorizationCode.user_id == user_id,
),
)
await db.commit()
2 changes: 2 additions & 0 deletions app/core/auth/endpoints_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.auth import cruds_auth, models_auth, schemas_auth
from app.core.auth.user_deleter_auth import AuthUserDeleter
from app.core.users import cruds_users, models_users
from app.core.utils.config import Settings
from app.core.utils.security import (
Expand Down Expand Up @@ -50,6 +51,7 @@
root="auth",
tag="Auth",
router=router,
user_deleter=AuthUserDeleter(),
)

templates = Jinja2Templates(directory="assets/templates")
Expand Down
23 changes: 23 additions & 0 deletions app/core/auth/user_deleter_auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.auth import cruds_auth
from app.types.module_user_deleter import ModuleUserDeleter


class AuthUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
await cruds_auth.delete_authorization_token_by_user_id(
db=db,
user_id=user_id,
)
await cruds_auth.delete_refresh_token_by_user_id(
db=db,
user_id=user_id,
)
2 changes: 2 additions & 0 deletions app/core/core_endpoints/endpoints_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.core_endpoints import cruds_core, models_core, schemas_core
from app.core.core_endpoints.user_deleter_core import CoreUserDeleter
from app.core.groups.groups_type import AccountType, GroupType
from app.core.users import models_users
from app.core.utils.config import Settings
Expand All @@ -26,6 +27,7 @@
root="",
tag="Core",
router=router,
user_deleter=CoreUserDeleter(),
)

hyperion_error_logger = logging.getLogger("hyperion.error")
Expand Down
15 changes: 15 additions & 0 deletions app/core/core_endpoints/user_deleter_core.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.types.module_user_deleter import ModuleUserDeleter


class CoreUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
pass
4 changes: 4 additions & 0 deletions app/core/google_api/endpoints_google_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.google_api.google_api import GoogleAPI
from app.core.google_api.user_deleter_google_api import (
GoogleAPIUserDeleter,
)
from app.core.utils.config import Settings
from app.dependencies import (
get_db,
Expand All @@ -17,6 +20,7 @@
root="google-api",
tag="GoogleAPI",
router=router,
user_deleter=GoogleAPIUserDeleter(),
)

hyperion_error_logger = logging.getLogger("hyperion.error")
Expand Down
15 changes: 15 additions & 0 deletions app/core/google_api/user_deleter_google_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.types.module_user_deleter import ModuleUserDeleter


class GoogleAPIUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
pass
12 changes: 12 additions & 0 deletions app/core/groups/cruds_groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,15 @@ async def update_group(
.values(**group_update.model_dump(exclude_none=True)),
)
await db.commit()


async def delete_membership_by_user_id(
user_id: str,
db: AsyncSession,
):
await db.execute(
delete(models_groups.CoreMembership).where(
models_groups.CoreMembership.user_id == user_id,
),
)
await db.commit()
2 changes: 2 additions & 0 deletions app/core/groups/endpoints_groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from app.core.groups import cruds_groups, models_groups, schemas_groups
from app.core.groups.groups_type import GroupType
from app.core.groups.user_deleter_groups import GroupsUserDeleter
from app.core.users import cruds_users
from app.dependencies import (
get_db,
Expand All @@ -27,6 +28,7 @@
root="groups",
tag="Groups",
router=router,
user_deleter=GroupsUserDeleter(),
)

hyperion_security_logger = logging.getLogger("hyperion.security")
Expand Down
19 changes: 19 additions & 0 deletions app/core/groups/user_deleter_groups.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.groups import cruds_groups
from app.types.module_user_deleter import ModuleUserDeleter


class GroupsUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
await cruds_groups.delete_membership_by_user_id(
user_id=user_id,
db=db,
)
6 changes: 5 additions & 1 deletion app/core/memberships/endpoints_memberships.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
from app.core.groups import cruds_groups
from app.core.groups.groups_type import GroupType
from app.core.memberships import cruds_memberships, schemas_memberships
from app.core.memberships.utils_memberships import validate_user_new_membership
from app.core.memberships.user_deleter_memberships import (
MembershipsUserDeleter,
)
from app.core.memberships.utils_memberships import validate_user_membership
from app.core.users import cruds_users, models_users, schemas_users
from app.dependencies import (
get_db,
Expand All @@ -25,6 +28,7 @@
root="memberships",
tag="Memberships",
router=router,
user_deleter=MembershipsUserDeleter(),
)


Expand Down
15 changes: 15 additions & 0 deletions app/core/memberships/user_deleter_memberships.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.types.module_user_deleter import ModuleUserDeleter


class MembershipsUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
pass # We keep the memberships for stats and history purposes
36 changes: 36 additions & 0 deletions app/core/notification/cruds_notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,39 @@ async def get_firebase_tokens_by_user_ids(
),
)
return list(result.scalars().all())


async def delete_topic_membership_by_user_id(
user_id: str,
db: AsyncSession,
):
await db.execute(
delete(models_notification.TopicMembership).where(
models_notification.TopicMembership.user_id == user_id,
),
)
await db.commit()


async def delete_message_by_firebase_device_token(
device_token: str,
db: AsyncSession,
):
await db.execute(
delete(models_notification.Message).where(
models_notification.Message.firebase_device_token == device_token,
),
)
await db.commit()


async def delete_firebase_devices_by_user_id(
user_id: str,
db: AsyncSession,
):
await db.execute(
delete(models_notification.FirebaseDevice).where(
models_notification.FirebaseDevice.user_id == user_id,
),
)
await db.commit()
4 changes: 4 additions & 0 deletions app/core/notification/endpoints_notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
schemas_notification,
)
from app.core.notification.notification_types import CustomTopic, Topic
from app.core.notification.user_deleter_notification import (
NotificationUserDeleter,
)
from app.core.users import models_users
from app.dependencies import (
get_db,
Expand All @@ -29,6 +32,7 @@
root="notification",
tag="Notifications",
router=router,
user_deleter=NotificationUserDeleter(),
)


Expand Down
33 changes: 33 additions & 0 deletions app/core/notification/user_deleter_notification.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.notification import cruds_notification
from app.types.module_user_deleter import ModuleUserDeleter


class NotificationUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
devices = await cruds_notification.get_firebase_devices_by_user_id(
db=db,
user_id=user_id,
)
for device in devices:
await cruds_notification.delete_message_by_firebase_device_token(
db=db,
device_token=device.firebase_device_token,
)
await cruds_notification.delete_firebase_devices_by_user_id(
db=db,
user_id=user_id,
)

await cruds_notification.delete_topic_membership_by_user_id(
db=db,
user_id=user_id,
)
2 changes: 2 additions & 0 deletions app/core/payment/endpoints_payment.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from app.core.core_module_list import core_module_list
from app.core.payment import cruds_payment, models_payment, schemas_payment
from app.core.payment.user_deleter_payment import PaymentUserDeleter
from app.dependencies import get_db
from app.modules.module_list import module_list
from app.types.module import CoreModule
Expand All @@ -22,6 +23,7 @@
root="payment",
tag="Payments",
router=router,
user_deleter=PaymentUserDeleter(),
)

hyperion_error_logger = logging.getLogger("hyperion.error")
Expand Down
15 changes: 15 additions & 0 deletions app/core/payment/user_deleter_payment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.types.module_user_deleter import ModuleUserDeleter


class PaymentUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
pass
2 changes: 2 additions & 0 deletions app/core/schools/endpoints_schools.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from app.core.groups.groups_type import AccountType, GroupType
from app.core.schools import cruds_schools, models_schools, schemas_schools
from app.core.schools.schools_type import SchoolType
from app.core.schools.user_deleter_schools import SchoolsUserDeleter
from app.core.users import cruds_users, schemas_users
from app.dependencies import (
get_db,
Expand All @@ -27,6 +28,7 @@
root="schools",
tag="Schools",
router=router,
user_deleter=SchoolsUserDeleter(),
)


Expand Down
15 changes: 15 additions & 0 deletions app/core/schools/user_deleter_schools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from sqlalchemy.ext.asyncio import AsyncSession

from app.types.module_user_deleter import ModuleUserDeleter


class SchoolsUserDeleter(ModuleUserDeleter):
async def has_reason_not_to_delete_user(
self,
user_id: str,
db: AsyncSession,
) -> str:
return ""

async def delete_user(self, user_id: str, db: AsyncSession) -> None:
pass
Loading