summaryrefslogtreecommitdiffstats
path: root/emacs/.emacs.d/site-lisp/pivot.el
diff options
context:
space:
mode:
authorGravatar Tom Willemse2014-09-01 12:46:08 +0200
committerGravatar Tom Willemse2014-09-01 12:46:08 +0200
commitc487024e26defbf8325f820cfd29184146eeaf70 (patch)
treed04f9f477014718d3ab5a65715b5db9cc6c65705 /emacs/.emacs.d/site-lisp/pivot.el
parent35b9c059eb757c2ee8169b69d0ff5bf3578202b4 (diff)
downloaddotfiles-c487024e26defbf8325f820cfd29184146eeaf70.tar.gz
dotfiles-c487024e26defbf8325f820cfd29184146eeaf70.zip
Add some pivotal functions
Diffstat (limited to 'emacs/.emacs.d/site-lisp/pivot.el')
-rw-r--r--emacs/.emacs.d/site-lisp/pivot.el77
1 files changed, 60 insertions, 17 deletions
diff --git a/emacs/.emacs.d/site-lisp/pivot.el b/emacs/.emacs.d/site-lisp/pivot.el
index 63830ab..b184a88 100644
--- a/emacs/.emacs.d/site-lisp/pivot.el
+++ b/emacs/.emacs.d/site-lisp/pivot.el
@@ -43,28 +43,71 @@ and story data via the API, and needs to be kept private."
Does not need a final `/'.")
+(defvar pivotel-user-id nil
+ "The user id of the current user.")
+(defvar pivotel-projects nil
+ "The projects from the current user.")
+
+(defmacro with-pivotel-headers (headers &rest body)
+ "Add `X-TrackerTocken' to HEADERS and bind them around BODY."
+ (declare (indent 1))
+ `(let ((url-request-extra-headers
+ (append (list (cons "X-TrackerToken" pivotel-api-token))
+ ,headers)))
+ ,@body))
+
+(defun pivotel--retrieve-from (url)
+ "Retrieve data from URL."
+ (with-current-buffer
+ (url-retrieve-synchronously (concat pivotel-api-url url))
+ (goto-char (point-min))
+ (search-forward "\n\n")
+ (let ((results (json-read)))
+ (kill-buffer)
+ results)))
+
(defun pivotel-get-story (project story)
"Get data from PROJECT for STORY."
- (let ((url-request-extra-headers
- `(("X-TrackerToken" . ,pivotel-api-token))))
- (with-current-buffer
- (url-retrieve-synchronously
- (format "%s/projects/%d/stories/%d"
- pivotel-api-url project story))
- (goto-char (point-min))
- (search-forward "\n\n")
- (json-read))))
+ (with-pivotel-headers nil
+ (pivotel--retrieve-from
+ (format "/projects/%d/stories/%d" project story))))
(defun pivotel-get-projects ()
"Get a list of all projects."
- (let ((url-request-extra-headers
- `(("X-TrackerTocken" . ,pivotel-api-token))))
- (with-current-buffer
- (url-retrieve-synchronously
- (format "%s/projects" pivotel-api-url))
- (goto-char (point-min))
- (search-forward "\n\n")
- (json-read))))
+ (or pivotel-projects
+ (setq pivotel-projects
+ (with-pivotel-headers nil
+ (pivotel--retrieve-from "/projects")))))
+
+(defun pivotel-get-stories (project)
+ "Get a list of all stories in PROJECT."
+ (with-pivotel-headers nil
+ (pivotel--retrieve-from (format "/projects/%d/stories" project))))
+
+(defun pivotel-get-me ()
+ "Get information about currently logged-in user."
+ (with-pivotel-headers nil (pivotel--retrieve-from "/me")))
+
+(defun pivotel-get-me-id ()
+ "Get and cache the current user's id."
+ (or pivotel-user-id
+ (setq pivotel-user-id
+ (cdr (assoc 'id (pivotel-get-me))))))
+
+(defun pivotel-get-all-stories ()
+ "Get all stories for the current user."
+ (let ((project-ids (mapcar (lambda (itm) (cdr (assoc 'id itm)))
+ (pivotel-get-projects))))
+ (mapcar #'pivotel-get-stories project-ids)))
+
+(defun pivotel-get-my-owned-stories ()
+ "Get the stories for which the user is an owner."
+ (let ((stories (pivotel-get-all-stories))
+ (id (pivotel-get-me-id)))
+ (delq nil
+ (mapcar (lambda (itm)
+ (when (= (cdr (assoc 'owned_by_id itm)) id) itm))
+ stories))))
(provide 'pivot)
;;; pivot.el ends here