From 8ab94f4677f8d56655a45bb636917429dcddda24 Mon Sep 17 00:00:00 2001 From: ckonstanski Date: Mon, 20 Jul 2026 21:09:54 -0600 Subject: got contact info working --- lisp/service/menu-service.lisp | 1 + lisp/service/resume-service.lisp | 152 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 151 insertions(+), 2 deletions(-) (limited to 'lisp/service') 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.")))))) -- cgit v1.3