2025-01-24 15:15:54 +00:00
|
|
|
package web
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
2025-02-07 16:17:51 +00:00
|
|
|
"strconv"
|
2025-01-24 15:15:54 +00:00
|
|
|
|
|
|
|
"github.com/Jaculabilis/intake/core"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Env struct {
|
2025-01-31 16:44:09 +00:00
|
|
|
db core.DB
|
2025-01-24 15:15:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func logged(handler http.HandlerFunc) http.HandlerFunc {
|
|
|
|
return func(writer http.ResponseWriter, req *http.Request) {
|
|
|
|
log.Printf("%s %s", req.Method, req.URL.Path)
|
|
|
|
handler(writer, req)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-06 04:44:03 +00:00
|
|
|
func handleFunc(
|
|
|
|
pattern string,
|
|
|
|
handler http.HandlerFunc,
|
|
|
|
middlewares ...func(http.HandlerFunc) http.HandlerFunc,
|
|
|
|
) {
|
|
|
|
for _, middleware := range middlewares {
|
|
|
|
handler = middleware(handler)
|
|
|
|
}
|
|
|
|
http.HandleFunc(pattern, handler)
|
2025-01-24 15:15:54 +00:00
|
|
|
}
|
|
|
|
|
2025-02-20 15:18:51 +00:00
|
|
|
func RunServer(db core.DB, addr string, port string) error {
|
2025-01-24 15:15:54 +00:00
|
|
|
env := &Env{db}
|
|
|
|
bind := net.JoinHostPort(addr, port)
|
|
|
|
|
2025-02-06 14:33:39 +00:00
|
|
|
handleFunc("GET /", env.getRoot, env.authed, logged)
|
2025-02-06 04:44:03 +00:00
|
|
|
handleFunc("GET /style.css", env.getStyle, logged)
|
|
|
|
handleFunc("GET /htmx.org@2.0.4.js", env.getScript, logged)
|
2025-02-06 14:33:39 +00:00
|
|
|
handleFunc("POST /login", env.login, logged)
|
|
|
|
handleFunc("GET /source/{source}", env.getSource, env.authed, logged)
|
2025-02-12 18:04:58 +00:00
|
|
|
handleFunc("GET /source/{source}/edit", env.getEditSource, env.authed, logged)
|
|
|
|
handleFunc("POST /source/{source}/edit", env.editSource, env.authed, logged)
|
2025-02-07 22:37:36 +00:00
|
|
|
handleFunc("POST /source/{source}/fetch", env.fetchSource, env.authed, logged)
|
2025-02-12 15:46:19 +00:00
|
|
|
handleFunc("GET /channel/", env.getChannels, env.authed, logged)
|
|
|
|
handleFunc("POST /channel/", env.editChannel, env.authed, logged)
|
|
|
|
handleFunc("DELETE /channel/", env.editChannel, env.authed, logged)
|
2025-02-06 14:33:39 +00:00
|
|
|
handleFunc("GET /channel/{channel}", env.getChannel, env.authed, logged)
|
2025-02-07 23:49:22 +00:00
|
|
|
handleFunc("POST /item", env.addItem, env.authed, logged)
|
2025-02-06 14:33:39 +00:00
|
|
|
handleFunc("GET /item/{source}/{id}", env.getItem, env.authed, logged)
|
|
|
|
handleFunc("DELETE /item/{source}/{id}", env.deleteItem, env.authed, logged)
|
|
|
|
handleFunc("POST /item/{source}/{id}/action/{action}", env.doAction, env.authed, logged)
|
2025-02-07 04:14:54 +00:00
|
|
|
handleFunc("PATCH /item/{source}/{id}/punt", env.puntItem, env.authed, logged)
|
2025-02-06 14:33:39 +00:00
|
|
|
handleFunc("POST /mass-deactivate", env.massDeactivate, env.authed, logged)
|
2025-01-24 15:15:54 +00:00
|
|
|
|
2025-02-10 14:22:43 +00:00
|
|
|
log.Printf("listening on %s", bind)
|
2025-02-20 15:18:51 +00:00
|
|
|
return http.ListenAndServe(bind, nil)
|
2025-01-24 15:15:54 +00:00
|
|
|
}
|
2025-02-07 16:17:51 +00:00
|
|
|
|
|
|
|
func getQueryInt(req *http.Request, name string, def int) int {
|
|
|
|
s := req.URL.Query().Get(name)
|
|
|
|
i, err := strconv.Atoi(s)
|
|
|
|
if err != nil {
|
|
|
|
return def
|
|
|
|
} else {
|
|
|
|
return i
|
|
|
|
}
|
|
|
|
}
|