Skip to content

Commit 04754ae

Browse files
FIXED UPSERT
1 parent 217d41f commit 04754ae

1 file changed

Lines changed: 58 additions & 25 deletions

File tree

src/solesearch_api/tasks/db/base.py

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22
from sqlmodel import Session, select
33

44
from solesearch_api.models.sneaker import Sneaker
5-
from solesearch_api.tasks import app
65
from solesearch_api.db import engine
76

87
logfire.configure(service_name="worker")
98

109

11-
@app.task(name="create_or_update_sneaker")
1210
def create_or_update_sneaker(
1311
sneaker: Sneaker,
1412
):
@@ -21,45 +19,42 @@ def create_or_update_sneaker(
2119
like links, images, sizes, and prices.
2220
2321
Args:
24-
- sneaker: The sneaker object to create or update
22+
sneaker: The sneaker object to create or update
2523
2624
Returns:
27-
- The created or updated sneaker object
25+
The created or updated sneaker object
2826
"""
2927
# Check if sneaker already exists with eager loading of relationships
3028
statement = select(Sneaker).where(
3129
Sneaker.sku == sneaker.sku,
3230
Sneaker.brand == sneaker.brand,
3331
)
3432
existing_sneaker = session.exec(statement).first()
35-
if existing_sneaker is None:
36-
logfire.info(
37-
"Sneaker not found, creating new sneaker",
38-
sneaker=sneaker,
39-
)
40-
# Just add the new sneaker if it doesn't exist already
41-
result = sneaker
42-
else:
33+
34+
if existing_sneaker:
4335
logfire.info(
44-
"Sneaker found, updating existing sneaker",
36+
f"{sneaker.brand} SKU '{sneaker.sku}' found, updating existing sneaker",
4537
sneaker=sneaker,
4638
existing_sneaker=existing_sneaker,
4739
)
40+
4841
# Update existing sneaker with new information
49-
existing_sneaker.name = sneaker.name or existing_sneaker.name
42+
existing_sneaker.name = choose_better_name(
43+
existing_sneaker.name, sneaker.name
44+
)
5045
existing_sneaker.parent_sku = (
51-
sneaker.parent_sku or existing_sneaker.parent_sku
46+
existing_sneaker.parent_sku or sneaker.parent_sku
5247
)
53-
existing_sneaker.audience = sneaker.audience or existing_sneaker.audience
48+
existing_sneaker.audience = existing_sneaker.audience or sneaker.audience
5449
existing_sneaker.release_date = (
55-
sneaker.release_date or existing_sneaker.release_date
50+
existing_sneaker.release_date or sneaker.release_date
5651
)
57-
existing_sneaker.retail_price = (
58-
sneaker.retail_price or existing_sneaker.retail_price
52+
existing_sneaker.retail_price = max(
53+
existing_sneaker.retail_price, sneaker.retail_price
5954
)
60-
existing_sneaker.colorway = sneaker.colorway or existing_sneaker.colorway
61-
existing_sneaker.description = (
62-
sneaker.description or existing_sneaker.description
55+
existing_sneaker.colorway = existing_sneaker.colorway or sneaker.colorway
56+
existing_sneaker.description = choose_better_description(
57+
existing_sneaker.description, sneaker.description
6358
)
6459
existing_sneaker.source = existing_sneaker.source or sneaker.source
6560
existing_sneaker.stockx_id = existing_sneaker.stockx_id or sneaker.stockx_id
@@ -71,22 +66,60 @@ def create_or_update_sneaker(
7166
existing_link_urls = {link.url for link in existing_sneaker.links}
7267
for link in sneaker.links:
7368
if link.url not in existing_link_urls:
69+
link.sneaker = existing_sneaker
7470
existing_sneaker.links.append(link)
7571

7672
# Add any new images
7773
existing_image_urls = {image.url for image in existing_sneaker.images}
7874
for image in sneaker.images:
7975
if image.url not in existing_image_urls:
80-
session.add(image)
76+
image.sneaker = existing_sneaker
8177
existing_sneaker.images.append(image)
8278

8379
# Add any new sizes
8480
existing_size_values = {size.value for size in existing_sneaker.sizes}
8581
for size in sneaker.sizes:
8682
if size.value not in existing_size_values:
87-
session.add(size)
83+
size.sneaker = existing_sneaker
8884
existing_sneaker.sizes.append(size)
85+
86+
session.add(existing_sneaker)
8987
result = existing_sneaker
90-
session.add(result)
88+
89+
else:
90+
logfire.info(
91+
f"{sneaker.brand} SKU '{sneaker.sku}' not found, creating new sneaker",
92+
sneaker=sneaker,
93+
)
94+
session.add(sneaker)
95+
result = sneaker
96+
9197
session.commit()
98+
logfire.info(
99+
"Committed session",
100+
)
92101
return result
102+
103+
104+
def choose_better_name(existing_name: str, new_name: str) -> str:
105+
"""
106+
Custom logic to determine the best sneaker name.
107+
Example: If one is more descriptive (longer), prefer it.
108+
"""
109+
if not existing_name:
110+
return new_name
111+
if not new_name:
112+
return existing_name
113+
return new_name if len(new_name) > len(existing_name) else existing_name
114+
115+
116+
def choose_better_description(existing_desc: str, new_desc: str) -> str:
117+
"""
118+
Custom logic to determine the best description.
119+
Example: Prefer the longer description.
120+
"""
121+
if not existing_desc:
122+
return new_desc
123+
if not new_desc:
124+
return existing_desc
125+
return new_desc if len(new_desc) > len(existing_desc) else existing_desc

0 commit comments

Comments
 (0)