Fix logging in repo, fix stale auth
This commit is contained in:
@@ -72,7 +72,6 @@ type ScreenHome struct {
|
|||||||
|
|
||||||
func (s *ScreenHome) Init(a *App) {
|
func (s *ScreenHome) Init(a *App) {
|
||||||
s.a, s.r = a, a.repo
|
s.a, s.r = a, a.repo
|
||||||
s.r.SetLogFunc(s.Log)
|
|
||||||
|
|
||||||
s.style = a.style
|
s.style = a.style
|
||||||
|
|
||||||
@@ -82,6 +81,7 @@ func (s *ScreenHome) Init(a *App) {
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
s.alert.SetCancelPressed(nil)
|
s.alert.SetCancelPressed(nil)
|
||||||
|
s.alert.SetLogger(s.Log)
|
||||||
|
|
||||||
s.openPdsEntry = w.NewField("home.openpds.field", s.style)
|
s.openPdsEntry = w.NewField("home.openpds.field", s.style)
|
||||||
s.openPdsEntry.SetLabel("ID")
|
s.openPdsEntry.SetLabel("ID")
|
||||||
@@ -170,6 +170,8 @@ func (s *ScreenHome) Init(a *App) {
|
|||||||
s.menuLayout.SetWidget(s.layout)
|
s.menuLayout.SetWidget(s.layout)
|
||||||
s.layout.SetLogger(s.Log)
|
s.layout.SetLogger(s.Log)
|
||||||
s.columns.SetLogger(s.Log)
|
s.columns.SetLogger(s.Log)
|
||||||
|
|
||||||
|
s.r.SetLogFunc(s.Log)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScreenHome) GetName() string { return "home" }
|
func (s *ScreenHome) GetName() string { return "home" }
|
||||||
@@ -209,14 +211,18 @@ func (s *ScreenHome) HandleKey(ev *tcell.EventKey) bool {
|
|||||||
}
|
}
|
||||||
return s.openPdsEntry.HandleKey(ev)
|
return s.openPdsEntry.HandleKey(ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ev.Key() {
|
switch ev.Key() {
|
||||||
case tcell.KeyCtrlO:
|
case tcell.KeyCtrlO:
|
||||||
return s.menuOpenPds()
|
return s.menuOpenPds()
|
||||||
|
case tcell.KeyCtrlA:
|
||||||
|
return s.addNewRecord()
|
||||||
case tcell.KeyCtrlD:
|
case tcell.KeyCtrlD:
|
||||||
return s.deleteCurrentRecord()
|
return s.deleteCurrentRecord()
|
||||||
case tcell.KeyCtrlR:
|
case tcell.KeyCtrlR:
|
||||||
return s.menuRefreshPds()
|
return s.menuRefreshPds()
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.menuLayout.HandleKey(ev)
|
return s.menuLayout.HandleKey(ev)
|
||||||
}
|
}
|
||||||
func (s *ScreenHome) HandleTime(ev *tcell.EventTime) {
|
func (s *ScreenHome) HandleTime(ev *tcell.EventTime) {
|
||||||
@@ -530,12 +536,12 @@ func (s *ScreenHome) menuAuthPds() bool {
|
|||||||
time.Sleep(100)
|
time.Sleep(100)
|
||||||
}
|
}
|
||||||
s.alert.SetVisible(false)
|
s.alert.SetVisible(false)
|
||||||
|
s.updatePdsListing()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return true
|
return true
|
||||||
|
|
||||||
}
|
}
|
||||||
func (s *ScreenHome) menuOpenPds() bool {
|
func (s *ScreenHome) menuOpenPds() bool {
|
||||||
s.menuLayout.HideMenu()
|
s.menuLayout.HideMenu()
|
||||||
@@ -622,6 +628,32 @@ func (s *ScreenHome) getPds(atId string) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ScreenHome) addNewRecord() bool {
|
||||||
|
if s.activePds == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
tn, err := s.pdsListing.GetActiveNode()
|
||||||
|
if err != nil {
|
||||||
|
s.Log("error getting active node")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
tnPath := tn.GetValuePath()
|
||||||
|
if len(tnPath) != 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
tnLabelPath := tn.GetLabelPath()
|
||||||
|
nsid, err := syntax.ParseNSID(tnPath[0])
|
||||||
|
if err != nil {
|
||||||
|
s.Log("error parsing NSID from %s: %w", tnPath[0], err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
//tmplt := s.activePds.GetBlankRecordForNSID(nsid)
|
||||||
|
//s.Log("%s", tmplt)
|
||||||
|
*/
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ScreenHome) deleteCurrentRecord() bool {
|
func (s *ScreenHome) deleteCurrentRecord() bool {
|
||||||
tn, err := s.pdsListing.GetActiveNode()
|
tn, err := s.pdsListing.GetActiveNode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -639,17 +671,15 @@ func (s *ScreenHome) deleteCurrentRecord() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
rkey := tnPath[1]
|
rkey := tnPath[1]
|
||||||
/*
|
|
||||||
if err := s.r.DeleteRecord(s.activePds.Did, nsid, rkey); err != nil {
|
|
||||||
s.Log("error deleting record: %w", err)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
s.alert.SetTitle("Confirm Deletion")
|
s.alert.SetTitle("Confirm Deletion")
|
||||||
s.alert.SetMessage(fmt.Sprintf("Are you sure you want to delete this record?\n%s: %s\nThis cannot be undone.", tnLabelPath[0], tnLabelPath[1]))
|
s.alert.SetMessage(fmt.Sprintf("Are you sure you want to delete this record?\n%s: %s\nThis cannot be undone.", tnLabelPath[0], tnLabelPath[1]))
|
||||||
s.alert.SetVisible(true)
|
s.alert.SetVisible(true)
|
||||||
s.alert.SetActive(true)
|
s.alert.SetActive(true)
|
||||||
s.alert.SetOkPressed(func() bool {
|
s.alert.SetOkPressed(func() bool {
|
||||||
s.r.DeleteRecord(s.activePds.Did, nsid, rkey)
|
if err := s.r.DeleteRecord(s.activePds.Did, nsid, rkey); err != nil {
|
||||||
|
panic(err)
|
||||||
|
s.Log("! Error Deleting Record: %s / %s / %s", s.activePds.Did, nsid, rkey)
|
||||||
|
}
|
||||||
s.alert.SetVisible(false)
|
s.alert.SetVisible(false)
|
||||||
s.alert.SetActive(false)
|
s.alert.SetActive(false)
|
||||||
return true
|
return true
|
||||||
@@ -659,7 +689,7 @@ func (s *ScreenHome) deleteCurrentRecord() bool {
|
|||||||
s.alert.SetActive(false)
|
s.alert.SetActive(false)
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
s.alert.SetPos(w.Coord{X: s.w / 4, Y: s.h / 4})
|
|
||||||
s.alert.HandleResize(w.Coord{X: s.w / 4, Y: s.h / 4}.ResizeEvent())
|
s.alert.HandleResize(w.Coord{X: s.w / 4, Y: s.h / 4}.ResizeEvent())
|
||||||
|
s.alert.SetPos(w.Coord{X: (s.w / 2) - (s.alert.GetW() / 2), Y: (s.h / 2) - (s.alert.GetH() / 2)})
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ type Pds struct {
|
|||||||
recordIdsToNSID map[string]syntax.NSID
|
recordIdsToNSID map[string]syntax.NSID
|
||||||
Records map[string]map[string]any
|
Records map[string]map[string]any
|
||||||
|
|
||||||
|
TIDClock syntax.TIDClock
|
||||||
|
|
||||||
RefreshTime time.Time
|
RefreshTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,11 @@ func NewRepo() (*Repo, error) {
|
|||||||
func (r *Repo) SetLogFunc(l func(string, ...any)) {
|
func (r *Repo) SetLogFunc(l func(string, ...any)) {
|
||||||
r.logFunc = l
|
r.logFunc = l
|
||||||
r.handler = NewAppLogHandler(r.logFunc)
|
r.handler = NewAppLogHandler(r.logFunc)
|
||||||
|
if viper.GetBool(KeyDebug) {
|
||||||
|
r.handler.SetLevel(slog.LevelDebug)
|
||||||
|
} else {
|
||||||
|
r.handler.SetLevel(slog.LevelWarn)
|
||||||
|
}
|
||||||
slog.SetDefault(slog.New(r.handler))
|
slog.SetDefault(slog.New(r.handler))
|
||||||
r.Logger = slog.Default()
|
r.Logger = slog.Default()
|
||||||
r.Logger.Debug("New Log Func Set for slog")
|
r.Logger.Debug("New Log Func Set for slog")
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ type AuthRepo struct {
|
|||||||
authUrl string
|
authUrl string
|
||||||
authError error
|
authError error
|
||||||
|
|
||||||
|
refreshes map[syntax.DID]time.Time
|
||||||
|
|
||||||
Logger *slog.Logger
|
Logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +39,7 @@ func NewAuthRepo(r *Repo) (*AuthRepo, error) {
|
|||||||
r: r,
|
r: r,
|
||||||
context: r.context,
|
context: r.context,
|
||||||
Logger: r.Logger,
|
Logger: r.Logger,
|
||||||
|
refreshes: make(map[syntax.DID]time.Time),
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
a.oauthConfig, a.oauthClient, a.store, err = a.buildOAuthClient()
|
a.oauthConfig, a.oauthClient, a.store, err = a.buildOAuthClient()
|
||||||
@@ -131,6 +134,20 @@ func (r *AuthRepo) ListenForCallback(res chan url.Values) (int, error) {
|
|||||||
|
|
||||||
func (r *AuthRepo) HasAuth(did syntax.DID) bool {
|
func (r *AuthRepo) HasAuth(did syntax.DID) bool {
|
||||||
sess, err := r.GetSession(did)
|
sess, err := r.GetSession(did)
|
||||||
|
if err != nil || sess == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
exp := time.Now().Add(time.Hour * -12)
|
||||||
|
if tm, ok := r.refreshes[did]; ok && tm.After(exp) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
_, err = sess.RefreshTokens(r.context)
|
||||||
|
if err != nil {
|
||||||
|
r.Logger.Debug("Failed to refresh tokens")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
r.refreshes[did] = time.Now()
|
||||||
|
|
||||||
return err == nil && sess != nil
|
return err == nil && sess != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package data
|
package data
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.bullercodeworks.com/brian/expds/data/models"
|
"git.bullercodeworks.com/brian/expds/data/models"
|
||||||
@@ -49,7 +50,7 @@ func (r *Repo) SendToPDS(did syntax.DID) error {
|
|||||||
if err := c.Post(r.context, "com.atproto.repo.createRecord", body, &resp); err != nil {
|
if err := c.Post(r.context, "com.atproto.repo.createRecord", body, &resp); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
r.Logger.Debug("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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,10 +69,11 @@ func (r *Repo) DeleteRecord(did syntax.DID, collection syntax.NSID, rkey string)
|
|||||||
Cid syntax.CID `json:"cid"`
|
Cid syntax.CID `json:"cid"`
|
||||||
Rev syntax.TID `json:"rev"`
|
Rev syntax.TID `json:"rev"`
|
||||||
}
|
}
|
||||||
r.Logger.Debug("deleting record (%s)", rkey)
|
r.Logger.Debug(fmt.Sprintf("deleting record (%s)", rkey))
|
||||||
if err := c.Post(r.context, "com.atproto.repo.deleteRecord", body, &resp); err != nil {
|
if err := c.Post(r.context, "com.atproto.repo.deleteRecord", body, &resp); err != nil {
|
||||||
|
r.Logger.Warn(fmt.Sprintf("error deleting record: %s", err.Error()))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
r.Logger.Debug("posted: %s :: %s", resp.Cid.String(), resp.Rev.String())
|
r.Logger.Debug(fmt.Sprintf("posted: %s :: %s", resp.Cid.String(), resp.Rev.String()))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ type JsonContent struct {
|
|||||||
vimMode bool
|
vimMode bool
|
||||||
cursor int
|
cursor int
|
||||||
|
|
||||||
|
field *wd.Field
|
||||||
|
|
||||||
editKey, editVal bool
|
editKey, editVal bool
|
||||||
editValType int
|
editValType int
|
||||||
|
|
||||||
@@ -84,6 +86,7 @@ func (w *JsonContent) Init(id string, style tcell.Style) {
|
|||||||
w.id = id
|
w.id = id
|
||||||
w.style = style
|
w.style = style
|
||||||
w.visible = true
|
w.visible = true
|
||||||
|
w.field = wd.NewField(fmt.Sprintf("%s-field", id), style)
|
||||||
w.keyMap = wd.NewKeyMap(
|
w.keyMap = wd.NewKeyMap(
|
||||||
wd.NewKey(wd.BuildEK(tcell.KeyUp), func(_ *tcell.EventKey) bool { return w.MoveUp() }),
|
wd.NewKey(wd.BuildEK(tcell.KeyUp), func(_ *tcell.EventKey) bool { return w.MoveUp() }),
|
||||||
wd.NewKey(wd.BuildEK(tcell.KeyDown), func(_ *tcell.EventKey) bool { return w.MoveDown() }),
|
wd.NewKey(wd.BuildEK(tcell.KeyDown), func(_ *tcell.EventKey) bool { return w.MoveDown() }),
|
||||||
@@ -148,8 +151,10 @@ func (w *JsonContent) Draw(screen tcell.Screen) {
|
|||||||
ln := len(w.contents)
|
ln := len(w.contents)
|
||||||
start, end := 0, ln-1
|
start, end := 0, ln-1
|
||||||
if ln == 0 {
|
if ln == 0 {
|
||||||
|
if !w.editable {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if ln > w.h-2 {
|
if ln > w.h-2 {
|
||||||
mid := h / 2
|
mid := h / 2
|
||||||
if w.cursor < mid {
|
if w.cursor < mid {
|
||||||
@@ -225,6 +230,12 @@ func (w *JsonContent) MinH() int { return len(w.contents) }
|
|||||||
|
|
||||||
func (w *JsonContent) SetValue(v any) error {
|
func (w *JsonContent) SetValue(v any) error {
|
||||||
w.value = v
|
w.value = v
|
||||||
|
if w.value == nil {
|
||||||
|
w.valueString = ""
|
||||||
|
w.contents = []string{}
|
||||||
|
w.cursor = 0
|
||||||
|
return nil
|
||||||
|
}
|
||||||
// Go ahead and try to build the json for v
|
// Go ahead and try to build the json for v
|
||||||
bts, err := json.MarshalIndent(v, "", " ")
|
bts, err := json.MarshalIndent(v, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -253,6 +264,7 @@ func (w *JsonContent) SetValue(v any) error {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
func (w *JsonContent) ClearValue() error { return w.SetValue(nil) }
|
||||||
|
|
||||||
func (w *JsonContent) SetBorder(brd []rune) {
|
func (w *JsonContent) SetBorder(brd []rune) {
|
||||||
if len(brd) == 0 {
|
if len(brd) == 0 {
|
||||||
@@ -376,48 +388,6 @@ func (w *JsonContent) getItemVal(line int) (string, error) {
|
|||||||
return "", errors.New("error finding value")
|
return "", errors.New("error finding value")
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func (w *JsonContent) getItemValType(line int) int {
|
|
||||||
if line < 0 || line >= len(w.contents) {
|
|
||||||
return JsonTypeErr
|
|
||||||
}
|
|
||||||
|
|
||||||
text := w.contents[line]
|
|
||||||
key, rest := w.getNextQuotedString(text)
|
|
||||||
rest = strings.Trim(rest, ", ")
|
|
||||||
if rest == "" {
|
|
||||||
if key != "" {
|
|
||||||
// Looks like a string value in an array
|
|
||||||
return JsonTypeString
|
|
||||||
} else rest == "true" || rest == "false" {
|
|
||||||
return JsonTypeBool
|
|
||||||
}
|
|
||||||
// see if we can parse this as a number
|
|
||||||
num, err := strconv.Atoi(rest)
|
|
||||||
if err == nil {
|
|
||||||
return JsonTypeNumber
|
|
||||||
}
|
|
||||||
return JsonType
|
|
||||||
}
|
|
||||||
if key == "" {
|
|
||||||
return "", "", errors.New("error finding quoted string")
|
|
||||||
} else if rest == "" {
|
|
||||||
// We have a 'key' value, but no 'rest' so this is likely an item in array
|
|
||||||
return "", key, nil
|
|
||||||
}
|
|
||||||
rest = strings.Trim(rest, ":, ")
|
|
||||||
if rest[0] == '{' {
|
|
||||||
|
|
||||||
}
|
|
||||||
val, rest := w.getNextQuotedString(rest)
|
|
||||||
if val != "" {
|
|
||||||
return key, val, nil
|
|
||||||
}
|
|
||||||
// Val isn't a quoted string,
|
|
||||||
return key, rest, nil
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func (w *JsonContent) getItemDepth(line int) int {
|
func (w *JsonContent) getItemDepth(line int) int {
|
||||||
if line < 0 || line >= len(w.contents) {
|
if line < 0 || line >= len(w.contents) {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user