Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add preview image id to impressions table #73

Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""adding preview image

Revision ID: 3d17fcf49eaa
Revises: f6ccafdb5b24
Create Date: 2025-01-31 15:54:10.085416

"""
from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision: str = '3d17fcf49eaa'
down_revision: Union[str, None] = 'f6ccafdb5b24'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
op.add_column("impressions", sa.Column("preview_image_id", sa.UUID, nullable=True))

op.create_foreign_key(
"fk_impressions_images",
"impressions",
"images",
["preview_image_id"],
["image_id"]
)


def downgrade() -> None:
op.drop_constraint("fk_impressions_images", "impressions", type_="foreignkey")
op.drop_column("impressions", "preview_image_id")
20 changes: 20 additions & 0 deletions src/poprox_storage/repositories/articles.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json
import logging
from collections import defaultdict
from datetime import datetime, timedelta
from uuid import UUID

Expand Down Expand Up @@ -169,6 +170,25 @@ def fetch_mentions(self) -> list[Mention]:
mentions.append(mention)
return mentions

def fetch_associated_image_ids(self, articles: list[Article]) -> dict[UUID, list[UUID]]:
association_table = self.tables["article_image_associations"]

article_ids = [a.article_id for a in articles]
association_query = select(association_table.c.article_id, association_table.c.image_id).where(
association_table.c.article_id.in_(article_ids)
)

association_result = self.conn.execute(association_query).fetchall()

# Converting association_result into a dictionary
article_image_dict = defaultdict(list)
for article_id, image_id in association_result:
if article_id not in article_image_dict:
article_image_dict[article_id] = []
article_image_dict[article_id].append(image_id)

return article_image_dict

def fetch_article_by_url(self, article_url: str, newsletter_id: UUID | None = None) -> UUID | None:
impression_table = self.tables["impressions"]
article_table = self.tables["articles"]
Expand Down
15 changes: 14 additions & 1 deletion src/poprox_storage/repositories/newsletters.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Table,
and_,
insert,
null,
select,
)

Expand Down Expand Up @@ -41,9 +42,15 @@ def store_newsletter(self, newsletter: Newsletter):
self.conn.execute(stmt)

for impression in newsletter.impressions:
if impression.article.preview_image_id:
preview_image_id = str(impression.article.preview_image_id)
else:
preview_image_id = null()

stmt = insert(impression_table).values(
newsletter_id=str(newsletter.newsletter_id),
article_id=str(impression.article.article_id),
preview_image_id=preview_image_id,
position=impression.position,
)
self.conn.execute(stmt)
Expand Down Expand Up @@ -147,7 +154,12 @@ def _fetch_newsletters(self, newsletters_table, impressions_table, articles_tabl
newsletter_result = self.conn.execute(newsletter_query).fetchall()

impressions_query = (
select(impressions_table.c.newsletter_id, impressions_table.c.position, articles_table)
select(
impressions_table.c.newsletter_id,
impressions_table.c.preview_image_id,
impressions_table.c.position,
articles_table,
)
.join(
impressions_table,
articles_table.c.article_id == impressions_table.c.article_id,
Expand All @@ -164,6 +176,7 @@ def _convert_to_newsletter_objs(self, newsletter_result, impressions_result):
impressions_by_newsletter_id[row.newsletter_id].append(
Impression(
newsletter_id=row.newsletter_id,
preview_image_id=row.preview_image_id,
position=row.position,
article=Article(
article_id=row.article_id,
Expand Down
Loading