Commit Graph

  • 6506931c1d feat(editor): add runUpload and retryUpload to UploadCoordinator xfy 2026-06-22 15:23:57 +08:00
  • e06667f792 feat(editor): add UploadCoordinator skeleton with pending map and node removal xfy 2026-06-22 15:22:42 +08:00
  • c92ba6d648 docs(plan): editor image upload placeholder implementation plan xfy 2026-06-22 15:19:01 +08:00
  • 055329107e docs(spec): editor image upload placeholder and failure feedback design xfy 2026-06-22 15:09:38 +08:00
  • 3df677e181 feat(comment): show real relative time on pending comments xfy 2026-06-22 14:19:05 +08:00
  • d3082d5c64 refactor(comment): share relative-time bucketing between server and client xfy 2026-06-22 14:18:36 +08:00
  • 6ff37322b2 feat(editor): add image upload to slash command and build tiptap in make dev xfy 2026-06-22 14:18:05 +08:00
  • 10ef52bede fix(comment): harden comment form with server honeypot, a11y labels, and reply layout xfy 2026-06-22 13:45:28 +08:00
  • 694e198331 docs(env): expand and correct .env.example comments xfy 2026-06-22 13:32:49 +08:00
  • 2c7319c220 docs(env): translate .env.example comments to Chinese xfy 2026-06-22 13:20:31 +08:00
  • a3ed0a2b4e docs(env): document RATE_LIMIT_COMMENT_* and RATE_LIMIT_UNKNOWN_* vars xfy 2026-06-22 13:16:34 +08:00
  • b24cfdcabc fix(startup): replace migration panic with friendly exit + configurable retry window xfy 2026-06-22 11:24:13 +08:00
  • 67212a52b3 fix(upload): make ConnectInfo optional to prevent 500 in release builds xfy 2026-06-18 17:07:07 +08:00
  • 20e352bf85 Merge branch 'feat/embedded-migrations' xfy 2026-06-18 16:47:16 +08:00
  • 91d83f714c docs(migrate.sh): note server auto-migrates on startup; this is a fallback xfy 2026-06-18 16:06:06 +08:00
  • 356f4354dc feat(main): run database migrations on server startup before listening xfy 2026-06-18 16:01:45 +08:00
  • 283d8b5f4d feat(db): implement migrate::run() with advisory lock and per-migration transactions xfy 2026-06-18 15:50:23 +08:00
  • 920e26e213 test(db): assert migrations/*.sql files are registered in MIGRATIONS xfy 2026-06-18 15:47:53 +08:00
  • d044304969 feat(db): scaffold migrate module with MIGRATIONS constant and error type xfy 2026-06-18 15:41:31 +08:00
  • 790002181a docs(env): add APP_BASE_URL and other security vars to .env.example xfy 2026-06-18 14:24:09 +08:00
  • 60c51f44ab fix(posts): move rebuild SELECT into transaction with FOR UPDATE xfy 2026-06-18 14:17:20 +08:00
  • c7d8a5e67f fix(comments): use advisory lock to fully eliminate concurrent duplicate submissions xfy 2026-06-18 14:15:19 +08:00
  • 57488f5c40 style(csrf): replace redundant closures with function references (clippy) xfy 2026-06-18 13:45:32 +08:00
  • 8f288c60da fix(comments): rate-limit check_pending_status to prevent status enumeration xfy 2026-06-18 13:43:57 +08:00
  • b34803e57d fix(search): drop ineffective trgm GIN index; correct misleading comment xfy 2026-06-18 13:42:23 +08:00
  • d1e08ec402 fix(image): write disk cache atomically via temp-file + rename xfy 2026-06-18 13:40:48 +08:00
  • 3723cd03f9 fix(image): add canonicalize prefix check to is_path_safe for defense in depth xfy 2026-06-18 13:39:46 +08:00
  • 7a6e9350fe fix(image): reject undecodable images with 422; cap raw file size at 20MB xfy 2026-06-18 13:38:03 +08:00
  • 22e883c6d9 fix(image): add X-Content-Type-Options: nosniff to all image responses xfy 2026-06-18 13:36:39 +08:00
  • 1e2e3c9332 perf(db): add statement_timeout; skip retry on pool Timeout errors xfy 2026-06-18 13:35:33 +08:00
  • 179897ba6f fix(migrations): make all migrations idempotent; distinguish applied vs error xfy 2026-06-18 13:34:02 +08:00
  • 71d4126e94 fix(posts): wrap rebuild_content_html in single transaction xfy 2026-06-18 13:32:55 +08:00
  • 82ab190e0d fix(comments): make duplicate-check atomic with transaction; index content_hash xfy 2026-06-18 13:31:37 +08:00
  • 1c6974ca68 fix(auth): run dummy Argon2 verify for non-existent users to prevent timing enumeration xfy 2026-06-18 13:29:55 +08:00
  • 05c01ccebe fix(session): serialize session-limit enforcement with row lock xfy 2026-06-18 13:27:49 +08:00
  • 53bfb1b7c0 feat(session): invalidate all sessions on role/status change via generation xfy 2026-06-18 13:26:09 +08:00
  • 82a3c12940 feat(security): add Origin-based CSRF protection for write endpoints xfy 2026-06-18 13:22:59 +08:00
  • 00478e4a1a perf(rate-limit): use lenient bucket when client IP is unknown xfy 2026-06-18 11:28:06 +08:00
  • 9986d1ce4e perf(auth): compile email regex once via LazyLock xfy 2026-06-18 11:25:15 +08:00
  • 3d187382cc perf(sanitizer): staticize allowlists with LazyLock to avoid per-call allocation xfy 2026-06-18 11:23:30 +08:00
  • 753525fb41 perf(upload): offload GIF/WebP raw image validation to spawn_blocking xfy 2026-06-18 11:19:34 +08:00
  • 033b89ccb8 perf(posts): offload Markdown rendering to spawn_blocking xfy 2026-06-18 11:18:36 +08:00
  • 45e92795de refactor(markdown): unify parser options across TOC and HTML passes xfy 2026-06-18 11:16:58 +08:00
  • 62600a6687 perf(auth): offload Argon2 hash/verify to spawn_blocking xfy 2026-06-18 11:16:13 +08:00
  • 79cb809010 perf(posts): add optional pagination to get_posts_by_tag, fix total count xfy 2026-06-18 11:14:56 +08:00
  • 2dda168b19 perf(db): switch pool recycling method from Verified to Fast xfy 2026-06-18 11:08:14 +08:00
  • 54f7bd481a perf(db): replace fixed 2s retry with exponential backoff + jitter xfy 2026-06-18 11:06:57 +08:00
  • 104ff427f9 perf(db): add exponential backoff retry helper with tests xfy 2026-06-18 11:05:22 +08:00
  • c6161764a9 perf(db): add indexes for trash and admin post list queries xfy 2026-06-18 11:02:13 +08:00
  • 306da3cf83 Merge caching and SSR invalidation improvements xfy 2026-06-18 10:43:40 +08:00
  • ed589f9c79 docs(changelog): record caching and SSR invalidation improvements xfy 2026-06-18 10:37:14 +08:00
  • 668920e9fb docs(ssr): clarify that generation counters are future-ready infrastructure xfy 2026-06-18 10:30:18 +08:00
  • 7f372446da refactor(ssr): restrict X-SSR-Generation header to GET requests and add serial tests xfy 2026-06-18 10:30:12 +08:00
  • 3ee39d910c refactor(ssr): remove unused per-slug/per-tag generation counters xfy 2026-06-18 10:30:07 +08:00
  • 4c695b4fc3 refactor(tasks): use named constants for MB and hours in cleanup xfy 2026-06-18 10:11:07 +08:00
  • 12355b7859 fix(tasks): skip symlinks during image disk cache cleanup xfy 2026-06-18 10:10:51 +08:00
  • a71da7473d perf(image): remove redundant Vec clone before spawn_blocking xfy 2026-06-18 10:10:44 +08:00
  • c0b14ed498 refactor(image): make bytes dependency optional and server-gated xfy 2026-06-18 10:10:40 +08:00
  • f1e5b657a3 chore(env): document image disk cache limits in .env.example xfy 2026-06-18 10:03:42 +08:00
  • 0b107c3f2e feat(tasks): add periodic image disk cache cleanup xfy 2026-06-18 10:03:38 +08:00
  • 36554af5f5 perf(image): store cached image data as Bytes to avoid Vec cloning xfy 2026-06-18 10:03:35 +08:00
  • 411e565465 docs(cache,search): update module and function comments xfy 2026-06-18 09:55:45 +08:00
  • 24bc6f44a0 fix(tasks): invalidate session cache after cleaning expired sessions xfy 2026-06-18 09:55:04 +08:00
  • 518b4e5d64 refactor(auth): store SessionUser instead of full User in session cache xfy 2026-06-18 09:55:00 +08:00
  • c780247d17 feat(posts): invalidate search cache on writes xfy 2026-06-17 17:21:01 +08:00
  • c40a771989 feat(search): cache search results with short TTL xfy 2026-06-17 17:20:54 +08:00
  • 1d216faa2f feat(auth): add in-memory session cache xfy 2026-06-17 17:20:47 +08:00
  • 75b8f80631 fix(posts): wrap empty_trash in transaction and lock rows for precise invalidation xfy 2026-06-17 17:05:07 +08:00
  • 05b9a3a595 feat: enable all HTTP compression algorithms by default xfy 2026-06-17 17:03:17 +08:00
  • 7bd02d0ea9 perf(cache): run tag post invalidations concurrently xfy 2026-06-17 16:59:29 +08:00
  • 2d8f1e0d98 refactor(posts): avoid redundant cache invalidation in bulk fallback paths xfy 2026-06-17 16:59:24 +08:00
  • c77f751377 refactor(posts): apply precise invalidation limit to batch_restore_posts xfy 2026-06-17 16:59:18 +08:00
  • ca212a2aab fix(posts): lock rows and read metadata in transaction for delete/purge/restore xfy 2026-06-17 16:58:54 +08:00
  • 634f733e36 feat: add Cache-Control headers for public pages and static assets xfy 2026-06-17 16:57:42 +08:00
  • 1092fbb3ce fix(posts): ensure rebuild invalidates tag posts cache xfy 2026-06-17 16:44:32 +08:00
  • facb75d632 feat: make HTTP compression algorithms configurable via COMPRESSION_ALGORITHMS xfy 2026-06-17 16:38:41 +08:00
  • c03093fc8b refactor(posts): use precise cache invalidation in rebuild xfy 2026-06-17 16:37:20 +08:00
  • bb34e2c36e refactor(posts): use precise cache invalidation in trash operations xfy 2026-06-17 16:37:20 +08:00
  • 82b070e7ac refactor(posts): use precise cache invalidation in create/update/delete xfy 2026-06-17 16:37:20 +08:00
  • c528936abb feat(cache): add invalidate_tag_posts_for helper xfy 2026-06-17 16:37:20 +08:00
  • 15e7e2578d refactor(utils): extract reading_time helper xfy 2026-06-17 16:25:22 +08:00
  • e683efe0ea refactor(models): remove dead Post status methods, add PostListItem tests xfy 2026-06-17 16:24:50 +08:00
  • 468a819951 fix(db): backfill word_count and reading_time for existing posts xfy 2026-06-17 16:24:44 +08:00
  • 9f41ea7354 refactor(posts): remove orphan row_to_post_list and use row_to_post_full for get_post_by_id xfy 2026-06-17 16:24:38 +08:00
  • 1eedab8f21 perf(posts): remove content_md from list/search SQL, read stored word counts xfy 2026-06-17 16:06:27 +08:00
  • a6f08d5d3f feat(db): add word_count and reading_time columns to posts xfy 2026-06-17 16:06:21 +08:00
  • 51e20980db perf(stats): combine three COUNT queries into one conditional aggregation xfy 2026-06-17 15:51:29 +08:00
  • 170c021b37 feat(cache): add PostListItem DTO and use it in list/tag/search caches xfy 2026-06-17 15:51:19 +08:00
  • 31d5a99d2a Merge cleanup/redundancies: remove dead comment code and duplicate DB indexes xfy 2026-06-17 15:24:47 +08:00
  • 70e61ab65d docs: explain why ConnectInfo is optional for image routes xfy 2026-06-17 15:16:26 +08:00
  • 018b3876b7 fix: return 404 for bare /uploads path and correct CHANGELOG xfy 2026-06-17 14:47:22 +08:00
  • 2d45e0991b docs: clarify image cache invalidation behavior xfy 2026-06-17 14:22:20 +08:00
  • dc7eb77fad docs: document image cache-control defaults xfy 2026-06-17 14:19:42 +08:00
  • abdfd2e3f9 fix: make If-None-Match comparison RFC 7232 compliant xfy 2026-06-17 14:14:37 +08:00
  • 27ce878771 feat: support If-None-Match 304 for image responses xfy 2026-06-17 14:08:45 +08:00
  • 21b665f41d feat: add Cache-Control and ETag headers for image responses xfy 2026-06-17 13:59:17 +08:00
  • fe6e5bd045 perf: offload image decode/resize/encode to spawn_blocking xfy 2026-06-17 13:52:05 +08:00
  • b48590ced3 feat: add compression and timeout middleware, skip uploads and image routes xfy 2026-06-17 13:45:55 +08:00
  • 7bad3ce382 fix: make ConnectInfo optional in serve_image to prevent 500 xfy 2026-06-17 13:21:20 +08:00
  • 28fd38e6b8 docs(plan): remove stale references to removed comment APIs xfy 2026-06-17 13:11:38 +08:00