Skip to content

Commit 6e65807

Browse files
committed
Extract cookie logout service
1 parent c00994a commit 6e65807

File tree

5 files changed

+58
-41
lines changed

5 files changed

+58
-41
lines changed
Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
from fastapi import APIRouter, Depends, status
22
from fastapi.responses import RedirectResponse
3-
from sqlalchemy.ext.asyncio.session import AsyncSession
43

5-
from futuramaapi.repositories.models import AuthSessionModel
6-
from futuramaapi.repositories.session import get_async_session
7-
from futuramaapi.routers.rest.users.dependencies import cookie_user_from_form_data, user_from_cookies
4+
from futuramaapi.routers.rest.users.dependencies import cookie_user_from_form_data
85
from futuramaapi.routers.rest.users.schemas import User
96

107
router = APIRouter()
@@ -31,23 +28,3 @@ async def auth_user(
3128
expires=user.cookie_expiration_time,
3229
)
3330
return response
34-
35-
36-
@router.post(
37-
"/logout",
38-
include_in_schema=False,
39-
name="user_logout",
40-
)
41-
async def cookie_logout_user(
42-
session: AsyncSession = Depends(get_async_session), # noqa: B008
43-
user: User | None = Depends(user_from_cookies), # noqa: B008
44-
) -> RedirectResponse:
45-
if user is None:
46-
return RedirectResponse("/auth", status_code=status.HTTP_302_FOUND)
47-
48-
if user._cookie_session is not None:
49-
await AuthSessionModel.do_expire(session, user._cookie_session)
50-
51-
response: RedirectResponse = RedirectResponse("/auth", status_code=status.HTTP_302_FOUND)
52-
response.delete_cookie(User.cookie_auth_key)
53-
return response

futuramaapi/routers/rest/users/dependencies.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,3 @@ async def cookie_user_from_form_data(
9999

100100
user._cookie_session = auth_session.key
101101
return user
102-
103-
104-
async def user_from_cookies(
105-
request: Request,
106-
session: AsyncSession = Depends(get_async_session), # noqa: B008
107-
) -> User | None:
108-
try:
109-
session_id: str = request.cookies[User.cookie_auth_key]
110-
except KeyError:
111-
return None
112-
113-
try:
114-
return await User.from_cookie_session_id(session, session_id)
115-
except ModelNotFoundError:
116-
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) from None
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from typing import ClassVar
2+
3+
from fastapi import Request, status
4+
from fastapi.responses import RedirectResponse
5+
from sqlalchemy import Update, update
6+
7+
from futuramaapi.repositories.models import AuthSessionModel
8+
from futuramaapi.routers.services import BaseSessionService
9+
10+
11+
class LogoutCookieSessionUserService(BaseSessionService[RedirectResponse]):
12+
cookie_auth_key: ClassVar[str] = "Authorization"
13+
14+
@property
15+
def request(self) -> Request:
16+
if self.context is None:
17+
raise AttributeError("Request is not defined.")
18+
19+
if "request" not in self.context:
20+
raise AttributeError("Request is not defined.")
21+
22+
return self.context["request"]
23+
24+
@property
25+
def _expire_session_statement(self) -> Update:
26+
key: str = self.request.cookies[self.cookie_auth_key]
27+
return update(AuthSessionModel).where(AuthSessionModel.key == key).values(expired=True)
28+
29+
async def process(self, *args, **kwargs) -> RedirectResponse:
30+
await self.session.execute(self._expire_session_statement)
31+
await self.session.commit()
32+
33+
response: RedirectResponse = RedirectResponse(
34+
"/auth",
35+
status_code=status.HTTP_302_FOUND,
36+
)
37+
response.delete_cookie(self.cookie_auth_key)
38+
return response

futuramaapi/routers/views/api.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from fastapi import APIRouter, Request, Response, status
22
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
3-
from fastapi.responses import FileResponse, HTMLResponse
3+
from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse
44

55
from futuramaapi.routers.services.about.get_about import GetAboutService
66
from futuramaapi.routers.services.auth.get_user_auth import GetUserAuthService
7+
from futuramaapi.routers.services.auth.logout_cookie_session_user import LogoutCookieSessionUserService
78
from futuramaapi.routers.services.changelog.get_changelog import GetChangelogService
89
from futuramaapi.routers.services.index.get_index import GetIndexService
910
from futuramaapi.routers.services.sitemaps.get_sitemap import GetSiteMapService
@@ -127,3 +128,19 @@ async def user_auth(
127128
},
128129
)
129130
return await service()
131+
132+
133+
@router.post(
134+
"/logout",
135+
include_in_schema=False,
136+
name="logout_cookie_session_user",
137+
)
138+
async def logout_cookie_session_user(
139+
request: Request,
140+
) -> RedirectResponse:
141+
service: LogoutCookieSessionUserService = LogoutCookieSessionUserService(
142+
context={
143+
"request": request,
144+
},
145+
)
146+
return await service()

templates/base.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
{% else %}
8080
<form
8181
method="POST"
82-
action="{{ relative_path_for('user_logout') }}"
82+
action="{{ relative_path_for('logout_cookie_session_user') }}"
8383
>
8484
<button
8585
type="submit"

0 commit comments

Comments
 (0)