From cdcc5b5293e2e0d19fb0fdb816274256ac9371ef Mon Sep 17 00:00:00 2001 From: soup Date: Sat, 17 Jan 2026 01:09:23 -0500 Subject: [PATCH] Initial commit: Lookbook personal collection app Pinterest-like app for saving images, videos, quotes, and embeds. Features: - Go backend with PostgreSQL, SSR templates - Console-based admin auth (login/logout via browser console) - Item types: images, videos (ffmpeg transcoding), quotes, embeds - Media stored as BLOBs in PostgreSQL - OpenGraph metadata extraction for links - Embed detection for YouTube, Vimeo, Twitter/X - Masonry grid layout, item detail pages - Tag system with filtering - Refresh metadata endpoint with change warnings - Replace media endpoint for updating item images/videos --- .envrc | 1 + .gitignore | 30 + Makefile | 26 + Procfile | 1 + cmd/server/main.go | 191 ++++++ default.nix | 90 +++ go.mod | 23 + go.sum | 64 ++ internal/components/page.go | 43 ++ internal/data/admin/queries.go | 41 ++ internal/data/item/queries.go | 219 +++++++ internal/data/media/queries.go | 158 +++++ internal/data/session/queries.go | 73 +++ internal/data/tag/queries.go | 153 +++++ internal/embed/detect.go | 251 ++++++++ internal/handlers/api_auth.go | 141 +++++ internal/handlers/api_items.go | 268 ++++++++ internal/handlers/api_tags.go | 47 ++ internal/handlers/api_upload.go | 577 ++++++++++++++++++ internal/handlers/context.go | 27 + internal/handlers/handler.go | 49 ++ internal/handlers/home.go | 213 +++++++ internal/handlers/item_page.go | 205 +++++++ internal/handlers/media.go | 50 ++ internal/handlers/router.go | 75 +++ internal/handlers/templates.go | 17 + internal/middleware/logger.go | 44 ++ internal/migrations/migrations.go | 131 ++++ internal/migrations/sql/.gitkeep | 0 internal/migrations/sql/0001_init.sql | 80 +++ .../migrations/sql/0002_media_source_url.sql | 5 + internal/opengraph/fetch.go | 185 ++++++ internal/static/css/.gitkeep | 0 internal/static/css/app.css | 562 +++++++++++++++++ .../static/fonts/CommitMono-400-Italic.woff2 | Bin 0 -> 50948 bytes .../static/fonts/CommitMono-400-Regular.woff2 | Bin 0 -> 47920 bytes .../static/fonts/CommitMono-450-Italic.woff2 | Bin 0 -> 51424 bytes .../static/fonts/CommitMono-450-Regular.woff2 | Bin 0 -> 48352 bytes .../static/fonts/CommitMono-700-Italic.woff2 | Bin 0 -> 49952 bytes .../static/fonts/CommitMono-700-Regular.woff2 | Bin 0 -> 47556 bytes internal/static/js/.gitkeep | 0 internal/static/js/app.js | 386 ++++++++++++ internal/static/static.go | 43 ++ internal/video/process.go | 151 +++++ shell.nix | 14 + 45 files changed, 4634 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 Procfile create mode 100644 cmd/server/main.go create mode 100644 default.nix create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/components/page.go create mode 100644 internal/data/admin/queries.go create mode 100644 internal/data/item/queries.go create mode 100644 internal/data/media/queries.go create mode 100644 internal/data/session/queries.go create mode 100644 internal/data/tag/queries.go create mode 100644 internal/embed/detect.go create mode 100644 internal/handlers/api_auth.go create mode 100644 internal/handlers/api_items.go create mode 100644 internal/handlers/api_tags.go create mode 100644 internal/handlers/api_upload.go create mode 100644 internal/handlers/context.go create mode 100644 internal/handlers/handler.go create mode 100644 internal/handlers/home.go create mode 100644 internal/handlers/item_page.go create mode 100644 internal/handlers/media.go create mode 100644 internal/handlers/router.go create mode 100644 internal/handlers/templates.go create mode 100644 internal/middleware/logger.go create mode 100644 internal/migrations/migrations.go create mode 100644 internal/migrations/sql/.gitkeep create mode 100644 internal/migrations/sql/0001_init.sql create mode 100644 internal/migrations/sql/0002_media_source_url.sql create mode 100644 internal/opengraph/fetch.go create mode 100644 internal/static/css/.gitkeep create mode 100644 internal/static/css/app.css create mode 100644 internal/static/fonts/CommitMono-400-Italic.woff2 create mode 100644 internal/static/fonts/CommitMono-400-Regular.woff2 create mode 100644 internal/static/fonts/CommitMono-450-Italic.woff2 create mode 100644 internal/static/fonts/CommitMono-450-Regular.woff2 create mode 100644 internal/static/fonts/CommitMono-700-Italic.woff2 create mode 100644 internal/static/fonts/CommitMono-700-Regular.woff2 create mode 100644 internal/static/js/.gitkeep create mode 100644 internal/static/js/app.js create mode 100644 internal/static/static.go create mode 100644 internal/video/process.go create mode 100644 shell.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..62c0224 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix --impure diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b1c02c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +.direnv/ + +# Environment files +.env +.env.local + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# macOS +.DS_Store + +# OpenCode +.opencode/ + +# Go +/bin/ +*.exe +*.out +*.test +result + +# Windows zone identifiers +*:Zone.Identifier + +# Inspiration/test files +/inspo/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2add9f0 --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +APP := ./cmd/server +VERSION := $(shell git rev-parse --short HEAD 2>/dev/null || echo "dev") +LDFLAGS := -X lookbook/internal/static.Version=$(VERSION) + +.PHONY: dev run migrate rollback fmt test build + +dev: + hivemind + +run: + go run $(APP) web + +migrate: + go run $(APP) -migrate + +rollback: + go run $(APP) -rollback + +fmt: + go fmt ./... + +test: + go test -v ./... + +build: + CGO_ENABLED=0 go build -ldflags "$(LDFLAGS)" -o bin/lookbook $(APP) diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..1a99a11 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: fd . -e go -e html -e css -e js | entr -r go run ./cmd/server web diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..05aa700 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,191 @@ +package main + +import ( + "context" + "database/sql" + "flag" + "fmt" + "log/slog" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + _ "github.com/jackc/pgx/v5/stdlib" + + "git.soup.land/soup/sxgo/ssr" + "lookbook/internal/handlers" + "lookbook/internal/middleware" + "lookbook/internal/migrations" + "lookbook/internal/static" +) + +const defaultAddr = ":8080" + +func main() { + migrate := flag.Bool("migrate", false, "run database migrations and exit") + rollback := flag.Bool("rollback", false, "roll back migrations and exit (one step by default)") + rollbackTarget := flag.Int64("to", -1, "target version for rollback when using -rollback") + dbURLFlag := flag.String("db-url", "", "database connection URL") + flag.Parse() + + logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: slog.LevelInfo, + })) + + dbURL := *dbURLFlag + if dbURL == "" { + dbURL = os.Getenv("DATABASE_URL") + } + if dbURL == "" { + dbURL = migrations.DefaultURL + } + + switch { + case *migrate && *rollback: + logger.Error("choose either -migrate or -rollback, not both") + os.Exit(1) + case *migrate: + if err := migrations.Up(context.Background(), dbURL, logger); err != nil { + logger.Error("migration failed", slog.Any("err", err)) + os.Exit(1) + } + return + case *rollback: + if err := migrations.Down(context.Background(), dbURL, *rollbackTarget, logger); err != nil { + logger.Error("rollback failed", slog.Any("err", err)) + os.Exit(1) + } + return + } + + // Check for subcommand + args := flag.Args() + if len(args) < 1 { + printUsage() + os.Exit(1) + } + + mode := args[0] + switch mode { + case "web": + runWebServer(dbURL, logger) + default: + logger.Error("unknown mode", slog.String("mode", mode)) + printUsage() + os.Exit(1) + } +} + +func printUsage() { + fmt.Fprintln(os.Stderr, "Usage:") + fmt.Fprintln(os.Stderr, " lookbook web - Run web server") + fmt.Fprintln(os.Stderr, "") + fmt.Fprintln(os.Stderr, "Flags:") + fmt.Fprintln(os.Stderr, " -migrate Run database migrations") + fmt.Fprintln(os.Stderr, " -rollback Roll back migrations") + fmt.Fprintln(os.Stderr, " -to Target version for rollback") + fmt.Fprintln(os.Stderr, " -db-url Database connection URL") +} + +func runWebServer(dbURL string, logger *slog.Logger) { + // Check for pending migrations + pending, err := migrations.CheckPending(context.Background(), dbURL, logger) + if err != nil { + logger.Warn("could not check migration status", slog.Any("err", err)) + } else if pending > 0 { + logger.Warn("database has pending migrations", + slog.Int("pending", pending), + slog.String("hint", "run 'make migrate' to apply")) + } + + db, err := sql.Open("pgx", dbURL) + if err != nil { + logger.Error("failed to open database", slog.Any("err", err)) + os.Exit(1) + } + defer db.Close() + + if err := db.Ping(); err != nil { + logger.Error("failed to ping database", slog.Any("err", err)) + os.Exit(1) + } + + rc := &handlers.RequestContext{ + DB: db, + Logger: logger, + TmplCache: ssr.NewTmplCache(handlers.TemplateFuncs), + } + router := handlers.NewRouter(rc) + + // Pages + router.Handle("GET /", handlers.HandleHome) + router.Handle("GET /item/{id}", handlers.HandleItemPage) + + // Static files + router.HandleStd("GET /static/{version}/", static.Handler()) + + // Media + router.Handle("GET /media/{id}", handlers.HandleGetMedia) + + // Auth API + router.Handle("POST /api/auth/login", handlers.HandleLogin) + router.Handle("POST /api/auth/logout", handlers.HandleLogout) + router.Handle("GET /api/auth/status", handlers.HandleAuthStatus) + + // Items API + router.Handle("GET /api/items", handlers.HandleListItems) + router.Handle("GET /api/items/{id}", handlers.HandleGetItem) + router.Handle("POST /api/items", handlers.HandleCreateItem) + router.Handle("PUT /api/items/{id}", handlers.HandleUpdateItem) + router.Handle("DELETE /api/items/{id}", handlers.HandleDeleteItem) + + // Item creation endpoints + router.Handle("POST /api/preview", handlers.HandlePreviewLink) + router.Handle("POST /api/items/from-link", handlers.HandleCreateFromLink) + router.Handle("POST /api/items/upload", handlers.HandleUpload) + router.Handle("POST /api/items/quote", handlers.HandleCreateQuote) + router.Handle("POST /api/items/{id}/refresh", handlers.HandleRefreshMetadata) + router.Handle("POST /api/items/{id}/media", handlers.HandleReplaceMedia) + + // Tags API + router.Handle("GET /api/tags", handlers.HandleListTags) + router.Handle("GET /api/tags/suggest", handlers.HandleSuggestTags) + + addr := defaultAddr + if envAddr := os.Getenv("ADDR"); envAddr != "" { + addr = envAddr + } + + server := &http.Server{ + Addr: addr, + Handler: middleware.Logging(logger)(router), + ReadHeaderTimeout: 5 * time.Second, + } + + go func() { + logger.Info("listening", slog.String("addr", addr)) + if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + logger.Error("http server error", slog.Any("err", err)) + os.Exit(1) + } + }() + + waitForShutdown(server, logger) +} + +func waitForShutdown(server *http.Server, logger *slog.Logger) { + quit := make(chan os.Signal, 1) + signal.Notify(quit, os.Interrupt, syscall.SIGTERM) + + <-quit + logger.Info("shutting down") + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Error("graceful shutdown failed", slog.Any("err", err)) + } +} diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..1a2b009 --- /dev/null +++ b/default.nix @@ -0,0 +1,90 @@ +{ pkgs ? import {} }: + +let + lookbook = pkgs.buildGoModule { + pname = "lookbook"; + version = "0.1.0"; + src = ./.; + + vendorHash = null; # Update after first build + + env.GOPRIVATE = "git.soup.land"; + + # Build the server binary + subPackages = [ "cmd/server" ]; + + postInstall = '' + mv $out/bin/server $out/bin/lookbook + ''; + + meta = with pkgs.lib; { + description = "Lookbook"; + homepage = "https://git.soup.land/soup/lookbook"; + }; + }; +in +{ + package = lookbook; + + nixosModule = { config, lib, pkgs, ... }: + let + cfg = config.services.lookbook; + in { + options.services.lookbook = { + enable = lib.mkEnableOption "lookbook service"; + + address = lib.mkOption { + type = lib.types.str; + default = "127.0.0.1:8080"; + description = "Address to listen on"; + }; + + databaseUrl = lib.mkOption { + type = lib.types.str; + description = "PostgreSQL connection URL"; + }; + + user = lib.mkOption { + type = lib.types.str; + default = "lookbook"; + description = "User to run the service as"; + }; + + group = lib.mkOption { + type = lib.types.str; + default = "lookbook"; + description = "Group to run the service as"; + }; + }; + + config = lib.mkIf cfg.enable { + users.users.${cfg.user} = { + isSystemUser = true; + group = cfg.group; + }; + users.groups.${cfg.group} = {}; + + systemd.services.lookbook = { + description = "Lookbook"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" "postgresql.service" ]; + requires = [ "postgresql.service" ]; + + environment = { + DATABASE_URL = cfg.databaseUrl; + ADDR = cfg.address; + }; + + serviceConfig = { + Type = "simple"; + User = cfg.user; + Group = cfg.group; + ExecStartPre = "${lookbook}/bin/lookbook -migrate"; + ExecStart = "${lookbook}/bin/lookbook web"; + Restart = "always"; + RestartSec = 5; + }; + }; + }; + }; +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f45b382 --- /dev/null +++ b/go.mod @@ -0,0 +1,23 @@ +module lookbook + +go 1.23.0 + +require ( + git.soup.land/soup/sxgo v0.1.1 + github.com/jackc/pgx/v5 v5.7.6 + github.com/pressly/goose/v3 v3.26.0 + golang.org/x/crypto v0.40.0 + golang.org/x/net v0.42.0 +) + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/sethvargo/go-retry v0.3.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/text v0.27.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..d938dbb --- /dev/null +++ b/go.sum @@ -0,0 +1,64 @@ +git.soup.land/soup/sxgo v0.1.1 h1:EIEHcb+yptNHy5kd+/YU/+Ov4kNYftDm0+El3jFFmks= +git.soup.land/soup/sxgo v0.1.1/go.mod h1:U8x8wBk6gx4j43wgT8wXX3J6o4KIz92tPCVBeytDTxM= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.6 h1:rWQc5FwZSPX58r1OQmkuaNicxdmExaEz5A2DO2hUuTk= +github.com/jackc/pgx/v5 v5.7.6/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= +github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pressly/goose/v3 v3.26.0 h1:KJakav68jdH0WDvoAcj8+n61WqOIaPGgH0bJWS6jpmM= +github.com/pressly/goose/v3 v3.26.0/go.mod h1:4hC1KrritdCxtuFsqgs1R4AU5bWtTAf+cnWvfhf2DNY= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE= +github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= +github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ= +modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek= +modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= diff --git a/internal/components/page.go b/internal/components/page.go new file mode 100644 index 0000000..82c4d1d --- /dev/null +++ b/internal/components/page.go @@ -0,0 +1,43 @@ +package components + +import ( + "git.soup.land/soup/sxgo/ssr" +) + +type Page struct { + Title string + IsAdmin bool + Content ssr.Renderable +} + +func (p Page) Render(sw *ssr.Writer) error { + sw.Tmpl(p, ` + + + + + + {{if .Title}}{{.Title}} - {{end}}Lookbook + + + +
+ + +
+
+`) + + p.Content.Render(sw) + return sw.Tmpl(p, ` +
+ + + + +`) +} diff --git a/internal/data/admin/queries.go b/internal/data/admin/queries.go new file mode 100644 index 0000000..65aec5c --- /dev/null +++ b/internal/data/admin/queries.go @@ -0,0 +1,41 @@ +package admin + +import ( + "context" + "database/sql" + "time" +) + +type Row struct { + ID int + PasswordHash []byte // nil if not set + CreatedAt time.Time +} + +// QGet returns the single admin row. +func QGet(ctx context.Context, db *sql.DB) (Row, error) { + query := `SELECT id, password_hash, created_at FROM admin WHERE id = 1` + + var row Row + err := db.QueryRowContext(ctx, query).Scan( + &row.ID, + &row.PasswordHash, + &row.CreatedAt, + ) + return row, err +} + +// QSetPassword sets the admin password hash. +func QSetPassword(ctx context.Context, db *sql.DB, hash []byte) error { + query := `UPDATE admin SET password_hash = $1 WHERE id = 1` + _, err := db.ExecContext(ctx, query, hash) + return err +} + +// QHasPassword returns true if a password has been set. +func QHasPassword(ctx context.Context, db *sql.DB) (bool, error) { + query := `SELECT password_hash IS NOT NULL FROM admin WHERE id = 1` + var has bool + err := db.QueryRowContext(ctx, query).Scan(&has) + return has, err +} diff --git a/internal/data/item/queries.go b/internal/data/item/queries.go new file mode 100644 index 0000000..b3719dc --- /dev/null +++ b/internal/data/item/queries.go @@ -0,0 +1,219 @@ +package item + +import ( + "context" + "database/sql" + "fmt" + "time" + + "github.com/jackc/pgx/v5/pgtype" +) + +type Row struct { + ID int64 + PubID string + Title *string + Description *string + LinkURL *string + ItemType string // 'image', 'video', 'quote', 'embed' + EmbedProvider *string + EmbedVideoID *string + EmbedHTML *string + CreatedAt time.Time + DeletedAt *time.Time +} + +type CreateParams struct { + Title *string + Description *string + LinkURL *string + ItemType string + EmbedProvider *string + EmbedVideoID *string + EmbedHTML *string +} + +// QCreate creates a new item. +func QCreate(ctx context.Context, db *sql.DB, p CreateParams) (Row, error) { + query := ` + INSERT INTO item (title, description, link_url, item_type, embed_provider, embed_video_id, embed_html) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING id, pub_id, title, description, link_url, item_type, embed_provider, embed_video_id, embed_html, created_at, deleted_at + ` + + var row Row + var pubID pgtype.UUID + err := db.QueryRowContext(ctx, query, + p.Title, p.Description, p.LinkURL, p.ItemType, p.EmbedProvider, p.EmbedVideoID, p.EmbedHTML, + ).Scan( + &row.ID, &pubID, &row.Title, &row.Description, &row.LinkURL, + &row.ItemType, &row.EmbedProvider, &row.EmbedVideoID, &row.EmbedHTML, + &row.CreatedAt, &row.DeletedAt, + ) + if err == nil { + row.PubID = formatUUID(pubID) + } + return row, err +} + +// QFindByPubID finds an item by its public ID. +func QFindByPubID(ctx context.Context, db *sql.DB, pubID string) (*Row, error) { + query := ` + SELECT id, pub_id, title, description, link_url, item_type, embed_provider, embed_video_id, embed_html, created_at, deleted_at + FROM item + WHERE pub_id = $1 + ` + + var row Row + var pubUUID pgtype.UUID + err := db.QueryRowContext(ctx, query, pubID).Scan( + &row.ID, &pubUUID, &row.Title, &row.Description, &row.LinkURL, + &row.ItemType, &row.EmbedProvider, &row.EmbedVideoID, &row.EmbedHTML, + &row.CreatedAt, &row.DeletedAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + row.PubID = formatUUID(pubUUID) + return &row, nil +} + +// QFindByID finds an item by its internal ID. +func QFindByID(ctx context.Context, db *sql.DB, id int64) (*Row, error) { + query := ` + SELECT id, pub_id, title, description, link_url, item_type, embed_provider, embed_video_id, embed_html, created_at, deleted_at + FROM item + WHERE id = $1 + ` + + var row Row + var pubUUID pgtype.UUID + err := db.QueryRowContext(ctx, query, id).Scan( + &row.ID, &pubUUID, &row.Title, &row.Description, &row.LinkURL, + &row.ItemType, &row.EmbedProvider, &row.EmbedVideoID, &row.EmbedHTML, + &row.CreatedAt, &row.DeletedAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + row.PubID = formatUUID(pubUUID) + return &row, nil +} + +// QList returns all non-deleted items, newest first. +func QList(ctx context.Context, db *sql.DB) ([]Row, error) { + query := ` + SELECT id, pub_id, title, description, link_url, item_type, embed_provider, embed_video_id, embed_html, created_at, deleted_at + FROM item + WHERE deleted_at IS NULL + ORDER BY created_at DESC + ` + + rows, err := db.QueryContext(ctx, query) + if err != nil { + return nil, err + } + defer rows.Close() + + var items []Row + for rows.Next() { + var row Row + var pubUUID pgtype.UUID + if err := rows.Scan( + &row.ID, &pubUUID, &row.Title, &row.Description, &row.LinkURL, + &row.ItemType, &row.EmbedProvider, &row.EmbedVideoID, &row.EmbedHTML, + &row.CreatedAt, &row.DeletedAt, + ); err != nil { + return nil, err + } + row.PubID = formatUUID(pubUUID) + items = append(items, row) + } + return items, rows.Err() +} + +// QListByTag returns all non-deleted items with a specific tag, newest first. +func QListByTag(ctx context.Context, db *sql.DB, tagName string) ([]Row, error) { + query := ` + SELECT i.id, i.pub_id, i.title, i.description, i.link_url, i.item_type, i.embed_provider, i.embed_video_id, i.embed_html, i.created_at, i.deleted_at + FROM item i + JOIN item_tag it ON i.id = it.item_id + JOIN tag t ON it.tag_id = t.id + WHERE i.deleted_at IS NULL AND t.name = $1 + ORDER BY i.created_at DESC + ` + + rows, err := db.QueryContext(ctx, query, tagName) + if err != nil { + return nil, err + } + defer rows.Close() + + var items []Row + for rows.Next() { + var row Row + var pubUUID pgtype.UUID + if err := rows.Scan( + &row.ID, &pubUUID, &row.Title, &row.Description, &row.LinkURL, + &row.ItemType, &row.EmbedProvider, &row.EmbedVideoID, &row.EmbedHTML, + &row.CreatedAt, &row.DeletedAt, + ); err != nil { + return nil, err + } + row.PubID = formatUUID(pubUUID) + items = append(items, row) + } + return items, rows.Err() +} + +type UpdateParams struct { + Title *string + Description *string + LinkURL *string +} + +// QUpdate updates an item's editable fields. +func QUpdate(ctx context.Context, db *sql.DB, id int64, p UpdateParams) error { + query := ` + UPDATE item + SET title = $2, description = $3, link_url = $4 + WHERE id = $1 + ` + _, err := db.ExecContext(ctx, query, id, p.Title, p.Description, p.LinkURL) + return err +} + +// QUpdateType updates an item's type. +func QUpdateType(ctx context.Context, db *sql.DB, id int64, itemType string) error { + query := `UPDATE item SET item_type = $2 WHERE id = $1` + _, err := db.ExecContext(ctx, query, id, itemType) + return err +} + +// QSoftDelete soft deletes an item. +func QSoftDelete(ctx context.Context, db *sql.DB, id int64) error { + query := `UPDATE item SET deleted_at = NOW() WHERE id = $1` + _, err := db.ExecContext(ctx, query, id) + return err +} + +// QRestore restores a soft-deleted item. +func QRestore(ctx context.Context, db *sql.DB, id int64) error { + query := `UPDATE item SET deleted_at = NULL WHERE id = $1` + _, err := db.ExecContext(ctx, query, id) + return err +} + +func formatUUID(u pgtype.UUID) string { + if !u.Valid { + return "" + } + b := u.Bytes + return fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:16]) +} diff --git a/internal/data/media/queries.go b/internal/data/media/queries.go new file mode 100644 index 0000000..c48de2e --- /dev/null +++ b/internal/data/media/queries.go @@ -0,0 +1,158 @@ +package media + +import ( + "context" + "database/sql" + "time" +) + +type Row struct { + ID int64 + ItemID int64 + MediaType string // 'original', 'thumbnail' + ContentType string // MIME type + Data []byte + Width *int + Height *int + SourceURL *string // Original URL the media was fetched from + CreatedAt time.Time +} + +type CreateParams struct { + ItemID int64 + MediaType string + ContentType string + Data []byte + Width *int + Height *int + SourceURL *string +} + +// QCreate creates a new media record. +func QCreate(ctx context.Context, db *sql.DB, p CreateParams) (Row, error) { + query := ` + INSERT INTO media (item_id, media_type, content_type, data, width, height, source_url) + VALUES ($1, $2, $3, $4, $5, $6, $7) + RETURNING id, item_id, media_type, content_type, data, width, height, source_url, created_at + ` + + var row Row + err := db.QueryRowContext(ctx, query, + p.ItemID, p.MediaType, p.ContentType, p.Data, p.Width, p.Height, p.SourceURL, + ).Scan( + &row.ID, &row.ItemID, &row.MediaType, &row.ContentType, &row.Data, + &row.Width, &row.Height, &row.SourceURL, &row.CreatedAt, + ) + return row, err +} + +// QFindByID finds a media record by ID. +func QFindByID(ctx context.Context, db *sql.DB, id int64) (*Row, error) { + query := ` + SELECT id, item_id, media_type, content_type, data, width, height, source_url, created_at + FROM media + WHERE id = $1 + ` + + var row Row + err := db.QueryRowContext(ctx, query, id).Scan( + &row.ID, &row.ItemID, &row.MediaType, &row.ContentType, &row.Data, + &row.Width, &row.Height, &row.SourceURL, &row.CreatedAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + return &row, nil +} + +// QFindByItemID finds all media for an item. +func QFindByItemID(ctx context.Context, db *sql.DB, itemID int64) ([]Row, error) { + query := ` + SELECT id, item_id, media_type, content_type, data, width, height, source_url, created_at + FROM media + WHERE item_id = $1 + ORDER BY media_type ASC + ` + + rows, err := db.QueryContext(ctx, query, itemID) + if err != nil { + return nil, err + } + defer rows.Close() + + var media []Row + for rows.Next() { + var row Row + if err := rows.Scan( + &row.ID, &row.ItemID, &row.MediaType, &row.ContentType, &row.Data, + &row.Width, &row.Height, &row.SourceURL, &row.CreatedAt, + ); err != nil { + return nil, err + } + media = append(media, row) + } + return media, rows.Err() +} + +// QFindThumbnailByItemID finds the thumbnail for an item. +func QFindThumbnailByItemID(ctx context.Context, db *sql.DB, itemID int64) (*Row, error) { + query := ` + SELECT id, item_id, media_type, content_type, data, width, height, source_url, created_at + FROM media + WHERE item_id = $1 AND media_type = 'thumbnail' + LIMIT 1 + ` + + var row Row + err := db.QueryRowContext(ctx, query, itemID).Scan( + &row.ID, &row.ItemID, &row.MediaType, &row.ContentType, &row.Data, + &row.Width, &row.Height, &row.SourceURL, &row.CreatedAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + return &row, nil +} + +// QFindOriginalByItemID finds the original media for an item. +func QFindOriginalByItemID(ctx context.Context, db *sql.DB, itemID int64) (*Row, error) { + query := ` + SELECT id, item_id, media_type, content_type, data, width, height, source_url, created_at + FROM media + WHERE item_id = $1 AND media_type = 'original' + LIMIT 1 + ` + + var row Row + err := db.QueryRowContext(ctx, query, itemID).Scan( + &row.ID, &row.ItemID, &row.MediaType, &row.ContentType, &row.Data, + &row.Width, &row.Height, &row.SourceURL, &row.CreatedAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + return &row, nil +} + +// QDelete deletes a media record by ID. +func QDelete(ctx context.Context, db *sql.DB, id int64) error { + query := `DELETE FROM media WHERE id = $1` + _, err := db.ExecContext(ctx, query, id) + return err +} + +// QDeleteByItemID deletes all media for an item. +func QDeleteByItemID(ctx context.Context, db *sql.DB, itemID int64) error { + query := `DELETE FROM media WHERE item_id = $1` + _, err := db.ExecContext(ctx, query, itemID) + return err +} diff --git a/internal/data/session/queries.go b/internal/data/session/queries.go new file mode 100644 index 0000000..15386fc --- /dev/null +++ b/internal/data/session/queries.go @@ -0,0 +1,73 @@ +package session + +import ( + "context" + "database/sql" + "time" +) + +type Row struct { + ID int64 + SessionID string + CreatedAt time.Time + ExpiresAt time.Time +} + +// QCreate creates a new session. +func QCreate(ctx context.Context, db *sql.DB, sessionID string, expiresAt time.Time) (Row, error) { + query := ` + INSERT INTO session (session_id, expires_at) + VALUES ($1, $2) + RETURNING id, session_id, created_at, expires_at + ` + + var row Row + err := db.QueryRowContext(ctx, query, sessionID, expiresAt).Scan( + &row.ID, + &row.SessionID, + &row.CreatedAt, + &row.ExpiresAt, + ) + return row, err +} + +// QFindBySessionID finds a session by its session ID. +// Returns (nil, nil) if the session does not exist. +func QFindBySessionID(ctx context.Context, db *sql.DB, sessionID string) (*Row, error) { + query := ` + SELECT id, session_id, created_at, expires_at + FROM session + WHERE session_id = $1 + LIMIT 1 + ` + + var row Row + err := db.QueryRowContext(ctx, query, sessionID).Scan( + &row.ID, + &row.SessionID, + &row.CreatedAt, + &row.ExpiresAt, + ) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + + return &row, nil +} + +// QDelete deletes a session by its session ID. +func QDelete(ctx context.Context, db *sql.DB, sessionID string) error { + query := `DELETE FROM session WHERE session_id = $1` + _, err := db.ExecContext(ctx, query, sessionID) + return err +} + +// QDeleteExpired deletes all expired sessions. +func QDeleteExpired(ctx context.Context, db *sql.DB) error { + query := `DELETE FROM session WHERE expires_at < NOW()` + _, err := db.ExecContext(ctx, query) + return err +} diff --git a/internal/data/tag/queries.go b/internal/data/tag/queries.go new file mode 100644 index 0000000..ca39bc4 --- /dev/null +++ b/internal/data/tag/queries.go @@ -0,0 +1,153 @@ +package tag + +import ( + "context" + "database/sql" +) + +type Row struct { + ID int64 + Name string +} + +// QFindOrCreate finds a tag by name or creates it if it doesn't exist. +func QFindOrCreate(ctx context.Context, db *sql.DB, name string) (Row, error) { + query := ` + INSERT INTO tag (name) + VALUES ($1) + ON CONFLICT (name) DO UPDATE SET name = EXCLUDED.name + RETURNING id, name + ` + + var row Row + err := db.QueryRowContext(ctx, query, name).Scan(&row.ID, &row.Name) + return row, err +} + +// QFindByName finds a tag by name. +func QFindByName(ctx context.Context, db *sql.DB, name string) (*Row, error) { + query := `SELECT id, name FROM tag WHERE name = $1` + + var row Row + err := db.QueryRowContext(ctx, query, name).Scan(&row.ID, &row.Name) + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + return &row, nil +} + +// QList returns all tags ordered by name. +func QList(ctx context.Context, db *sql.DB) ([]Row, error) { + query := `SELECT id, name FROM tag ORDER BY name ASC` + + rows, err := db.QueryContext(ctx, query) + if err != nil { + return nil, err + } + defer rows.Close() + + var tags []Row + for rows.Next() { + var row Row + if err := rows.Scan(&row.ID, &row.Name); err != nil { + return nil, err + } + tags = append(tags, row) + } + return tags, rows.Err() +} + +// QSuggest returns tags matching a prefix. +func QSuggest(ctx context.Context, db *sql.DB, prefix string, limit int) ([]Row, error) { + query := ` + SELECT id, name FROM tag + WHERE name ILIKE $1 || '%' + ORDER BY name ASC + LIMIT $2 + ` + + rows, err := db.QueryContext(ctx, query, prefix, limit) + if err != nil { + return nil, err + } + defer rows.Close() + + var tags []Row + for rows.Next() { + var row Row + if err := rows.Scan(&row.ID, &row.Name); err != nil { + return nil, err + } + tags = append(tags, row) + } + return tags, rows.Err() +} + +// QTagsForItem returns all tags for an item. +func QTagsForItem(ctx context.Context, db *sql.DB, itemID int64) ([]Row, error) { + query := ` + SELECT t.id, t.name + FROM tag t + JOIN item_tag it ON t.id = it.tag_id + WHERE it.item_id = $1 + ORDER BY t.name ASC + ` + + rows, err := db.QueryContext(ctx, query, itemID) + if err != nil { + return nil, err + } + defer rows.Close() + + var tags []Row + for rows.Next() { + var row Row + if err := rows.Scan(&row.ID, &row.Name); err != nil { + return nil, err + } + tags = append(tags, row) + } + return tags, rows.Err() +} + +// QAddTagToItem adds a tag to an item. +func QAddTagToItem(ctx context.Context, db *sql.DB, itemID, tagID int64) error { + query := ` + INSERT INTO item_tag (item_id, tag_id) + VALUES ($1, $2) + ON CONFLICT DO NOTHING + ` + _, err := db.ExecContext(ctx, query, itemID, tagID) + return err +} + +// QRemoveTagFromItem removes a tag from an item. +func QRemoveTagFromItem(ctx context.Context, db *sql.DB, itemID, tagID int64) error { + query := `DELETE FROM item_tag WHERE item_id = $1 AND tag_id = $2` + _, err := db.ExecContext(ctx, query, itemID, tagID) + return err +} + +// QSetTagsForItem replaces all tags for an item with the given tag names. +func QSetTagsForItem(ctx context.Context, db *sql.DB, itemID int64, tagNames []string) error { + // Delete existing tags + _, err := db.ExecContext(ctx, `DELETE FROM item_tag WHERE item_id = $1`, itemID) + if err != nil { + return err + } + + // Add new tags + for _, name := range tagNames { + tag, err := QFindOrCreate(ctx, db, name) + if err != nil { + return err + } + if err := QAddTagToItem(ctx, db, itemID, tag.ID); err != nil { + return err + } + } + return nil +} diff --git a/internal/embed/detect.go b/internal/embed/detect.go new file mode 100644 index 0000000..107ad89 --- /dev/null +++ b/internal/embed/detect.go @@ -0,0 +1,251 @@ +package embed + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "net/url" + "regexp" + "time" +) + +// Provider identifies the video hosting platform. +type Provider string + +const ( + ProviderYouTube Provider = "youtube" + ProviderVimeo Provider = "vimeo" + ProviderTwitter Provider = "twitter" +) + +// VideoInfo contains information about an embedded video. +type VideoInfo struct { + Provider Provider + VideoID string + Title string + Description string + ThumbnailURL string + EmbedHTML string +} + +var ( + youtubeRegex = regexp.MustCompile(`(?:youtube\.com/(?:watch\?v=|embed/|v/|shorts/)|youtu\.be/)([a-zA-Z0-9_-]{11})`) + vimeoRegex = regexp.MustCompile(`(?:vimeo\.com/(?:video/)?|player\.vimeo\.com/video/)(\d+)`) + twitterRegex = regexp.MustCompile(`(?:twitter\.com|x\.com)/([^/]+)/status/(\d+)`) +) + +// Detect checks if a URL is a YouTube, Vimeo, or Twitter/X post and returns its info. +func Detect(ctx context.Context, targetURL string) (*VideoInfo, error) { + // Try YouTube + if matches := youtubeRegex.FindStringSubmatch(targetURL); len(matches) > 1 { + return fetchYouTube(ctx, matches[1]) + } + + // Try Vimeo + if matches := vimeoRegex.FindStringSubmatch(targetURL); len(matches) > 1 { + return fetchVimeo(ctx, matches[1]) + } + + // Try Twitter/X + if matches := twitterRegex.FindStringSubmatch(targetURL); len(matches) > 2 { + return fetchTwitter(ctx, matches[2], targetURL) + } + + return nil, nil // Not a recognized embed +} + +func fetchYouTube(ctx context.Context, videoID string) (*VideoInfo, error) { + // YouTube thumbnails are available without API + thumbnailURL := fmt.Sprintf("https://img.youtube.com/vi/%s/maxresdefault.jpg", videoID) + + // Try to get metadata via oEmbed + oembedURL := fmt.Sprintf("https://www.youtube.com/oembed?url=%s&format=json", + url.QueryEscape("https://www.youtube.com/watch?v="+videoID)) + + var title string + if meta, err := fetchOEmbed(ctx, oembedURL); err == nil { + title = meta.Title + } + + embedHTML := fmt.Sprintf( + ``, + videoID, + ) + + return &VideoInfo{ + Provider: ProviderYouTube, + VideoID: videoID, + Title: title, + ThumbnailURL: thumbnailURL, + EmbedHTML: embedHTML, + }, nil +} + +func fetchVimeo(ctx context.Context, videoID string) (*VideoInfo, error) { + oembedURL := fmt.Sprintf("https://vimeo.com/api/oembed.json?url=%s", + url.QueryEscape("https://vimeo.com/"+videoID)) + + meta, err := fetchOEmbed(ctx, oembedURL) + if err != nil { + return nil, fmt.Errorf("vimeo oembed: %w", err) + } + + embedHTML := fmt.Sprintf( + ``, + videoID, + ) + + return &VideoInfo{ + Provider: ProviderVimeo, + VideoID: videoID, + Title: meta.Title, + Description: meta.Description, + ThumbnailURL: meta.ThumbnailURL, + EmbedHTML: embedHTML, + }, nil +} + +// twitterSyndicationResponse represents the Twitter syndication API response +type twitterSyndicationResponse struct { + Text string `json:"text"` + User struct { + Name string `json:"name"` + ScreenName string `json:"screen_name"` + } `json:"user"` + Photos []struct { + URL string `json:"url"` + Width int `json:"width"` + Height int `json:"height"` + } `json:"photos"` + MediaDetails []struct { + MediaURLHTTPS string `json:"media_url_https"` + Type string `json:"type"` + } `json:"mediaDetails"` + Video struct { + Poster string `json:"poster"` + } `json:"video"` +} + +func fetchTwitter(ctx context.Context, tweetID string, originalURL string) (*VideoInfo, error) { + apiURL := fmt.Sprintf("https://cdn.syndication.twimg.com/tweet-result?id=%s&token=0", tweetID) + + req, err := http.NewRequestWithContext(ctx, "GET", apiURL, nil) + if err != nil { + return nil, err + } + req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; Lookbook/1.0)") + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("twitter syndication: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("twitter syndication status: %d", resp.StatusCode) + } + + var tweet twitterSyndicationResponse + if err := json.NewDecoder(resp.Body).Decode(&tweet); err != nil { + return nil, fmt.Errorf("twitter syndication decode: %w", err) + } + + // Find thumbnail - prefer photos, then video poster + var thumbnailURL string + if len(tweet.Photos) > 0 { + thumbnailURL = tweet.Photos[0].URL + } else if len(tweet.MediaDetails) > 0 { + thumbnailURL = tweet.MediaDetails[0].MediaURLHTTPS + } else if tweet.Video.Poster != "" { + thumbnailURL = tweet.Video.Poster + } + + // Build embed HTML using Twitter's embed widget + embedHTML := fmt.Sprintf( + ``, + originalURL, + ) + + title := fmt.Sprintf("@%s", tweet.User.ScreenName) + if tweet.User.Name != "" { + title = fmt.Sprintf("%s (@%s)", tweet.User.Name, tweet.User.ScreenName) + } + + return &VideoInfo{ + Provider: ProviderTwitter, + VideoID: tweetID, + Title: title, + Description: tweet.Text, + ThumbnailURL: thumbnailURL, + EmbedHTML: embedHTML, + }, nil +} + +type oembedResponse struct { + Title string `json:"title"` + Description string `json:"description"` + ThumbnailURL string `json:"thumbnail_url"` +} + +func fetchOEmbed(ctx context.Context, oembedURL string) (*oembedResponse, error) { + req, err := http.NewRequestWithContext(ctx, "GET", oembedURL, nil) + if err != nil { + return nil, err + } + + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("oembed status: %d", resp.StatusCode) + } + + var meta oembedResponse + if err := json.NewDecoder(resp.Body).Decode(&meta); err != nil { + return nil, err + } + + return &meta, nil +} + +// DownloadThumbnail downloads the thumbnail image for a video. +func DownloadThumbnail(ctx context.Context, thumbnailURL string) ([]byte, string, error) { + req, err := http.NewRequestWithContext(ctx, "GET", thumbnailURL, nil) + if err != nil { + return nil, "", err + } + req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; Lookbook/1.0)") + + client := &http.Client{Timeout: 30 * time.Second} + resp, err := client.Do(req) + if err != nil { + return nil, "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, "", fmt.Errorf("thumbnail status: %d", resp.StatusCode) + } + + contentType := resp.Header.Get("Content-Type") + + data := make([]byte, 0, 1<<20) // 1MB initial capacity + buf := make([]byte, 32*1024) + for { + n, err := resp.Body.Read(buf) + if n > 0 { + data = append(data, buf[:n]...) + } + if err != nil { + break + } + } + + return data, contentType, nil +} diff --git a/internal/handlers/api_auth.go b/internal/handlers/api_auth.go new file mode 100644 index 0000000..9bc6555 --- /dev/null +++ b/internal/handlers/api_auth.go @@ -0,0 +1,141 @@ +package handlers + +import ( + "context" + "crypto/rand" + "encoding/base64" + "encoding/json" + "net/http" + "time" + + "golang.org/x/crypto/bcrypt" + + "lookbook/internal/data/admin" + "lookbook/internal/data/session" +) + +const sessionDuration = 30 * 24 * time.Hour // 30 days + +type loginRequest struct { + Password string `json:"password"` +} + +type loginResponse struct { + FirstTime bool `json:"firstTime,omitempty"` + Error string `json:"error,omitempty"` +} + +// HandleLogin handles POST /api/auth/login +// If no password is set, it sets the password. Otherwise, it verifies the password. +func HandleLogin(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + var req loginRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, loginResponse{Error: "invalid request"}) + } + + if req.Password == "" { + return writeJSON(w, http.StatusBadRequest, loginResponse{Error: "password required"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + adm, err := admin.QGet(ctx, rc.DB) + if err != nil { + return err + } + + firstTime := adm.PasswordHash == nil + + if firstTime { + // First login: set the password + hash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) + if err != nil { + return err + } + if err := admin.QSetPassword(ctx, rc.DB, hash); err != nil { + return err + } + } else { + // Verify password + if err := bcrypt.CompareHashAndPassword(adm.PasswordHash, []byte(req.Password)); err != nil { + return writeJSON(w, http.StatusUnauthorized, loginResponse{Error: "invalid password"}) + } + } + + // Create session + sessionID, err := generateSessionID() + if err != nil { + return err + } + + expiresAt := time.Now().Add(sessionDuration) + if _, err := session.QCreate(ctx, rc.DB, sessionID, expiresAt); err != nil { + return err + } + + // Set cookie + http.SetCookie(w, &http.Cookie{ + Name: "session_id", + Value: sessionID, + Path: "/", + Expires: expiresAt, + HttpOnly: true, + SameSite: http.SameSiteLaxMode, + Secure: r.TLS != nil, + }) + + return writeJSON(w, http.StatusOK, loginResponse{FirstTime: firstTime}) +} + +// HandleLogout handles POST /api/auth/logout +func HandleLogout(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + cookie, err := r.Cookie("session_id") + if err == nil { + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + session.QDelete(ctx, rc.DB, cookie.Value) + } + + // Clear cookie + http.SetCookie(w, &http.Cookie{ + Name: "session_id", + Value: "", + Path: "/", + MaxAge: -1, + HttpOnly: true, + SameSite: http.SameSiteLaxMode, + }) + + return writeJSON(w, http.StatusOK, map[string]string{"status": "ok"}) +} + +// HandleAuthStatus handles GET /api/auth/status +func HandleAuthStatus(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + hasPassword, err := admin.QHasPassword(ctx, rc.DB) + if err != nil { + return err + } + + return writeJSON(w, http.StatusOK, map[string]any{ + "isAdmin": rc.IsAdmin, + "passwordSet": hasPassword, + }) +} + +func generateSessionID() (string, error) { + b := make([]byte, 32) + if _, err := rand.Read(b); err != nil { + return "", err + } + return base64.URLEncoding.EncodeToString(b), nil +} + +func writeJSON(w http.ResponseWriter, status int, v any) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + return json.NewEncoder(w).Encode(v) +} diff --git a/internal/handlers/api_items.go b/internal/handlers/api_items.go new file mode 100644 index 0000000..0b0a453 --- /dev/null +++ b/internal/handlers/api_items.go @@ -0,0 +1,268 @@ +package handlers + +import ( + "context" + "encoding/json" + "net/http" + "time" + + "lookbook/internal/data/item" + "lookbook/internal/data/media" + "lookbook/internal/data/tag" +) + +type itemResponse struct { + ID string `json:"id"` + Title *string `json:"title,omitempty"` + Description *string `json:"description,omitempty"` + LinkURL *string `json:"linkUrl,omitempty"` + ItemType string `json:"itemType"` + EmbedHTML *string `json:"embedHtml,omitempty"` + Tags []string `json:"tags"` + CreatedAt string `json:"createdAt"` + MediaID *int64 `json:"mediaId,omitempty"` + ThumbnailID *int64 `json:"thumbnailId,omitempty"` + ThumbnailSourceURL *string `json:"thumbnailSourceUrl,omitempty"` +} + +type createItemRequest struct { + Title *string `json:"title"` + Description *string `json:"description"` + LinkURL *string `json:"linkUrl"` + ItemType string `json:"itemType"` // 'image', 'video', 'quote', 'embed' + EmbedProvider *string `json:"embedProvider"` + EmbedVideoID *string `json:"embedVideoId"` + EmbedHTML *string `json:"embedHtml"` + Tags []string `json:"tags"` +} + +type updateItemRequest struct { + Title *string `json:"title"` + Description *string `json:"description"` + LinkURL *string `json:"linkUrl"` + Tags []string `json:"tags"` +} + +// HandleListItems handles GET /api/items +func HandleListItems(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + tagFilter := r.URL.Query().Get("tag") + + var items []item.Row + var err error + if tagFilter != "" { + items, err = item.QListByTag(ctx, rc.DB, tagFilter) + } else { + items, err = item.QList(ctx, rc.DB) + } + if err != nil { + return err + } + + response := make([]itemResponse, 0, len(items)) + for _, it := range items { + resp, err := buildItemResponse(ctx, rc, it) + if err != nil { + return err + } + response = append(response, resp) + } + + return writeJSON(w, http.StatusOK, response) +} + +// HandleGetItem handles GET /api/items/{id} +func HandleGetItem(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + pubID := r.PathValue("id") + if pubID == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing id"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + return writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + } + + resp, err := buildItemResponse(ctx, rc, *it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusOK, resp) +} + +// HandleCreateItem handles POST /api/items +func HandleCreateItem(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + var req createItemRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) + } + + if req.ItemType == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "itemType required"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + it, err := item.QCreate(ctx, rc.DB, item.CreateParams{ + Title: req.Title, + Description: req.Description, + LinkURL: req.LinkURL, + ItemType: req.ItemType, + EmbedProvider: req.EmbedProvider, + EmbedVideoID: req.EmbedVideoID, + EmbedHTML: req.EmbedHTML, + }) + if err != nil { + return err + } + + // Set tags + if len(req.Tags) > 0 { + if err := tag.QSetTagsForItem(ctx, rc.DB, it.ID, req.Tags); err != nil { + return err + } + } + + resp, err := buildItemResponse(ctx, rc, it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusCreated, resp) +} + +// HandleUpdateItem handles PUT /api/items/{id} +func HandleUpdateItem(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + pubID := r.PathValue("id") + if pubID == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing id"}) + } + + var req updateItemRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + return writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + } + + if err := item.QUpdate(ctx, rc.DB, it.ID, item.UpdateParams{ + Title: req.Title, + Description: req.Description, + LinkURL: req.LinkURL, + }); err != nil { + return err + } + + // Update tags + if err := tag.QSetTagsForItem(ctx, rc.DB, it.ID, req.Tags); err != nil { + return err + } + + // Refetch to return updated item + it, err = item.QFindByID(ctx, rc.DB, it.ID) + if err != nil { + return err + } + + resp, err := buildItemResponse(ctx, rc, *it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusOK, resp) +} + +// HandleDeleteItem handles DELETE /api/items/{id} +func HandleDeleteItem(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + pubID := r.PathValue("id") + if pubID == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing id"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + return writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + } + + if err := item.QSoftDelete(ctx, rc.DB, it.ID); err != nil { + return err + } + + return writeJSON(w, http.StatusOK, map[string]string{"status": "deleted"}) +} + +func buildItemResponse(ctx context.Context, rc *RequestContext, it item.Row) (itemResponse, error) { + tags, err := tag.QTagsForItem(ctx, rc.DB, it.ID) + if err != nil { + return itemResponse{}, err + } + + tagNames := make([]string, len(tags)) + for i, t := range tags { + tagNames[i] = t.Name + } + + resp := itemResponse{ + ID: it.PubID, + Title: it.Title, + Description: it.Description, + LinkURL: it.LinkURL, + ItemType: it.ItemType, + EmbedHTML: it.EmbedHTML, + Tags: tagNames, + CreatedAt: it.CreatedAt.Format(time.RFC3339), + } + + // Get media IDs + mediaList, err := media.QFindByItemID(ctx, rc.DB, it.ID) + if err != nil { + return itemResponse{}, err + } + for _, m := range mediaList { + if m.MediaType == "original" { + resp.MediaID = &m.ID + } else if m.MediaType == "thumbnail" { + resp.ThumbnailID = &m.ID + resp.ThumbnailSourceURL = m.SourceURL + } + } + + return resp, nil +} diff --git a/internal/handlers/api_tags.go b/internal/handlers/api_tags.go new file mode 100644 index 0000000..6f6a3fa --- /dev/null +++ b/internal/handlers/api_tags.go @@ -0,0 +1,47 @@ +package handlers + +import ( + "context" + "net/http" + "time" + + "lookbook/internal/data/tag" +) + +// HandleListTags handles GET /api/tags +func HandleListTags(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + tags, err := tag.QList(ctx, rc.DB) + if err != nil { + return err + } + + names := make([]string, len(tags)) + for i, t := range tags { + names[i] = t.Name + } + + return writeJSON(w, http.StatusOK, names) +} + +// HandleSuggestTags handles GET /api/tags/suggest?q=... +func HandleSuggestTags(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + prefix := r.URL.Query().Get("q") + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + tags, err := tag.QSuggest(ctx, rc.DB, prefix, 10) + if err != nil { + return err + } + + names := make([]string, len(tags)) + for i, t := range tags { + names[i] = t.Name + } + + return writeJSON(w, http.StatusOK, names) +} diff --git a/internal/handlers/api_upload.go b/internal/handlers/api_upload.go new file mode 100644 index 0000000..7df0a83 --- /dev/null +++ b/internal/handlers/api_upload.go @@ -0,0 +1,577 @@ +package handlers + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" + + "lookbook/internal/data/item" + "lookbook/internal/data/media" + "lookbook/internal/data/tag" + "lookbook/internal/embed" + "lookbook/internal/opengraph" + "lookbook/internal/video" +) + +type urlMetadata struct { + Title string + Description string + ImageURL string + SiteName string + IsEmbed bool + Provider string + VideoID string + EmbedHTML string +} + +// fetchURLMetadata fetches metadata for a URL, trying embed detection first, then OpenGraph +func fetchURLMetadata(ctx context.Context, url string) (*urlMetadata, error) { + // Check if it's a YouTube/Vimeo/Twitter embed + videoInfo, err := embed.Detect(ctx, url) + if err == nil && videoInfo != nil { + return &urlMetadata{ + Title: videoInfo.Title, + Description: videoInfo.Description, + ImageURL: videoInfo.ThumbnailURL, + IsEmbed: true, + Provider: string(videoInfo.Provider), + VideoID: videoInfo.VideoID, + EmbedHTML: videoInfo.EmbedHTML, + }, nil + } + + // Fetch OpenGraph metadata + meta, err := opengraph.Fetch(ctx, url) + if err != nil { + return nil, err + } + + return &urlMetadata{ + Title: meta.Title, + Description: meta.Description, + ImageURL: meta.ImageURL, + SiteName: meta.SiteName, + IsEmbed: false, + }, nil +} + +type previewResponse struct { + Title string `json:"title,omitempty"` + Description string `json:"description,omitempty"` + ImageURL string `json:"imageUrl,omitempty"` + SiteName string `json:"siteName,omitempty"` + IsEmbed bool `json:"isEmbed"` + Provider string `json:"provider,omitempty"` + VideoID string `json:"videoId,omitempty"` + EmbedHTML string `json:"embedHtml,omitempty"` +} + +// HandlePreviewLink handles POST /api/preview - fetches metadata for a URL +func HandlePreviewLink(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + var req struct { + URL string `json:"url"` + } + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) + } + + if req.URL == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "url required"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second) + defer cancel() + + meta, err := fetchURLMetadata(ctx, req.URL) + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": fmt.Sprintf("failed to fetch: %v", err)}) + } + + return writeJSON(w, http.StatusOK, previewResponse{ + Title: meta.Title, + Description: meta.Description, + ImageURL: meta.ImageURL, + SiteName: meta.SiteName, + IsEmbed: meta.IsEmbed, + Provider: meta.Provider, + VideoID: meta.VideoID, + EmbedHTML: meta.EmbedHTML, + }) +} + +type createFromLinkRequest struct { + URL string `json:"url"` + Title *string `json:"title"` + Description *string `json:"description"` + Tags []string `json:"tags"` + // For embeds: + Provider *string `json:"provider"` + VideoID *string `json:"videoId"` + EmbedHTML *string `json:"embedHtml"` + // For downloading hero image: + ImageURL *string `json:"imageUrl"` +} + +// HandleCreateFromLink handles POST /api/items/from-link +func HandleCreateFromLink(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + var req createFromLinkRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 60*time.Second) + defer cancel() + + var itemType string + var embedProvider, embedVideoID, embedHTML *string + + if req.Provider != nil && *req.Provider != "" { + // It's an embed + itemType = "embed" + embedProvider = req.Provider + embedVideoID = req.VideoID + embedHTML = req.EmbedHTML + } else if req.ImageURL != nil && *req.ImageURL != "" { + // It's a link with an image + itemType = "image" + } else { + // Just a link (will be shown as a card) + itemType = "link" + } + + // Create the item + it, err := item.QCreate(ctx, rc.DB, item.CreateParams{ + Title: req.Title, + Description: req.Description, + LinkURL: &req.URL, + ItemType: itemType, + EmbedProvider: embedProvider, + EmbedVideoID: embedVideoID, + EmbedHTML: embedHTML, + }) + if err != nil { + return err + } + + // Download and store image if available + var imageURL string + if req.ImageURL != nil { + imageURL = *req.ImageURL + } + + // For embeds, fetch thumbnail + if itemType == "embed" && embedProvider != nil { + if videoInfo, err := embed.Detect(ctx, req.URL); err == nil && videoInfo != nil { + imageURL = videoInfo.ThumbnailURL + } + } + + if imageURL != "" { + imgData, contentType, err := opengraph.DownloadImage(ctx, imageURL) + if err != nil { + rc.Logger.Warn("failed to download image", "url", imageURL, "error", err) + } else { + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "thumbnail", + ContentType: contentType, + Data: imgData, + SourceURL: &imageURL, + }) + if err != nil { + rc.Logger.Warn("failed to store image", "error", err) + } + } + } + + // Set tags + if len(req.Tags) > 0 { + if err := tag.QSetTagsForItem(ctx, rc.DB, it.ID, req.Tags); err != nil { + return err + } + } + + resp, err := buildItemResponse(ctx, rc, it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusCreated, resp) +} + +// HandleUpload handles POST /api/items/upload - multipart file upload +func HandleUpload(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + // Parse multipart form (max 500MB) + if err := r.ParseMultipartForm(500 << 20); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "failed to parse form"}) + } + + file, header, err := r.FormFile("file") + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "file required"}) + } + defer file.Close() + + title := r.FormValue("title") + description := r.FormValue("description") + tagsStr := r.FormValue("tags") + + var tags []string + if tagsStr != "" { + tags = strings.Split(tagsStr, ",") + for i := range tags { + tags[i] = strings.TrimSpace(tags[i]) + } + } + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute) + defer cancel() + + // Read file data + data, err := io.ReadAll(file) + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "failed to read file"}) + } + + contentType := header.Header.Get("Content-Type") + if contentType == "" { + contentType = http.DetectContentType(data) + } + + var itemType string + var originalData, thumbnailData []byte + var originalContentType string + + if video.IsVideo(contentType) { + itemType = "video" + // Process video: transcode and extract thumbnail + transcoded, thumbnail, err := video.ProcessVideo(ctx, data, contentType) + if err != nil { + return writeJSON(w, http.StatusInternalServerError, map[string]string{"error": fmt.Sprintf("video processing failed: %v", err)}) + } + originalData = transcoded + originalContentType = "video/mp4" + thumbnailData = thumbnail + } else if video.IsImage(contentType) { + itemType = "image" + originalData = data + originalContentType = contentType + } else { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "unsupported file type"}) + } + + // Create item + var titlePtr, descPtr *string + if title != "" { + titlePtr = &title + } + if description != "" { + descPtr = &description + } + + it, err := item.QCreate(ctx, rc.DB, item.CreateParams{ + Title: titlePtr, + Description: descPtr, + ItemType: itemType, + }) + if err != nil { + return err + } + + // Store original media + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "original", + ContentType: originalContentType, + Data: originalData, + }) + if err != nil { + return err + } + + // Store thumbnail for videos + if len(thumbnailData) > 0 { + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "thumbnail", + ContentType: "image/jpeg", + Data: thumbnailData, + }) + if err != nil { + rc.Logger.Warn("failed to store thumbnail", "error", err) + } + } + + // Set tags + if len(tags) > 0 { + if err := tag.QSetTagsForItem(ctx, rc.DB, it.ID, tags); err != nil { + return err + } + } + + resp, err := buildItemResponse(ctx, rc, it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusCreated, resp) +} + +type createQuoteRequest struct { + Text string `json:"text"` + Source *string `json:"source"` // Optional attribution + SourceURL *string `json:"sourceUrl"` + Tags []string `json:"tags"` +} + +// HandleCreateQuote handles POST /api/items/quote +func HandleCreateQuote(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + var req createQuoteRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid request"}) + } + + if req.Text == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "text required"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + it, err := item.QCreate(ctx, rc.DB, item.CreateParams{ + Title: req.Source, + Description: &req.Text, + LinkURL: req.SourceURL, + ItemType: "quote", + }) + if err != nil { + return err + } + + // Set tags + if len(req.Tags) > 0 { + if err := tag.QSetTagsForItem(ctx, rc.DB, it.ID, req.Tags); err != nil { + return err + } + } + + resp, err := buildItemResponse(ctx, rc, it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusCreated, resp) +} + +// HandleReplaceMedia handles POST /api/items/{id}/media - replaces media for an item +func HandleReplaceMedia(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + pubID := r.PathValue("id") + if pubID == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing id"}) + } + + // Parse multipart form (max 500MB) + if err := r.ParseMultipartForm(500 << 20); err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "failed to parse form"}) + } + + file, header, err := r.FormFile("file") + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "file required"}) + } + defer file.Close() + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + return writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + } + + // Read file data + data, err := io.ReadAll(file) + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "failed to read file"}) + } + + contentType := header.Header.Get("Content-Type") + if contentType == "" { + contentType = http.DetectContentType(data) + } + + var originalData, thumbnailData []byte + var originalContentType string + var newItemType string + + if video.IsVideo(contentType) { + newItemType = "video" + transcoded, thumbnail, err := video.ProcessVideo(ctx, data, contentType) + if err != nil { + return writeJSON(w, http.StatusInternalServerError, map[string]string{"error": fmt.Sprintf("video processing failed: %v", err)}) + } + originalData = transcoded + originalContentType = "video/mp4" + thumbnailData = thumbnail + } else if video.IsImage(contentType) { + newItemType = "image" + originalData = data + originalContentType = contentType + } else { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "unsupported file type"}) + } + + // Delete existing media + media.QDeleteByItemID(ctx, rc.DB, it.ID) + + // Store new original media + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "original", + ContentType: originalContentType, + Data: originalData, + }) + if err != nil { + return err + } + + // Store thumbnail for videos + if len(thumbnailData) > 0 { + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "thumbnail", + ContentType: "image/jpeg", + Data: thumbnailData, + }) + if err != nil { + rc.Logger.Warn("failed to store thumbnail", "error", err) + } + } + + // Update item type if it changed (e.g., embed -> image) + if it.ItemType != newItemType && (it.ItemType == "embed" || it.ItemType == "link") { + item.QUpdateType(ctx, rc.DB, it.ID, newItemType) + } + + // Refetch and return updated item + it, err = item.QFindByID(ctx, rc.DB, it.ID) + if err != nil { + return err + } + + resp, err := buildItemResponse(ctx, rc, *it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusOK, resp) +} + +// HandleRefreshMetadata handles POST /api/items/{id}/refresh +// Re-fetches metadata and thumbnail for an item with a link URL +func HandleRefreshMetadata(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + if !rc.RequireAdmin(w) { + return nil + } + + pubID := r.PathValue("id") + if pubID == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "missing id"}) + } + + ctx, cancel := context.WithTimeout(r.Context(), 60*time.Second) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + return writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + } + + if it.LinkURL == nil || *it.LinkURL == "" { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": "item has no link URL"}) + } + + meta, err := fetchURLMetadata(ctx, *it.LinkURL) + if err != nil { + return writeJSON(w, http.StatusBadRequest, map[string]string{"error": fmt.Sprintf("failed to fetch: %v", err)}) + } + + // Update title and description + var titlePtr, descPtr *string + if meta.Title != "" { + titlePtr = &meta.Title + } + if meta.Description != "" { + descPtr = &meta.Description + } + item.QUpdate(ctx, rc.DB, it.ID, item.UpdateParams{ + Title: titlePtr, + Description: descPtr, + LinkURL: it.LinkURL, + }) + + // Download and replace thumbnail + if meta.ImageURL != "" { + // Delete existing media for this item + media.QDeleteByItemID(ctx, rc.DB, it.ID) + + imgData, contentType, err := opengraph.DownloadImage(ctx, meta.ImageURL) + if err != nil { + rc.Logger.Warn("failed to download image during refresh", "url", meta.ImageURL, "error", err) + } else { + _, err = media.QCreate(ctx, rc.DB, media.CreateParams{ + ItemID: it.ID, + MediaType: "thumbnail", + ContentType: contentType, + Data: imgData, + SourceURL: &meta.ImageURL, + }) + if err != nil { + rc.Logger.Warn("failed to store refreshed image", "error", err) + } + } + } + + // Refetch and return updated item + it, err = item.QFindByID(ctx, rc.DB, it.ID) + if err != nil { + return err + } + + resp, err := buildItemResponse(ctx, rc, *it) + if err != nil { + return err + } + + return writeJSON(w, http.StatusOK, resp) +} diff --git a/internal/handlers/context.go b/internal/handlers/context.go new file mode 100644 index 0000000..9f4ee77 --- /dev/null +++ b/internal/handlers/context.go @@ -0,0 +1,27 @@ +package handlers + +import ( + "database/sql" + "log/slog" + "net/http" + + "git.soup.land/soup/sxgo/ssr" +) + +// RequestContext holds dependencies that are injected into every request handler. +type RequestContext struct { + DB *sql.DB + Logger *slog.Logger + TmplCache *ssr.TmplCache + IsAdmin bool // true if authenticated as admin +} + +// RequireAdmin checks authentication and returns 401 if not admin. +// Returns true if authenticated, false if 401 was sent. +func (rc *RequestContext) RequireAdmin(w http.ResponseWriter) bool { + if !rc.IsAdmin { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return false + } + return true +} diff --git a/internal/handlers/handler.go b/internal/handlers/handler.go new file mode 100644 index 0000000..4878f12 --- /dev/null +++ b/internal/handlers/handler.go @@ -0,0 +1,49 @@ +package handlers + +import ( + "log/slog" + "net/http" +) + +// Handler is a function that handles HTTP requests and can return an error. +// It receives a RequestContext with injected dependencies (DB, Logger). +type Handler func(rc *RequestContext, w http.ResponseWriter, r *http.Request) error + +// WithErrorHandling wraps a Handler to automatically handle errors. +func WithErrorHandling(rc *RequestContext, h Handler) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + wrapper := &responseWrapper{ + ResponseWriter: w, + written: false, + } + + err := h(rc, wrapper, r) + if err != nil { + rc.Logger.Error("handler error", + slog.String("method", r.Method), + slog.String("path", r.URL.Path), + slog.Any("error", err), + ) + + if !wrapper.written { + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + } + } + } +} + +// responseWrapper tracks if response was written +type responseWrapper struct { + http.ResponseWriter + written bool +} + +func (w *responseWrapper) Write(b []byte) (int, error) { + w.written = true + return w.ResponseWriter.Write(b) +} + +func (w *responseWrapper) WriteHeader(statusCode int) { + w.written = true + w.ResponseWriter.WriteHeader(statusCode) +} diff --git a/internal/handlers/home.go b/internal/handlers/home.go new file mode 100644 index 0000000..eb8ba14 --- /dev/null +++ b/internal/handlers/home.go @@ -0,0 +1,213 @@ +package handlers + +import ( + "context" + "net/http" + "time" + + "git.soup.land/soup/sxgo/ssr" + "lookbook/internal/components" + "lookbook/internal/data/item" + "lookbook/internal/data/media" + "lookbook/internal/data/tag" +) + +type homeContent struct { + Items []homeItem + Tags []string + ActiveTag string + IsAdmin bool +} + +type homeItem struct { + ID string + Title *string + Description *string + LinkURL *string + ItemType string + EmbedHTML *string + Tags []string + ThumbnailID *int64 + MediaID *int64 +} + +func (h homeContent) Render(sw *ssr.Writer) error { + return sw.Tmpl(h, ` + + +{{if .IsAdmin}} + +{{end}} +`) +} + +// HandleHome handles GET / +func HandleHome(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + tagFilter := r.URL.Query().Get("tag") + + var items []item.Row + var err error + if tagFilter != "" { + items, err = item.QListByTag(ctx, rc.DB, tagFilter) + } else { + items, err = item.QList(ctx, rc.DB) + } + if err != nil { + return err + } + + // Get all tags + allTags, err := tag.QList(ctx, rc.DB) + if err != nil { + return err + } + tagNames := make([]string, len(allTags)) + for i, t := range allTags { + tagNames[i] = t.Name + } + + // Build home items + homeItems := make([]homeItem, 0, len(items)) + for _, it := range items { + hi := homeItem{ + ID: it.PubID, + Title: it.Title, + Description: it.Description, + LinkURL: it.LinkURL, + ItemType: it.ItemType, + EmbedHTML: it.EmbedHTML, + } + + // Get tags + itemTags, err := tag.QTagsForItem(ctx, rc.DB, it.ID) + if err != nil { + return err + } + hi.Tags = make([]string, len(itemTags)) + for i, t := range itemTags { + hi.Tags[i] = t.Name + } + + // Get media + mediaList, err := media.QFindByItemID(ctx, rc.DB, it.ID) + if err != nil { + return err + } + for _, m := range mediaList { + if m.MediaType == "thumbnail" { + hi.ThumbnailID = &m.ID + } else if m.MediaType == "original" { + hi.MediaID = &m.ID + } + } + + homeItems = append(homeItems, hi) + } + + content := homeContent{ + Items: homeItems, + Tags: tagNames, + ActiveTag: tagFilter, + IsAdmin: rc.IsAdmin, + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + sw := ssr.NewWriter(w, rc.TmplCache) + + page := components.Page{ + Title: "", + IsAdmin: rc.IsAdmin, + Content: content, + } + + return page.Render(sw) +} diff --git a/internal/handlers/item_page.go b/internal/handlers/item_page.go new file mode 100644 index 0000000..c0bc609 --- /dev/null +++ b/internal/handlers/item_page.go @@ -0,0 +1,205 @@ +package handlers + +import ( + "context" + "net/http" + "time" + + "git.soup.land/soup/sxgo/ssr" + "lookbook/internal/components" + "lookbook/internal/data/item" + "lookbook/internal/data/media" + "lookbook/internal/data/tag" +) + +type itemPageContent struct { + Item itemPageData + IsAdmin bool +} + +type itemPageData struct { + ID string + Title *string + Description *string + LinkURL *string + ItemType string + EmbedHTML *string + Tags []string + CreatedAt string + ThumbnailID *int64 + MediaID *int64 +} + +func (c itemPageContent) Render(sw *ssr.Writer) error { + return sw.Tmpl(c, ` +
+ ← BACK + +
+ {{if eq .Item.ItemType "quote"}} +
+
{{.Item.Description}}
+ {{if .Item.Title}}— {{.Item.Title}}{{end}} +
+ {{else if eq .Item.ItemType "video"}} +
+ +
+ {{else if eq .Item.ItemType "embed"}} + {{if .Item.ThumbnailID}} +
+ {{if .Item.Title}}{{.Item.Title}}{{else}}Embed{{end}} +
+ {{else if .Item.MediaID}} +
+ {{if .Item.Title}}{{.Item.Title}}{{else}}Embed{{end}} +
+ {{end}} + {{else if .Item.MediaID}} +
+ {{if .Item.Title}}{{.Item.Title}}{{else}}Image{{end}} +
+ {{else if .Item.ThumbnailID}} +
+ {{if .Item.Title}}{{.Item.Title}}{{else}}Image{{end}} +
+ {{end}} + +
+ {{if .Item.Title}} +

{{.Item.Title}}

+ {{end}} + + {{if and .Item.Description (ne .Item.ItemType "quote")}} +

{{.Item.Description}}

+ {{end}} + + {{if .Item.LinkURL}} + {{.Item.LinkURL}} + {{end}} + + {{if .Item.Tags}} +
+ {{range .Item.Tags}} + {{.}} + {{end}} +
+ {{end}} + + +
+ + {{if .IsAdmin}} +
+ + {{if .Item.LinkURL}}{{end}} + +
+ {{end}} +
+
+ +{{if .IsAdmin}} + +{{end}} +`) +} + +// HandleItemPage handles GET /item/{id} +func HandleItemPage(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + pubID := r.PathValue("id") + if pubID == "" { + http.NotFound(w, r) + return nil + } + + ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second) + defer cancel() + + it, err := item.QFindByPubID(ctx, rc.DB, pubID) + if err != nil { + return err + } + if it == nil { + http.NotFound(w, r) + return nil + } + + // Get tags + itemTags, err := tag.QTagsForItem(ctx, rc.DB, it.ID) + if err != nil { + return err + } + tagNames := make([]string, len(itemTags)) + for i, t := range itemTags { + tagNames[i] = t.Name + } + + // Get media + var thumbnailID, mediaID *int64 + mediaList, err := media.QFindByItemID(ctx, rc.DB, it.ID) + if err != nil { + return err + } + for _, m := range mediaList { + if m.MediaType == "thumbnail" { + thumbnailID = &m.ID + } else if m.MediaType == "original" { + mediaID = &m.ID + } + } + + data := itemPageData{ + ID: it.PubID, + Title: it.Title, + Description: it.Description, + LinkURL: it.LinkURL, + ItemType: it.ItemType, + EmbedHTML: it.EmbedHTML, + Tags: tagNames, + CreatedAt: it.CreatedAt.Format("Jan 2, 2006"), + ThumbnailID: thumbnailID, + MediaID: mediaID, + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + sw := ssr.NewWriter(w, rc.TmplCache) + + var title string + if it.Title != nil { + title = *it.Title + } + + page := components.Page{ + Title: title, + IsAdmin: rc.IsAdmin, + Content: itemPageContent{Item: data, IsAdmin: rc.IsAdmin}, + } + + return page.Render(sw) +} diff --git a/internal/handlers/media.go b/internal/handlers/media.go new file mode 100644 index 0000000..d46f844 --- /dev/null +++ b/internal/handlers/media.go @@ -0,0 +1,50 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "strconv" + "time" + + "lookbook/internal/data/media" +) + +// HandleGetMedia handles GET /media/{id} +func HandleGetMedia(rc *RequestContext, w http.ResponseWriter, r *http.Request) error { + idStr := r.PathValue("id") + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + http.Error(w, "invalid id", http.StatusBadRequest) + return nil + } + + ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second) + defer cancel() + + m, err := media.QFindByID(ctx, rc.DB, id) + if err != nil { + return err + } + if m == nil { + http.NotFound(w, r) + return nil + } + + // Set caching headers (media is immutable) + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + w.Header().Set("Content-Type", m.ContentType) + w.Header().Set("Content-Length", strconv.Itoa(len(m.Data))) + + // Add ETag for conditional requests + etag := fmt.Sprintf(`"%d"`, m.ID) + w.Header().Set("ETag", etag) + + if r.Header.Get("If-None-Match") == etag { + w.WriteHeader(http.StatusNotModified) + return nil + } + + w.Write(m.Data) + return nil +} diff --git a/internal/handlers/router.go b/internal/handlers/router.go new file mode 100644 index 0000000..81a91f6 --- /dev/null +++ b/internal/handlers/router.go @@ -0,0 +1,75 @@ +package handlers + +import ( + "context" + "log/slog" + "net/http" + "time" + + "lookbook/internal/data/session" +) + +// Router wraps http.ServeMux and automatically injects RequestContext into handlers. +type Router struct { + mux *http.ServeMux + rc *RequestContext +} + +func NewRouter(rc *RequestContext) *Router { + return &Router{ + mux: http.NewServeMux(), + rc: rc, + } +} + +// Handle registers a handler that returns an error. +// The RequestContext is automatically injected and error handling is applied. +func (rt *Router) Handle(pattern string, h Handler) { + rt.mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { + rc := &RequestContext{ + DB: rt.rc.DB, + Logger: rt.rc.Logger, + TmplCache: rt.rc.TmplCache, + IsAdmin: rt.loadAuth(r), + } + + handler := WithErrorHandling(rc, h) + handler(w, r) + }) +} + +// loadAuth checks if the request has a valid session cookie. +func (rt *Router) loadAuth(r *http.Request) bool { + cookie, err := r.Cookie("session_id") + if err != nil { + return false + } + + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() + + sess, err := session.QFindBySessionID(ctx, rt.rc.DB, cookie.Value) + if err != nil { + rt.rc.Logger.Error("failed to find session", slog.Any("err", err)) + return false + } + if sess == nil { + return false + } + + if time.Now().After(sess.ExpiresAt) { + rt.rc.Logger.Info("session expired", slog.String("session_id", cookie.Value)) + return false + } + + return true +} + +// HandleStd registers a standard http.Handler (for static files, etc.) +func (rt *Router) HandleStd(pattern string, h http.Handler) { + rt.mux.Handle(pattern, h) +} + +func (rt *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) { + rt.mux.ServeHTTP(w, r) +} diff --git a/internal/handlers/templates.go b/internal/handlers/templates.go new file mode 100644 index 0000000..e1b9517 --- /dev/null +++ b/internal/handlers/templates.go @@ -0,0 +1,17 @@ +package handlers + +import ( + "html/template" + + "lookbook/internal/static" +) + +var TemplateFuncs = template.FuncMap{ + "staticURL": static.VersionedPath, + "safeHTML": func(s *string) template.HTML { + if s == nil { + return "" + } + return template.HTML(*s) + }, +} diff --git a/internal/middleware/logger.go b/internal/middleware/logger.go new file mode 100644 index 0000000..d1d2a7c --- /dev/null +++ b/internal/middleware/logger.go @@ -0,0 +1,44 @@ +package middleware + +import ( + "log/slog" + "net/http" + "time" +) + +// Logging emits structured request logs. +func Logging(logger *slog.Logger) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + ww := &responseWriter{ResponseWriter: w, status: http.StatusOK} + + next.ServeHTTP(ww, r) + + logger.LogAttrs(r.Context(), slog.LevelInfo, "request", + slog.String("method", r.Method), + slog.String("path", r.URL.Path), + slog.Int("status", ww.status), + slog.Int("bytes", ww.bytes), + slog.Duration("latency", time.Since(start)), + ) + }) + } +} + +type responseWriter struct { + http.ResponseWriter + status int + bytes int +} + +func (w *responseWriter) WriteHeader(statusCode int) { + w.status = statusCode + w.ResponseWriter.WriteHeader(statusCode) +} + +func (w *responseWriter) Write(b []byte) (int, error) { + n, err := w.ResponseWriter.Write(b) + w.bytes += n + return n, err +} diff --git a/internal/migrations/migrations.go b/internal/migrations/migrations.go new file mode 100644 index 0000000..a6dc1a0 --- /dev/null +++ b/internal/migrations/migrations.go @@ -0,0 +1,131 @@ +package migrations + +import ( + "context" + "database/sql" + "embed" + "fmt" + "log/slog" + "os" + + _ "github.com/jackc/pgx/v5/stdlib" + "github.com/pressly/goose/v3" +) + +//go:embed sql/*.sql +var FS embed.FS + +const DefaultURL = "postgres:///lookbook?sslmode=disable" + +// Up applies all available migrations using the provided database URL. +func Up(ctx context.Context, dbURL string, logger *slog.Logger) error { + url := dbURL + if url == "" { + url = DefaultURL + } + + db, err := openDB(url, logger) + if err != nil { + return err + } + defer db.Close() + + if err := goose.UpContext(ctx, db, "sql"); err != nil { + return fmt.Errorf("apply migrations: %w", err) + } + + logger.Info("database migrated") + return nil +} + +// Down rolls back migrations. If targetVersion < 0, it steps back one migration; otherwise it migrates down to the target version. +func Down(ctx context.Context, dbURL string, targetVersion int64, logger *slog.Logger) error { + url := dbURL + if url == "" { + url = DefaultURL + } + + db, err := openDB(url, logger) + if err != nil { + return err + } + defer db.Close() + + if targetVersion < 0 { + if err := goose.DownContext(ctx, db, "sql"); err != nil { + return fmt.Errorf("rollback one: %w", err) + } + logger.Info("rolled back one migration") + return nil + } + + if err := goose.DownToContext(ctx, db, "sql", targetVersion); err != nil { + return fmt.Errorf("rollback to version %d: %w", targetVersion, err) + } + logger.Info("rolled back to version", slog.Int64("version", targetVersion)) + return nil +} + +// CheckPending returns the number of pending migrations without applying them. +func CheckPending(ctx context.Context, dbURL string, logger *slog.Logger) (int, error) { + url := dbURL + if url == "" { + url = DefaultURL + } + + db, err := openDB(url, logger) + if err != nil { + return 0, err + } + defer db.Close() + + current, err := goose.GetDBVersionContext(ctx, db) + if err != nil { + return 0, fmt.Errorf("get db version: %w", err) + } + + migrations, err := goose.CollectMigrations("sql", 0, goose.MaxVersion) + if err != nil { + return 0, fmt.Errorf("collect migrations: %w", err) + } + + pending := 0 + for _, m := range migrations { + if m.Version > current { + pending++ + } + } + + return pending, nil +} + +// slogLogger adapts slog to goose's minimal logging interface. +type slogLogger struct { + logger *slog.Logger +} + +func (l slogLogger) Printf(format string, v ...any) { + l.logger.Info(fmt.Sprintf(format, v...)) +} + +func (l slogLogger) Fatalf(format string, v ...any) { + l.logger.Error(fmt.Sprintf(format, v...)) + os.Exit(1) +} + +func openDB(url string, logger *slog.Logger) (*sql.DB, error) { + goose.SetBaseFS(FS) + goose.SetLogger(slogLogger{logger: logger}) + + db, err := sql.Open("pgx", url) + if err != nil { + return nil, fmt.Errorf("open db: %w", err) + } + + if err := db.Ping(); err != nil { + db.Close() + return nil, fmt.Errorf("ping db: %w", err) + } + + return db, nil +} diff --git a/internal/migrations/sql/.gitkeep b/internal/migrations/sql/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/migrations/sql/0001_init.sql b/internal/migrations/sql/0001_init.sql new file mode 100644 index 0000000..0dafb8c --- /dev/null +++ b/internal/migrations/sql/0001_init.sql @@ -0,0 +1,80 @@ +-- +goose Up +-- gen_random_uuid() is built-in since PostgreSQL 13, no extension needed + +-- Admin authentication (single row) +CREATE TABLE admin ( + id SERIAL PRIMARY KEY, + password_hash BYTEA, -- NULL until first login() sets password + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Insert the single admin row +INSERT INTO admin (id) VALUES (1); + +-- Sessions for admin authentication +CREATE TABLE session ( + id BIGSERIAL PRIMARY KEY, + session_id TEXT NOT NULL UNIQUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL +); + +CREATE INDEX idx_session_expires_at ON session(expires_at); + +-- Items (the main content) +CREATE TABLE item ( + id BIGSERIAL PRIMARY KEY, + pub_id UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE, + title TEXT, + description TEXT, + link_url TEXT, -- Source URL (optional) + item_type TEXT NOT NULL, -- 'image', 'video', 'quote', 'embed' + embed_provider TEXT, -- 'youtube', 'vimeo', NULL + embed_video_id TEXT, -- Video ID for embeds + embed_html TEXT, -- Cached embed iframe HTML + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + deleted_at TIMESTAMPTZ -- Soft delete +); + +CREATE INDEX idx_item_deleted ON item(deleted_at); +CREATE INDEX idx_item_created ON item(created_at DESC); +CREATE INDEX idx_item_pub_id ON item(pub_id); + +-- Media blobs (stored in DB) +CREATE TABLE media ( + id BIGSERIAL PRIMARY KEY, + item_id BIGINT NOT NULL REFERENCES item(id) ON DELETE CASCADE, + media_type TEXT NOT NULL, -- 'original', 'thumbnail' + content_type TEXT NOT NULL, -- MIME type + data BYTEA NOT NULL, + width INT, + height INT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX idx_media_item_id ON media(item_id); + +-- Tags +CREATE TABLE tag ( + id BIGSERIAL PRIMARY KEY, + name TEXT NOT NULL UNIQUE +); + +CREATE INDEX idx_tag_name ON tag(name); + +-- Item-Tag junction +CREATE TABLE item_tag ( + item_id BIGINT NOT NULL REFERENCES item(id) ON DELETE CASCADE, + tag_id BIGINT NOT NULL REFERENCES tag(id) ON DELETE CASCADE, + PRIMARY KEY (item_id, tag_id) +); + +CREATE INDEX idx_item_tag_tag_id ON item_tag(tag_id); + +-- +goose Down +DROP TABLE IF EXISTS item_tag; +DROP TABLE IF EXISTS tag; +DROP TABLE IF EXISTS media; +DROP TABLE IF EXISTS item; +DROP TABLE IF EXISTS session; +DROP TABLE IF EXISTS admin; diff --git a/internal/migrations/sql/0002_media_source_url.sql b/internal/migrations/sql/0002_media_source_url.sql new file mode 100644 index 0000000..6fa0935 --- /dev/null +++ b/internal/migrations/sql/0002_media_source_url.sql @@ -0,0 +1,5 @@ +-- +goose Up +ALTER TABLE media ADD COLUMN source_url TEXT; + +-- +goose Down +ALTER TABLE media DROP COLUMN source_url; diff --git a/internal/opengraph/fetch.go b/internal/opengraph/fetch.go new file mode 100644 index 0000000..4060537 --- /dev/null +++ b/internal/opengraph/fetch.go @@ -0,0 +1,185 @@ +package opengraph + +import ( + "context" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "time" + + "golang.org/x/net/html" +) + +// Metadata contains extracted OpenGraph and meta data from a URL. +type Metadata struct { + Title string + Description string + ImageURL string + VideoURL string + SiteName string + Type string // og:type +} + +// Fetch fetches and parses OpenGraph metadata from a URL. +func Fetch(ctx context.Context, targetURL string) (*Metadata, error) { + req, err := http.NewRequestWithContext(ctx, "GET", targetURL, nil) + if err != nil { + return nil, fmt.Errorf("create request: %w", err) + } + req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; Lookbook/1.0)") + + client := &http.Client{ + Timeout: 10 * time.Second, + CheckRedirect: func(req *http.Request, via []*http.Request) error { + if len(via) >= 5 { + return fmt.Errorf("too many redirects") + } + return nil + }, + } + + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("fetch url: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status: %d", resp.StatusCode) + } + + // Limit response body to 1MB + body := io.LimitReader(resp.Body, 1<<20) + + doc, err := html.Parse(body) + if err != nil { + return nil, fmt.Errorf("parse html: %w", err) + } + + meta := &Metadata{} + parseNode(doc, meta) + + // Resolve relative URLs + baseURL, _ := url.Parse(targetURL) + if meta.ImageURL != "" && !strings.HasPrefix(meta.ImageURL, "http") { + if imgURL, err := baseURL.Parse(meta.ImageURL); err == nil { + meta.ImageURL = imgURL.String() + } + } + if meta.VideoURL != "" && !strings.HasPrefix(meta.VideoURL, "http") { + if vidURL, err := baseURL.Parse(meta.VideoURL); err == nil { + meta.VideoURL = vidURL.String() + } + } + + return meta, nil +} + +func parseNode(n *html.Node, meta *Metadata) { + if n.Type == html.ElementNode { + switch n.Data { + case "meta": + parseMeta(n, meta) + case "title": + if meta.Title == "" && n.FirstChild != nil { + meta.Title = strings.TrimSpace(n.FirstChild.Data) + } + } + } + + for c := n.FirstChild; c != nil; c = c.NextSibling { + parseNode(c, meta) + } +} + +func parseMeta(n *html.Node, meta *Metadata) { + var property, name, content string + for _, attr := range n.Attr { + switch attr.Key { + case "property": + property = attr.Val + case "name": + name = attr.Val + case "content": + content = attr.Val + } + } + + // OpenGraph properties + switch property { + case "og:title": + meta.Title = content + case "og:description": + if meta.Description == "" { + meta.Description = content + } + case "og:image": + if meta.ImageURL == "" { + meta.ImageURL = content + } + case "og:video", "og:video:url": + if meta.VideoURL == "" { + meta.VideoURL = content + } + case "og:site_name": + meta.SiteName = content + case "og:type": + meta.Type = content + } + + // Twitter cards + switch name { + case "twitter:title": + if meta.Title == "" { + meta.Title = content + } + case "twitter:description": + if meta.Description == "" { + meta.Description = content + } + case "twitter:image": + if meta.ImageURL == "" { + meta.ImageURL = content + } + case "description": + if meta.Description == "" { + meta.Description = content + } + } +} + +// DownloadImage downloads an image from a URL and returns the data and content type. +func DownloadImage(ctx context.Context, imageURL string) ([]byte, string, error) { + req, err := http.NewRequestWithContext(ctx, "GET", imageURL, nil) + if err != nil { + return nil, "", fmt.Errorf("create request: %w", err) + } + req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; Lookbook/1.0)") + + client := &http.Client{Timeout: 30 * time.Second} + + resp, err := client.Do(req) + if err != nil { + return nil, "", fmt.Errorf("fetch image: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, "", fmt.Errorf("unexpected status: %d", resp.StatusCode) + } + + contentType := resp.Header.Get("Content-Type") + if !strings.HasPrefix(contentType, "image/") { + return nil, "", fmt.Errorf("not an image: %s", contentType) + } + + // Limit to 50MB + data, err := io.ReadAll(io.LimitReader(resp.Body, 50<<20)) + if err != nil { + return nil, "", fmt.Errorf("read image: %w", err) + } + + return data, contentType, nil +} diff --git a/internal/static/css/.gitkeep b/internal/static/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/static/css/app.css b/internal/static/css/app.css new file mode 100644 index 0000000..3910d32 --- /dev/null +++ b/internal/static/css/app.css @@ -0,0 +1,562 @@ +/* + * Commit Mono - Neutral programming typeface + * Licensed under SIL Open Font License 1.1 + * https://commitmono.com/ + */ + +@font-face { + font-family: 'CommitMono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("../fonts/CommitMono-450-Regular.woff2") format('woff2'); +} + +@font-face { + font-family: 'CommitMono'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("../fonts/CommitMono-450-Italic.woff2") format('woff2'); +} + +@font-face { + font-family: 'CommitMono'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("../fonts/CommitMono-700-Regular.woff2") format('woff2'); +} + +@font-face { + font-family: 'CommitMono'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("../fonts/CommitMono-700-Italic.woff2") format('woff2'); +} + +/* Reset */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +/* Base */ +:root { + --bg: #fff; + --fg: #000; + --gray-1: #f5f5f5; + --gray-2: #e5e5e5; + --gray-3: #888; + --font: 'CommitMono', ui-monospace, 'SF Mono', Menlo, monospace; +} + +html { + font-size: 14px; +} + +body { + font-family: var(--font); + background: var(--bg); + color: var(--fg); + line-height: 1.5; + min-height: 100vh; +} + +a { + color: inherit; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +img, video { + max-width: 100%; + height: auto; + display: block; +} + +button, input, textarea, select { + font: inherit; + color: inherit; +} + +/* Header */ +.header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 2rem; + border-bottom: 1px solid var(--gray-2); +} + +.logo { + font-weight: 700; + font-size: 1rem; + letter-spacing: 0.1em; +} + +.nav { + display: flex; + gap: 1.5rem; +} + +.nav a { + font-size: 0.85rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +/* Main */ +.main { + max-width: 1600px; + margin: 0 auto; + padding: 2rem; +} + +/* Admin Bar */ +.admin-bar { + margin-bottom: 1.5rem; + display: flex; + gap: 1rem; +} + +/* Tags Bar */ +.tags-bar { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-bottom: 2rem; + padding-bottom: 1rem; + border-bottom: 1px solid var(--gray-2); +} + +.tag { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: 0.25rem 0.5rem; + border: 1px solid var(--gray-2); + background: var(--bg); + transition: all 0.15s ease; +} + +.tag:hover, .tag.active { + background: var(--fg); + color: var(--bg); + border-color: var(--fg); + text-decoration: none; +} + +/* Grid */ +.grid { + column-count: 4; + column-gap: 1rem; +} + +.grid-item { + display: block; + break-inside: avoid; + margin-bottom: 1rem; + background: var(--gray-1); + border: 1px solid var(--gray-2); + overflow: hidden; + position: relative; + transition: transform 0.15s ease, box-shadow 0.15s ease; +} + +.grid-item:hover { + text-decoration: none; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0,0,0,0.1); +} + +.grid-item img { + width: 100%; + display: block; +} + +/* Quote Card */ +.quote-card { + padding: 1.5rem; + min-height: 150px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.quote-card blockquote { + font-size: 1.1rem; + font-style: italic; + line-height: 1.6; + margin-bottom: 0.75rem; +} + +.quote-card blockquote::before { + content: '"'; +} + +.quote-card blockquote::after { + content: '"'; +} + +.quote-card cite { + font-size: 0.85rem; + color: var(--gray-3); + font-style: normal; +} + +/* Link Card */ +.link-card { + padding: 1.5rem; + min-height: 100px; +} + +.link-title { + font-weight: 700; + margin-bottom: 0.5rem; +} + +.link-url { + font-size: 0.75rem; + color: var(--gray-3); + word-break: break-all; +} + +/* Embed Placeholder */ +.embed-placeholder { + aspect-ratio: 16/9; + display: flex; + align-items: center; + justify-content: center; + background: var(--fg); + color: var(--bg); + font-size: 2rem; +} + +/* Item Tags */ +.item-tags { + display: flex; + flex-wrap: wrap; + gap: 0.25rem; + padding: 0.5rem; + background: var(--bg); + border-top: 1px solid var(--gray-2); +} + +.item-tag { + font-size: 0.65rem; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: 0.15rem 0.35rem; + background: var(--gray-1); + border: 1px solid var(--gray-2); +} + +/* Item Page */ +.item-page { + max-width: 900px; + margin: 0 auto; +} + +.back-link { + display: inline-block; + font-size: 0.85rem; + margin-bottom: 2rem; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.item-detail { + border: 1px solid var(--gray-2); +} + +.image-container img, +.video-container video { + width: 100%; +} + +.embed-container { + position: relative; +} + +/* YouTube/Vimeo iframe embeds */ +.embed-container iframe { + max-width: 100%; +} + +/* Twitter embeds */ +.embed-container .twitter-tweet { + margin: 1rem auto !important; +} + +.quote-detail { + padding: 3rem; + text-align: center; +} + +.quote-detail blockquote { + font-size: 1.5rem; + font-style: italic; + line-height: 1.6; + margin-bottom: 1rem; +} + +.quote-detail blockquote::before { + content: '"'; +} + +.quote-detail blockquote::after { + content: '"'; +} + +.quote-detail cite { + color: var(--gray-3); + font-style: normal; +} + +.item-meta { + padding: 1.5rem; + border-top: 1px solid var(--gray-2); +} + +.item-meta h1 { + font-size: 1.25rem; + font-weight: 700; + margin-bottom: 0.75rem; +} + +.item-meta .description { + margin-bottom: 1rem; + color: var(--gray-3); +} + +.item-meta .source-link { + display: block; + font-size: 0.85rem; + color: var(--gray-3); + word-break: break-all; + margin-bottom: 1rem; +} + +.item-meta .item-tags { + background: none; + border: none; + padding: 0; + margin-bottom: 1rem; +} + +.item-meta .timestamp { + display: block; + font-size: 0.75rem; + color: var(--gray-3); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.item-actions { + padding: 1rem 1.5rem; + border-top: 1px solid var(--gray-2); + display: flex; + gap: 0.5rem; +} + +/* Buttons */ +.btn { + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.1em; + padding: 0.5rem 1rem; + border: 1px solid var(--fg); + background: var(--bg); + cursor: pointer; + transition: all 0.15s ease; +} + +.btn:hover { + background: var(--fg); + color: var(--bg); +} + +.btn-danger { + border-color: #c00; + color: #c00; +} + +.btn-danger:hover { + background: #c00; + color: #fff; +} + +.btn-close { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + line-height: 1; +} + +/* Modal */ +.modal { + display: none; + position: fixed; + inset: 0; + background: rgba(0,0,0,0.5); + z-index: 1000; + align-items: center; + justify-content: center; +} + +.modal.active { + display: flex; +} + +.modal-content { + background: var(--bg); + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow-y: auto; + border: 1px solid var(--fg); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--gray-2); +} + +.modal-header h2 { + font-size: 1rem; + font-weight: 700; + letter-spacing: 0.1em; +} + +.modal-tabs { + display: flex; + border-bottom: 1px solid var(--gray-2); +} + +.modal-tabs .tab { + flex: 1; + padding: 0.75rem; + background: none; + border: none; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.1em; + cursor: pointer; + border-bottom: 2px solid transparent; +} + +.modal-tabs .tab.active { + border-bottom-color: var(--fg); +} + +.modal-body { + padding: 1.5rem; +} + +.tab-content { + display: none; +} + +.tab-content.active { + display: block; +} + +/* Forms */ +form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +input, textarea { + width: 100%; + padding: 0.75rem; + border: 1px solid var(--gray-2); + background: var(--bg); +} + +input:focus, textarea:focus { + outline: none; + border-color: var(--fg); +} + +textarea { + resize: vertical; + min-height: 80px; +} + +input[type="file"] { + padding: 0.5rem; +} + +/* Preview */ +.preview { + padding: 1rem; + background: var(--gray-1); + border: 1px solid var(--gray-2); + display: none; +} + +.preview.active { + display: block; +} + +.preview img { + max-width: 200px; + margin-bottom: 0.5rem; +} + +.preview-title { + font-weight: 700; + margin-bottom: 0.25rem; +} + +.preview-description { + font-size: 0.85rem; + color: var(--gray-3); +} + +/* Responsive */ +@media (max-width: 1200px) { + .grid { + column-count: 3; + } +} + +@media (max-width: 900px) { + .grid { + column-count: 2; + } + + .main { + padding: 1rem; + } +} + +@media (max-width: 600px) { + .grid { + column-count: 1; + } + + .header { + padding: 1rem; + } + + .quote-detail { + padding: 2rem 1rem; + } + + .quote-detail blockquote { + font-size: 1.25rem; + } +} diff --git a/internal/static/fonts/CommitMono-400-Italic.woff2 b/internal/static/fonts/CommitMono-400-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7701d5fe9a6b71948910486429f4dc554012efb9 GIT binary patch literal 50948 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 literal 0 HcmV?d00001 diff --git a/internal/static/fonts/CommitMono-400-Regular.woff2 b/internal/static/fonts/CommitMono-400-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fc8cb3da4b51da43ab8d7d660678756dac2de878 GIT binary patch literal 47920 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 z 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�aISCq=!cMlHVjlGknW&7`f24GJ5Y7f;^Yy?VAa z3s@5O43ncs|h^&PvvYw;2UBPS9qO4tx8VZkN?p}>Q{Pq4%d*SdvZrx1> z-Dcy8?}GmJ1=(G^hW!f z9G_+(iSt@tLt7%A&%1Y2y-nuXA+_&c#PT2ez1w|4LVrP+1dD6Lo^+!t(aDo-{dT-s z`n@jkMgQ`v>)YQw4pZ?^o>;WOI?Z(ZPq8#`1@m^=$J# zrXOEb7q`DEBJr&D>d&|1{AcGEpEWFd7@4&ByyDiMN%m*F8W$b7Y4@0Qy>1_u?;pWK zo!@`R{oQl^xzn58I=$&7U!T{Cw*P$<8sGc7?#|xdW$ER0_0}52-<|FBH}S5IW9LUVa^oAvq!#_QHx);KThbK2AAuczPb zy>pIDoVA;157 z?#er~f6LX#>%1)zd4{_m&wVUcUa4O-t#YaL(JN86XDwUz?}X#~ddsiV>)pfu`EFTz zz5Z9wJJ;jiF3z1$ed@zK+l$4PXEpt5CT-5%v2vI3`S1DZ7bDL;?Rze}u(~oP|MJaP zwwcDC(|u-s%;Wmfz2`wzBIeOKLS zi=Gteozd;pvz4EcvvX~gTHL3L=cnYRy`nFQAInSc{8xr@e_W38>I6F7)wy>)8^QeH^R-51Gr^TOtTJmP5 zm$8{hglnu`>+z+k_30L1q6>jtFt~r&=u4n_+!3(dU=NrXzK?J?>rmuOeIFa%-~>?{~p^n{OLj+Kinw z&3Am4u{a_od7kTh#evK2DY}c7sP9dYQWt#jJ(KgYhyF{B$vux1WZM0wOB!`=?kJf1 zB|)@h@totyMwjl*{MqdDl;uy1+T8f9y^qho5Po^yO~ayJ!aKL%p_l*XhO1`9o8{ZO zZIX)=+1EEp@K?uvJ6*JPt-=AfX@6Dym0dc&PSSnwIO+Ud$=t?SEWdryuADqKef`-T z+F!TYpSFK(zI$fk^qt3dPH4V=^M?^<)neKD(oCDvA1WG8{@C%t>d4M1vhDr)mKEiE z=a<@-rQe;aI{9$xxx3Ljx2b&pV&A#^``%BVKR@dB75W=9*XHTsf5D{;4Ii$V>u3vQ zxH8@@pZxK%^qh;&)%Pb`d?*%V_;CCE^4rTlTYhpq6z|o{!N8{afZuyAYJUgc2+*8S=V|yf6;E~7~ z$B(l}>An?>O0nO~UB0{meeu~Ev>vrA~`897=sAbDf^Wu(_wC59^ zw#-*l<1hVu^VOzJDJBxVp3@KfT{rtv+t!ukIv2xAZ%>r>wBF>q{ndBxyQUJGW{x#ZTULA z`?@Oo`pgX$GG-?wHQSo}np_Nx7*lm`AH0;Kq+c%<)6;vc>4aBSz4m8z^W0duW0vh{ zUP<=SrPFpQJ-0fqvRWr%TK4&9)!a)do<{q(3W-fzm)w2w)#8oYqRe*Qelz#s!t~fg z4V%Z#zq{Wh6y?A2~eIW<|gl6TJA-EWS19XjCqJhQbmC?aHv(1xjAJZX#%x!3w$ zyXI*0RlSLO%6@k>tvedxw$9A?LDQ4Z=CM!yzPfq7$9sFb_wo6=l`fsQ8<}#|cfsq@ nnNRLr)eZRelXc66JqIFZPqN;>Ysa+u_@AwBPweMlU|;|M{WJ2l literal 0 HcmV?d00001 diff --git a/internal/static/fonts/CommitMono-450-Italic.woff2 b/internal/static/fonts/CommitMono-450-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ffdf7e80f4cfc2c19e8cf2e43d07a8915ae56c58 GIT binary patch literal 51424 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

kdCZ}+L+w)c;!wC;NQb-wpZ8&}Ty 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 literal 0 HcmV?d00001 diff --git a/internal/static/fonts/CommitMono-700-Italic.woff2 b/internal/static/fonts/CommitMono-700-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b2c9d8aa2588efb23803281502bf2687887ea08d GIT binary patch literal 49952 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

)b!v48z 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 { + if (!password) { + console.error('Usage: login("your-password")'); + return; + } + try { + const res = await fetch('/api/auth/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ password }) + }); + const data = await res.json(); + if (res.ok) { + console.log(data.firstTime ? 'Password set! Reloading...' : 'Logged in! Reloading...'); + setTimeout(() => location.reload(), 500); + } else { + console.error(data.error || 'Login failed'); + } + } catch (err) { + console.error('Login error:', err); + } +}; + +window.logout = async () => { + try { + await fetch('/api/auth/logout', { method: 'POST' }); + console.log('Logged out! Reloading...'); + setTimeout(() => location.reload(), 500); + } catch (err) { + console.error('Logout error:', err); + } +}; + +// Modal functions +function showAddModal() { + document.getElementById('add-modal').classList.add('active'); +} + +function hideAddModal() { + document.getElementById('add-modal').classList.remove('active'); +} + +function showEditModal() { + document.getElementById('edit-modal').classList.add('active'); +} + +function hideEditModal() { + document.getElementById('edit-modal').classList.remove('active'); +} + +// Tab switching +document.addEventListener('DOMContentLoaded', () => { + const tabs = document.querySelectorAll('.modal-tabs .tab'); + tabs.forEach(tab => { + tab.addEventListener('click', () => { + const tabId = tab.dataset.tab; + + // Update tab buttons + tabs.forEach(t => t.classList.remove('active')); + tab.classList.add('active'); + + // Update tab content + document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active')); + document.getElementById('tab-' + tabId).classList.add('active'); + }); + }); + + // URL preview on input + const urlInput = document.querySelector('#link-form input[name="url"]'); + if (urlInput) { + let debounceTimer; + urlInput.addEventListener('input', (e) => { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => fetchPreview(e.target.value), 500); + }); + } +}); + +// Fetch URL preview +async function fetchPreview(url) { + const preview = document.getElementById('link-preview'); + if (!url) { + preview.classList.remove('active'); + preview.innerHTML = ''; + return; + } + + try { + const res = await fetch('/api/preview', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ url }) + }); + + if (!res.ok) { + const data = await res.json(); + preview.innerHTML = `

${data.error || 'Failed to fetch preview'}
`; + preview.classList.add('active'); + return; + } + + const data = await res.json(); + preview.dataset.preview = JSON.stringify(data); + + let html = ''; + if (data.imageUrl) { + html += `Preview`; + } + if (data.title) { + html += `
${escapeHtml(data.title)}
`; + } + if (data.description) { + html += `
${escapeHtml(data.description)}
`; + } + if (data.isEmbed) { + html += `
${escapeHtml(data.provider.toUpperCase())} VIDEO
`; + } + + preview.innerHTML = html || '
No preview available
'; + preview.classList.add('active'); + + // Auto-fill title if empty + const titleInput = document.querySelector('#link-form input[name="title"]'); + if (titleInput && !titleInput.value && data.title) { + titleInput.value = data.title; + } + } catch (err) { + console.error('Preview error:', err); + preview.innerHTML = '
Failed to fetch preview
'; + preview.classList.add('active'); + } +} + +// Submit link form +async function submitLink(event) { + event.preventDefault(); + const form = event.target; + const url = form.url.value; + const tags = form.tags.value ? form.tags.value.split(',').map(t => t.trim()).filter(Boolean) : []; + + // Get preview data + const preview = document.getElementById('link-preview'); + const previewData = preview.dataset.preview ? JSON.parse(preview.dataset.preview) : {}; + + // Use form values, falling back to preview data + const title = form.title.value || previewData.title || null; + const description = form.description.value || previewData.description || null; + + try { + const body = { + url, + title, + description, + tags, + imageUrl: previewData.imageUrl || null, + }; + + if (previewData.isEmbed) { + body.provider = previewData.provider; + body.videoId = previewData.videoId; + body.embedHtml = previewData.embedHtml; + } + + const res = await fetch('/api/items/from-link', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body) + }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to add item'); + } + } catch (err) { + console.error('Submit error:', err); + alert('Failed to add item'); + } + + return false; +} + +// Submit upload form +async function submitUpload(event) { + event.preventDefault(); + const form = event.target; + const formData = new FormData(form); + + try { + const res = await fetch('/api/items/upload', { + method: 'POST', + body: formData + }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to upload'); + } + } catch (err) { + console.error('Upload error:', err); + alert('Failed to upload'); + } + + return false; +} + +// Submit quote form +async function submitQuote(event) { + event.preventDefault(); + const form = event.target; + const text = form.text.value; + const source = form.source.value || null; + const sourceUrl = form.sourceUrl.value || null; + const tags = form.tags.value ? form.tags.value.split(',').map(t => t.trim()).filter(Boolean) : []; + + try { + const res = await fetch('/api/items/quote', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ text, source, sourceUrl, tags }) + }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to add quote'); + } + } catch (err) { + console.error('Submit error:', err); + alert('Failed to add quote'); + } + + return false; +} + +// Edit item +function editItem(id) { + showEditModal(); +} + +// Submit edit form +async function submitEdit(event) { + event.preventDefault(); + const form = event.target; + const id = form.id.value; + const title = form.title.value || null; + const description = form.description.value || null; + const linkUrl = form.linkUrl.value || null; + const tags = form.tags.value ? form.tags.value.split(',').map(t => t.trim()).filter(Boolean) : []; + + try { + const res = await fetch(`/api/items/${id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ title, description, linkUrl, tags }) + }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to update'); + } + } catch (err) { + console.error('Update error:', err); + alert('Failed to update'); + } + + return false; +} + +// Refresh metadata +async function refreshMetadata(id) { + try { + // Fetch current item data + const itemRes = await fetch(`/api/items/${id}`); + if (!itemRes.ok) { + alert('Failed to fetch item'); + return; + } + const item = await itemRes.json(); + + if (!item.linkUrl) { + alert('Item has no link URL'); + return; + } + + // Fetch fresh metadata + const previewRes = await fetch('/api/preview', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ url: item.linkUrl }) + }); + if (!previewRes.ok) { + const data = await previewRes.json(); + alert(data.error || 'Failed to fetch metadata'); + return; + } + const preview = await previewRes.json(); + + // Check if user has made manual edits + const titleChanged = item.title && preview.title && item.title !== preview.title; + const descChanged = item.description && preview.description && item.description !== preview.description; + const imageChanged = item.thumbnailSourceUrl && preview.imageUrl && item.thumbnailSourceUrl !== preview.imageUrl; + + if (titleChanged || descChanged || imageChanged) { + let msg = 'This will overwrite your changes:\n'; + if (titleChanged) msg += `\nTitle: "${item.title}" → "${preview.title}"`; + if (descChanged) msg += `\nDescription will be replaced`; + if (imageChanged) msg += `\nImage will be replaced`; + msg += '\n\nContinue?'; + + if (!confirm(msg)) return; + } + + // Proceed with refresh + const res = await fetch(`/api/items/${id}/refresh`, { method: 'POST' }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to refresh'); + } + } catch (err) { + console.error('Refresh error:', err); + alert('Failed to refresh'); + } +} + +// Replace media +async function submitReplaceMedia(event, id) { + event.preventDefault(); + const form = event.target; + const formData = new FormData(form); + + try { + const res = await fetch(`/api/items/${id}/media`, { + method: 'POST', + body: formData + }); + + if (res.ok) { + location.reload(); + } else { + const data = await res.json(); + alert(data.error || 'Failed to replace media'); + } + } catch (err) { + console.error('Replace media error:', err); + alert('Failed to replace media'); + } + + return false; +} + +// Delete item +async function deleteItem(id) { + if (!confirm('Delete this item?')) return; + + try { + const res = await fetch(`/api/items/${id}`, { method: 'DELETE' }); + + if (res.ok) { + location.href = '/'; + } else { + const data = await res.json(); + alert(data.error || 'Failed to delete'); + } + } catch (err) { + console.error('Delete error:', err); + alert('Failed to delete'); + } +} + +// Utility +function escapeHtml(str) { + const div = document.createElement('div'); + div.textContent = str; + return div.innerHTML; +} diff --git a/internal/static/static.go b/internal/static/static.go new file mode 100644 index 0000000..f1e45a1 --- /dev/null +++ b/internal/static/static.go @@ -0,0 +1,43 @@ +package static + +import ( + "crypto/sha256" + "embed" + "encoding/hex" + "net/http" + "strings" + "time" +) + +//go:embed css/* js/* fonts/* +var staticFS embed.FS + +// Version is set via -ldflags in production +var Version string + +func init() { + if Version == "" { + h := sha256.Sum256([]byte(time.Now().String())) + Version = hex.EncodeToString(h[:4]) + } +} + +func VersionedPath(path string) string { + return "/static/" + Version + "/" + path +} + +func Handler() http.Handler { + fileServer := http.FileServer(http.FS(staticFS)) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Strip version prefix: /static/{version}/file.css -> /file.css + path := r.URL.Path + path = strings.TrimPrefix(path, "/static/") + if idx := strings.Index(path, "/"); idx != -1 { + path = path[idx:] + } + r.URL.Path = path + + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + fileServer.ServeHTTP(w, r) + }) +} diff --git a/internal/video/process.go b/internal/video/process.go new file mode 100644 index 0000000..6270ce7 --- /dev/null +++ b/internal/video/process.go @@ -0,0 +1,151 @@ +package video + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" +) + +// ExtractThumbnail extracts a thumbnail from a video file. +// Returns the thumbnail image data as JPEG. +func ExtractThumbnail(ctx context.Context, videoData []byte) ([]byte, error) { + // Write video to temp file + tmpDir, err := os.MkdirTemp("", "lookbook-video-*") + if err != nil { + return nil, fmt.Errorf("create temp dir: %w", err) + } + defer os.RemoveAll(tmpDir) + + inputPath := filepath.Join(tmpDir, "input") + outputPath := filepath.Join(tmpDir, "thumbnail.jpg") + + if err := os.WriteFile(inputPath, videoData, 0600); err != nil { + return nil, fmt.Errorf("write temp video: %w", err) + } + + // Extract thumbnail at 1 second mark + cmd := exec.CommandContext(ctx, "ffmpeg", + "-i", inputPath, + "-ss", "00:00:01", + "-vframes", "1", + "-vf", "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease", + "-q:v", "2", + "-y", + outputPath, + ) + + var stderr bytes.Buffer + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("ffmpeg thumbnail: %w: %s", err, stderr.String()) + } + + thumbnail, err := os.ReadFile(outputPath) + if err != nil { + return nil, fmt.Errorf("read thumbnail: %w", err) + } + + return thumbnail, nil +} + +// TranscodeToMP4 transcodes a video to H.264 MP4 format. +// Returns the transcoded video data. +func TranscodeToMP4(ctx context.Context, videoData []byte, contentType string) ([]byte, error) { + // If already MP4 with H.264, we might skip transcoding + // For simplicity, we always transcode to ensure compatibility + + tmpDir, err := os.MkdirTemp("", "lookbook-video-*") + if err != nil { + return nil, fmt.Errorf("create temp dir: %w", err) + } + defer os.RemoveAll(tmpDir) + + inputPath := filepath.Join(tmpDir, "input") + outputPath := filepath.Join(tmpDir, "output.mp4") + + if err := os.WriteFile(inputPath, videoData, 0600); err != nil { + return nil, fmt.Errorf("write temp video: %w", err) + } + + // Transcode to H.264 MP4 + cmd := exec.CommandContext(ctx, "ffmpeg", + "-i", inputPath, + "-c:v", "libx264", + "-preset", "medium", + "-crf", "23", + "-c:a", "aac", + "-b:a", "128k", + "-movflags", "+faststart", + "-y", + outputPath, + ) + + var stderr bytes.Buffer + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("ffmpeg transcode: %w: %s", err, stderr.String()) + } + + output, err := os.ReadFile(outputPath) + if err != nil { + return nil, fmt.Errorf("read transcoded: %w", err) + } + + return output, nil +} + +// ProcessVideo processes an uploaded video: transcodes to MP4 and extracts thumbnail. +// Returns (transcodedData, thumbnailData, error). +func ProcessVideo(ctx context.Context, videoData []byte, contentType string) ([]byte, []byte, error) { + // Extract thumbnail first (from original, often has better quality) + thumbnail, err := ExtractThumbnail(ctx, videoData) + if err != nil { + return nil, nil, fmt.Errorf("extract thumbnail: %w", err) + } + + // Transcode to MP4 + transcoded, err := TranscodeToMP4(ctx, videoData, contentType) + if err != nil { + return nil, nil, fmt.Errorf("transcode: %w", err) + } + + return transcoded, thumbnail, nil +} + +// IsVideo checks if a content type is a video type. +func IsVideo(contentType string) bool { + switch contentType { + case "video/mp4", "video/webm", "video/quicktime", "video/x-msvideo", + "video/x-matroska", "video/mpeg", "video/ogg", "video/3gpp": + return true + } + return false +} + +// IsImage checks if a content type is an image type. +func IsImage(contentType string) bool { + switch contentType { + case "image/jpeg", "image/png", "image/gif", "image/webp", "image/avif": + return true + } + return false +} + +// ReadUpload reads an uploaded file up to maxSize bytes. +func ReadUpload(r io.Reader, maxSize int64) ([]byte, error) { + limited := io.LimitReader(r, maxSize+1) + data, err := io.ReadAll(limited) + if err != nil { + return nil, err + } + if int64(len(data)) > maxSize { + return nil, fmt.Errorf("file too large (max %d bytes)", maxSize) + } + return data, nil +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..70e57fa --- /dev/null +++ b/shell.nix @@ -0,0 +1,14 @@ +let + sx-nix = import ../sx-nix {}; + pkgs = sx-nix.pkgs; +in + +pkgs.mkShell { + packages = [ + (sx-nix.go.goToolchainBin { version = "1.25.5"; sha256 = "sha256-npt1XWOzas8wwSqaP8N5JDcUwcbT3XKGHaY38zbrs1s="; }) + pkgs.postgresql + pkgs.entr + pkgs.fd + pkgs.hivemind + ]; +}