Skip to content

Commit

Permalink
Add Cache-Control to feeds
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenwardy committed Jul 2, 2024
1 parent d25dc2c commit 5f1cd08
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 16 deletions.
16 changes: 2 additions & 14 deletions app/blueprints/api/endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@
from app import csrf
from app.logic.graphs import get_package_stats, get_package_stats_for_user, get_all_package_stats
from app.markdown import render_markdown
from app.models import Tag, PackageState, PackageType, Package, db, PackageRelease, Permission, ForumTopic, \
from app.models import Tag, PackageState, PackageType, Package, db, PackageRelease, Permission, \
MinetestRelease, APIToken, PackageScreenshot, License, ContentWarning, User, PackageReview, Thread, Collection, \
PackageAlias, Language
from app.querybuilder import QueryBuilder
from app.utils import is_package_page, get_int_or_abort, url_set_query, abs_url, is_yes, get_request_date
from app.utils import is_package_page, get_int_or_abort, url_set_query, abs_url, is_yes, get_request_date, cached
from app.utils.minetest_hypertext import html_to_minetest, package_info_as_hypertext, package_reviews_as_hypertext
from . import bp
from .auth import is_api_authd
Expand All @@ -52,18 +52,6 @@ def inner(*args, **kwargs):
return inner


def cached(max_age: int):
def decorator(f):
@wraps(f)
def inner(*args, **kwargs):
res: Response = f(*args, **kwargs)
res.cache_control.max_age = max_age
return res
return inner

return decorator


@bp.route("/api/packages/")
@cors_allowed
@cached(300)
Expand Down
10 changes: 9 additions & 1 deletion app/blueprints/feeds/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

from app.markdown import render_markdown
from app.models import Package, PackageState, db, PackageRelease
from app.utils import is_package_page, abs_url_for
from app.utils import is_package_page, abs_url_for, cached

bp = Blueprint("feeds", __name__)

Expand Down Expand Up @@ -113,50 +113,58 @@ def _atomify(feed):


@bp.route("/feeds/all.json")
@cached(1800)
def all_json():
feed = _get_all_feed(abs_url_for("feeds.all_json"))
return jsonify(feed)


@bp.route("/feeds/all.atom")
@cached(1800)
def all_atom():
feed = _get_all_feed(abs_url_for("feeds.all_atom"))
return _atomify(feed)


@bp.route("/feeds/packages.json")
@cached(1800)
def packages_all_json():
feed = _get_new_packages_feed(abs_url_for("feeds.packages_all_json"))
return jsonify(feed)


@bp.route("/feeds/packages.atom")
@cached(1800)
def packages_all_atom():
feed = _get_new_packages_feed(abs_url_for("feeds.packages_all_atom"))
return _atomify(feed)


@bp.route("/feeds/releases.json")
@cached(1800)
def releases_all_json():
feed = _get_releases_feed(PackageRelease.query, abs_url_for("feeds.releases_all_json"))
return jsonify(feed)


@bp.route("/feeds/releases.atom")
@cached(1800)
def releases_all_atom():
feed = _get_releases_feed(PackageRelease.query, abs_url_for("feeds.releases_all_atom"))
return _atomify(feed)


@bp.route("/packages/<author>/<name>/releases_feed.json")
@is_package_page
@cached(1800)
def releases_package_json(package: Package):
feed = _get_releases_feed(package.releases, package.get_url("feeds.releases_package_json", absolute=True))
return jsonify(feed)


@bp.route("/packages/<author>/<name>/releases_feed.atom")
@is_package_page
@cached(1800)
def releases_package_atom(package: Package):
feed = _get_releases_feed(package.releases, package.get_url("feeds.releases_package_atom", absolute=True))
return _atomify(feed)
15 changes: 14 additions & 1 deletion app/utils/flask.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@

import datetime
import typing
from functools import wraps
from urllib.parse import urljoin, urlparse, urlunparse

import user_agents
from flask import request, abort, url_for
from flask import request, abort, url_for, Response
from flask_babel import LazyString, lazy_gettext
from werkzeug.datastructures import MultiDict

Expand Down Expand Up @@ -162,3 +163,15 @@ def get_daterange_options() -> typing.List[typing.Tuple[LazyString, str]]:
(lazy_gettext("Year to date"), url_set_query(start=year_start, end=now.isoformat())),
(lazy_gettext("Last year"), url_set_query(start=last_year_start, end=last_year_end)),
]


def cached(max_age: int):
def decorator(f):
@wraps(f)
def inner(*args, **kwargs):
res: Response = f(*args, **kwargs)
res.cache_control.max_age = max_age
return res
return inner

return decorator

0 comments on commit 5f1cd08

Please sign in to comment.