Source code for dakweb.routers.source
# SPDX-License-Identifier: GPL-2.0-or-later
# © 2026, Ansgar 🙀 <ansgar@debian.org>
# © 2026, Anton Gladky <gladk@debian.org>
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy import or_, select
from sqlalchemy.orm import Session
from daklib.dbconn import (
DBSource,
DSCFile,
MetadataKey,
PoolFile,
SourceMetadata,
Suite,
)
from dakweb.routers.deps import get_db
router = APIRouter()
[docs]
class DscInSuite(BaseModel):
version: str
component: str
filename: str
filesize: int
sha256sum: str
[docs]
@router.get("/dsc_in_suite/{suite}/{source}")
def dsc_in_suite(
suite: str,
source: str,
db: Session = Depends(get_db),
) -> list[DscInSuite]:
"""Find all dsc files for a given source package in a given suite."""
stmt = (
select(DSCFile)
.join(PoolFile)
.join(DBSource)
.join(Suite, DBSource.suites)
.where(or_(Suite.suite_name == suite, Suite.codename == suite))
.where(DBSource.source == source)
.where(PoolFile.filename.endswith(".dsc"))
)
return [
DscInSuite(
version=p.source.version,
component=p.poolfile.component.component_name,
filename=p.poolfile.filename,
filesize=p.poolfile.filesize,
sha256sum=p.poolfile.sha256sum,
)
for p in db.scalars(stmt)
]
[docs]
class FileInArchive(BaseModel):
filename: str
component: str
sha256sum: str
[docs]
@router.get("/file_in_archive/{filepattern:path}")
def file_in_archive(
filepattern: str,
db: Session = Depends(get_db),
) -> list[FileInArchive]:
"""Check if a file pattern is known to the archive (SQL LIKE syntax)."""
stmt = select(PoolFile).where(PoolFile.filename.like(filepattern))
return [
FileInArchive(
filename=p.filename,
component=p.component.component_name,
sha256sum=p.sha256sum,
)
for p in db.scalars(stmt)
]
[docs]
@router.get("/sha256sum_in_archive/{sha256sum}")
def sha256sum_in_archive(
sha256sum: str,
db: Session = Depends(get_db),
) -> list[FileInArchive]:
"""Check if files with matching sha256sums are known to the archive."""
stmt = select(PoolFile).where(PoolFile.sha256sum == sha256sum)
return [
FileInArchive(
filename=p.filename,
component=p.component.component_name,
sha256sum=p.sha256sum,
)
for p in db.scalars(stmt)
]
[docs]
class SourcesInSuite(BaseModel):
source: str
version: str
[docs]
@router.get("/sources_in_suite/{suite}")
def sources_in_suite(
suite: str,
db: Session = Depends(get_db),
) -> list[SourcesInSuite]:
"""Return all source packages and versions in a given suite."""
stmt = (
select(DBSource)
.join(Suite, DBSource.suites)
.where(or_(Suite.suite_name == suite, Suite.codename == suite))
)
return [
SourcesInSuite(source=p.source, version=p.version) for p in db.scalars(stmt)
]
[docs]
@router.get("/all_sources")
def all_sources(db: Session = Depends(get_db)) -> list[SourcesInSuite]:
"""Return all source packages and versions known to the archive (includes NEW)."""
return [
SourcesInSuite(source=p.source, version=p.version)
for p in db.scalars(select(DBSource))
]