github.com/raphaelreyna/latte@v0.11.2-0.20220317193248-98e2fcef4eef/internal/server/server.go (about) 1 package server 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "io" 8 "log" 9 "net/http" 10 "os" 11 12 "github.com/gorilla/mux" 13 "github.com/raphaelreyna/latte/internal/job" 14 ) 15 16 type Server struct { 17 router *mux.Router 18 rootDir string 19 db DB 20 cmd string 21 errLog *log.Logger 22 infoLog *log.Logger 23 tmplCache *job.TemplateCache 24 } 25 26 func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { 27 s.router.ServeHTTP(w, r) 28 } 29 30 func (s *Server) respond(w http.ResponseWriter, payload interface{}, code int) []byte { 31 w.WriteHeader(code) 32 if payload == nil { 33 return nil 34 } 35 switch payload.(type) { 36 case string: 37 w.Write([]byte(payload.(string))) 38 return nil 39 case []byte: 40 w.Write(payload.([]byte)) 41 return nil 42 case io.ReadCloser: 43 _, err := io.Copy(w, payload.(io.ReadCloser)) 44 if err != nil { 45 s.errLog.Println(err) 46 http.Error(w, err.Error(), http.StatusInternalServerError) 47 return nil 48 } 49 return nil 50 default: 51 payload, err := json.Marshal(payload) 52 if err != nil { 53 s.errLog.Println(err) 54 http.Error(w, err.Error(), http.StatusInternalServerError) 55 return nil 56 } 57 w.Write(payload) 58 return payload 59 } 60 } 61 62 func NewServer(root, cmd string, db DB, eLog, iLog *log.Logger, tCacheSize int) (*Server, error) { 63 var err error 64 // Ping db to ensure connection 65 if db != nil { 66 if err = db.Ping(context.Background()); err != nil { 67 return nil, fmt.Errorf("error while pinging database: %v", err) 68 } 69 iLog.Println("successfully connected to database") 70 } 71 s := &Server{ 72 rootDir: root, 73 db: db, 74 errLog: eLog, 75 infoLog: iLog, 76 } 77 78 // Create the template cache 79 s.tmplCache, err = job.NewTemplateCache(tCacheSize) 80 if err != nil { 81 return nil, err 82 } 83 84 // Ensure root directory exists 85 if _, err := os.Stat(root); os.IsNotExist(err) { 86 if err = os.Mkdir(root, 0755); err != nil { 87 return nil, err 88 } 89 } else if err != nil { 90 return nil, err 91 } 92 s.cmd = cmd 93 return s.routes(), nil 94 }