;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*- (declaim (optimize (speed 0) (safety 3) (debug 3))) (in-package :resume) ;; shared (defclass resumes-service (auth-service) ((title :initarg :title :initform nil :accessor title)) (:documentation "")) ;; resume (defun resumes-json () (with-auth (instance resumes-service "resume-view") (setf (title instance) "Resumes"))) (defclass resumes/view-service (resumes-service resume) ((resumes :initarg :resumes :initform nil :accessor resumes) (location-p :initform nil)) (:documentation "")) (defun resumes-view-json () (with-auth (instance resumes/view-service "resume-view") (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) (setf (resumes instance) (get-all-resumes resume-pkg user)))) (sanitize-rest-json instance) (loop for resume in (resumes instance) do (sanitize-json resume)))) (defclass resumes/add-service (resumes/view-service) ((form :initarg :form :initform nil :accessor form)) (:documentation "")) (defun resumes-add-json () (with-auth (instance resumes/add-service "resume-modify") (setf (title instance) "Resume - Add") (setf (form instance) (make-form "resumes-add-form" nil t `((:name "name" :label "Name" :field-type "text" :required "required") (:label "Add Resume" :field-type "button" :onclick "on_resumes_add_submit_clicked()")))))) (defun resumes-add-submit-json (name) (declare (special name)) (with-auth (instance resumes/add-service "resume-modify") (with-resume-database (handler-case (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (resume (make-instance 'resume :user_id (id user)))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) (sb-introspect:function-lambda-list #'resumes-add-submit-json)) do (setf (slot-value resume param) (symbol-value param))) (insert-resume resume-pkg resume) (setf (session-value :message) (format nil "Resume \"~a\" created successfully." (name resume)))) (error (e) (setf (session-value :errormsg) (format nil "Error creating resume \"~a\". ~a" name e))))))) (defclass resumes/modify-service (resumes/add-service) () (:documentation "")) (defun resumes-modify-json (id) (with-auth (instance resumes/modify-service "resume-modify") (setf (title instance) "Resume - Modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (resume (get-record resume-pkg (make-instance 'resume :id id :user_id (id user))))) (if resume (setf (form instance) (make-form "resumes-modify-form" nil t `((:name "id" :field-type "hidden" :value ,(id resume) :required "required") (:name "name" :label "Name" :field-type "text" :value ,(name resume) :required "required") (:label "Modify Resume" :field-type "button" :onclick "on_resumes_modify_submit_clicked()")))) (setf (session-value :errormsg) "Error: could not modify resume. Not found.")))))) (defun resumes-modify-submit-json (id name) (declare (special id name)) (with-auth (instance resumes/modify-service "resume-modify") (setf (title instance) "Resume - Modify") (with-resume-database (handler-case (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (resume (get-record resume-pkg (make-instance 'resume :id id :user_id (id user))))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) (sb-introspect:function-lambda-list #'resumes-modify-submit-json)) do (setf (slot-value resume param) (symbol-value param))) (update-resume resume-pkg resume) (setf (session-value :message) (format nil "Resume \"~a\" modified successfully." (name resume)))) (error (e) (setf (session-value :errormsg) (format nil "Error modifying resume \"~a\". ~a" name e))))))) (defclass resumes/delete-service (resumes/add-service) () (:documentation "")) (defun resumes-delete-json (id) (with-auth (instance resumes/delete-service "resume-modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (resume (get-record resume-pkg (make-instance 'resume :id id :user_id (id user))))) (if resume (progn (delete-resume resume-pkg resume) (setf (session-value :message) (format nil "Resume \"~a\" deleted successfully." (name resume)))) (setf (session-value :errormsg) "Error: could not delete resume: not found.")))))) ;; contactinfo (defun contactinfo-json () (with-auth (instance resumes-service "resume-view") (setf (title instance) "Contact Information"))) (defclass contactinfo/view-service (resumes-service contactinfo) ((contactinfos :initarg :contactinfos :initform nil :accessor contactinfos) (location-p :initform nil)) (:documentation "")) (defun contactinfo-view-json () (with-auth (instance contactinfo/view-service "resume-view") (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) (setf (contactinfos instance) (get-all-contactinfo resume-pkg user)))) (sanitize-rest-json instance) (loop for contactinfo-v in (contactinfos instance) do (sanitize-json contactinfo-v)))) (defclass contactinfo/add-service (contactinfo/view-service) ((form :initarg :form :initform nil :accessor form)) (:documentation "")) (defun state-options (states) (mapcar (lambda (state) `(:label ,(format nil "~a ~a" (abbr state) (state state)) :value ,(id state))) states)) (defun visastatus-options (visastatuses) (mapcar (lambda (visastatus) `(:label ,(status visastatus) :value ,(id visastatus))) visastatuses)) (defun contactinfo-add-json () (with-auth (instance contactinfo/add-service "resume-modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (states (get-records resume-pkg (make-instance 'states) "abbr asc")) (visastatuses (get-records resume-pkg (make-instance 'visastatus) "visastatus asc"))) (setf (title instance) "Contact Info - Add") (setf (form instance) (make-form "contactinfo-add-form" nil t `((:name "address" :label "Address" :field-type "text" :required "required") (:name "city" :label "City" :field-type "text" :required "required") (:name "state_id" :label "State" :field-type "select" :options ,(state-options states) :required "required") (:name "phone" :label "Phone" :field-type "text" :required "required") (:name "email" :label "Email" :field-type "text" :required "required") (:name "visastatus_id" :label "VISA Status" :field-type "select" :options ,(visastatus-options visastatuses) :required "required") (:label "Add Contact Info" :field-type "button" :onclick "on_contactinfo_add_submit_clicked()")))))))) (defun contactinfo-add-submit-json (address city state_id phone email visastatus_id) (declare (special address city state_id phone email visastatus_id)) (with-auth (instance contactinfo/add-service "resume-modify") (with-resume-database (handler-case (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (contactinfo (make-instance 'contactinfo :user_id (id user)))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) (sb-introspect:function-lambda-list #'contactinfo-add-submit-json)) do (setf (slot-value contactinfo param) (symbol-value param))) (insert-contactinfo resume-pkg contactinfo) (setf (session-value :message) (format nil "Contact Info \"~a, ~a\" created successfully." address city))) (error (e) (setf (session-value :errormsg) (format nil "Error creating Contact Info \"~a, ~a\". ~a" address city e))))))) (defclass contactinfo/modify-service (contactinfo/add-service) () (:documentation "")) (defun contactinfo-modify-json (id) (with-auth (instance contactinfo/modify-service "resume-modify") (setf (title instance) "Contact Info - Modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (states (get-records resume-pkg (make-instance 'states) "abbr asc")) (visastatuses (get-records resume-pkg (make-instance 'visastatus) "status asc")) (contactinfo-v (get-record resume-pkg (make-instance 'contactinfo-v :id id :user_id (id user))))) (if contactinfo-v (setf (form instance) (make-form "contactinfo-modify-form" nil t `((:name "id" :field-type "hidden" :value ,(id contactinfo-v) :required "required") (:name "address" :label "Address" :field-type "text" :value ,(address contactinfo-v) :required "required") (:name "city" :label "City" :field-type "text" :value ,(city contactinfo-v) :required "required") (:name "state_id" :label "State" :field-type "select" :value ,(state_id contactinfo-v) :options ,(state-options states) :required "required") (:name "phone" :label "Phone" :field-type "text" :value ,(phone contactinfo-v) :required "required") (:name "email" :label "Email" :field-type "text" :value ,(email contactinfo-v) :required "required") (:name "visastatus_id" :label "VISA Status" :field-type "select" :value ,(visastatus_id contactinfo-v) :options ,(visastatus-options visastatuses) :required "required") (:label "Modify Contact Info" :field-type "button" :onclick "on_contactinfo_modify_submit_clicked()")))) (setf (session-value :errormsg) "Error: could not modify Contact Info. Not found.")))))) (defun contactinfo-modify-submit-json (id address city state_id phone email visastatus_id) (declare (special id address city state_id phone email visastatus_id)) (with-auth (instance contactinfo/modify-service "resume-modify") (setf (title instance) "Contact Info - Modify") (with-resume-database (handler-case (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (contactinfo (get-record resume-pkg (make-instance 'contactinfo :id id :user_id (id user))))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) (sb-introspect:function-lambda-list #'contactinfo-modify-submit-json)) do (setf (slot-value contactinfo param) (symbol-value param))) (update-contactinfo resume-pkg contactinfo) (setf (session-value :message) (format nil "Contact Info \"~a, ~a\" modified successfully." address city))) (error (e) (setf (session-value :errormsg) (format nil "Error modifying Contact Info \"~a, ~a\". ~a" address city e))))))) (defclass contactinfo/delete-service (contactinfo/add-service) () (:documentation "")) (defun contactinfo-delete-json (id) (with-auth (instance contactinfo/delete-service "resume-modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (contactinfo (get-record resume-pkg (make-instance 'contactinfo :id id :user_id (id user))))) (if contactinfo (progn (delete-contactinfo resume-pkg contactinfo) (setf (session-value :message) (format nil "Contact Info \"~a, ~a\" deleted successfully." (address contactinfo) (city contactinfo)))) (setf (session-value :errormsg) "Error: could not delete Contact Info: not found."))))))