feat(provenance): ArtistService resolves images via artist_id
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -47,18 +47,12 @@ class ArtistService:
|
|||||||
aid = artist.id
|
aid = artist.id
|
||||||
|
|
||||||
img_join = (
|
img_join = (
|
||||||
select(ImageRecord.id)
|
select(ImageRecord.id).where(ImageRecord.artist_id == aid)
|
||||||
.join(ImageProvenance, ImageProvenance.image_record_id == ImageRecord.id)
|
|
||||||
.join(Source, Source.id == ImageProvenance.source_id)
|
|
||||||
.where(Source.artist_id == aid)
|
|
||||||
)
|
)
|
||||||
image_count = (
|
image_count = (
|
||||||
await self.session.execute(
|
await self.session.execute(
|
||||||
select(func.count(func.distinct(ImageRecord.id)))
|
select(func.count(ImageRecord.id))
|
||||||
.select_from(ImageRecord)
|
.where(ImageRecord.artist_id == aid)
|
||||||
.join(ImageProvenance, ImageProvenance.image_record_id == ImageRecord.id)
|
|
||||||
.join(Source, Source.id == ImageProvenance.source_id)
|
|
||||||
.where(Source.artist_id == aid)
|
|
||||||
)
|
)
|
||||||
).scalar_one()
|
).scalar_one()
|
||||||
|
|
||||||
@@ -162,11 +156,7 @@ class ArtistService:
|
|||||||
# over ImageRecord fails in Postgres because its json columns have
|
# over ImageRecord fails in Postgres because its json columns have
|
||||||
# no equality operator.
|
# no equality operator.
|
||||||
stmt = select(ImageRecord).where(
|
stmt = select(ImageRecord).where(
|
||||||
ImageRecord.id.in_(
|
ImageRecord.artist_id == artist.id
|
||||||
select(ImageProvenance.image_record_id)
|
|
||||||
.join(Source, Source.id == ImageProvenance.source_id)
|
|
||||||
.where(Source.artist_id == artist.id)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
if cursor:
|
if cursor:
|
||||||
cur_ts, cur_id = decode_cursor(cursor)
|
cur_ts, cur_id = decode_cursor(cursor)
|
||||||
|
|||||||
@@ -82,3 +82,25 @@ async def test_paged_images(db):
|
|||||||
async def test_paged_images_unknown_slug_none(db):
|
async def test_paged_images_unknown_slug_none(db):
|
||||||
svc = ArtistService(db)
|
svc = ArtistService(db)
|
||||||
assert await svc.images("ghost", cursor=None, limit=10) is None
|
assert await svc.images("ghost", cursor=None, limit=10) is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_overview_and_images_include_artist_id_only(db):
|
||||||
|
# FC-2d-vii-c: a folder-style image has artist_id but no provenance.
|
||||||
|
a = Artist(name="Solo", slug="solo")
|
||||||
|
db.add(a)
|
||||||
|
await db.flush()
|
||||||
|
rec = ImageRecord(
|
||||||
|
path="/images/s/1.jpg", sha256="s" + "0" * 63,
|
||||||
|
size_bytes=1, mime="image/jpeg", width=1, height=1,
|
||||||
|
origin="imported_filesystem", integrity_status="unknown",
|
||||||
|
artist_id=a.id,
|
||||||
|
)
|
||||||
|
db.add(rec)
|
||||||
|
await db.flush()
|
||||||
|
|
||||||
|
svc = ArtistService(db)
|
||||||
|
ov = await svc.overview("solo")
|
||||||
|
assert ov["image_count"] == 1
|
||||||
|
page = await svc.images("solo", cursor=None, limit=10)
|
||||||
|
assert [i["id"] for i in page.images] == [rec.id]
|
||||||
|
|||||||
Reference in New Issue
Block a user