aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillermo Serrahima <dev@vylion.com>2026-03-13 11:17:25 +0100
committerGuillermo Serrahima <dev@vylion.com>2026-03-13 11:17:25 +0100
commit2987e7a3f9c052054b7630dd9c1fafd2661c3c86 (patch)
tree48e987f3361825560b7c5efc24c9743a51dff49f
parent7eacda993ac98fc4b3ee7bb443ae3f230761e022 (diff)
downloadllostre-2987e7a3f9c052054b7630dd9c1fafd2661c3c86.tar.xz
llostre-2987e7a3f9c052054b7630dd9c1fafd2661c3c86.zip
Added proper logging
-rw-r--r--backend/main.go70
1 files changed, 38 insertions, 32 deletions
diff --git a/backend/main.go b/backend/main.go
index 032c6e9..d5fbb91 100644
--- a/backend/main.go
+++ b/backend/main.go
@@ -5,6 +5,7 @@ import (
"fmt"
"llostre/backend/auth"
"llostre/backend/fetchers"
+ "log/slog"
"net/http"
"os"
"strings"
@@ -15,6 +16,7 @@ import (
)
var (
+ logger *slog.Logger
backendURL string
frontendURL string
sessionsMutex sync.RWMutex
@@ -24,22 +26,31 @@ var (
func init() {
godotenv.Load("../.env")
- // fallback values
+ // setup URLs
appDomain := os.Getenv("APP_DOMAIN")
if appDomain == "" {
- appDomain = "127.0.0.1"
+ appDomain = "http://127.0.0.1:8080"
}
- frontendPort := os.Getenv("APP_FRONTEND_PORT")
- if frontendPort == "" {
- frontendPort = "8080"
- }
- backendPort := os.Getenv("APP_BACKEND_PORT")
- if backendPort == "" {
- backendPort = "8080"
+
+ backendURL = appDomain + "/api"
+ frontendURL = appDomain
+
+ // setup logger
+ logLevel := slog.LevelInfo
+ switch strings.ToLower(os.Getenv("LOG_LEVEL")) {
+ case "debug":
+ logLevel = slog.LevelDebug
+ case "info":
+ logLevel = slog.LevelInfo
+ case "warn":
+ logLevel = slog.LevelWarn
+ case "error":
+ logLevel = slog.LevelError
}
- backendURL = fmt.Sprintf("%s", appDomain)
- frontendURL = backendURL
+ logger = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
+ Level: logLevel,
+ }))
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
@@ -60,8 +71,7 @@ func loginHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, fmt.Sprintf("failed to fetch PDS: %v", err), http.StatusInternalServerError)
return
}
- fmt.Printf("Resolved DID: %s\n", did)
- fmt.Printf("Resolved PDS: %s\n", pds)
+ logger.Debug("Resolved DID and PDS", "did", did, "pds", pds)
// fetch oauth metadata from PDS
metadata, err := auth.FetchOAuthMetadata(pds)
@@ -100,8 +110,8 @@ func loginHandler(w http.ResponseWriter, r *http.Request) {
sessionsMutex.Unlock()
config := auth.OAuthConfig{
- ClientID: backendURL + "/api/callback",
- RedirectURI: backendURL + "/api/callback",
+ ClientID: backendURL + "/callback",
+ RedirectURI: backendURL + "/callback",
Scopes: []string{"atproto"},
}
@@ -117,9 +127,9 @@ func callbackHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Query().Get("code") == "" && r.URL.Query().Get("state") == "" && r.URL.Query().Get("error") == "" {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{
- "client_id": backendURL + "/api/callback",
+ "client_id": backendURL + "/callback",
"client_name": "llostre",
- "redirect_uris": []string{backendURL + "/api/callback"},
+ "redirect_uris": []string{backendURL + "/callback"},
"scope": "atproto",
"grant_types": []string{"authorization_code", "refresh_token"},
"response_types": []string{"code"},
@@ -153,7 +163,7 @@ func callbackHandler(w http.ResponseWriter, r *http.Request) {
oauthState.PDS,
code,
oauthState.CodeVerifier,
- backendURL,
+ backendURL + "/callback",
oauthState.KeyPair,
)
if err != nil {
@@ -182,7 +192,7 @@ func callbackHandler(w http.ResponseWriter, r *http.Request) {
delete(sessions, state) // remove the partial oauth state from login
sessionsMutex.Unlock()
- fmt.Printf("About to set cookie with token: %s\n", sessionToken)
+ logger.Debug("About to set cookie", "token", sessionToken)
// set session cookie
http.SetCookie(w, &http.Cookie{
@@ -195,7 +205,7 @@ func callbackHandler(w http.ResponseWriter, r *http.Request) {
MaxAge: 86400 * 30,
})
- fmt.Printf("Cookie set, redirecting to: %s\n", frontendURL+"/")
+ logger.Debug("Cookie set, redirecting to frontend", "destination", frontendURL+"/")
// redirect to main app
http.Redirect(w, r, frontendURL, http.StatusFound)
@@ -232,16 +242,16 @@ func sessionHandler(w http.ResponseWriter, r *http.Request) {
}
func postsHandler(w http.ResponseWriter, r *http.Request) {
- fmt.Printf("\n=== POST HANDLER START ===\n")
+ logger.Debug("posts handler start")
cookie, err := r.Cookie("session_token")
if err != nil {
- fmt.Printf("Cookie error: %v\n", err)
+ logger.Error("cookie not received", "error", err)
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
- fmt.Printf("Cookie value: %s\n", cookie.Value)
+ logger.Debug("cookie received", "value", cookie.Value)
sessionsMutex.RLock()
session, exists := sessions[cookie.Value]
@@ -251,13 +261,9 @@ func postsHandler(w http.ResponseWriter, r *http.Request) {
return
}
- fmt.Printf("Session exists: %v\n", exists)
- fmt.Printf("Session DID: %s\n", session.DID)
- fmt.Printf("Session PDS: %s\n", session.PDS)
- fmt.Printf("Session AccessToken length: %d\n", len(session.AccessToken))
- fmt.Printf("Session KeyPair: %p\n", session.KeyPair)
+ logger.Debug("session found", "did", session.DID, "pds", session.PDS, "access token length", len(session.AccessToken), "session keypair", session.KeyPair)
if session.KeyPair != nil {
- fmt.Printf("KeyPair PublicKey: %p\n", session.KeyPair.PublicKey)
+ logger.Debug("session public key", "key", session.KeyPair.PublicKey)
}
needsRefresh := time.Now().After(session.ExpiresAt)
@@ -267,7 +273,7 @@ func postsHandler(w http.ResponseWriter, r *http.Request) {
sessionsMutex.RUnlock()
if needsRefresh {
- newTokens, err := auth.RefreshAccessToken(pds, refreshToken, keypair)
+ newTokens, err := auth.RefreshAccessToken(pds, refreshToken, backendURL + "/callback", keypair)
if err != nil {
sessionsMutex.Lock()
delete(sessions, cookie.Value)
@@ -285,12 +291,12 @@ func postsHandler(w http.ResponseWriter, r *http.Request) {
posts, err := fetchers.FetchAppBskyFeedPosts(session.DID, session.PDS, session.AccessToken, session.KeyPair)
if err != nil {
- fmt.Printf("FetchAppBskyFeedPosts error: %v\n", err)
+ logger.Error("fetching app.bsky.feed.posts failed", "error", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
- fmt.Printf("Successfully fetched %d posts\n", len(posts))
+ logger.Debug("successfully fetched posts", "number", len(posts))
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Content-Type", "application/json")