diff options
Diffstat (limited to 'pg-datastore.lisp')
-rw-r--r-- | pg-datastore.lisp | 136 |
1 files changed, 0 insertions, 136 deletions
diff --git a/pg-datastore.lisp b/pg-datastore.lisp deleted file mode 100644 index 5505de1..0000000 --- a/pg-datastore.lisp +++ /dev/null @@ -1,136 +0,0 @@ -;; scrumli --- A simple scrum web application -;; Copyright (C) 2013 Tom Willemse - -;; scrumli is free software: you can redistribute it and/or modify -;; it under the terms of the GNU Affero General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; scrumli is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU Affero General Public License for more details. - -;; You should have received a copy of the GNU Affero General Public License -;; along with scrumli. If not, see <http://www.gnu.org/licenses/>. - -(in-package #:scrumli.pg-datastore) - -(defclass pg-datastore () - ((connection-spec :initarg :connection-spec - :accessor connection-spec))) - -(defclass story () - ((id :col-type serial :reader story-id) - (state :col-type string :reader state :initform "TODO") - (role :col-type string :reader role :initarg :role) - (necessity :col-type string :reader necessity :initarg :necessity) - (title :col-type string :reader title :initarg :title) - (priority :col-type integer :reader priority :initarg :priority) - (content :col-type string :reader content :initarg :content) - (reporter :col-type string :reader reporter :initarg :reporter) - (assignee :col-type string :reader assignee :initarg :assignee)) - (:metaclass dao-class) - (:keys id)) - -(defclass task () - ((id :col-type serial :reader story-id) - (state :col-type string :reader state :initform "TODO") - (description :col-type string :reader description :initarg :description) - (priority :col-type integer :reader priority :initarg :priority) - (reporter :col-type string :reader reporter :initarg :reporter) - (assignee :col-type string :reader assignee :initarg :assignee) - (story-id :col-type integer :reader story-id :initarg :story-id)) - (:metaclass dao-class) - (:keys id)) - -(deftable task - (!dao-def) - (!foreign 'story 'story-id 'id)) - -(defmethod datastore-init ((datastore pg-datastore)) - (with-connection (connection-spec datastore) - (unless (table-exists-p 'story) - (execute (dao-table-definition 'story))) - (unless (table-exists-p 'task) - (execute (dao-table-definition 'task))))) - -(defmethod datastore-get-all-stories ((datastore pg-datastore)) - (with-connection (connection-spec datastore) - (query (:order-by (:select :* (:as (:md5 'assignee) 'md5) - :from 'story) 'priority) :alists))) - -(defmethod datastore-get-stories-for ((datastore pg-datastore) username) - (with-connection (connection-spec datastore) - (query (:order-by (:select :* (:as (:md5 'assignee) 'md5) - :from 'story - :where (:= 'assignee username)) - 'priority) :alists))) - -(defmethod datastore-get-story ((datastore pg-datastore) id) - (with-connection (connection-spec datastore) - (append (query (:select :* (:as (:md5 'assignee) 'md5) :from 'story - :where (:= 'id id)) :alist) - `((tasks . ,(datastore-get-tasks-for-story datastore id)))))) - -(defmethod datastore-get-tasks-for-story ((datastore pg-datastore) id) - (with-connection (connection-spec datastore) - (query (:order-by (:select :* (:as (:md5 'assignee) 'md5) :from 'task - :where (:= 'story-id id)) - 'priority) - :alists))) - -(defmethod datastore-post-story - ((datastore pg-datastore) role necessity title content reporter) - (with-connection (connection-spec datastore) - (let ((obj (make-instance - 'story :role role :necessity necessity :title title - :priority (+ 1 (or (query (:select - (:coalesce (:max 'priority) 0) - :from 'story) :single) - 0)) - :content content :assignee "" :reporter reporter))) - (save-dao obj)))) - -(defmethod datastore-post-task - ((datastore pg-datastore) story-id description reporter) - (with-connection (connection-spec datastore) - (let ((obj (make-instance - 'task :description description - :priority (+ 1 (query (:select - (:coalesce (:max 'priority) 0) - :from 'task) :single)) - :reporter reporter :story-id (parse-integer story-id) - :assignee ""))) - (save-dao obj)))) - -(defmethod datastore-story-get-state ((datastore pg-datastore) type id) - (with-connection (connection-spec datastore) - (query (:select 'state :from type :where (:= 'id id)) :single))) - -(defmethod datastore-story-set-state - ((datastore pg-datastore) type id state) - (with-connection (connection-spec datastore) - (execute (:update type :set 'state state :where (:= 'id id))))) - -(defmethod datastore-story-change-priority - ((datastore pg-datastore) type id dir) - (with-connection (connection-spec datastore) - (let* ((current-priority (query (:select 'priority :from type - :where (:= 'id id)) - :single)) - (next-priority (funcall (ecase dir (:up #'-) (:down #'+)) - current-priority 1)) - (max-priority (query (:select (:max 'priority) :from type) - :single))) - (execute (:update type :set 'priority current-priority - :where (:= 'priority next-priority))) - (execute (:update type :set - 'priority (max 1 (min next-priority max-priority)) - :where (:= 'id id)))))) - -(defmethod datastore-set-assignee - ((datastore pg-datastore) type id assignee) - (with-connection (connection-spec datastore) - (execute (:update type :set 'assignee assignee - :where (:= 'id id))))) |