22from sqlmodel import Session , select
33
44from solesearch_api .models .sneaker import Sneaker
5- from solesearch_api .tasks import app
65from solesearch_api .db import engine
76
87logfire .configure (service_name = "worker" )
98
109
11- @app .task (name = "create_or_update_sneaker" )
1210def 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