Commit Graph
95 Commits
Author SHA1 Message Date
REDCODE 9c5bc6ccf7 feat(MilkStream.Client): pass date-range filters through asset search 2026-08-22 00:53:38 +02:00
REDCODE c644717808 feat(MilkStream.Client): add deleted-only listing and asset restore to AssetService 2026-08-22 00:48:38 +02:00
REDCODE 70c432a668 refactor(auth): delegate profile fetch to UserService and drop manual token refresh 2026-08-21 02:48:39 +02:00
REDCODE 87b7d61f1a refactor(frontend): drop underscore prefix from service and code-behind private fields 2026-08-21 02:31:07 +02:00
REDCODE 819be813dd feat(frontend): download previewer image via attachment link 2026-08-21 02:15:15 +02:00
REDCODE 2dd4f8621f style(services): add trailing newline to ServiceBase 2026-08-21 02:13:01 +02:00
REDCODE 8209da44e7 refactor(jobs): route job reads through GetJsonAsync keeping the throwing boundary 2026-08-21 01:33:52 +02:00
REDCODE 2177cb1a0b refactor(settings): return null from GetAllSettings instead of throwing 2026-08-21 01:33:42 +02:00
REDCODE 79b15ed0ff refactor(asset): migrate asset reads to GetJsonAsync 2026-08-21 01:33:33 +02:00
REDCODE 4124daeec9 refactor(user): migrate user reads to GetJsonAsync 2026-08-21 01:33:23 +02:00
REDCODE 8007a2d8ce refactor(services): migrate album, person, stats, and folder reads to GetJsonAsync 2026-08-21 01:33:14 +02:00
REDCODE a38f5eb59e refactor(services): add GetJsonAsync helper to ServiceBase 2026-08-21 01:33:09 +02:00
REDCODE cd2fa3a355 fix(services): unsubscribe AuthInfoChanged on dispose to prevent singleton scoped subscription leak 2026-08-21 01:22:59 +02:00
REDCODE a3372881c4 refactor(settings): remove dead UpdateSettingsAsync batch method 2026-08-21 01:22:43 +02:00
REDCODE b6386aad98 refactor(asset): rename fs-browse to directory and remove the DB-path browse endpoint
- Rename the filesystem browse route from /api/asset/fs-browse to /api/asset/directory
  (controller route, client URL, REST tests, and service log label).
- Remove the old /api/asset/browse endpoint and its BrowseAssets/GetDirectoryNames
  repository code, plus the client BrowseAsync method. Repoint AlbumAssetPicker's
  admin/curator folder browse to the /directory endpoint.
- Drop the now-unused pg_catalog.split_part DbFunction mapping.
- Refresh .env GIT_VERSION.
2026-08-21 01:00:38 +02:00
REDCODE 85357752e6 feat(frontend): render GIF previews as video and download the converted mp4
- Add MediaService.VideoUrl for the display media endpoint
- ImagePreview renders a <video> (webp poster) for video MIME types; otherwise the existing <img>
- Download and 'View full size' use the video URL for animated assets
- Home and AlbumDetail pass the asset MIME type into the shared preview
2026-08-20 23:58:56 +02:00
REDCODE ba66000748 merge: integrate develop (incremental scans, visibility cascade, view-mode search) 2026-08-20 18:03:58 +02:00
REDCODE b5b8fb247c Merge branch 'develop' into feature/cascade-visibility-skip-deleted 2026-08-20 14:08:54 +00:00
REDCODE 82ab09adcb Merge branch 'develop' into feature/incremental-scans 2026-08-19 13:04:25 +00:00
REDCODE a5dda805fd feat(ui): add launch modal with folder selection and per-folder scan actions 2026-08-19 14:10:38 +02:00
REDCODE 68fdad13d5 Merge branch 'develop' into feature/broken-assets-gif-conversion 2026-08-18 15:05:43 +00:00
REDCODE 3fce3599fb fix: use page-fullness pagination for broken report and folder browse
Aligns the maintenance page with the project's existing pagination pattern
instead of relying on the X-Total-Count response header, which is not
exposed to the WASM client over CORS. The broken report now pages by
'count >= page size' like AlbumAssetPicker, and folder browse pages over
the on-disk file count carried in the response body. The pagination bar
always renders when files exist so browsing can never strand on a page
with no database matches.

Refs #180
2026-08-18 16:54:28 +02:00
REDCODE 6026c9ec43 Merge branch 'develop' into feature/regularize-services 2026-08-18 14:44:46 +00:00
REDCODE 83d30feadf feat: rebuild maintenance page with broken report and fs browsing
Add BrokenAssetList (paginated broken-assets grid with retry/delete and
requeue buttons) and FolderBrowser (filesystem browsing with folder
sidebar, breadcrumbs, bulk visibility/delete). Maintenance.razor now
switches between the two tabs. Add EJobType.AnimatedConversion.

Refs #180 #181
2026-08-18 11:09:37 +02:00
REDCODE 164008bef1 fix: surface bulk visibility errors on the frontend 2026-08-18 01:48:09 +02:00
REDCODE c05082ad13 Merge branch 'develop' into feature/cascade-visibility-skip-deleted 2026-08-17 22:40:36 +00:00
REDCODE c97b16ada9 refactor(stats): extract shared components & formatting helper
Breaks up the monolithic Stats.razor into reusable pieces under
Components/Shared/ per the AGENTS.md extraction rule:

- StatCountCard: covers the three count-card shapes used 19 times
  (solid top-level, outline data-completeness, icon-title sections).
- StatTable: reusable card+table scaffold for the seven distribution
  tables, with optional header/footer row fragments.
- Formatting: static FormatBytes / PercentOfTotal helpers (were private
  methods in Stats.razor).

Stats.razor now composes these; visual output is unchanged.

Refs #176
2026-08-17 22:55:54 +02:00
REDCODE 556c4a15e0 fix: use inherited LoginService property to avoid CS9107 2026-08-17 22:02:51 +02:00
REDCODE 3374fe6ad4 refactor: adopt primary-constructor style in SettingsService and UserService 2026-08-17 22:01:22 +02:00
REDCODE fa62e75a72 feat: expose cascade option on bulk update services 2026-08-17 21:48:59 +02:00
REDCODE 2d4e78f014 Merge branch 'develop' into feature/cascade-visibility-skip-deleted 2026-08-17 21:17:31 +02:00
REDCODE ee73c8ad90 Merge remote-tracking branch 'gitea/develop' into feature/media-url-builder 2026-08-17 21:14:05 +02:00
REDCODE 588095f370 chore: remove dead frontend code 2026-08-17 20:14:15 +02:00
REDCODE 9f5d9c0c11 refactor: repurpose MediaService as shared media URL builder 2026-08-17 19:30:59 +02:00
REDCODE 30dca5e216 feat: cascade album visibility skips only deleted assets 2026-08-17 16:40:51 +02:00
REDCODE 52e026d7e1 perf(ui): page cosplayer albums via album endpoint and skip count queries
CosplayerDetail now fetches album pages from GET /api/album?personOwnerId=
instead of re-fetching the entire PersonDetailedDto per scroll page. The home
browse page opts out of the asset count query (includeCount=false).
2026-08-11 13:11:13 +02:00
REDCODE 26674e05e5 refactor: quality improvements from desloppify scan
- Remove 16 unused using System; imports from migration files (implicit usings available)
- Fix 6 empty catch blocks with proper exception logging
- Remove unused import (false positive flagged as wontfix)
- Skip test coverage, orphaned, and stale exclude issues as false positives
- Add missing namespace to IPersonRepository.cs
- Rename IFolderRepository Create/Delete to Insert/Remove for CRUD consistency
- Fix ITagRepository.Delete parameter name from 'id' to 'tag'
- Add missing IDisposable to IMediaRepository
- Rename SettingsExtensions to SettingsExtension for naming consistency
- Rename PagedParametersDTO.cs to PagedParametersDto.cs
- Add .desloppify/ to .gitignore
2026-07-29 19:52:49 +02:00
REDCODE 785d33e289 fix: hide register form when registration is disabled
Adds GET /api/auth/register endpoint to check registration status.
Register page now pre-checks on load and shows EmptyState instead of
the form when registration is disabled. Fixes #149.
2026-07-21 14:14:18 +02:00
REDCODE a3eeb8b6d1 fix: show registration disabled message on 403
LoginService.Register() now returns HttpStatusCode instead of bool,
so the frontend can distinguish between 403 (registration disabled),
409 (duplicate), and other failures. Fixes #149.
2026-07-21 14:13:06 +02:00
REDCODE d89f6f0a21 fix: address PR #142 review issues
- Fix timer leak: implement IDisposable on AlbumAssetPicker
- Remove unnecessary full-table COUNT in GetFolderGroups
- Remove dead DirectoryEntryDto.AssetCount
- Remove unused ExistingAssetIds parameter
- Remove redundant .Distinct() after .Union()
- Extract hardcoded page size 150 to named constant
- Rename AssetSearchOptionsDto.Unassigned to Unlinked for consistency
- BrowseAssets returns 404 for missing folderId instead of 200 empty
2026-07-17 00:00:37 +02:00
REDCODE 8589a85625 refactor: rename UnlinkedAssetGroupDto to AssetGroupDto 2026-07-16 23:14:14 +02:00
REDCODE 983cd8baef refactor: add Embedded mode, UnlinkedOnly param, rename methods from Unlinked to generic names 2026-07-16 23:13:18 +02:00
REDCODE 8f0267b0f7 feat: redesign AlbumAssetPicker with breadcrumb navigation, directory drill-down, and file browser UX 2026-07-16 21:43:49 +02:00
REDCODE 0cc80a084a fix: handle 204/empty responses in AssetService and always reset isLoading in AlbumAssetPicker 2026-07-16 21:06:14 +02:00
REDCODE e41e7d774f feat: extend AssetService with unassigned/folder/uploader/search params and GetUnlinkedGroupsAsync 2026-07-16 20:53:02 +02:00
REDCODE 2c292d2d81 feat: add frontend service methods for merge, bulk update, and bulk delete people 2026-07-16 19:27:48 +02:00
REDCODE 19ab8c0975 refactor: centralize cascade visibility logic in AlbumService.CascadeVisibilityToAssetsAsync
- Add CascadeVisibilityToAssetsAsync to AlbumService (skips private/deleted)
- Replace duplicated loop+filter in Albums, CosplayerDetail, PersonForm with single call
- Update labels to describe skip-private/deleted behavior
2026-07-15 23:01:41 +02:00
REDCODE 3cdad1cebd feat: add album-level bulk actions to CosplayerDetail page
- Add BulkUpdateAlbumsAsync to AlbumService
- Fix AlbumCard border gate from IsAdminOrCurator to CanEdit()
- CosplayerDetail: Delete, Unlink, Visibility buttons in select mode
- CosplayerDetail: Select All / Deselect All button
- CosplayerDetail: visibility breakdown stats in header
- CosplayerDetail: visibility modal for albums
2026-07-15 22:14:18 +02:00
REDCODE fff5ea65df feat: add bulk delete and visibility change to AlbumDetail select mode
- Fix AssetController.BulkUpdate/BulkDelete — add missing Save() call
- Add BulkUpdateAssetsAsync and BulkDeleteAssetsAsync to AssetService
- Rename 'Remove N' → 'Unlink N' (removes from album, original behavior)
- Add 'Delete N' button — soft-deletes selected assets via BulkDelete
- Add 'Visibility' button — opens ModalFrame to pick Public/Protected/Private
- Apply calls BulkUpdateAssetsAsync with chosen visibility level
2026-07-15 21:46:28 +02:00
REDCODE 268b380867 refactor: move CanEdit logic to LoginService, remove local page properties 2026-07-15 12:18:53 +02:00