Skip to content

Commit f716447

Browse files
authored
Merge pull request #933 from thunderstore-io/cyberstorm-package-versions-endpoint
Cyberstorm API: add endpoint for Package's versions
2 parents 1be3ee0 + 08df456 commit f716447

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import pytest
2+
from rest_framework.test import APIClient
3+
4+
from thunderstore.repository.factories import PackageVersionFactory
5+
from thunderstore.repository.models import Package
6+
7+
8+
@pytest.mark.django_db
9+
def test_package_versions_api_view__returns_error_for_inactive_package(
10+
api_client: APIClient,
11+
package: Package,
12+
) -> None:
13+
package.is_active = False
14+
package.save()
15+
16+
response = api_client.get(
17+
f"/api/cyberstorm/versions/{package.namespace}/{package.name}/",
18+
)
19+
actual = response.json()
20+
21+
assert actual["detail"] == "Not found."
22+
23+
24+
@pytest.mark.django_db
25+
def test_package_versions_api_view__does_not_return_inactive_versions(
26+
api_client: APIClient,
27+
) -> None:
28+
inactive = PackageVersionFactory(is_active=False)
29+
30+
response = api_client.get(
31+
f"/api/cyberstorm/versions/{inactive.package.namespace}/{inactive.package.name}/",
32+
)
33+
actual = response.json()
34+
35+
assert actual["detail"] == "Not found."
36+
37+
38+
@pytest.mark.django_db
39+
def test_package_versions_api_view__returns_versions(
40+
api_client: APIClient,
41+
) -> None:
42+
expected = PackageVersionFactory()
43+
44+
response = api_client.get(
45+
f"/api/cyberstorm/versions/{expected.package.namespace}/{expected.package.name}/",
46+
)
47+
actual = response.json()
48+
49+
assert len(actual) == 1
50+
assert actual[0]["version_number"] == expected.version_number

django/thunderstore/api/cyberstorm/views/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from .community_list import CommunityListAPIView
44
from .markdown import PackageVersionChangelogAPIView, PackageVersionReadmeAPIView
55
from .package_detail import PackageDetailAPIView
6+
from .package_versions import PackageVersionsAPIView
67
from .packages import (
78
CommunityPackageListAPIView,
89
NamespacePackageListAPIView,
@@ -20,6 +21,7 @@
2021
"PackageDetailAPIView",
2122
"PackageVersionChangelogAPIView",
2223
"PackageVersionReadmeAPIView",
24+
"PackageVersionsAPIView",
2325
"TeamDetailAPIView",
2426
"TeamMembersAPIView",
2527
"TeamServiceAccountsAPIView",
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from rest_framework import serializers
2+
from rest_framework.generics import ListAPIView, get_object_or_404
3+
4+
from thunderstore.api.utils import CyberstormAutoSchemaMixin
5+
from thunderstore.repository.models import Package
6+
7+
8+
class CyberstormPackageVersionSerializer(serializers.Serializer):
9+
version_number = serializers.CharField()
10+
datetime_created = serializers.DateTimeField(source="date_created")
11+
download_count = serializers.IntegerField(min_value=0, source="downloads")
12+
download_url = serializers.CharField(source="full_download_url")
13+
install_url = serializers.CharField()
14+
15+
16+
class PackageVersionsAPIView(CyberstormAutoSchemaMixin, ListAPIView):
17+
"""
18+
Return a list of available versions of the package.
19+
"""
20+
21+
serializer_class = CyberstormPackageVersionSerializer
22+
23+
def get_queryset(self):
24+
package = get_object_or_404(
25+
Package.objects.active(),
26+
namespace__name=self.kwargs["namespace_id"],
27+
name__iexact=self.kwargs["package_name"],
28+
)
29+
30+
return package.versions.active()

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
PackageDetailAPIView,
1111
PackageVersionChangelogAPIView,
1212
PackageVersionReadmeAPIView,
13+
PackageVersionsAPIView,
1314
TeamDetailAPIView,
1415
TeamMembersAPIView,
1516
TeamServiceAccountsAPIView,
@@ -89,4 +90,9 @@
8990
PackageVersionReadmeAPIView.as_view(),
9091
name="cyberstorm.package-version.readme",
9192
),
93+
path(
94+
"versions/<str:namespace_id>/<str:package_name>/",
95+
PackageVersionsAPIView.as_view(),
96+
name="cyberstorm.package.versions",
97+
),
9298
]

0 commit comments

Comments
 (0)