github.com/uvalib/orcid-access-ws@v0.0.0-20250612130209-7d062dbabf9d/orcidaccessws/handlers/set_orcid_attributes_handler.go (about) 1 package handlers 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "net/http" 9 "regexp" 10 "strings" 11 12 "github.com/gorilla/mux" 13 "github.com/uvalib/orcid-access-ws/orcidaccessws/api" 14 "github.com/uvalib/orcid-access-ws/orcidaccessws/authtoken" 15 "github.com/uvalib/orcid-access-ws/orcidaccessws/config" 16 "github.com/uvalib/orcid-access-ws/orcidaccessws/dao" 17 "github.com/uvalib/orcid-access-ws/orcidaccessws/logger" 18 "github.com/uvalib/orcid-access-ws/orcidaccessws/orcid" 19 ) 20 21 // SetOrcidAttributes -- set the orcid attributes handler 22 func SetOrcidAttributes(w http.ResponseWriter, r *http.Request) { 23 24 vars := mux.Vars(r) 25 id := vars["id"] 26 token := r.URL.Query().Get("auth") 27 28 // parameters OK? 29 if isEmpty(id) || isEmpty(token) { 30 status := http.StatusBadRequest 31 encodeStandardResponse(w, status, http.StatusText(status)) 32 return 33 } 34 35 // validate the token 36 if authtoken.Validate(config.Configuration.SharedSecret, token) == false { 37 status := http.StatusForbidden 38 encodeStandardResponse(w, status, http.StatusText(status)) 39 return 40 } 41 42 decoder := json.NewDecoder(r.Body) 43 attributes := api.OrcidAttributes{} 44 45 if err := decoder.Decode(&attributes); err != nil { 46 logger.Log(fmt.Sprintf("ERROR: decoding set attributes request payload %s", err)) 47 status := http.StatusBadRequest 48 encodeStandardResponse(w, status, 49 fmt.Sprintf("%s (%s)", http.StatusText(status), err.Error())) 50 return 51 } 52 53 defer io.Copy(ioutil.Discard, r.Body) 54 defer r.Body.Close() 55 56 // at minimum, the ORCID must be defined 57 //if isEmpty(attributes.Orcid) { 58 // status := http.StatusBadRequest 59 // encodeStandardResponse(w, status, http.StatusText(status)) 60 // return 61 //} 62 63 // set the ORCID attributes 64 err := dao.Store.SetOrcidAttributesByCid(id, attributes) 65 if err != nil { 66 logger.Log(fmt.Sprintf("ERROR: %s", err.Error())) 67 status := http.StatusInternalServerError 68 encodeStandardResponse(w, status, 69 fmt.Sprintf("%s (%s)", http.StatusText(status), err.Error())) 70 return 71 } 72 73 // Send Employment or Education to ORCID 74 if !isEmpty(attributes.UserTypes) { 75 sendEmployment := false 76 sendEducation := false 77 types := strings.Split(attributes.UserTypes, ";") 78 employmentCheck := regexp.MustCompile(`Staff|Employee|Faculty`) 79 80 for _, userType := range types { 81 matched := employmentCheck.MatchString(userType) 82 if matched { 83 sendEmployment = true 84 } else { 85 sendEducation = true 86 } 87 } 88 if sendEducation { 89 orcid.SendEducation(attributes) 90 } 91 if sendEmployment { 92 orcid.SendEmployment(attributes) 93 } 94 } 95 96 status := http.StatusOK 97 encodeStandardResponse(w, status, http.StatusText(status)) 98 } 99 100 // 101 // end of file 102 //