Start back end and skeleton front end
This commit is contained in:
		
							
								
								
									
										121
									
								
								http/server.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								http/server.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
|  | ||||
| 	h "gitlab.codemonkeysoftware.net/b/hatmill" | ||||
| 	a "gitlab.codemonkeysoftware.net/b/hatmill/attribute" | ||||
| 	e "gitlab.codemonkeysoftware.net/b/hatmill/element" | ||||
| 	_ "gitlab.codemonkeysoftware.net/b/henwen" | ||||
| ) | ||||
|  | ||||
| const Addr = ":8080" | ||||
| const Title = "Henwen" | ||||
|  | ||||
| const ( | ||||
| 	PathRoot     = "/" | ||||
| 	PathCreate   = "/create" | ||||
| 	PathDoCreate = "/create/do" | ||||
| ) | ||||
|  | ||||
| func writePage(w io.Writer, contents h.Term) error { | ||||
| 	page := e.Html()( | ||||
| 		e.Head()( | ||||
| 			e.Title()(h.Text(Title)), | ||||
| 		), | ||||
| 		e.Body()( | ||||
| 			e.H1()(h.Text(Title)), | ||||
| 			e.Div()(contents), | ||||
| 		), | ||||
| 	) | ||||
| 	_, err := h.WriteDocument(w, page) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func pageRoot() h.Term { | ||||
| 	return h.Terms{ | ||||
| 		e.H2()(h.Text("Welcome!")), | ||||
| 		e.A(a.Href(PathCreate))( | ||||
| 			h.Text("Create event"), | ||||
| 		), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	fieldNameEarliest  = "earliestDate" | ||||
| 	fieldNameLatest    = "latestDate" | ||||
| 	fieldNameEventName = "eventName" | ||||
| ) | ||||
|  | ||||
| func pageCreate() h.Term { | ||||
| 	return h.Terms{ | ||||
| 		e.H2()(h.Text("Create an event")), | ||||
| 		e.Form(a.Action(PathDoCreate), a.Method("POST"))( | ||||
| 			e.Label(a.For(fieldNameEventName))(h.Text("Event name")), | ||||
| 			e.Input(a.Name(fieldNameEventName)), | ||||
|  | ||||
| 			e.Label(a.For(fieldNameEarliest))(h.Text("Earliest date")), | ||||
| 			e.Input(a.Name(fieldNameEarliest), a.Type("date")), | ||||
|  | ||||
| 			e.Label(a.For(fieldNameLatest))(h.Text("Latest date")), | ||||
| 			e.Input(a.Name(fieldNameLatest), a.Type("date")), | ||||
|  | ||||
| 			e.Input(a.Type("submit")), | ||||
| 		), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func pageDoCreate(name string, earliest, latest time.Time) h.Term { | ||||
| 	return h.Terms{ | ||||
| 		e.H2()(h.Text("Created event!")), | ||||
|  | ||||
| 		e.H3()(h.Text("Name")), | ||||
| 		h.Text(name), | ||||
|  | ||||
| 		e.H3()(h.Text("Earliest date")), | ||||
| 		h.Text(earliest.Format(time.ANSIC)), | ||||
|  | ||||
| 		e.H3()(h.Text("Latest date")), | ||||
| 		h.Text(latest.Format(time.ANSIC)), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	mux := http.NewServeMux() | ||||
| 	mux.HandleFunc(PathRoot, func(w http.ResponseWriter, r *http.Request) { | ||||
| 		_ = writePage(w, pageRoot()) | ||||
| 	}) | ||||
| 	mux.HandleFunc(PathCreate, func(w http.ResponseWriter, r *http.Request) { | ||||
| 		_ = writePage(w, pageCreate()) | ||||
| 	}) | ||||
| 	mux.HandleFunc(PathDoCreate, func(w http.ResponseWriter, r *http.Request) { | ||||
| 		const dateFmt = "2006-01-02" | ||||
| 		earliest, err := time.Parse(dateFmt, r.FormValue(fieldNameEarliest)) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprint(w, "bad earliest date") | ||||
| 			return | ||||
| 		} | ||||
| 		latest, err := time.Parse(dateFmt, r.FormValue(fieldNameLatest)) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprint(w, "bad latest date") | ||||
| 			return | ||||
| 		} | ||||
| 		eventName := r.FormValue(fieldNameEventName) | ||||
| 		if eventName == "" { | ||||
| 			fmt.Fprint(w, "event name is required") | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		_ = writePage(w, pageDoCreate(eventName, earliest, latest)) | ||||
| 	}) | ||||
|  | ||||
| 	srv := http.Server{ | ||||
| 		Addr:    Addr, | ||||
| 		Handler: mux, | ||||
| 	} | ||||
| 	log.Println(srv.ListenAndServe()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user