1from __future__ import annotations
 2
 3from plain.http import HttpMiddleware, RedirectResponse, Request, Response
 4
 5
 6class RedirectionMiddleware(HttpMiddleware):
 7    def after_response(self, request: Request, response: Response) -> Response:
 8        if response.status_code == 404:
 9            from .models import NotFoundLog, Redirect, RedirectLog
10
11            redirects = Redirect.query.filter(enabled=True).only(
12                "id", "from_pattern", "to_pattern", "http_status", "is_regex"
13            )
14            for redirect in redirects:
15                if redirect.matches_request(request):
16                    # Log it
17                    redirect_log = RedirectLog.from_redirect(redirect, request)
18                    # Then redirect
19                    return RedirectResponse(
20                        str(redirect_log.to_url), status_code=redirect.http_status
21                    )
22
23            # Nothing matched, just log the 404
24            NotFoundLog.from_request(request)
25
26        return response