aboutsummaryrefslogtreecommitdiffstats
path: root/api/api.go
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-14 08:58:38 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-14 08:58:38 -0800
commite3c379d069ffa9661561d25cdbf2f5894a2f8ee8 (patch)
tree24d0e9f5610dd9c8f873c5b78e6bc1c88d32840a /api/api.go
parent4b06155fbde91a1bef6361ef36efb28789861928 (diff)
downloadneko-e3c379d069ffa9661561d25cdbf2f5894a2f8ee8.tar.gz
neko-e3c379d069ffa9661561d25cdbf2f5894a2f8ee8.tar.bz2
neko-e3c379d069ffa9661561d25cdbf2f5894a2f8ee8.zip
Refactor: project structure, implement dependency injection, and align v2 UI with v1
Diffstat (limited to 'api/api.go')
-rw-r--r--api/api.go51
1 files changed, 32 insertions, 19 deletions
diff --git a/api/api.go b/api/api.go
index 1ce6e5a..5e7618d 100644
--- a/api/api.go
+++ b/api/api.go
@@ -7,23 +7,36 @@ import (
"strconv"
"strings"
- "adammathes.com/neko/crawler"
- "adammathes.com/neko/exporter"
+ "adammathes.com/neko/config"
+ "adammathes.com/neko/internal/crawler"
+ "adammathes.com/neko/internal/exporter"
"adammathes.com/neko/models/feed"
"adammathes.com/neko/models/item"
)
-// NewRouter returns a configured mux with all API routes.
-func NewRouter() *http.ServeMux {
- mux := http.NewServeMux()
- mux.HandleFunc("/stream", HandleStream)
- mux.HandleFunc("/item/", HandleItem)
- mux.HandleFunc("/feed", HandleFeed)
- mux.HandleFunc("/feed/", HandleFeed)
- mux.HandleFunc("/tag", HandleCategory)
- mux.HandleFunc("/export/", HandleExport)
- mux.HandleFunc("/crawl", HandleCrawl)
- return mux
+type Server struct {
+ Config *config.Settings
+ *http.ServeMux
+}
+
+// NewServer returns a configured server with all API routes.
+func NewServer(cfg *config.Settings) *Server {
+ s := &Server{
+ Config: cfg,
+ ServeMux: http.NewServeMux(),
+ }
+ s.routes()
+ return s
+}
+
+func (s *Server) routes() {
+ s.HandleFunc("/stream", s.HandleStream)
+ s.HandleFunc("/item/", s.HandleItem)
+ s.HandleFunc("/feed", s.HandleFeed)
+ s.HandleFunc("/feed/", s.HandleFeed)
+ s.HandleFunc("/tag", s.HandleCategory)
+ s.HandleFunc("/export/", s.HandleExport)
+ s.HandleFunc("/crawl", s.HandleCrawl)
}
func jsonError(w http.ResponseWriter, msg string, code int) {
@@ -37,7 +50,7 @@ func jsonResponse(w http.ResponseWriter, data interface{}) {
json.NewEncoder(w).Encode(data)
}
-func HandleStream(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleStream(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
jsonError(w, "method not allowed", http.StatusMethodNotAllowed)
return
@@ -72,7 +85,7 @@ func HandleStream(w http.ResponseWriter, r *http.Request) {
jsonResponse(w, items)
}
-func HandleItem(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleItem(w http.ResponseWriter, r *http.Request) {
idStr := strings.TrimPrefix(r.URL.Path, "/item/")
id, _ := strconv.ParseInt(idStr, 10, 64)
@@ -115,7 +128,7 @@ func HandleItem(w http.ResponseWriter, r *http.Request) {
}
}
-func HandleFeed(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleFeed(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
feeds, err := feed.All()
@@ -180,7 +193,7 @@ func HandleFeed(w http.ResponseWriter, r *http.Request) {
}
}
-func HandleCategory(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleCategory(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
jsonError(w, "method not allowed", http.StatusMethodNotAllowed)
return
@@ -194,7 +207,7 @@ func HandleCategory(w http.ResponseWriter, r *http.Request) {
jsonResponse(w, categories)
}
-func HandleExport(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleExport(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
jsonError(w, "method not allowed", http.StatusMethodNotAllowed)
return
@@ -208,7 +221,7 @@ func HandleExport(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(exporter.ExportFeeds(format)))
}
-func HandleCrawl(w http.ResponseWriter, r *http.Request) {
+func (s *Server) HandleCrawl(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
jsonError(w, "method not allowed", http.StatusMethodNotAllowed)
return