in traffic_ops/traffic_ops_golang/deliveryservice/request/requests.go [873:999]
func putV4(w http.ResponseWriter, r *http.Request, inf *api.Info) (result dsrManipulationResult) {
tx := inf.Tx.Tx
var dsr tc.DeliveryServiceRequestV4
var dsrV40 tc.DeliveryServiceRequestV40
if inf.Version.Minor == 0 {
if err := json.NewDecoder(r.Body).Decode(&dsrV40); err != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, fmt.Errorf("decoding: %v", err), nil)
return
}
dsr = dsrV40.Upgrade()
} else {
if err := json.NewDecoder(r.Body).Decode(&dsr); err != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, fmt.Errorf("decoding: %v", err), nil)
return
}
dsrV40 = dsr.Downgrade()
}
if userErr, sysErr := validateV4(dsr, tx); userErr != nil || sysErr != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, userErr, sysErr)
return
}
if dsr.Status != tc.RequestStatusDraft && dsr.Status != tc.RequestStatusSubmitted {
userErr := fmt.Errorf("cannot change DeliveryServiceRequest status to '%s'", dsr.Status)
api.HandleErr(w, r, tx, http.StatusBadRequest, userErr, nil)
return
}
if dsr.ChangeType != tc.DSRChangeTypeDelete {
dsr.Original = nil
} else {
dsr.Requested = nil
}
upgraded := dsr.Upgrade()
authorized, err := isTenantAuthorized(upgraded, inf)
if err != nil {
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, err)
return
}
if !authorized {
api.HandleErr(w, r, tx, http.StatusForbidden, errors.New("not authorized on this tenant"), nil)
return
}
upgraded.LastEditedBy = inf.User.UserName
upgraded.LastEditedByID = new(int)
*upgraded.LastEditedByID = inf.User.ID
if upgraded.Requested != nil && len(upgraded.Requested.TLSVersions) < 1 {
upgraded.Requested.TLSVersions = nil
}
if upgraded.Original != nil && len(upgraded.Original.TLSVersions) < 1 {
upgraded.Original.TLSVersions = nil
}
args := []interface{}{
upgraded.AssigneeID,
upgraded.ChangeType,
inf.User.ID,
upgraded.Requested,
upgraded.Original,
upgraded.Status,
inf.IntParams["id"],
}
if dsr.Original != nil {
if dsr.Original.LongDesc1 != nil || dsr.Original.LongDesc2 != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, errors.New("the longDesc1 and longDesc2 fields are no longer supported in API 4.0 onwards"), nil)
return
}
}
if dsr.Requested != nil {
if dsr.Requested.LongDesc1 != nil || dsr.Requested.LongDesc2 != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, errors.New("the longDesc1 and longDesc2 fields are no longer supported in API 4.0 onwards"), nil)
return
}
}
if err := tx.QueryRow(updateQuery, args...).Scan(&upgraded.CreatedAt, &upgraded.LastUpdated); err != nil {
var userErr, sysErr error
var errCode int
if errors.Is(err, sql.ErrNoRows) {
userErr = fmt.Errorf("no such Delivery Service Request: #%d", inf.IntParams["id"])
errCode = http.StatusNotFound
sysErr = fmt.Errorf("running update query for Delivery Service Requests: %w", err)
} else {
userErr, sysErr, errCode = api.ParseDBError(err)
}
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
upgraded.SetXMLID()
dsr.XMLID = upgraded.XMLID
if dsr.ChangeType == tc.DSRChangeTypeUpdate {
query := deliveryservice.SelectDeliveryServicesQuery + `WHERE xml_id=:XMLID`
originals, userErr, sysErr, errCode := deliveryservice.GetDeliveryServices(query, map[string]interface{}{"XMLID": dsr.XMLID}, inf.Tx)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
if len(originals) < 1 {
userErr = fmt.Errorf("cannot update non-existent Delivery Service '%s'", dsr.XMLID)
api.HandleErr(w, r, tx, http.StatusBadRequest, userErr, nil)
return
}
if len(originals) > 1 {
sysErr = fmt.Errorf("too many Delivery Services with XMLID '%s'; want: 1, got: %d", dsr.XMLID, len(originals))
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, sysErr)
return
}
dsr.Original = new(tc.DeliveryServiceV4)
*dsr.Original = originals[0].DS.Downgrade()
*dsr.Original = dsr.Original.RemoveLD1AndLD2()
if dsr.Requested != nil {
*dsr.Requested = dsr.Requested.RemoveLD1AndLD2()
}
}
api.WriteRespAlertObj(w, r, tc.SuccessLevel, fmt.Sprintf("Delivery Service Request #%d updated", inf.IntParams["id"]), dsr)
result.Successful = true
result.Action = "Updated"
result.Assignee = dsr.Assignee
result.ChangeType = dsr.ChangeType
result.XMLID = dsr.XMLID
return
}