REDCODE
1dfa9eaf41
perf: replace in-memory path parsing with SELECT DISTINCT SQL, remove dir count badges
2026-07-16 22:44:20 +02:00
REDCODE
50b5a28841
perf: replace in-memory path parsing with SQL SPLIT_PART aggregation and double-LIKE filter
2026-07-16 22:15:11 +02:00
REDCODE
580cdee67d
feat: add collapsible sidebar toggle to AlbumAssetPicker folder browser
2026-07-16 21:50:23 +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
5d9aa21987
feat: add file-browser BrowseUnlinkedAssets endpoint with directory tree from OriginalPath
2026-07-16 21:43:44 +02:00
REDCODE
ad1f9e2222
fix: use OnParametersSetAsync instead of fire-and-forget to ensure Blazor re-renders after init
2026-07-16 21:33:48 +02:00
REDCODE
90c81c2d20
fix: use Albums.Count==0 instead of !Any() for unlinked filter, add trace logging
2026-07-16 21:06:18 +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
ad7c38b20e
feat: integrate AlbumAssetPicker into AlbumDetail with Add Assets button and merge handler
2026-07-16 20:55:32 +02:00
REDCODE
e0a5bd0ce4
feat: add AlbumAssetPicker modal component with drillable folder sidebar, search, and multi-select
2026-07-16 20:54:29 +02:00
REDCODE
e41e7d774f
feat: extend AssetService with unassigned/folder/uploader/search params and GetUnlinkedGroupsAsync
2026-07-16 20:53:02 +02:00
REDCODE
34220e93d4
feat: extend AssetController with unlinked-groups endpoint and pass new search/unassigned/folder/uploader params
2026-07-16 20:52:33 +02:00
REDCODE
22706a09cd
feat: extend AssetRepository with unassigned, folderId, uploadedBy, search filters and GetUnlinkedGroups
2026-07-16 20:51:34 +02:00
REDCODE
664c1de5da
feat: add trigram GIN index on Asset.OriginalFilename for efficient ILike search
2026-07-16 20:50:30 +02:00
REDCODE
081295af86
feat: add UnlinkedAssetGroupDto and extend AssetSearchOptionsDto with unlinked/folder/uploader filters
2026-07-16 20:49:56 +02:00
REDCODE
7dd00c0a5e
fix: gate registration behind UserRegistrationEnabled setting
...
AuthController.Register() never checked the UserRegistrationEnabled
server setting, allowing anyone to register even when disabled.
- Inject ISettingsRepository into AuthController
- Return 403 Forbidden at top of Register() if setting is not 'true'
- Add setup test #3.5 to enable registration for the main test flow
Closes #141
2026-07-16 20:37:50 +02:00
REDCODE
3a195dbc15
chore: Adjusted rate-limits of thumbs, preview and jobs to avoid triggering them during normal usage
2026-07-16 20:09:47 +02:00
REDCODE
cce310ee14
Merge pull request 'feat: frontend multi-select enhancements - merge, unlink cosplayer, visibility refactor' ( #140 ) from feat/128-frontend-merge-multi-select into develop
...
Reviewed-on: #140
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com >
2026-07-16 17:54:32 +00:00
REDCODE
ada113914d
refactor: move Unlink cosplayer button from album header to album edit form
2026-07-16 19:48:55 +02:00
REDCODE
a2a25673de
refactor: replace inline visibility modal with shared VisibilityModal in Cosplayers.razor
2026-07-16 19:33:09 +02:00
REDCODE
963e897fe5
feat: add Unlink cosplayer button to AlbumDetail.razor
2026-07-16 19:31:39 +02:00
REDCODE
f9fe91e975
feat: add Merge Albums button to CosplayerDetail.razor
2026-07-16 19:31:12 +02:00
REDCODE
01fc121bc3
feat: add Merge button to Cosplayers.razor with CosplayerGrid preview access
2026-07-16 19:30:22 +02:00
REDCODE
da8a5ad539
feat: add Merge button to Albums.razor with AlbumGrid preview access
2026-07-16 19:29:41 +02:00
REDCODE
ff2ed4f7cd
feat: add MergeModal shared component for merge destination selection
2026-07-16 19:28:45 +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
f064277c31
Merge pull request 'feat: add rate limiting with configurable buckets' ( #139 ) from feature/rate-limit into develop
...
Reviewed-on: #139
2026-07-16 17:17:53 +00:00
REDCODE
c5ea749517
test: added rate limiting stress test
2026-07-16 19:17:37 +02:00
REDCODE
ebe83fe691
chore: use record for config classes
2026-07-16 19:06:35 +02:00
REDCODE
ab58ac7dd8
Merge branch 'develop' into feature/rate-limit
2026-07-16 16:56:33 +00:00
REDCODE
17d3f0f2a7
Merge pull request 'feat: backend merge endpoints, bulk visibility fix, and tests' ( #138 ) from feat/backend-merge-endpoints into develop
...
Reviewed-on: #138
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com >
Reviewed-by: Fastwind <fastwind@noreply.localhost >
2026-07-16 16:46:52 +00:00
REDCODE
1e2bc83b20
fix: guard against null PersonOwnerId in MergePeople albums query
...
Replace PersonOwnerId ?? Guid.Empty with explicit null check to
avoid matching albums with no owner if sourceIds contained Guid.Empty.
2026-07-16 18:30:23 +02:00
MrFastwind
58014a37bd
feat: apply rate-limit buckets to controllers
...
- AuthController: auth bucket (10 req/60s) — anti-brute-force
- MediaController.GetImage: media_original bucket (50 req/60s)
- MediaController.GetThumb: media_thumb bucket (200 req/60s)
- MediaController.GetPreview: media_preview bucket (200 req/60s)
- JobsController: jobs bucket (30 req/10s) — quick refresh for long-polling
- All other endpoints: global bucket (100 req/60s) via default
2026-07-16 18:26:39 +02:00
MrFastwind
c79ed47e41
feat: add rate limiting with configurable buckets
...
Add fixed-window rate limiting to Lactose with 6 configurable buckets:
- Global (100 req/60s) for all generic calls
- Auth (10 req/60s) strict anti-brute-force
- MediaOriginal (50 req/60s) for full-size media
- MediaThumb (200 req/60s) for thumbnails
- MediaPreview (200 req/60s) for previews
- Jobs (30 req/10s) quick refresh for long-polling
All buckets configurable via appsettings.json RateLimiting section.
Rejected requests return HTTP 429 with JSON body and Retry-After header.
2026-07-16 18:17:58 +02:00
REDCODE
e48da562fa
test: flatten test numbering to sequential 1–137
...
Renumber all test blocks flatly with no gaps or sub-letter suffixes.
Split the remaining multi-request block in the bulk visibility section.
2026-07-16 18:08:17 +02:00
REDCODE
b943d2e595
fix: split multi-request test blocks into single-request blocks
...
REST Client only processes the first request per ### block.
Split 99f into 99f/99f1 and 99i2 into 99i2/99i2b so dynamic
variables set by response handlers are available in subsequent tests.
2026-07-16 18:04:40 +02:00
REDCODE
0950106609
test: add merge and bulk visibility tests to WepApiTest.http
...
Covers: album merge validation and e2e, person merge validation and e2e,
bulk visibility update (people + assets), authorization gating.
2026-07-16 17:58:14 +02:00
REDCODE
7ba1ab1551
feat: add merge endpoints to AlbumController and PersonController
...
POST /api/album/merge — Curator/Admin, validates DestinationId not in SourceIds
POST /api/person/merge — Admin/Curator, validates DestinationId not in SourceIds
2026-07-16 17:56:52 +02:00
REDCODE
656e6fa9bf
feat: add MergePeople to person repository
...
Reassigns albums (PersonOwnerId), faces (PersonId), and maintainers
from source people to destination, then hard-deletes source people.
2026-07-16 17:56:24 +02:00
REDCODE
5e1306e466
feat: add MergeAlbums to album repository
...
Loads destination + source albums with assets, moves all assets
from sources to destination (deduplicated), then hard-deletes sources.
2026-07-16 17:55:46 +02:00
REDCODE
22565c4f92
feat: add AlbumMergeDto and PersonMergeDto
...
New DTOs for merge endpoints. Both require DestinationId and SourceIds,
with DestinationId validated to not appear in SourceIds by the controller.
2026-07-16 17:55:15 +02:00
REDCODE
e62a567e4e
fix: apply Visibility and MaintainerUserIds in PersonController.BulkUpdate
...
The bulk update path was ignoring Visibility and MaintainerUserIds
from PersonUpdateDto, unlike the single-update path.
2026-07-16 17:55:00 +02:00
REDCODE
e5ffe86077
feat: add visibility-colored borders to cosplayer cards in selection mode
...
Adds border-warning for non-Public cosplayers and preserves the
cosplayer-card-select accent outline, matching the AlbumCard pattern.
2026-07-16 17:26:26 +02:00
REDCODE
d4a53cb2dc
fix(UI): make the delete cosplayer button in cosplayer detail page be just an icon to conform with albums detail page
2026-07-16 16:09:34 +02:00
REDCODE
548b0d5bfd
Merge pull request 'feat: add reusable ConfirmDialog component for deletion operations' ( #135 ) from issue-57-confirm-dialog into develop
...
Reviewed-on: #135
Reviewed-by: Samuele Lorefice <aironenerowork@gmail.com >
2026-07-16 13:59:26 +00:00
REDCODE
92fb5a0149
fix: add ConfirmDialog to Settings folder deletion flow
...
FolderBox now delegates deletion to parent via OnDeleteRequested
callback instead of deleting directly. Settings.razor shows a
ConfirmDialog before removing the folder.
2026-07-16 15:11:33 +02:00
REDCODE
6542dcafd6
fix: add ConfirmDialog to Cosplayers bulk delete flow
...
Adds confirmation before bulk-deleting selected cosplayers.
2026-07-16 15:10:37 +02:00
REDCODE
b7690b5828
fix: add ConfirmDialog to Albums bulk delete flow
...
Adds confirmation before bulk-deleting selected albums.
2026-07-16 15:10:20 +02:00
REDCODE
f3f2bdba02
fix: add ConfirmDialog to CosplayerDetail delete flows
...
Adds confirmation before deleting a cosplayer or bulk-deleting selected
albums. Uses a single ConfirmDialog with dynamic message and stored
callback for either action.
2026-07-16 15:10:03 +02:00
REDCODE
8bf6405c64
fix: add ConfirmDialog to AlbumDetail delete flows
...
Adds confirmation before deleting an album or bulk-deleting selected
assets. Uses a single ConfirmDialog with dynamic message and stored
callback for either action.
2026-07-16 15:09:36 +02:00