NewNotification.go (80 lines of code) (raw):

package main import ( "bytes" "errors" "fmt" "github.com/antchfx/xmlquery" "gitlab.com/codmill/customer-projects/guardian/pluto-vs-relay/vidispine" "io/ioutil" "log" "strings" "text/template" ) type TemplateContent struct { Url string EntityType string NotificationType string } /** create and test a simple notification document. if the result does not parse as xml, returns an error */ func CreateNotificationDoc(content *TemplateContent) (string, error) { templateContent := `<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <NotificationDocument xmlns="http://xml.vidispine.com/schema/vidispine"> <action> <http synchronous="false"> <retry>5</retry> <contentType>application/json</contentType> <url>{{.Url}}</url> <method>POST</method> <timeout>10</timeout> </http> </action> <trigger> <{{.EntityType}}> <{{.NotificationType}}/> </{{.EntityType}}> </trigger> </NotificationDocument>` tmpl, err := template.New("notificationDoc").Parse(templateContent) if err != nil { return "", err } buffer := bytes.Buffer{} err = tmpl.Execute(&buffer, content) if err != nil { return "", err } finalDoc := buffer.String() log.Printf("DEBUG generated document is %s", finalDoc) _, testErr := xmlquery.Parse(strings.NewReader(finalDoc)) if testErr != nil { log.Print("Failing document was: ", finalDoc) return "", testErr } return finalDoc, nil } func CreateNotification(r *vidispine.VSRequestor, callback_uri string, entityType string, notificationType string) error { newdoc, build_err := CreateNotificationDoc(&TemplateContent{ Url: callback_uri, EntityType: entityType, NotificationType: notificationType, }) if build_err != nil { log.Print("ERROR CreateNotification could not build a valid xml document: ", build_err) return errors.New("could not build valid xml") } urlEntityType := entityType if entityType == "metadata" || entityType == "shape" { urlEntityType = "item" //metadata updates get sent to to /item endpoint } response, serverErr := r.Post( fmt.Sprintf("/API/%s/notification", urlEntityType), "application/xml", "application/xml", strings.NewReader(newdoc), ) if serverErr != nil { return serverErr } serverResponseBytes, _ := ioutil.ReadAll(response) log.Printf("Notification created succesfully: %s", string(serverResponseBytes)) return nil }