summaryrefslogtreecommitdiff
path: root/lisp/service
diff options
context:
space:
mode:
authorckonstanski <kostcarl@isu.edu>2026-07-20 21:09:54 -0600
committerckonstanski <kostcarl@isu.edu>2026-07-20 21:09:54 -0600
commit8ab94f4677f8d56655a45bb636917429dcddda24 (patch)
treeb8481a5b04eca19fca1056340e35f1d6665a4fbd /lisp/service
parent9486b95432298bc89f6d7e4639721fb4e49879e0 (diff)
got contact info working
Diffstat (limited to 'lisp/service')
-rw-r--r--lisp/service/menu-service.lisp1
-rw-r--r--lisp/service/resume-service.lisp152
2 files changed, 151 insertions, 2 deletions
diff --git a/lisp/service/menu-service.lisp b/lisp/service/menu-service.lisp
index 6e97992..a01c5f8 100644
--- a/lisp/service/menu-service.lisp
+++ b/lisp/service/menu-service.lisp
@@ -5,6 +5,7 @@
(defparameter *menu-config* '((:id "a_menu_home" :label "Home" :handler "/home" :permissions "_Public")
(:id "a_menu_resumes" :label "Resumes" :handler "/resumes" :permissions "resume-view")
+ (:id "a_menu_resumes_contactinfo" :label "Contact Info" :handler "/resumes/contactinfo" :permissions "resume-view")
(:id "a_menu_contact_us" :label "Contact Me" :handler "/contact-us" :permissions "_Public")
(:id "a_menu_messages" :label "Messages" :handler "/messages" :permissions "messages-view")
(:id "a_menu_users" :label "Users" :handler "/users" :permissions "users-view")))
diff --git a/lisp/service/resume-service.lisp b/lisp/service/resume-service.lisp
index d31ae30..3536a87 100644
--- a/lisp/service/resume-service.lisp
+++ b/lisp/service/resume-service.lisp
@@ -3,12 +3,16 @@
(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")))
@@ -25,7 +29,7 @@
(with-resume-database
(let ((resume-pkg (make-instance 'resume-pkg))
(user (get-user)))
- (setf (resumes instance) (get-all-resumes-for-user resume-pkg user))))
+ (setf (resumes instance) (get-all-resumes resume-pkg user))))
(sanitize-rest-json instance)
(loop for resume in (resumes instance)
do (sanitize-json resume))))
@@ -52,7 +56,11 @@
(handler-case
(let* ((resume-pkg (make-instance 'resume-pkg))
(user (get-user))
- (resume (make-instance 'resume :user_id (id user) :name name)))
+ (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)
@@ -86,6 +94,10 @@
(let* ((resume-pkg (make-instance 'resume-pkg))
(user (get-user))
(resume (get-resume 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)))
(setf (name resume) name)
(update-resume resume-pkg resume)
(setf (session-value :message) (format nil "Resume \"~a\" modified successfully." (name resume))))
@@ -107,3 +119,139 @@
(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-contactinfo 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."))))))