Created
December 8, 2021 17:05
-
-
Save utkarshchowdhary/332b02897e80ba708cabefb93321efc5 to your computer and use it in GitHub Desktop.
A Basic HTTP server in Go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"errors" | |
"fmt" | |
"log" | |
"net/http" | |
) | |
func LogOutput(message string) { | |
fmt.Println(message) | |
} | |
type SimpleDataStore struct { | |
userData map[string]string | |
} | |
func (sds SimpleDataStore) UserNameForID(userID string) (string, bool) { | |
name, ok := sds.userData[userID] | |
return name, ok | |
} | |
func NewSimpleDataStore() SimpleDataStore { | |
return SimpleDataStore{ | |
userData: map[string]string{ | |
"1": "Fred", | |
"2": "Mary", | |
"3": "Pat", | |
}, | |
} | |
} | |
type DataStore interface { | |
UserNameForID(userID string) (string, bool) | |
} | |
type Logger interface { | |
Log(message string) | |
} | |
type LoggerAdapter func(message string) | |
func (lg LoggerAdapter) Log(message string) { | |
lg(message) | |
} | |
type SimpleLogic struct { | |
l Logger | |
ds DataStore | |
} | |
func (sl SimpleLogic) SayHello(userID string) (string, error) { | |
sl.l.Log("in SayHello for " + userID) | |
if name, ok := sl.ds.UserNameForID(userID); ok { | |
return "Hello, " + name, nil | |
} | |
return "", errors.New("unknown user") | |
} | |
func (sl SimpleLogic) SayGoodbye(userID string) (string, error) { | |
sl.l.Log("in SayGoodbye for " + userID) | |
if name, ok := sl.ds.UserNameForID(userID); ok { | |
return "Goodbye, " + name, nil | |
} | |
return "", errors.New("unknown user") | |
} | |
func NewSimpleLogic(l Logger, ds DataStore) SimpleLogic { | |
return SimpleLogic{ | |
l: l, | |
ds: ds, | |
} | |
} | |
type Logic interface { | |
SayHello(userID string) (string, error) | |
} | |
type Controller struct { | |
l Logger | |
logic Logic | |
} | |
func (c Controller) SayHello(w http.ResponseWriter, r *http.Request) { | |
c.l.Log("In SayHello") | |
userID := r.URL.Query().Get("user_id") | |
if message, err := c.logic.SayHello(userID); err != nil { | |
w.WriteHeader(http.StatusBadRequest) | |
w.Write([]byte(err.Error())) | |
} else { | |
w.Write([]byte(message)) | |
} | |
} | |
func NewController(l Logger, logic Logic) Controller { | |
return Controller{ | |
l: l, | |
logic: logic, | |
} | |
} | |
func main() { | |
l := LoggerAdapter(LogOutput) | |
ds := NewSimpleDataStore() | |
logic := NewSimpleLogic(l, ds) | |
c := NewController(l, logic) | |
http.HandleFunc("/hello", c.SayHello) | |
log.Fatal(http.ListenAndServe(":8080", nil)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment