Tree Browser Work

This commit is contained in:
2026-02-05 11:46:41 -06:00
parent 687e64e701
commit 367d62ff00
8 changed files with 286 additions and 39 deletions

View File

@@ -27,7 +27,7 @@ func (a *AppLogHandler) addGroups(groups ...string) { a.groups = append(a.group
// AppLogHandler can handle all levels
func (a *AppLogHandler) Enabled(_ context.Context, lvl slog.Level) bool { return lvl >= a.level }
func (a *AppLogHandler) Handle(ctx context.Context, rcd slog.Record) error {
func (a *AppLogHandler) Handle(_ context.Context, rcd slog.Record) error {
if a.logFunc == nil {
return errors.New("no log func defined")
}

View File

@@ -40,6 +40,7 @@ type Repo struct {
handler *AppLogHandler
logFunc func(string, ...any)
Logger *slog.Logger
context context.Context
}
@@ -56,6 +57,7 @@ func NewRepo() (*Repo, error) {
} else {
r.handler.SetLevel(slog.LevelWarn)
}
r.Logger = slog.Default()
var err error
r.Auth, err = NewAuthRepo(r)
if err != nil {
@@ -64,10 +66,7 @@ func NewRepo() (*Repo, error) {
return r, nil
}
func (r *Repo) GetPDS(atId string) (*models.Pds, error) {
if p, ok := r.LoadedPDSs[atId]; ok && time.Since(p.RefreshTime) < r.BestBy {
return p, nil
}
func (r *Repo) fetchPds(atId string) (*models.Pds, error) {
p, err := models.NewPdsFromDid(atId)
if err != nil {
return nil, err
@@ -76,8 +75,19 @@ func (r *Repo) GetPDS(atId string) (*models.Pds, error) {
return p, nil
}
func (r *Repo) SendToPDS() error {
session, err := r.Auth.GetSession()
func (r *Repo) ReloadPds(atId string) (*models.Pds, error) {
return r.fetchPds(atId)
}
func (r *Repo) GetPDS(atId string) (*models.Pds, error) {
if p, ok := r.LoadedPDSs[atId]; ok && time.Since(p.RefreshTime) < r.BestBy {
return p, nil
}
return r.fetchPds(atId)
}
func (r *Repo) SendToPDS(did syntax.DID) error {
session, err := r.Auth.GetSession(did)
if err != nil {
return err
}
@@ -94,11 +104,11 @@ func (r *Repo) SendToPDS() error {
var resp struct {
Uri syntax.ATURI `json:"uri"`
}
slog.Debug("posting expds status...")
r.Logger.Debug("posting expds status...")
if err := c.Post(r.context, "com.atproto.repo.CreateRecord", body, &resp); err != nil {
return err
}
slog.Debug(fmt.Sprintf("posted: %s :: %s", resp.Uri.Authority(), resp.Uri.RecordKey()))
r.Logger.Debug(fmt.Sprintf("posted: %s :: %s", resp.Uri.Authority(), resp.Uri.RecordKey()))
return nil
}
@@ -106,4 +116,6 @@ func (r *Repo) SetLogFunc(l func(string, ...any)) {
r.logFunc = l
r.handler = NewAppLogHandler(r.logFunc)
slog.SetDefault(slog.New(r.handler))
r.Logger = slog.Default()
r.Logger.Debug("New Log Func Set for slog")
}

View File

@@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"log/slog"
"net"
"net/http"
"net/url"
@@ -13,6 +14,7 @@ import (
"time"
"github.com/bluesky-social/indigo/atproto/auth/oauth"
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/spf13/viper"
)
@@ -24,12 +26,15 @@ type AuthRepo struct {
context context.Context
session *oauth.ClientSessionData
Logger *slog.Logger
}
func NewAuthRepo(r *Repo) (*AuthRepo, error) {
a := &AuthRepo{
r: r,
context: r.context,
Logger: r.Logger,
}
var err error
a.oauthConfig, a.oauthClient, a.store, err = a.buildOAuthClient()
@@ -110,20 +115,22 @@ func (r *AuthRepo) ListenForCallback(res chan url.Values) (int, error) {
if !errors.Is(err, http.ErrServerClosed) {
panic(err)
}
r.Logger.Debug("Server Shut Down")
}()
return listener.Addr().(*net.TCPAddr).Port, nil
}
func (r *AuthRepo) HasAuth() bool {
sess, err := r.store.GetMostRecentSession(r.context)
return err != nil || sess == nil
func (r *AuthRepo) HasAuth(did syntax.DID) bool {
sess, err := r.GetSession(did)
return err == nil && sess != nil
}
func (r *AuthRepo) GetSession() (*oauth.ClientSession, error) {
sess, err := r.store.GetMostRecentSession(r.context)
func (r *AuthRepo) GetSession(did syntax.DID) (*oauth.ClientSession, error) {
sess, err := r.store.GetMostRecentSessionFor(r.context, did)
if err != nil {
return nil, fmt.Errorf("error getting most recent session: %w", err)
}
r.Logger.Warn(fmt.Sprintf("GetSession(): Resuming Session: %s (%s)", sess.SessionID, sess.AccountDID))
return r.oauthClient.ResumeSession(r.context, sess.AccountDID, sess.SessionID)
}

View File

@@ -96,6 +96,20 @@ func (m *SqliteStore) GetSession(ctx context.Context, did syntax.DID, sessionID
return &row.Data, nil
}
func (m *SqliteStore) GetMostRecentSessionFor(ctx context.Context, did syntax.DID) (*oauth.ClientSessionData, error) {
var row storedSessionData
res := m.db.WithContext(ctx).Where(&storedSessionData{
AccountDid: did,
}).Order(clause.OrderByColumn{
Column: clause.Column{Name: "updated_at"},
Desc: true,
}).First(&row)
if res.Error != nil {
return nil, res.Error
}
return &row.Data, nil
}
// not part of the ClientAuthStore interface, just used for the CLI app
func (m *SqliteStore) GetMostRecentSession(ctx context.Context) (*oauth.ClientSessionData, error) {
var row storedSessionData