// package handler // for serverless deploy
package main // for regular deploy
import (
"bytes"
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"git.sr.ht/~evanj/e3/internal/cache"
"git.sr.ht/~evanj/e3/internal/db"
"git.sr.ht/~evanj/e3/internal/send"
"git.sr.ht/~evanj/e3/internal/upload"
"git.sr.ht/~evanj/e3/internal/user"
"git.sr.ht/~evanj/security"
)
type App struct {
log *log.Logger
upload http.Handler
send http.Handler
user http.Handler
}
var app App
func init() {
var w io.Writer
switch os.Getenv("LOG_LEVEL") {
case "ALL":
w = os.Stdout
default:
w = bytes.NewBufferString(os.DevNull)
}
sec := security.Default(os.Getenv("SECRET"))
db, err := db.New(os.Getenv("MYSQL"), sec)
if err != nil {
log.Fatal(err)
}
cached := cache.New(
log.New(w, "[e3:cache] ", 0),
os.Getenv("CACHE_KEY"),
db,
os.Getenv("MEMCACHE"),
)
u := user.New(
log.New(w, "[e3:user] ", 0),
cached,
)
app = App{
log.New(w, "[e3] ", 0),
upload.New(
os.Getenv("URL"),
cached,
u,
),
send.New(
log.New(w, "[e3:send] ", 0),
cached,
),
u,
}
}
func (app App) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// TODO: Refactor routes to namespace as user is.
urlParts := strings.Split(r.URL.Path, "/")
if len(urlParts) > 1 {
switch urlParts[1] {
case "user":
app.user.ServeHTTP(w, r)
return
case "invite":
app.user.ServeHTTP(w, r)
return
}
}
switch r.Method {
case "GET":
switch r.URL.Path {
case "/":
app.user.ServeHTTP(w, r)
return
case "/favicon.ico":
http.NotFound(w, r)
return
default:
app.send.ServeHTTP(w, r)
return
}
case "POST":
switch r.URL.Path {
case "/":
app.user.ServeHTTP(w, r)
return
default:
app.upload.ServeHTTP(w, r)
return
}
case "OPTIONS":
w.Header().Add("Access-Control-Allow-Origin", "*")
w.Header().Add("Access-Control-Allow-Headers", "Authorization")
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "pong")
return
default:
http.NotFound(w, r)
}
}
// for serverless deploy
// func ServeHTTP(w http.ResponseWriter, r *http.Request) {
// app.ServeHTTP(w, r)
// }
// for regular deploy
func main() {
port := fmt.Sprintf(":%s", os.Getenv("PORT"))
app.log.Println("Server has been started:", os.Getenv("URL"))
log.Fatal(http.ListenAndServe(port, app))
}