github.com/jamiefdhurst/journal@v0.9.2/internal/app/controller/apiv1/update.go (about)

     1  package apiv1
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  
     7  	"github.com/jamiefdhurst/journal/internal/app"
     8  	"github.com/jamiefdhurst/journal/internal/app/model"
     9  	"github.com/jamiefdhurst/journal/pkg/controller"
    10  )
    11  
    12  // Update Update an existing entry via API
    13  type Update struct {
    14  	controller.Super
    15  }
    16  
    17  // Run Update action
    18  func (c *Update) Run(response http.ResponseWriter, request *http.Request) {
    19  	container := c.Super.Container.(*app.Container)
    20  	if !container.Configuration.EnableEdit {
    21  		response.WriteHeader(http.StatusForbidden)
    22  		return
    23  	}
    24  
    25  	js := model.Journals{Container: container, Gs: model.GiphyAdapter(container)}
    26  	journal := js.FindBySlug(c.Params[1])
    27  
    28  	response.Header().Add("Content-Type", "application/json")
    29  	if journal.ID == 0 {
    30  		response.WriteHeader(http.StatusNotFound)
    31  	} else {
    32  		var journalRequest = journalFromJSON{}
    33  		decoder := json.NewDecoder(request.Body)
    34  		err := decoder.Decode(&journalRequest)
    35  		if err != nil {
    36  			response.WriteHeader(http.StatusBadRequest)
    37  		} else {
    38  			// Update only fields that are present
    39  			if journalRequest.Title != "" {
    40  				journal.Title = journalRequest.Title
    41  			}
    42  			if journalRequest.Date != "" {
    43  				journal.Date = journalRequest.Date
    44  			}
    45  			if journalRequest.Content != "" {
    46  				journal.Content = journalRequest.Content
    47  			}
    48  			journal = js.Save(journal)
    49  			encoder := json.NewEncoder(response)
    50  			encoder.SetEscapeHTML(false)
    51  			encoder.Encode(journal)
    52  		}
    53  	}
    54  }