Skip sync for existing data and too-recent dates
- Check consumption table before fetching; return early if data exists - Return "no data to fetch" for dates >= yesterday (not yet available) - Add sync-month.sh script to sync all days in a month - Add kill-server.sh script to free port 3000 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -246,31 +246,44 @@
|
||||
"Fetch all Eloverblik data and save to database.
|
||||
date is a LocalDate for which to fetch time series (one day)."
|
||||
[query-fn ^LocalDate date]
|
||||
(log/info "Starting Eloverblik fetch for" (.format date date-fmt))
|
||||
(let [refresh-token (read-refresh-token)
|
||||
access-token (get-access-token refresh-token)]
|
||||
(if-not access-token
|
||||
(do (log/error "Failed to get Eloverblik access token")
|
||||
{:error "Failed to get access token"})
|
||||
(let [mps (fetch-metering-points access-token)
|
||||
all-ids (->> mps
|
||||
(mapcat (fn [mp]
|
||||
(cons (:meteringPointId mp)
|
||||
(map :meteringPointId
|
||||
(:childMeteringPoints mp)))))
|
||||
(distinct)
|
||||
(vec))
|
||||
from date
|
||||
to (.plusDays date 1)]
|
||||
(log/info "Found" (count all-ids) "metering points:" all-ids)
|
||||
(save-metering-points! query-fn mps)
|
||||
;; Time series
|
||||
(let [ts-resp (fetch-time-series access-token all-ids from to)
|
||||
readings (parse-time-series ts-resp all-ids)]
|
||||
(save-time-series! query-fn readings from))
|
||||
;; Charges
|
||||
(let [ch-resp (fetch-charges access-token all-ids)]
|
||||
(save-charges! query-fn ch-resp))
|
||||
{:metering-points (count all-ids)
|
||||
:from (.format from date-fmt)
|
||||
:to (.format to date-fmt)}))))
|
||||
(let [yesterday (.minusDays (LocalDate/now dk-zone) 1)
|
||||
time-start (utc-start-for-date date)
|
||||
cnt (:cnt (query-fn :count-consumption-for-date
|
||||
{:time-start time-start}))]
|
||||
(cond
|
||||
(not (.isBefore date yesterday))
|
||||
(do (log/info "No data to fetch for" (.format date date-fmt) "(too recent)")
|
||||
{:no-data true :date (.format date date-fmt)})
|
||||
|
||||
(and cnt (pos? cnt))
|
||||
(do (log/info "Data already exists for" (.format date date-fmt))
|
||||
{:exists true :date (.format date date-fmt)})
|
||||
:else
|
||||
(do
|
||||
(log/info "Starting Eloverblik fetch for" (.format date date-fmt))
|
||||
(let [refresh-token (read-refresh-token)
|
||||
access-token (get-access-token refresh-token)]
|
||||
(if-not access-token
|
||||
(do (log/error "Failed to get Eloverblik access token")
|
||||
{:error "Failed to get access token"})
|
||||
(let [mps (fetch-metering-points access-token)
|
||||
all-ids (->> mps
|
||||
(mapcat (fn [mp]
|
||||
(cons (:meteringPointId mp)
|
||||
(map :meteringPointId
|
||||
(:childMeteringPoints mp)))))
|
||||
(distinct)
|
||||
(vec))
|
||||
from date
|
||||
to (.plusDays date 1)]
|
||||
(log/info "Found" (count all-ids) "metering points:" all-ids)
|
||||
(save-metering-points! query-fn mps)
|
||||
(let [ts-resp (fetch-time-series access-token all-ids from to)
|
||||
readings (parse-time-series ts-resp all-ids)]
|
||||
(save-time-series! query-fn readings from))
|
||||
(let [ch-resp (fetch-charges access-token all-ids)]
|
||||
(save-charges! query-fn ch-resp))
|
||||
{:metering-points (count all-ids)
|
||||
:from (.format from date-fmt)
|
||||
:to (.format to date-fmt)})))))))
|
||||
|
||||
|
||||
@@ -182,8 +182,14 @@
|
||||
(java.time.LocalDate/now dk-zone))
|
||||
result (eloverblik/fetch-and-save-all! query-fn date)]
|
||||
(fragment
|
||||
(if (:error result)
|
||||
(cond
|
||||
(:error result)
|
||||
[:p {:class "text-red-600 font-medium"} (:error result)]
|
||||
(:no-data result)
|
||||
[:p {:class "text-gray-400"} (str "No data to fetch for " (:date result))]
|
||||
(:exists result)
|
||||
[:p {:class "text-gray-500"} (str "Data exists for " (:date result))]
|
||||
:else
|
||||
[:p {:class "text-green-700 font-medium"}
|
||||
(str "Synced " (:metering-points result)
|
||||
" metering points (" (:from result) " to " (:to result) ")")]))))
|
||||
|
||||
Reference in New Issue
Block a user