From de70fbde5a77712e906bd2385e3a71a6051e8660 Mon Sep 17 00:00:00 2001 From: Glenn Thompson Date: Mon, 29 Dec 2025 12:16:12 +0300 Subject: [PATCH] refactor: Address PR review feedback for timestamp handling - Rename format-timestamp-for-postgres to format-timestamp-iso8601 (database-agnostic) - Reuse format-timestamp-iso8601 in authenticate-user instead of inline formatting - Change listened_at field type from integer to timestamp for consistency --- database.lisp | 10 +++++----- user-management.lisp | 6 +----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/database.lisp b/database.lisp index 4b34c21..37b6a6a 100644 --- a/database.lisp +++ b/database.lisp @@ -61,7 +61,7 @@ (db:create "user_listening_history" '((user_id :integer) (track_title :text) (track_artist :text) - (listened_at :integer) + (listened_at :timestamp) (duration_seconds :integer)))) (unless (db:collection-exists-p "user_playlists") @@ -98,8 +98,8 @@ (string= (string-upcase (package-name (db:implementation))) "I-LAMBDALITE")) -(defun format-timestamp-for-postgres (value) - "Convert a timestamp value to ISO 8601 format for PostgreSQL. +(defun format-timestamp-iso8601 (value) + "Convert a timestamp value to ISO 8601 format. Handles: integers (Unix epoch), local-time timestamps, strings, and NIL." (cond ((null value) nil) @@ -124,10 +124,10 @@ Handles: integers (Unix epoch), local-time timestamps, strings, and NIL." (last-login (dm:field data-model "last-login"))) (when created-date (setf (dm:field data-model "created-date") - (format-timestamp-for-postgres created-date))) + (format-timestamp-iso8601 created-date))) (when last-login (setf (dm:field data-model "last-login") - (format-timestamp-for-postgres last-login)))))) + (format-timestamp-iso8601 last-login)))))) (defun data-model-save (data-model) "Wrapper on data-model save method to bypass error using dm:save on lambdalite. diff --git a/user-management.lisp b/user-management.lisp index ef6f860..3acf20c 100644 --- a/user-management.lisp +++ b/user-management.lisp @@ -70,14 +70,10 @@ (when (and (= 1 user-active) (verify-password password user-password)) ;; Update last login using data-model (database agnostic) - ;; Use ISO 8601 format in UTC that PostgreSQL TIMESTAMP can parse (handler-case (progn (setf (dm:field user "last-login") - (local-time:format-timestring nil (local-time:now) - :format '(:year "-" (:month 2) "-" (:day 2) " " - (:hour 2) ":" (:min 2) ":" (:sec 2)) - :timezone local-time:+utc-zone+)) + (format-timestamp-iso8601 (local-time:now))) ;; Use data-model-save to normalize all timestamp fields before saving (data-model-save user)) (error (e)