server and web app
This commit is contained in:
@@ -7,10 +7,13 @@ import (
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/tim/cairnquire/apps/server/internal/auth"
|
||||
"github.com/tim/cairnquire/apps/server/internal/collaboration"
|
||||
"github.com/tim/cairnquire/apps/server/internal/config"
|
||||
"github.com/tim/cairnquire/apps/server/internal/email"
|
||||
"github.com/tim/cairnquire/apps/server/internal/database"
|
||||
"github.com/tim/cairnquire/apps/server/internal/docs"
|
||||
"github.com/tim/cairnquire/apps/server/internal/httpserver"
|
||||
@@ -52,10 +55,6 @@ func New(ctx context.Context, cfg config.Config, logger *slog.Logger) (*App, err
|
||||
repo := docs.NewRepository(db.SQL())
|
||||
service := docs.NewService(cfg.Content.SourceDir, contentStore, renderer, repo, logger)
|
||||
hub := realtime.NewHub(logger)
|
||||
service.OnChange(func(change docs.DocumentChange) {
|
||||
hub.Broadcast(realtime.Event{Type: "document_version", Data: change})
|
||||
})
|
||||
|
||||
if _, err := service.SyncSourceDir(ctx); err != nil {
|
||||
logger.Warn("initial content sync failed", "error", err)
|
||||
}
|
||||
@@ -68,16 +67,33 @@ func New(ctx context.Context, cfg config.Config, logger *slog.Logger) (*App, err
|
||||
return nil, fmt.Errorf("build auth service: %w", err)
|
||||
}
|
||||
|
||||
collabRepo := collaboration.NewRepository(db.SQL())
|
||||
var emailSender collaboration.EmailSender
|
||||
if cfg.Email.SMTPHost != "" {
|
||||
emailSender = email.NewSMTPSender(cfg.Email, logger)
|
||||
} else {
|
||||
emailSender = email.NewNoOpSender(logger)
|
||||
}
|
||||
collabService := collaboration.NewService(collabRepo, emailSender, hub, logger)
|
||||
|
||||
service.OnChange(func(change docs.DocumentChange) {
|
||||
hub.Broadcast(realtime.Event{Type: "document_version", Data: change})
|
||||
if err := collabService.NotifyDocumentChanged(ctx, formatDocumentID(change.Path), change.Path, "system"); err != nil {
|
||||
logger.Warn("notify document changed", "error", err)
|
||||
}
|
||||
})
|
||||
|
||||
handler, err := httpserver.New(httpserver.Dependencies{
|
||||
Config: cfg,
|
||||
Logger: logger,
|
||||
Documents: service,
|
||||
Repository: repo,
|
||||
ContentStore: contentStore,
|
||||
Hub: hub,
|
||||
SyncService: syncService,
|
||||
SyncRepo: syncRepo,
|
||||
Auth: authService,
|
||||
Config: cfg,
|
||||
Logger: logger,
|
||||
Documents: service,
|
||||
Repository: repo,
|
||||
ContentStore: contentStore,
|
||||
Hub: hub,
|
||||
SyncService: syncService,
|
||||
SyncRepo: syncRepo,
|
||||
Auth: authService,
|
||||
Collaboration: collabService,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("build http handler: %w", err)
|
||||
@@ -158,3 +174,9 @@ func (a *App) syncPoll(ctx context.Context) {
|
||||
func (a *App) Close() error {
|
||||
return a.db.Close()
|
||||
}
|
||||
|
||||
func formatDocumentID(path string) string {
|
||||
clean := strings.TrimPrefix(path, "/")
|
||||
clean = strings.TrimSuffix(clean, ".md")
|
||||
return "doc:" + clean
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user