(ns monostate)
(def ^:private session-state
(atom {:user-id nil
:permissions #{}
:last-access nil}))
(defn start-session
"Starts a new user session with ID and permissions."
[user-id permissions]
(reset! session-state {:user-id user-id
:permissions permissions
:last-access (java.time.Instant/now)}))
(defn end-session
"Ends the session, resetting the state to default values."
[]
(reset! session-state {:user-id nil
:permissions #{}
:last-access nil}))
(defn update-last-access
"Updates the last access timestamp to the current time."
[]
(swap! session-state assoc :last-access (java.time.Instant/now)))
(defn get-session
"Retrieves the complete state of the current session."
[]
@session-state)
(defn has-permission?
"Checks if the user has a specific permission."
[permission]
(contains? (:permissions @session-state) permission))
(comment
(start-session "user-123" #{"read" "write"})
;; => {:user-id "user-123", :permissions #{"read" "write"}, :last-access <timestamp>}
(has-permission? "read") ;; => true
(has-permission? "delete") ;; => false
(update-last-access)
(get-session)
;; => {:user-id "user-123", :permissions #{"read" "write"}, :last-access <new-timestamp>}
(end-session)
;; => {:user-id nil, :permissions #{}, :last-access nil}
)
![Cover image for Clojure Is Awesome!!! [PART 4]](https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12jamolozgaxseegg5bu.jpg)
Speedy emails, satisfied customers
Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)