99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"mermaid-server/internal"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
var testInput = []byte(`
|
|
graph TB
|
|
|
|
subgraph "Jira"
|
|
createTicket["Create ticket"]
|
|
updateTicket["Update ticket"]
|
|
fireWebhook["Fire webhook"]
|
|
|
|
createTicket-->fireWebhook
|
|
updateTicket-->fireWebhook
|
|
end
|
|
|
|
subgraph "Jira Webhook"
|
|
receiveWebhook["Receive webhook"]
|
|
storeEvent["Store event in immutable list"]
|
|
publishNewStoredEventEvent["Publish message to notify system of new event"]
|
|
|
|
createEvent["Create internal event that will be stored"]
|
|
setCreatedAt["Set created at date to now"]
|
|
setSourceJira["Set source to Jira webhook"]
|
|
|
|
receiveWebhook-->createEvent-->setCreatedAt-->setSourceJira-->storeEvent
|
|
storeEvent-->publishNewStoredEventEvent
|
|
end
|
|
|
|
fireWebhook-->receiveWebhook
|
|
|
|
subgraph "Play Event"
|
|
publishEventUpdated["Publish message to notify system of new status"]
|
|
|
|
verifyEventSource["Verify event source"]
|
|
parsePayload["Parse event payload using source to determine structure"]
|
|
findEventHandler["Find the handler for the specific event type + version"]
|
|
getLatestPersistedState["Get latest persisted state"]
|
|
changeInMemoryStateUsingEventData["Change in-memory state using event data"]
|
|
persistUpdatedState["Persist updated state"]
|
|
|
|
verifyEventSource-->parsePayload
|
|
parsePayload-->findEventHandler
|
|
findEventHandler-->getLatestPersistedState-->changeInMemoryStateUsingEventData-->persistUpdatedState
|
|
|
|
persistUpdatedState-->publishEventUpdated
|
|
end
|
|
|
|
publishNewStoredEventEvent-->verifyEventSource
|
|
`)
|
|
|
|
func main() {
|
|
mermaid := flag.String("mermaid", "", "The full path to the mermaidcli executable.")
|
|
in := flag.String("in", "", "Directory to store input files.")
|
|
out := flag.String("out", "", "Directory to store output files.")
|
|
flag.Parse()
|
|
|
|
if *mermaid == "" {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Missing required argument `mermaid`")
|
|
os.Exit(1)
|
|
}
|
|
|
|
if *in == "" {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Missing required argument `in`")
|
|
os.Exit(1)
|
|
}
|
|
|
|
if *out == "" {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Missing required argument `out`")
|
|
os.Exit(1)
|
|
}
|
|
|
|
cache := internal.NewDiagramCache()
|
|
generator := internal.NewGenerator(cache, *mermaid, *in, *out)
|
|
|
|
httpHandler := internal.GenerateHTTPHandler(generator)
|
|
|
|
r := http.NewServeMux()
|
|
r.Handle("/generate", http.HandlerFunc(httpHandler))
|
|
|
|
httpServer := &http.Server{
|
|
Addr: ":80",
|
|
Handler: r,
|
|
}
|
|
_, _ = fmt.Fprintf(os.Stdout, "Listening on address %s", httpServer.Addr)
|
|
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Could not listen for http connections: %s", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
_, _ = fmt.Fprintf(os.Stdout, "Shutdown")
|
|
}
|