Files
old-ibcetvorke/cetgemini/cetgemini.go
2023-07-30 19:21:16 +02:00

79 lines
1.7 KiB
Go

package cetgemini
import (
"context"
"fmt"
"github.com/a-h/gemini"
"github.com/a-h/gemini/mux"
"github.com/senaduka/cetvorke/database"
"log"
"strconv"
"strings"
"sync"
)
func StartServer(waitgroup *sync.WaitGroup) {
defer waitgroup.Done()
// Create the handlers for a domain (a.gemini).
index := gemini.HandlerFunc(indexHandler)
post := gemini.HandlerFunc(postHandler)
// Create a router for gemini://a.gemini/require_cert and gemini://a.gemini/public
routerA := mux.NewMux()
routerA.AddRoute("/clanak/{postID}/*", post)
routerA.AddRoute("/", index)
// Set up the domain handlers.
ctx := context.Background()
a, err := gemini.NewDomainHandlerFromFiles("localhost", "server.crt", "server.key", routerA)
if err != nil {
log.Fatal("error creating domain handler A:", err)
}
err = gemini.ListenAndServe(ctx, ":1965", a)
if err != nil {
log.Fatal("error:", err)
}
}
// write a gemini handler function
func indexHandler(w gemini.ResponseWriter, r *gemini.Request) {
links, err := database.GetRecentLinks()
if err != nil {
w.Write([]byte(fmt.Sprintf("Error: %s", err)))
return
}
response := "# Najnoviji članci\n\n"
for _, link := range links {
// append links to response in gemini feed format
response += link.GemtextLink()
}
fmt.Println(response)
w.Write([]byte(response))
}
func postHandler(w gemini.ResponseWriter, r *gemini.Request) {
post_id_str := strings.Split(r.URL.Path, "/")[2]
post_id, err := strconv.Atoi(post_id_str)
if err != nil {
w.Write([]byte(fmt.Sprintf("Error: %s", err)))
return
}
post, err := database.GetPost(post_id)
if err != nil {
w.Write([]byte(fmt.Sprintf("Error: %s", err)))
return
}
response := post.GemtextPage()
w.Write([]byte(response))
}