diff options
Diffstat (limited to 'backend/main.go')
| -rw-r--r-- | backend/main.go | 70 |
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") |
