feat: ШАГ 2 — Staging-таблица browser_events + Store
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"verstak/internal/core/actions"
|
||||
"verstak/internal/core/activity"
|
||||
"verstak/internal/core/bridge"
|
||||
"verstak/internal/core/browser"
|
||||
"verstak/internal/core/config"
|
||||
"verstak/internal/core/files"
|
||||
"verstak/internal/core/nodes"
|
||||
@@ -46,6 +47,7 @@ type App struct {
|
||||
sync *syncsvc.Service
|
||||
fileWatcher *watcher.Service
|
||||
bridge *bridge.Server
|
||||
browser *browser.Store
|
||||
vault string
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"log"
|
||||
|
||||
"verstak/internal/core/bridge"
|
||||
"verstak/internal/core/browser"
|
||||
"verstak/internal/core/config"
|
||||
)
|
||||
|
||||
@@ -13,9 +14,18 @@ func (a *App) startBridge(appCfg *config.AppConfig) {
|
||||
bc := a.bridgeConfig(appCfg)
|
||||
|
||||
handler := func(events []bridge.Event) {
|
||||
// For now, log received events. Storage comes in Step 2.
|
||||
// Convert to browser events and store in staging.
|
||||
be := make([]browser.Event, 0, len(events))
|
||||
for _, ev := range events {
|
||||
log.Printf("[bridge] event: type=%s url=%s domain=%s", ev.Type, ev.URL, ev.Domain)
|
||||
be = append(be, bridgeToBrowser(ev))
|
||||
}
|
||||
n, err := a.browser.InsertEvents(be)
|
||||
if err != nil {
|
||||
log.Printf("[bridge] store events: %v", err)
|
||||
return
|
||||
}
|
||||
if n > 0 {
|
||||
log.Printf("[bridge] stored %d/%d events", n, len(be))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,3 +104,34 @@ func (a *App) BridgeInfo() map[string]interface{} {
|
||||
}
|
||||
return info
|
||||
}
|
||||
|
||||
// bridgeToBrowser converts a bridge.Event to a browser.Event.
|
||||
func bridgeToBrowser(ev bridge.Event) browser.Event {
|
||||
deviceID := ev.ID
|
||||
if idx := indexOf(ev.ID, "_"); idx > 0 {
|
||||
deviceID = ev.ID[:idx]
|
||||
}
|
||||
return browser.Event{
|
||||
ID: ev.ID,
|
||||
DeviceID: deviceID,
|
||||
Type: ev.Type,
|
||||
URL: ev.URL,
|
||||
Title: ev.Title,
|
||||
Domain: ev.Domain,
|
||||
ActiveSeconds: ev.ActiveSeconds,
|
||||
TSStart: ev.TSStart,
|
||||
TSEnd: ev.TSEnd,
|
||||
TS: ev.TS,
|
||||
SelectedText: ev.SelectedText,
|
||||
Note: ev.Note,
|
||||
}
|
||||
}
|
||||
|
||||
func indexOf(s string, sub string) int {
|
||||
for i := 0; i < len(s); i++ {
|
||||
if string(s[i]) == sub {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"verstak/internal/core/actions"
|
||||
"verstak/internal/core/activity"
|
||||
"verstak/internal/core/browser"
|
||||
"verstak/internal/core/config"
|
||||
"verstak/internal/core/files"
|
||||
"verstak/internal/core/nodes"
|
||||
@@ -266,6 +267,7 @@ func (a *App) initVault(vaultPath string) error {
|
||||
a.templates = templatesReg
|
||||
a.sync = syncSvc
|
||||
a.fileWatcher = watcherSvc
|
||||
a.browser = browser.NewStore(db)
|
||||
a.vault = abs
|
||||
a.vaultOpen = true
|
||||
a.mu.Unlock()
|
||||
@@ -319,6 +321,7 @@ func (a *App) closeVault() {
|
||||
a.sync = nil
|
||||
a.fileWatcher = nil
|
||||
a.bridge = nil
|
||||
a.browser = nil
|
||||
a.vault = ""
|
||||
a.vaultOpen = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user