Skip to content

Commit 4005a6f

Browse files
committed
Add query params
1 parent f399412 commit 4005a6f

4 files changed

Lines changed: 54 additions & 32 deletions

File tree

root/app/api.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from fastapi.responses import JSONResponse
33
from keyvaluestore import KeyValueStore
44
from models import ImagesResponse
5+
from pydantic import ValidationError
56
import json
67
import traceback
78

@@ -11,12 +12,25 @@
1112
async def health():
1213
return "Success"
1314

14-
@api.get("/api/v1/images", response_model=ImagesResponse, summary="Get a list of images")
15-
async def images():
15+
async def get_images():
16+
with KeyValueStore() as kv:
17+
return kv["images"]
18+
19+
@api.get("/api/v1/images", response_model=ImagesResponse, summary="Get a list of images", response_model_exclude_none=True)
20+
async def images(include_config: bool = False, include_deprecated: bool = False):
1621
try:
17-
with KeyValueStore() as kv:
18-
content = json.loads(kv["images"])
19-
return JSONResponse(content=content)
22+
response = await get_images()
23+
image_response = ImagesResponse.model_validate_json(response)
24+
if not include_deprecated:
25+
image_response.exclude_deprecated()
26+
if not include_config:
27+
image_response.exclude_config()
28+
return image_response
29+
except ValidationError:
30+
print(traceback.format_exc())
31+
response = await get_images()
32+
content = json.loads(response)
33+
return JSONResponse(content=content)
2034
except Exception:
2135
print(traceback.format_exc())
2236
raise HTTPException(status_code=404, detail="Not found")

root/app/keyvaluestore.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,5 @@ def __getitem__(self, key):
4141
def set_value(self, key, value, schema_version):
4242
self.conn.execute("REPLACE INTO kv (key, value, updated_at, schema_version) VALUES (?, ?, DATETIME('now', 'utc'), ?)", (key, value, schema_version))
4343
self.conn.commit()
44-
def update_schema(self, key, schema_version):
45-
is_updated = self.conn.execute(f"SELECT 1 FROM kv WHERE key = '{key}' AND schema_version = {schema_version}").fetchone() is not None
46-
if not is_updated:
47-
self.conn.execute(f"UPDATE kv SET schema_version = {schema_version} WHERE key = '{key}'")
48-
self.conn.commit()
49-
return is_updated
44+
def is_current_schema(self, key, schema_version):
45+
return self.conn.execute(f"SELECT 1 FROM kv WHERE key = '{key}' AND schema_version = {schema_version}").fetchone() is not None

root/app/models.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,26 +74,26 @@ class MacAddress(BaseModel):
7474
optional: bool
7575

7676
class Config(BaseModel):
77-
application_setup: str
78-
readonly_supported: bool | None
79-
nonroot_supported: bool | None
80-
privileged: bool | None
81-
networking: str | None
82-
hostname: Hostname | None
83-
mac_address: MacAddress | None
84-
env_vars: list[EnvVar] | None
85-
volumes: list[Volume] | None
86-
ports: list[Port] | None
87-
custom: list[Custom] | None
88-
security_opt: list[SecurityOpt] | None
89-
devices: list[Device] | None
90-
caps: list[Cap] | None
77+
application_setup: str | None = None
78+
readonly_supported: bool | None = None
79+
nonroot_supported: bool | None = None
80+
privileged: bool | None = None
81+
networking: str | None = None
82+
hostname: Hostname | None = None
83+
mac_address: MacAddress | None = None
84+
env_vars: list[EnvVar] | None = None
85+
volumes: list[Volume] | None = None
86+
ports: list[Port] | None = None
87+
custom: list[Custom] | None = None
88+
security_opt: list[SecurityOpt] | None = None
89+
devices: list[Device] | None = None
90+
caps: list[Cap] | None = None
9191

9292
class Image(BaseModel):
9393
name: str
9494
github_url: str
95-
project_url: str | None
96-
project_logo: str | None
95+
project_url: str | None = None
96+
project_logo: str | None = None
9797
description: str
9898
version: str
9999
version_timestamp: str
@@ -103,8 +103,8 @@ class Image(BaseModel):
103103
stars: int
104104
tags: list[Tag]
105105
architectures: list[Architecture]
106-
changelog: list[Changelog] | None
107-
config: Config
106+
changelog: list[Changelog] | None = None
107+
config: Config | None = None
108108

109109
class Repository(BaseModel):
110110
linuxserver: list[Image]
@@ -116,3 +116,11 @@ class ImagesResponse(BaseModel):
116116
status: str
117117
last_updated: str
118118
data: ImagesData
119+
120+
def exclude_config(self):
121+
for image in self.data.repositories.linuxserver:
122+
image.config = None
123+
124+
def exclude_deprecated(self):
125+
images = self.data.repositories.linuxserver
126+
self.data.repositories.linuxserver = list(filter(lambda image: not image.deprecated, images))

root/app/updater.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,11 @@ def get_image(repo):
154154
tags, stable = get_tags(readme_vars)
155155
deprecated = readme_vars.get("project_deprecation_status", False)
156156
version, version_timestamp = gh.get_last_stable_release(repo)
157+
application_setup = None
158+
if readme_vars.get("app_setup_block_enabled", False):
159+
application_setup = f"{repo.html_url}?tab=readme-ov-file#application-setup"
157160
config = Config(
158-
application_setup=f"{repo.html_url}?tab=readme-ov-file#application-setup",
161+
application_setup=application_setup,
159162
readonly_supported=readme_vars.get("readonly_supported", None),
160163
nonroot_supported=readme_vars.get("nonroot_supported", None),
161164
privileged=readme_vars.get("privileged", None),
@@ -190,8 +193,8 @@ def get_image(repo):
190193

191194
def update_images():
192195
with KeyValueStore(invalidate_hours=INVALIDATE_HOURS, readonly=False) as kv:
193-
is_updated = kv.update_schema("images", IMAGES_SCHEMA_VERSION)
194-
if ("images" in kv and is_updated) or CI == "1":
196+
is_current_schema = kv.is_current_schema("images", IMAGES_SCHEMA_VERSION)
197+
if ("images" in kv and is_current_schema) or CI == "1":
195198
print(f"{datetime.datetime.now()} - skipped - already updated")
196199
return
197200
print(f"{datetime.datetime.now()} - updating images")
@@ -202,6 +205,7 @@ def update_images():
202205
if not image:
203206
continue
204207
images.append(image)
208+
205209
data = ImagesData(repositories=Repository(linuxserver=images))
206210
last_updated = datetime.datetime.now(datetime.timezone.utc).isoformat(' ', 'seconds')
207211
response = ImagesResponse(status="OK", last_updated=last_updated, data=data)

0 commit comments

Comments
 (0)