@@ -7,6 +7,11 @@ import {
77import { connectToDatabase } from "@/lib/mongodb" ;
88import { NextResponse } from "next/server" ;
99import Shipment from "@/models/shipment" ;
10+ import { resolveMonitoringAction } from "@/lib/monitoring-logic" ;
11+ import {
12+ buildNewEventsMessage ,
13+ buildDateChangedMessage ,
14+ } from "@/lib/message-builders" ;
1015
1116export async function GET ( ) {
1217 try {
@@ -31,55 +36,47 @@ export async function GET() {
3136 const latestExpectedDeliveryDate =
3237 latestShipmentStatusData . data . expectedDeliveryDate ;
3338 const currentExpectedDeliveryDate = shipmentFromDb . expectedDeliveryDate ;
34- const deliveryDateChanged =
35- latestExpectedDeliveryDate !== currentExpectedDeliveryDate ;
3639
37- const hasNewEvents =
38- latestShipmentStatusData . data . events . length >
39- shipmentFromDb . events . length ;
40+ const action = resolveMonitoringAction ( {
41+ storedEvents : shipmentFromDb . events ,
42+ storedDeliveryDate : currentExpectedDeliveryDate ,
43+ latestEvents : latestShipmentStatusData . data . events ,
44+ latestDeliveryDate : latestExpectedDeliveryDate ,
45+ } ) ;
4046
41- if ( hasNewEvents ) {
42- const newEvents = latestShipmentStatusData . data . events . slice (
43- 0 ,
44- latestShipmentStatusData . data . events . length -
45- shipmentFromDb . events . length ,
46- ) ;
47+ if ( action . type === "new_events" ) {
48+ const { newEvents, updatedDeliveryDate } = action ;
4749
4850 shipmentFromDb . events = [ ...newEvents , ...shipmentFromDb . events ] ;
49- shipmentFromDb . expectedDeliveryDate = latestExpectedDeliveryDate ;
50-
51- const message =
52- `\nβββββββββββββββββββββ\n` +
53- `π¦ **Shipment Update!** π¦\n\n` +
54- `π Your shipment **${ shipmentFromDb . title } ** has new events:\n\n` +
55- `π **Location:** ${ newEvents [ 0 ] . location } \n` +
56- `π **Details:** ${ newEvents [ 0 ] . details } \n` +
57- `π
**Date:** ${ newEvents [ 0 ] . date } \n` +
58- `β° **Time:** ${ newEvents [ 0 ] . time } \n` +
59- ( latestExpectedDeliveryDate
60- ? `π **Expected Delivery:** ${ latestExpectedDeliveryDate } \n`
61- : "" ) ;
51+ // Never overwrite a known date with null (scraping fluke guard)
52+ if ( updatedDeliveryDate !== null ) {
53+ shipmentFromDb . expectedDeliveryDate = updatedDeliveryDate ;
54+ }
55+
56+ const message = buildNewEventsMessage ( {
57+ trackingId : shipmentFromDb . trackingId ,
58+ title : shipmentFromDb . title ,
59+ latestEvent : newEvents [ 0 ] ,
60+ updatedDeliveryDate,
61+ } ) ;
6262
6363 await sendMessage ( {
6464 userDiscordId : shipmentFromDb . userDiscordId ,
6565 message,
6666 } ) ;
6767
6868 await shipmentFromDb . save ( ) ;
69- } else if ( deliveryDateChanged ) {
70- // No new scan events, but delivery date changed (or became available for the first time)
71- shipmentFromDb . expectedDeliveryDate = latestExpectedDeliveryDate ;
72-
73- const message =
74- `\nβββββββββββββββββββββ\n` +
75- `π¦ **Shipment Update!** π¦\n\n` +
76- `π Your shipment **${ shipmentFromDb . title } ** has an updated delivery date:\n\n` +
77- ( currentExpectedDeliveryDate
78- ? `π **Previous Delivery Date:** ${ currentExpectedDeliveryDate } \n`
79- : "" ) +
80- ( latestExpectedDeliveryDate
81- ? `π **New Expected Delivery:** ${ latestExpectedDeliveryDate } \n`
82- : `π **Expected Delivery Date:** Not available yet\n` ) ;
69+ } else if ( action . type === "date_changed" ) {
70+ // Delivery date changed or became available for the first time
71+ const { previousDate, updatedDeliveryDate } = action ;
72+ shipmentFromDb . expectedDeliveryDate = updatedDeliveryDate ;
73+
74+ const message = buildDateChangedMessage ( {
75+ trackingId : shipmentFromDb . trackingId ,
76+ title : shipmentFromDb . title ,
77+ previousDate,
78+ updatedDeliveryDate,
79+ } ) ;
8380
8481 await sendMessage ( {
8582 userDiscordId : shipmentFromDb . userDiscordId ,
0 commit comments