diff --git a/backend/Dockerfile b/backend/Dockerfile index e953efde..c0a8ad48 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -47,6 +47,9 @@ RUN npm ci --omit=dev COPY --from=builder /app/dist ./dist +# Copy migrations for auto-migrate on startup +COPY migrations ./migrations + # Create local images directory for when MinIO is not configured RUN mkdir -p /app/public/images/products diff --git a/backend/src/routes/intelligence.ts b/backend/src/routes/intelligence.ts index 4da15411..fb970965 100644 --- a/backend/src/routes/intelligence.ts +++ b/backend/src/routes/intelligence.ts @@ -27,8 +27,8 @@ router.get('/brands', async (req: Request, res: Response) => { array_agg(DISTINCT d.state) FILTER (WHERE d.state IS NOT NULL) as states, COUNT(DISTINCT d.id) as store_count, COUNT(DISTINCT sp.id) as sku_count, - ROUND(AVG(sp.price_rec)::numeric, 2) FILTER (WHERE sp.price_rec > 0) as avg_price_rec, - ROUND(AVG(sp.price_med)::numeric, 2) FILTER (WHERE sp.price_med > 0) as avg_price_med + ROUND(AVG(sp.price_rec) FILTER (WHERE sp.price_rec > 0)::numeric, 2) as avg_price_rec, + ROUND(AVG(sp.price_med) FILTER (WHERE sp.price_med > 0)::numeric, 2) as avg_price_med FROM store_products sp JOIN dispensaries d ON sp.dispensary_id = d.id WHERE sp.brand_name_raw IS NOT NULL AND sp.brand_name_raw != '' @@ -154,10 +154,9 @@ router.get('/pricing', async (req: Request, res: Response) => { SELECT sp.category_raw as category, ROUND(AVG(sp.price_rec)::numeric, 2) as avg_price, - MIN(sp.price_rec) FILTER (WHERE sp.price_rec > 0) as min_price, + MIN(sp.price_rec) as min_price, MAX(sp.price_rec) as max_price, - ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY sp.price_rec)::numeric, 2) - FILTER (WHERE sp.price_rec > 0) as median_price, + ROUND(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY sp.price_rec)::numeric, 2) as median_price, COUNT(*) as product_count FROM store_products sp WHERE sp.category_raw IS NOT NULL AND sp.price_rec > 0 @@ -169,7 +168,7 @@ router.get('/pricing', async (req: Request, res: Response) => { SELECT d.state, ROUND(AVG(sp.price_rec)::numeric, 2) as avg_price, - MIN(sp.price_rec) FILTER (WHERE sp.price_rec > 0) as min_price, + MIN(sp.price_rec) as min_price, MAX(sp.price_rec) as max_price, COUNT(DISTINCT sp.id) as product_count FROM store_products sp