src/model/user.lisp

DOWNLOAD
(defpackage murja.model.user
  (:use :cl)
  (:local-nicknames (:json :com.inuoe.jzon))
  (:export :get-user :User :user-id :user-username :user-password :user-nickname :user-img-location :abilities))

(in-package :murja.model.user)

(defclass User ()
  ((id :initarg :id :accessor user-id :col-type integer)
   (username :initarg :username :accessor user-username :col-type string)
   (password :initarg :password :accessor user-password :col-type string)
   (nickname :initarg :nickname :accessor user-nickname :col-type string)
   (img-location :initform "" :initarg :img-location :accessor user-img-location :col-type string)
   (abilities :ghost t :initarg :abilities :initform #() :accessor abilities :col-type string))

  (:metaclass postmodern:dao-class)
  (:keys id)
  (:table-name "blog.Users"))

(defmethod print-object ((usr User) output)
  (with-slots (id username nickname img-location abilities) usr
    
    (format output "#<USER: ~{~{~a: ~s~}~^,~%~t ~}>" (list
						  (list :id id)
						  (list :username username)
						  (list :nickname nickname)
						  (list :password "******")
						  (list :img-location img-location)
						  (list :abilities abilities)))))

(defparameter *user-query*
  "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
  u.id = $1
GROUP BY
  u.id;")

(defun get-user (id)
  "Gets user and populates its abilities"
  (let ((usr (postmodern:query *user-query* id (:dao User :single))))
    (with-slots (abilities) usr 
      (when (stringp abilities)
	(setf abilities (json:parse abilities))))
    usr))
		       

;; (postmodern:get-dao 'User 1)

;; (get-user 1)