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  //