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  }