diff of 993870748bbc4d8315468a7f0a039e0daf60168a

993870748bbc4d8315468a7f0a039e0daf60168a
diff --git a/aggressive-murja.asd b/aggressive-murja.asd
index 203a241..4756fd5 100644
--- a/aggressive-murja.asd
+++ b/aggressive-murja.asd
@@ -41,10 +41,7 @@
 			       (:file "migrations")
 			       (:file "json")))
 		 (:file "migration-list")
-		 (:module "users"
-		  :components ((:file "user-db")))
 		 (:file "session-db")
-		 (:file "settings")
 		 (:file "middleware-db")
 		 (:module "model"
 		  :components
@@ -71,8 +68,7 @@
 
 		 (:module "routes"
 		  :components
-		  ((:file "settings-routes")
-		   (:file "login-routes")
+		  ((:file "login-routes")
 		   (:file "post-routes")
 		   (:file "media-routes")
 		   (:file "rss-routes")
diff --git a/resources/sql/media-fns.sql b/resources/sql/media-fns.sql
index 5d905d4..fe04fa1 100644
--- a/resources/sql/media-fns.sql
+++ b/resources/sql/media-fns.sql
@@ -5,14 +5,6 @@ insert into blog.media (name, data) values ($1, $2) returning id;
 -- returns: :array-hash
 select name, data from blog.media where id = $1::uuid ;
 
--- name: list-pictures*
--- returns: :array-hash
-select id, name from blog.media;
-
 -- name: delete-picture* :!
 -- returns: :array-hash
 delete from blog.media where id = $1::uuid;
-
--- name: select-referencing-posts* :?
--- returns: :array-hash
-select * from blog.media_post_pairing where media_id = $1;
diff --git a/src/media/media-db.lisp b/src/media/media-db.lisp
index af41a9b..746097f 100644
--- a/src/media/media-db.lisp
+++ b/src/media/media-db.lisp
@@ -3,11 +3,8 @@
   (:import-from :com.inuoe.jzon :parse)
   (:import-from :halisql :defqueries)
   (:import-from :lisp-fixup :fix-timestamp)
-  (:export :list-pictures :get-media :insert-media :select-referencing-posts*))
+  (:export :get-media :insert-media :select-referencing-posts*))
 
 (in-package :murja.media.media-db)
 
 (defqueries "media-fns")
-
-(defun list-pictures ()
-  (list-pictures*))
diff --git a/src/middleware-db.lisp b/src/middleware-db.lisp
index 8cc9a45..e22299c 100644
--- a/src/middleware-db.lisp
+++ b/src/middleware-db.lisp
@@ -43,18 +43,17 @@
 (defun @transaction (next)
   (with-db
       (handler-bind ((cl-postgres:database-socket-error
-		     (lambda (c)
-		       (log:error "Socket error from db: ~a~%" c)
-		       (setf (hunchentoot:return-code*) 500)
-		       (return-from @transaction "Internal Server Error")))
+		       (lambda (c)
+			 (log:error "Socket error from db: ~a~%" c)
+			 (setf (hunchentoot:return-code*) 500)
+			 (return-from @transaction "Internal Server Error")))
 		     (cl-postgres:database-error
 		       (lambda (c)
 			 (log:error "Error from db: ~a~%" c)
 			 (setf (hunchentoot:return-code*) 500)
 			 (return-from @transaction "Internal Server Error"))))
 	(with-transaction (:repeatable-read-rw)
-	  (let* ((murja.settings:*settings* (murja.settings:get-settings)))
-	    (funcall next))))))
+	  (funcall next)))))
 
 (defun @db (next)
   (with-db
@@ -68,5 +67,4 @@
 			 (log:error "Error from db: ~a~%" c)
 			 (setf (hunchentoot:return-code*) 500)
 			 (return-from @db "Internal Server Error"))))
-	(let* ((murja.settings:*settings* (murja.settings:get-settings)))
-	  (funcall next)))))
+	(funcall next))))
diff --git a/src/middleware/auth.lisp b/src/middleware/auth.lisp
index f1d39b8..ea9172e 100644
--- a/src/middleware/auth.lisp
+++ b/src/middleware/auth.lisp
@@ -1,6 +1,7 @@
 (defpackage murja.middleware.auth
-  (:use :cl :postmodern :murja.users.user-db)
+  (:use :cl :postmodern)
   (:import-from :murja.model.user :user-username)
+  (:local-nicknames (:users :murja.model.user))
   (:export :@ssr-authenticated :*now* :*session-key* :*user* :@can?))
 
 (in-package :murja.middleware.auth)
@@ -52,10 +53,10 @@
 	      (log:warn "assert-ownership-username failed for ~a" username-cookie)
 	      "not authorized"))
 	(if user-id
-	    (let ((user (get-user-by-id user-id)))
+	    (let ((user (users:get-user user-id)))
 	      (if (and user
 		       (string= (hunchentoot:session-value :logged-in-username)
-				(gethash "username" user)))
+				(users:user-username user)))
 		  (let ((*user* user)
 			(*session-key* session-cookie))
 		    (funcall next))
@@ -73,8 +74,8 @@
 ;; this is used in murja.routes.media-routes and murja.routes.post-routes, but this (and the previous @authenticated middleware) is obviously deprecated and will hopefully disappear one of these years
 (defun @can? (next ability)
   (if (and *user*
-	   (member ability 
-		   (gethash "permissions" *user*)
+	   (member ability
+		   (users:abilities *user*)
 		   :test #'string=))
       (funcall next)
       (progn
diff --git a/src/model/settings.lisp b/src/model/settings.lisp
index 7db6d3d..aedc917 100644
--- a/src/model/settings.lisp
+++ b/src/model/settings.lisp
@@ -6,8 +6,8 @@
 
 ```
 (define-settings
-  (defsetting site-name \"default-site\")
-  (defsetting test-setting 12345))
+  (site-name \"default-site\")
+  (test-setting 12345))
 ```
 
 After running that form, one can get setting's current value by funcalling its symbol (for example: `(site-name) => \"default site\")`. If you wish to change
diff --git a/src/model/user.lisp b/src/model/user.lisp
index 3037975..43479d7 100644
--- a/src/model/user.lisp
+++ b/src/model/user.lisp
@@ -46,9 +46,29 @@ WHERE
 GROUP BY
   u.id;")
 
-(defun get-user (id)
+(defparameter *user-query-with-password*
+    "SELECT
+  u.id,
+  u.username,
+  u.nickname,
+  u.img_location,
+  u.password,
+  json_agg(DISTINCT perm.action) as abilities
+FROM
+  blog.users u
+  left JOIN blog.groupmapping gm ON u.id = gm.userid
+  left JOIN blog.grouppermissions gp ON gp.groupid = gm.groupid
+  left JOIN blog.permission perm ON gp.permissionid = perm.id
+WHERE
+  WHERE u.Username = $1 AND u.Password = $2
+GROUP BY
+  u.id;")
+
+(defun get-user (id-or-username &optional password)
   "Gets user and populates its abilities"
-  (let ((usr (postmodern:query *user-query* id (:dao User :single))))
+  (let ((usr (if password
+		 (postmodern:query *user-query-with-password* id-or-username password (:dao User :single))
+		 (postmodern:query *user-query* id-or-username (:dao User :single)))))
     (with-slots (abilities) usr 
       (when (stringp abilities)
 	(setf abilities (json:parse abilities))))
diff --git a/src/posts/post-db.lisp b/src/posts/post-db.lisp
index 51e28cb..4ac8d8b 100644
--- a/src/posts/post-db.lisp
+++ b/src/posts/post-db.lisp
@@ -36,6 +36,7 @@
 	(fix-timestamp (gethash "created_at" post)))
   post)
 
+;; still used in the outbound rss stuff 
 (defun get-page (page page-size &key allow-hidden? modified-since)
   (let* ((page (if (< page 1)
 		   1
@@ -48,20 +49,4 @@
     (mapcar #'fix-post 
 	    resulting-page)))
 
-(defun get-post (id &key allow-hidden?)
-  (let* ((posts (coerce (get-by-id* id allow-hidden?) 'list))
-	 (post (first posts)))
-    (when post
-      (fix-post post))))
-    
-(defun get-post-version (id version)
-  (let ((post (first (coerce (get-versioned-by-id* id version) 'list))))
-    (when post 
-      (fix-post post ))))
 
-(defun get-tagged (tag &key allow-hidden?)
-  (let ((posts (coerce (get-tagged* tag allow-hidden?) 'list)))
-    (log:info "Tag ~a returns posts ~a~%" tag (mapcar #'alexandria:hash-table-alist posts))
-    (when posts
-      (mapcar #'fix-post
-	      posts))))
diff --git a/src/routes/login-routes.lisp b/src/routes/login-routes.lisp
index 2c452c2..6943f77 100644
--- a/src/routes/login-routes.lisp
+++ b/src/routes/login-routes.lisp
@@ -1,5 +1,5 @@
 (defpackage murja.routes.login-routes
-  (:use :cl :binding-arrows)
+  (:use :cl :binding-arrows :murja.setting-definitions)
   (:export :get-session-key :set-session-cookies :formdata->hashmap)
   (:import-from :cl-hash-util :hash)
   (:import-from :murja.session :set-session-value)
@@ -10,11 +10,11 @@
   (:import-from :murja.middleware.json :@json)
   (:import-from :easy-routes :defroute)
   (:import-from :com.inuoe.jzon :parse :stringify)
-  (:local-nicknames (:user-db :murja.users.user-db)
-		    (:settings :murja.routes.settings-routes)))
+  (:local-nicknames (:users :murja.model.user)))
 
 (in-package :murja.routes.login-routes)
 
+;; obviously called in forms-post-login
 (defun get-session-key (username)
   "Creates a new db-backed session for new logins"
   (let ((old-sessions (coerce (murja.session.db:login-query-session* (murja.session.db:now) username) 'list)))
@@ -34,7 +34,8 @@
 	      (simple-date:decode-interval max-age)
 	    (values key (lisp-fixup:to-secs year month day hour min sec ms)))))))
 
-(defun set-session-cookies (username session-key max-age settings)
+;; obviously called in forms-post-login
+(defun set-session-cookies (username session-key max-age)
   (hunchentoot:set-cookie "murja-username" :value username
 			  ;; :secure t breaks on localhost
 			  		   :secure (not lisp-fixup:*dev?*)
@@ -43,7 +44,7 @@
 					   :http-only t
 					   :domain ;;send :domain only in linux production envs
 					   (unless lisp-fixup:*dev?*
-					     (gethash "domain" settings))
+					     (domain))
 					   :same-site "Strict")
   
   (hunchentoot:set-cookie "murja-session" :value session-key
@@ -52,34 +53,36 @@
 					  :max-age max-age 
 					  :http-only t
 					  :domain (unless lisp-fixup:*dev?*
-						    (gethash "domain" settings))
+						    (domain))
 					  :same-site "Strict"))
 
-(defun save-initial-data-dump (username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email)
-  (user-db:register-user username nickname "" password)
-  (user-db:cast-only-user-as-admin)
+;; TODO rewrite the initial ui
 
-  (settings:update-setting "domain" domain)
-  (settings:update-setting "blog-title" blog_title)
-  (settings:update-setting "rss-title" rss_title)
-  (settings:update-setting "rss-link" rss_link)
-  (settings:update-setting "rss-description" rss_description)
-  (settings:update-setting "rss-lang" rss_lang)
-  (settings:update-setting "rss-email" rss_email))
+;; (defun save-initial-data-dump (username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email)
+;;   (user-db:register-user username nickname "" password)
+;;   (user-db:cast-only-user-as-admin)
+
+;;   (settings:update-setting "domain" domain)
+;;   (settings:update-setting "blog-title" blog_title)
+;;   (settings:update-setting "rss-title" rss_title)
+;;   (settings:update-setting "rss-link" rss_link)
+;;   (settings:update-setting "rss-description" rss_description)
+;;   (settings:update-setting "rss-lang" rss_lang)
+;;   (settings:update-setting "rss-email" rss_email))
   
 
-(defroute initial-pageview? ("/api/initial" :method :post :decorators (@transaction
-								       @json)) ()
-  (murja.json:bind-json (username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email) () (hunchentoot:raw-post-data :force-text t)
-			(if (user-db:no-users?)
-			    (progn 
-			      (save-initial-data-dump username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email)
-			      (setf (hunchentoot:return-code*) 204)
-			      "")
-			    (progn
-			      (log:warn "Someone called POST /api/initial while there are users")
-			      (setf (hunchentoot:return-code*) 500)
-			      ""))))
+;; (defroute initial-pageview? ("/api/initial" :method :post :decorators (@transaction
+;; 								       @json)) ()
+;;   (murja.json:bind-json (username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email) () (hunchentoot:raw-post-data :force-text t)
+;; 			(if (user-db:no-users?)
+;; 			    (progn 
+;; 			      (save-initial-data-dump username nickname password domain blog_title rss_title rss_link rss_description rss_lang rss_email)
+;; 			      (setf (hunchentoot:return-code*) 204)
+;; 			      "")
+;; 			    (progn
+;; 			      (log:warn "Someone called POST /api/initial while there are users")
+;; 			      (setf (hunchentoot:return-code*) 500)
+;; 			      ""))))
 
 
 
@@ -92,19 +95,18 @@
   (let* ((form (lisp-fixup:formdata->hashmap (hunchentoot:raw-post-data :force-text t)))
 	 (username (gethash "username" form))
 	 (password (gethash "password" form))
-	 (user-row (murja.users.user-db:select-user-by-login username (sha-512 password))))
+	 (user-row (users:get-user username (sha-512 password))))
     (if (and user-row
-	     (string= (gethash "username" user-row) username))
-	(let ((settings (murja.routes.settings-routes:get-settings))
-	      (murja.middleware.auth:*user* (murja.users.user-db:get-user-by-id (gethash "userid" user-row))))
+	     (string= (users:user-username user-row) username))
+	(let ((murja.middleware.auth:*user* user-row))
 	  (multiple-value-bind (session-key max-age) (get-session-key username)
 	    (if session-key
 	      (let ((murja.middleware.auth:*session-key* session-key))
 		
 		(set-session-value :logged-in-username username)
-		(set-session-value :logged-in-user-id (gethash "userid" user-row))
+		(set-session-value :logged-in-user-id (users:user-id user-row))
 		
-		(set-session-cookies username session-key max-age settings)
+		(set-session-cookies username session-key max-age)
 		(log:info "~a logged in successfully~%" username))
 	      (progn
 		(log:error "~a tried to log-in but get-session-key didn't return a session key. This happening signifies a bug" username)))))
diff --git a/src/routes/media-routes.lisp b/src/routes/media-routes.lisp
index 6bf2e71..55f42da 100644
--- a/src/routes/media-routes.lisp
+++ b/src/routes/media-routes.lisp
@@ -3,7 +3,7 @@
   (:import-from :lisp-fixup :slurp-bytes)
   (:import-from :com.inuoe.jzon :stringify :parse)
   (:import-from :murja.middleware.db :@transaction)
-  (:import-from :murja.media.media-db :delete-picture* :list-pictures :insert-media :select-referencing-posts* :get-media)
+  (:import-from :murja.media.media-db :get-media :insert-media :delete-picture*)
    
   (:import-from :murja.middleware.json :@json)
   (:import-from :murja.middleware.auth :@authenticated :@can? :*user*)
@@ -44,7 +44,7 @@
 	    (format nil "inline; filename=~a" (gethash "name" pic)))
       (gethash "data" pic))))
 
-;; I don't think this is called anywhere, but I'm not atm able to improvise a regexp that would make sure it's not 
+;; this is called in murja.view.admin.media-admin
 (defroute delete-pic ("/api/pictures" :method :delete
 				      :decorators (@transaction
 						   @authenticated
diff --git a/src/routes/post-routes.lisp b/src/routes/post-routes.lisp
index cc6eab2..307ebca 100644
--- a/src/routes/post-routes.lisp
+++ b/src/routes/post-routes.lisp
@@ -1,6 +1,5 @@
 (defpackage murja.routes.post-routes
   (:use :cl)
-  (:import-from :murja.routes.settings-routes :get-settings)
   (:import-from :lisp-fixup :partial)
   (:import-from :com.inuoe.jzon :stringify :parse)
   (:import-from :murja.middleware.db :@transaction)
diff --git a/src/routes/root-routes.lisp b/src/routes/root-routes.lisp
index ab49942..221effe 100644
--- a/src/routes/root-routes.lisp
+++ b/src/routes/root-routes.lisp
@@ -5,11 +5,11 @@
   (:import-from :murja.middleware.db :@transaction)
    
   (:import-from :murja.middleware.json :@json)
-  (:import-from :easy-routes :defroute)
-  (:local-nicknames (:user-db :murja.users.user-db)))
+  (:import-from :easy-routes :defroute))
 
 (in-package :murja.routes.root-routes)
 
+;; thsi whole package becomes unnecessary once murja.css has been embedded inside lisp image 
 (defparameter *allowed-resources*
   (let ((result nil))
     (cl-fad:walk-directory
@@ -35,16 +35,6 @@
 	       (mapcar #'pathname))
 	     :initial-value (make-hash-table :test 'equalp))))
 
-(define-condition unknown-mime (error)
-  ((file-type :initarg :file-type
-              :initform nil
-              :accessor file-type))
-  ;; the :report is the message into the debugger:
-  (:report (lambda (condition stream)
-	     (format stream
-		     "Don't know how to transform file of type ~a to a mime type"
-		     (file-type condition)))))
-
 (defun get-resource (file)
   ;; there are not other resources beside murja.css anymore, and I'd love to get rid of it too
   (when (equalp file "murja.css")
diff --git a/src/routes/rss-routes.lisp b/src/routes/rss-routes.lisp
index a2d15ce..dc57161 100644
--- a/src/routes/rss-routes.lisp
+++ b/src/routes/rss-routes.lisp
@@ -1,20 +1,17 @@
 (defpackage murja.routes.rss-routes
-  (:use :cl)
+  (:use :cl :murja.setting-definitions)
   (:import-from :easy-routes :defroute)
   (:import-from :murja.posts.post-db :get-page)
-  (:import-from :murja.routes.settings-routes :get-settings)
   (:import-from :murja.middleware.db :@transaction)
   (:import-from :murja.middleware.auth :@authenticated :*user*))
 
 (in-package :murja.routes.rss-routes)
 
 (defun posts->rss (posts)
-  (let* ((settings (get-settings))
-	 (title (gethash "rss-title" settings))
-	 (link (gethash "rss-link" settings))
-	 (description (gethash "rss-description" settings))
-	 (lang (gethash "rss-lang" settings))
-	 (mail (gethash "rss-mail" settings))
+  (let* ((title (rss-title))
+	 (link (rss-link))
+	 (description (rss-description))
+	 (lang (rss-lang))
 	 (output (make-string-output-stream)))
     (xml-emitter:with-rss2 (output)
       (xml-emitter:rss-channel-header title
@@ -33,13 +30,11 @@
 (defroute rsssss ("/api/rss" :method :get
 			     :decorators ( @transaction)) ()
   (let ((lisp-fixup:*rfc822* t))
-    (let* ((settings (get-settings))
-	   (if-modified-since (when (hunchentoot:header-in* :if-modified-since)
+    (let* ((if-modified-since (when (hunchentoot:header-in* :if-modified-since)
 				(lisp-fixup:if-modified-since->simpledate-timestamp
 				 (hunchentoot:header-in* :if-modified-since))))
-	   (page-size (gethash "recent-post-count" settings))
-	   (page (get-page 1 page-size :allow-hidden? nil
-				       :modified-since if-modified-since))
+	   (page (get-page 1 (page-size) :allow-hidden? nil
+					 :modified-since if-modified-since))
 	   (last-modified 
 	     ;; this application's tz handling is a fucking joke 
 	     (str:replace-all "EST" "GMT" 
diff --git a/src/routes/settings-routes.lisp b/src/routes/settings-routes.lisp
deleted file mode 100644
index d22bc50..0000000
--- a/src/routes/settings-routes.lisp
+++ /dev/null
@@ -1,31 +0,0 @@
-(defpackage murja.routes.settings-routes
-  (:use :cl)
-  (:import-from :halisql :defqueries)
-  (:import-from :lisp-fixup :partial)
-  (:import-from :com.inuoe.jzon :stringify :parse)
-  (:import-from :binding-arrows :->>)
-  (:import-from :murja.middleware.auth :@authenticated :*user*)
-  (:import-from :murja.middleware.json :@json)
-  (:import-from :murja.middleware.db :@transaction)
-  (:import-from :easy-routes :defroute)
-  (:export :update-setting :get-settings))
-
-(in-package :murja.routes.settings-routes)
-
-(defun get-settings ()
-  (reduce (lambda (acc pair)
-	    (destructuring-bind (k v) pair
-	      (setf (gethash k acc) (com.inuoe.jzon:parse v))
-	      acc)) 
-	  (postmodern:query "SELECT key, value FROM blog.Settings")
-
-	  :initial-value (make-hash-table :test 'equal)))
-
-(defroute client-settings ("/api/settings/client-settings" :method :get
-							   :decorators (@transaction
-									@json)) ()
-  (com.inuoe.jzon:stringify
-   (get-settings)))
-
-(defun update-setting (k v)
-  (postmodern:execute "INSERT INTO blog.Settings (key, value) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET value = excluded.value" k (stringify v)))
diff --git a/src/routes/user-editor.lisp b/src/routes/user-editor.lisp
index 757a787..594cda6 100644
--- a/src/routes/user-editor.lisp
+++ b/src/routes/user-editor.lisp
@@ -10,19 +10,19 @@
   (:import-from :com.inuoe.jzon :stringify :parse)
   (:import-from :easy-routes :defroute)
 
-  (:local-nicknames (:user-db :murja.users.user-db)
-		    (:login :murja.routes.login-routes)
-		    (:settings :murja.routes.settings-routes)))
+  (:local-nicknames (:login :murja.routes.login-routes)
+		    (:users :murja.model.user)))
 
 (in-package :murja.routes.user-editor)
 
 ;; TODO redo with spinneret
 
-(defun can-save-user? (user-id old-password)
-  (and *user*
-       (equalp (gethash "id" *user*)
-	       user-id)
-       (user-db:search-with-id-and-pwd* user-id (sha-512 old-password))))
+;; (defun can-save-user? (user-id old-password)
+;;   (and *user*
+;;        (equalp (users:user-id *user*)
+;; 	       user-id)
+;;        ;; (user-db:search-with-id-and-pwd* user-id (sha-512 old-password))
+;;        ))
 
 (defmacro patch (map symbol)
   (let ((symbol-str (str:downcase (format nil "~s" symbol))))
diff --git a/src/rss/reader-db.lisp b/src/rss/reader-db.lisp
index 4086391..70a985b 100644
--- a/src/rss/reader-db.lisp
+++ b/src/rss/reader-db.lisp
@@ -15,36 +15,6 @@
 
 (defqueries "reader-fns")
 
-(defun parse (key hashmap)
-  (setf (gethash key hashmap)
-	(com.inuoe.jzon:parse (gethash key hashmap)))
-  hashmap)
-
-(defun get-user-feeds (user-id archived?)
-  (let* ((feeds (coerce (get-user-feeds* user-id archived?) 'list))
-	 (fixed-feeds
-	   (mapcar (compose (partial #'parse "items")
-			    (partial #'parse "creator"))
-		   feeds)))
-    (dolist (feed fixed-feeds)
-      (setf (gethash "items" feed)
-	    (coerce (gethash "items" feed) 'list))
-      
-      (if (equalp (list 'null) (gethash "items" feed))
-	  (setf (gethash "items" feed) #())
-	  
-	  (dolist (item (gethash "items" feed))
-            (setf (gethash "is_read" item)
-		  (not (equalp 'NULL (gethash "read_at" item))))
-
-	    ;; frontend doesn't need this
-	    (remhash "read_at" item))))
-
-    fixed-feeds))
-
-(defun subscribe-to-feed (feed-name feed-url owner)
-  (insert-feed feed-name feed-url (gethash "id" owner)))
-
 (defun subscribe-to-feed2 (feed-name feed-url owner)
   (insert-feed feed-name feed-url (murja.model.user:user-id owner)))
 
diff --git a/src/session.lisp b/src/session.lisp
index 74c02da..682b011 100644
--- a/src/session.lisp
+++ b/src/session.lisp
@@ -2,6 +2,7 @@
   (:use :cl)
   (:export :set-session-value :get-session-value)
   (:import-from :murja.session.db :assert-ownership :set-session-val* :get-session-val*)
+  (:local-nicknames (:users :murja.model.user))
   (:import-from :murja.middleware.auth :*user* :*session-key*))
 
 (in-package :murja.session)
@@ -9,7 +10,7 @@
 (defun set-session-value (key val)
   (assert *user*)
   (assert *session-key*)
-  (let ((user-id (gethash "id" *user*)))
+  (let ((user-id (users:user-id *user*)))
     (assert-ownership user-id *session-key*)
     
     (set-session-val* *session-key* (str:downcase (symbol-name key)) val)
@@ -19,7 +20,7 @@
 (defun get-session-value (key)  
   (assert *user*)
   (assert *session-key*)
-  (let* ((user-id (gethash "id" *user*))
+  (let* ((user-id (users:user-id *user*))
 	 (res (coerce (get-session-val* (murja.session.db:now) user-id key) 'list)))
     (when res
       (gethash "val" (first res)))))
diff --git a/src/settings.lisp b/src/settings.lisp
deleted file mode 100644
index 896ca47..0000000
--- a/src/settings.lisp
+++ /dev/null
@@ -1,19 +0,0 @@
-(defpackage murja.settings 
-  (:use :cl)
-  (:documentation "DEPRECATED.
-
-Please use murja.setting-definitions functions")
-  (:export :*settings* :get-settings))
-
-(in-package :murja.settings)
-
-(defun get-settings ()
-  (reduce (lambda (acc pair)
-	    (destructuring-bind (k v) pair
-	      (setf (gethash k acc) (com.inuoe.jzon:parse v))
-	      acc)) 
-	  (postmodern:query "SELECT key, value FROM blog.Settings")
-
-	  :initial-value (make-hash-table :test 'equal)))
-
-(defvar *settings* nil "A hashmap view of `select * from blog.settings`. If this variable is nil, wrap your route with @transaction middleware. If you setf keys here, remember to update db too with murja.routes.settings-routes:update-setting")
diff --git a/src/users/user-db.lisp b/src/users/user-db.lisp
deleted file mode 100644
index 060960c..0000000
--- a/src/users/user-db.lisp
+++ /dev/null
@@ -1,56 +0,0 @@
-(defpackage :murja.users.user-db
-  (:use :cl :postmodern)
-  (:import-from :lisp-fixup :sha-512)
-  (:export :patch-user-img* :get-session-user-by-id :search-with-id-and-pwd* :get-user-by-id :select-user-by-login :register-user :patch-user :no-users? :cast-only-user-as-admin)
-  (:import-from :halisql :defqueries))
-
-(in-package :murja.users.user-db)
-
-(defqueries "user-fns")
-
-(defun jsonize-key (hash key)
-  (setf (gethash key hash)
-	(coerce
-	 (com.inuoe.jzon:parse (gethash key hash))
-	 'list))
-  hash)
-
-(defun get-user-by-id (id)
-  (let ((result (coerce (get-user-by-id* id) 'list)))
-    (when result
-      (jsonize-key (first result) "permissions"))))
-
-(defun get-session-user-by-id (id)
-  (jsonize-key (aref (query-user-for-session id) 0) "permissions"))
-
-(defun select-user-by-login (username password-sha)
-  (let ((usr (first (coerce  (query-users* username password-sha) 'list))))
-    (if usr
-	(jsonize-key usr "permissions")
-	(let ((usrs (coerce (postmodern:query "SELECT * FROM blog.Users" :alists) 'list)))
-	  (unless usrs
-	    (log:error "There are no users in the db"))
-	  nil))))
-
-(defun register-user (username nickname img-location password)
-  "Inserts the new user into db and returns its id" 
-  (caar (postmodern:query "INSERT INTO blog.Users (username, nickname, img_location, password) VALUES ($1, $2, $3, $4) returning id"
-			  username
-			  nickname
-			  img-location
-			  (sha-512 password))))
-
-(defun cast-only-user-as-admin ()
-  (let ((c (caar (query "SELECT count(*) FROM blog.users"))))
-    (assert (equalp c 1))
-    (execute "INSERT INTO blog.groupmapping SELECT usr.id, grp.id, true FROM blog.users usr JOIN blog.usergroup grp ON grp.name = 'Admins'")))
-
-  ;;(postmodern:connect-toplevel "blogdb" "blogadmin" "blog" "localhost")
-
-(defun patch-user (usr)
-  (cl-hash-util:with-keys ("nickname" "username" "password" "id") usr
-    (patch-user* nickname username password id)))
-
-(defun no-users? ()
-  (caar (postmodern:query "SELECT NOT EXISTS (SELECT * FROM blog.users)")))
-
diff --git a/src/view/admin/new-post.lisp b/src/view/admin/new-post.lisp
index 6ef1720..b532a1a 100644
--- a/src/view/admin/new-post.lisp
+++ b/src/view/admin/new-post.lisp
@@ -2,7 +2,6 @@
   (:use :cl :easy-routes :binding-arrows :spinneret :murja.model.post :murja.view.admin.components.editor)
   ;; (:import-from :murja.model.post :article :post-title)
   (:import-from :murja.middleware.db :@transaction :@db)
-  (:import-from :murja.routes.login-routes :formdata->hashmap)
   (:import-from :murja.middleware.auth :@authenticated :@ssr-authenticated :*user*)
   (:import-from :murja.model.user :user-id )
   (:import-from :murja.view.components.tabs :deftab)
@@ -49,7 +48,7 @@
   (let ((abilities (coerce (murja.model.user:abilities *user*) 'list)))
     (when (member "edit-post" abilities :test 'equal)
       (let ((post (get-post (parse-integer id) :allow-hidden? t))
-	    (form (formdata->hashmap (hunchentoot:raw-post-data :force-text t))))
+	    (form (lisp-fixup:formdata->hashmap (hunchentoot:raw-post-data :force-text t))))
 	
 	(setf (article post) (gethash "article" form))
 	(setf (post-title post) (gethash "title" form))
diff --git a/src/view/admin/post-list.lisp b/src/view/admin/post-list.lisp
index 57da058..9c99df5 100644
--- a/src/view/admin/post-list.lisp
+++ b/src/view/admin/post-list.lisp
@@ -1,7 +1,6 @@
 (defpackage murja.view.admin.post-list
   (:use :cl :binding-arrows :spinneret
-   :easy-routes
-   :murja.settings :cl-hash-util
+   :easy-routes :cl-hash-util
    :murja.view.components.blogpost)
   (:import-from :murja.view.components.tabs :deftab)
   (:import-from :murja.model.post :admin-get-all-titles :title :month :year :id :tags :hidden :unlisted)
diff --git a/src/view/blog-root.lisp b/src/view/blog-root.lisp
index 74177e2..d601d01 100644
--- a/src/view/blog-root.lisp
+++ b/src/view/blog-root.lisp
@@ -1,17 +1,17 @@
 (defpackage murja.view.blog-root
   (:use :cl :binding-arrows
 	:murja.view.components.blogpost
-   :easy-routes
-	:murja.settings :cl-hash-util)
+   :easy-routes :cl-hash-util)
   (:export :root)
   (:import-from :murja.view.components.tabs :deftab)
-  (:import-from :murja.model.post :get-page))
+  (:import-from :murja.model.post :get-page)
+  (:local-nicknames (:settings :murja.setting-definitions)))
 
 (in-package :murja.view.blog-root)
 
 (deftab root (:url "/"
 	      :title "Home")
-  (let* ((recent-post-count (gethash "recent-post-count" murja.settings:*settings*))
+  (let* ((recent-post-count (settings:recent-post-count))
 	 (loaded-page (get-page 1 recent-post-count)))
     (page loaded-page 1)))
 
@@ -19,6 +19,6 @@
 		  :subtab root
 		  :captured-url-params (id))
   (let* ((id (parse-integer id))
-	 (recent-post-count (gethash "recent-post-count" murja.settings:*settings*))
+	 (recent-post-count (settings:recent-post-count))
 	 (loaded-page (get-page id recent-post-count)))
     (page loaded-page id)))
diff --git a/src/view/components/root.lisp b/src/view/components/root.lisp
index e2cdcbe..469c4e8 100644
--- a/src/view/components/root.lisp
+++ b/src/view/components/root.lisp
@@ -1,6 +1,6 @@
 (defpackage murja.view.components.root
   (:use :cl :spinneret :binding-arrows
-   :murja.settings
+	:murja.setting-definitions
    :murja.middleware.auth
 	:murja.model.user)
 
@@ -80,7 +80,7 @@
 		
 		(:body
 		 (:header
-		  (:a :href "/" (gethash "blog-title" *settings* )))
+		  (:a :href "/" (blog-title)))
 
 		 (:div :class "sidebar-flex"
 		       ,inner-component
diff --git a/src/view/components/tabs.lisp b/src/view/components/tabs.lisp
index 66b5e09..1846cb5 100644
--- a/src/view/components/tabs.lisp
+++ b/src/view/components/tabs.lisp
@@ -50,9 +50,8 @@
 			       :component (lambda (&rest all)
 					    (destructuring-bind ,captured-url-params all 
 					      (murja.middleware.db:with-db
-						  (let ((murja.settings:*settings* (murja.settings:get-settings)))
-						    (with-html 
-						      ,@rst)))))))
+						  (with-html 
+						    ,@rst))))))
      (defroute ,sym (,(if lisp-fixup:*dev?*
 			  ;; we handle /blog prefix on our own only on dev
 			  (format nil "/blog~A" url)
diff --git a/src/view/single-post.lisp b/src/view/single-post.lisp
index 70918a0..93396b2 100644
--- a/src/view/single-post.lisp
+++ b/src/view/single-post.lisp
@@ -1,7 +1,6 @@
 (defpackage murja.view.single-post
   (:use :cl :binding-arrows
-   :easy-routes
-   :murja.settings :cl-hash-util
+   :easy-routes :cl-hash-util
    :murja.view.components.blogpost)
   (:import-from :murja.view.components.tabs :deftab)
   (:export :blog/post/id)