diff --git a/SECURITY.md b/SECURITY.md index 0f91680a0d..fbcebc8a9e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,7 +7,8 @@ Breaking changes are reported in the [changelog/history](https://docs.qdraw.nl/d | Version | Supported | |---------|--------------------| -| 0.5.x | :white_check_mark: | +| 0.6.x | :white_check_mark: | +| 0.5.x | :x: | | 0.4.x | :x: | | < 0.3 | :x: | diff --git a/documentation/docs/developer-guide/api/readme.md b/documentation/docs/developer-guide/api/readme.md index 020e1468c3..8192afde44 100644 --- a/documentation/docs/developer-guide/api/readme.md +++ b/documentation/docs/developer-guide/api/readme.md @@ -48,7 +48,6 @@ This document is auto generated | __/api/geo-reverse-lookup__ | GET | Reverse geo lookup | | __/api/health__ | GET | Check if the service has any known errors and return only a stringPublic API | | __/api/health/details__ | GET | Check if the service has any known errorsFor Authorized Users only | -| __/api/health/application-insights__ | GET | Add Application Insights script to user context | | __/api/health/version__ | POST | Check if Client/App version has a match with the API-versionthe parameter 've...| | __/api/health/check-for-updates__ | GET | Check if Client/App version has a match with the API-version | | __/search__ | POST | Redirect to search GET page (HTML) | diff --git a/history.md b/history.md index 9ed8226c51..77bbaf2fb3 100644 --- a/history.md +++ b/history.md @@ -3,20 +3,25 @@ ## List of **[Starsky](readme.md)** Projects - [By App documentation](starsky/readme.md) _database photo index & import index project_ - - [starsky](starsky/starsky/readme.md) _web api application / interface_ - - [client app](starsky/starsky/clientapp/readme.md) _react front-end application_ - - [starskyImporterCli](starsky/starskyimportercli/readme.md) _import command line interface_ - - [starskyGeoCli](starsky/starskygeocli/readme.md) _gpx sync and reverse 'geo tagging'_ - - [starskyWebHtmlCli](starsky/starskywebhtmlcli/readme.md) _publish web images to a content package_ - - [starskyWebFtpCli](starsky/starskywebftpcli/readme.md) _copy a content package to a ftp service_ - - [starskyAdminCli](starsky/starskyadmincli/readme.md) _manage user accounts_ - - [starskySynchronizeCli](starsky/starskysynchronizecli/readme.md) _check if disk changes are updated in the database_ - - [starskyThumbnailCli](starsky/starskythumbnailcli/readme.md) _speed web performance by generating smaller images_ - - [Starsky Business Logic](starsky/starskybusinesslogic/readme.md) _business logic libraries (.NET)_ - - [starskyTest](starsky/starskytest/readme.md) _mstest unit tests (for .NET)_ + - [starsky](starsky/starsky/readme.md) _web api application / interface_ + - [client app](starsky/starsky/clientapp/readme.md) _react front-end application_ + - [starskyImporterCli](starsky/starskyimportercli/readme.md) _import command line interface_ + - [starskyGeoCli](starsky/starskygeocli/readme.md) _gpx sync and reverse 'geo tagging'_ + - [starskyWebHtmlCli](starsky/starskywebhtmlcli/readme.md) _publish web images to a content + package_ + - [starskyWebFtpCli](starsky/starskywebftpcli/readme.md) _copy a content package to a ftp + service_ + - [starskyAdminCli](starsky/starskyadmincli/readme.md) _manage user accounts_ + - [starskySynchronizeCli](starsky/starskysynchronizecli/readme.md) _check if disk changes are + updated in the database_ + - [starskyThumbnailCli](starsky/starskythumbnailcli/readme.md) _speed web performance by + generating smaller images_ + - [Starsky Business Logic](starsky/starskybusinesslogic/readme.md) _business logic libraries ( + .NET)_ + - [starskyTest](starsky/starskytest/readme.md) _mstest unit tests (for .NET)_ - [starsky-tools](starsky-tools/readme.md) _nodejs tools to add-on tasks_ - [Starsky Desktop](starskydesktop/readme.md) _Desktop Application_ - - [Download Desktop App](https://docs.qdraw.nl/download/) _Windows and Mac OS version_ + - [Download Desktop App](https://docs.qdraw.nl/download/) _Windows and Mac OS version_ - **[Changelog](history.md) Release notes and history** ## Release notes of Starsky @@ -27,7 +32,8 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ - Added _for new features_ - Breaking change _fix or feature that would cause existing functionality to change_ -- Changed _for non-breaking changes in existing functionality for example docs change / refactoring / dependency upgrades_ +- Changed _for non-breaking changes in existing functionality for example docs change / + refactoring / dependency upgrades_ - Deprecated _for soon-to-be removed features_ - Removed _for now removed features_ - Fixed _for any bug fixes_ @@ -35,30 +41,47 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ ## List of versions -## version 0.6.0-beta.0 - _(Unreleased)_ - 2024-01-? {#v0.6.0-beta.0} +## version 0.6.0-beta.1 - _(Unreleased)_ - 2024-01-? {#v0.6.0-beta.0} + +- WIP Electron forge + +## version 0.6.0-beta.0 - 2024-02-11 {#v0.6.0-beta.0} - [x] (Added) _Back-end_ Add support for OpenTelemetry (server side only) (PR #1323) - [x] (Changed) _Back-end_ Upgrade to .NET 8 - SDK 8.0.100 (Runtime: 8.0.1) (PR #1335) -- [x] (Fixed) Feature/202401 fix runtime & update end2end (PR #1355) -- [x] (Fixed) Build project more clear info object (PR #1354) -- [x] (Fixed) Move to Serilog (_build only) && update dotnet-sonarscan to the latest version (PR #1353) -- [x] (Changed) Rename codecov.yml, update rules & add documentation for static code analysis (PR #1352) -- [x] (Changed) Code smell: optional chain expression (PR #1351) -- [x] (Changed) detail view mp4 refactor & fix video scroll click (PR #1350) -- [x] (Fixed) Swagger autogen is broken after .NET 8 upgrade (PR #1348) -- [x] (Changed) Update npm (PR #1347) -- [x] (Fixed) .NET 8 Code smells (PR #1346, 1345, 1344) -- [x] (Security) Bump vite, actions/cache, ws, Client App (PR #1343, 1342, 1341, 1339, 1338) +- [x] (Fixed) _Tools_ Fix runtime & update end2end (PR #1355) +- [x] (Fixed) _Back-end_ Build project more clear info object (PR #1354) +- [x] (Fixed) _Back-end_ Move to Serilog (_build only) && update dotnet-sonarScan to the latest + version (PR #1353) +- [x] (Changed) _Docs_ Rename codecov.yml, update rules & add documentation for static code + analysis (PR #1352) +- [x] (Changed) _Back-end_ Code smell: optional chain expression (PR #1351) +- [x] (Changed) _Front-end_ detail view mp4 refactor & fix video scroll click (PR #1350) +- [x] (Fixed) _Back-end_ Swagger autogen is broken after .NET 8 upgrade (PR #1348) +- [x] (Changed) _Front-end_ Update npm (PR #1347) +- [x] (Fixed) _Back-end_ .NET 8 Code smells (PR #1346, 1345, 1344) +- [x] (Security) _Back-end_ Bump vite, actions/cache, ws, Client App, docs (PR #1343, 1342, 1341, + 1339, 1338, 1378) +- [x] (Fixed) _Back-end_ Retry in docker image for npm ci (PR #1369) +- [x] (Fixed) _Front-end_ Clean unused exports (PR #1367) +- [x] (Breaking change) _Back-end_ Removed Direct dependency of Application Insights (PR #1366 ) +- [x] (Fixed) _App_ Retry if port is used in Electron (PR #1365) +- [x] (Fixed) _Front-end_ ColorClass filter refactor (PR #1364) +- [x] (Fixed) _Front-end_ iOS styling issue (PR #1363) +- [x] (Fixed) _Back-end_ MemoryStream dispose (PR #1361) +- [x] (Fixed) _Back-end_ ReadyToRun faster binary builds (PR #1360) ## version 0.5.14 - 2023-12-29 {#v0.5.14} -- [x] (Changed) _Back-end_ upgrade various packages (PR #1321 #1322 #1319 #1318 #1317 #1315 #1314 #1312) +- [x] (Changed) _Back-end_ upgrade various packages (PR #1321 #1322 #1319 #1318 #1317 #1315 #1314 + #1312) ## version 0.5.13 - 2023-12-13 {#v0.5.13} - [x] (Changed) _Front-end_ Accessibility focus for prev next in detailView (PR #1291) - [x] (Changed) _Front-end_ Move from div to button Accessibility (PR #1294) -- [x] (Changed) _Front-end_ Front-end version updates (PR #1295, #1296, #1297, #1298, #1299, #1300, #1301, #1303) +- [x] (Changed) _Front-end_ Front-end version updates (PR #1295, #1296, #1297, #1298, #1299, #1300, + #1301, #1303) - [x] (Changed) _Front-end_ Code style style issues (PR #1304, #1307) - [x] (Fixed) _Front-end_ long file names in multi select (Issue #1305 PR #1307) - [x] (Fixed) _Back-end_ Replace tags / info etc. with OkAndSame status (Issue #1175 PR #1308) @@ -80,13 +103,16 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ ## version 0.5.11 - 2023-10-13 {#v0.5.11} -- [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.413 - see #1256 - (Runtime: 6.0.21) (PR #1205) -- [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.414 - see #1256 - (Runtime: 6.0.22) (PR #1237) +- [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.413 - see #1256 - (Runtime: 6.0.21) (PR + #1205) +- [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.414 - see #1256 - (Runtime: 6.0.22) (PR + #1237) - [x] (Changed) _Front-end_ Move from Create React App to Vite (PR #1204) -- [x] (Changed) _Front-end_ Upgrade npm packages (PR #1219, 1220, 1228, 1230, 1237, 1240) +- [x] (Changed) _Front-end_ Upgrade npm packages (PR #1219, 1220, 1228, 1230, 1237, 1240) - [x] (Changed) _Front-end_ Upgrade npm packages (PR 1241, 1239, 1252, 1244, 1246, 1247, 1250, 1251) - [x] (Changed) _Back-end_ Upgrade github yaml's (PR 1232, 1233, 1234, 1235) -- [x] (Changed) _Desktop_ Upgrade Electron to 26.x (27.0 has removed support for Mac OS 10.13 and 10.14) (PR #1255) +- [x] (Changed) _Desktop_ Upgrade Electron to 26.x (27.0 has removed support for Mac OS 10.13 and + 10.14) (PR #1255) - [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.415 (Runtime: 6.0.23) (PR #1256) ## version 0.5.10 - 2023-07-27 {#v0.5.10} @@ -100,7 +126,7 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ ## version 0.5.9 - 2023-05-18 {#v0.5.9} - [x] (Fixed) _Back-end_ Fix for duplicate entry for key 'PRIMARY' (PR #1157) -- [x] (Fixed) _Tools_ Update dependencies (PR #1162) +- [x] (Fixed) _Tools_ Update dependencies (PR #1162) - [x] (Fixed) _Docs_ update documentation (PR #1160, #1167) - [x] (Fixed) _Back-end_ Add default launchSettings.json (PR #1168) @@ -110,7 +136,8 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ - [x] (Fixed) _Back-end_ Info API gives last write date back (PR #1147) - [x] (Changed) _Back-end_ `api/publish` checks now if files exists Issue #1126 (PR #1148) - [x] (Fixed) _Back-end_ Fix for duplicate entry for key 'PRIMARY' Issue #1151 (PR #1148) -- [x] (Fixed) _Back-end_ RegexMatchTimeoutException ExtensionRolesHelper.IsExtensionForce Issue #1152 (PR #1148) +- [x] (Fixed) _Back-end_ RegexMatchTimeoutException ExtensionRolesHelper.IsExtensionForce Issue + #1152 (PR #1148) - [x] (Fixed) _Back-end_ Desktop app Cmd+E check xmp files / upload Issue #1114 (PR #1154) - [x] (Fixed) _Back-end_ Index Code bug with null reference (PR #1154) - [x] (Fixed) _Back-end_ Update ImageSharp/ TimeZoneConverter to latest version (PR #1154) @@ -124,7 +151,8 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ - [x] (Fixed) _Back-end_ Code smells, improving readability (PR #1115, #1116, #1121) - [x] (Changed) _Back-end_ Add help info screen and test for demo CLI (PR #1117) - [x] (Changed) _Desktop_ Upgrade Electron packages (PR #1118, #1119) -- [x] (Fixed) _Front-end_ Should skip xmp socket updates in collection:true archive list Issue #1107 (PR #1120) +- [x] (Fixed) _Front-end_ Should skip xmp socket updates in collection:true archive list Issue + #1107 (PR #1120) - [x] (Changed) _Front-end_ Upgrade packages (PR #1122) - [x] (Changed) _Front-end_ skip xmp in default last week query (PR #1134) - [x] (Changed) _Back-end_ Multiple or queries seperated by comma (PR #1134) @@ -136,7 +164,9 @@ Semantic Versioning 2.0.0 is from version 0.1.6+ - [x] (Fixed) _Front-end_ Add preloader state for update geo location (PR #1135) - [x] (Fixed) _Back-end_ Change tests for MySqlDatabaseFixes (PR #1135) - [x] (Fixed) _Back-end_ `api/info` gives xmp (Issue #1127) (PR #1136) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.408 (Runtime: 6.0.16)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.16/6.0.16.md) (PR #1137) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.408 (Runtime: 6.0.16)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.16/6.0.16.md) ( + PR #1137) ## version 0.5.7-beta.0 - 2023-03-20 {#v0.5.7-beta.0} @@ -158,13 +188,16 @@ _Known issues #1106, #1107 and #1108_ - [x] (Changed) _Front-end_ Removal of Directories (PR #1085) - [x] (Changed) _Front-end_ Hide parts of menu in UseLocalDesktopUi mode (PR #1087) - [x] (Fixed) _Front-end_ Fixed 300 eslint issues (PR #1087) -- [x] (Changed) _Back-end_ when deleting in systemtrash mode xmp files are now deleted (PR #1088) +- [x] (Changed) _Back-end_ when deleting in systemTrash mode xmp files are now deleted (PR #1088) - [x] (Changed) _Back-end_ test when deleting in server mode: xmp files are gone fixed (PR #1088) - [x] (Changed) _Back-end_ xmp database changes test (PR #1088) -- [x] (Changed) _Back-end_ resync test with changed xmp's (PR #1088) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.407 (Runtime: 6.0.15)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.15/6.0.15.md) (PR #1096) +- [x] (Changed) _Back-end_ re-sync test with changed xmp (PR #1088) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.407 (Runtime: 6.0.15)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.15/6.0.15.md) ( + PR #1096) - [x] (Changed) _Back-end_ Add more first bytes support to detect imageFormat (PR #1097) -- [x] (Changed) _Front-end_ When deleting the item is going to the next or one folder below (PR #1097) +- [x] (Changed) _Front-end_ When deleting the item is going to the next or one folder below (PR + #1097) - [x] (Fixed) _Back-end_ should not add xmp files to thumbnail query table (PR #1100) ## version 0.5.5 - 2023-02-17 {#v0.5.5} @@ -172,16 +205,21 @@ _Known issues #1106, #1107 and #1108_ - [x] (Fixed) _Back-end_ Remove UpdateItem and AddItem from IQuery, instead use async (PR #1067) - [x] (Fixed) _Back-end_ Sync compare on last edited date time instead on DateTime.Now (PR #1067) - [x] (Fixed) _Back-end_ tar.gz longer filename support (PR #1069) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.406 (Runtime: 6.0.14)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.14/6.0.14.md) (PR #1075) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.406 (Runtime: 6.0.14)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.14/6.0.14.md) ( + PR #1075) - [x] (Changed) _Docs_ Upgrade Docusaurus npm deps (PR #1074) - [x] (Changed) _Front-end_ Upgrade client npm deps (PR #1073) ## version 0.5.5-beta.0 - 2023-02-07 {#v0.5.5-beta.0} -- [x] (Fixed) _Back-end_ Make warning work again when database is missing (Issue #1045, PR #1044, #1046) -- [x] (Fixed) _Back-end_ Add retry when thumbnail cleaning and database errors (Issue #1040, PR #1046) +- [x] (Fixed) _Back-end_ Make warning work again when database is missing (Issue #1045, PR #1044, + #1046) +- [x] (Fixed) _Back-end_ Add retry when thumbnail cleaning and database errors (Issue #1040, PR + #1046) - [x] (Fixed) _Desktop_ Windows Desktop App did not start (PR #1047) -- [x] (Fixed) _Back-end_ Add auto install `./build.ps1` for Windows package manager (winget) for .NET and node (PR #1047) +- [x] (Fixed) _Back-end_ Add auto install `./build.ps1` for Windows package manager (winGet) for + .NET and node (PR #1047) - [x] (Fixed) _Desktop_ Upgrade Electron to 22.1.0 and fix tests (PR #1047) - [x] (Updated) _CI_ Update Github Actions (20230206, PR #1063, #1062, #1061, #1060, #1059) - [x] (Updated) _Docs_ Update Docusaurus (PR #1055, #1049) @@ -192,7 +230,8 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Back-end_ App insights metrics for internal queues (PR #1028) - [x] (Added) _Back-end_ no request validation and 400 status code for `/api/disk/mkdir` (PR #1030) -- [x] (Added) _Back-end_ no request validation and 400 status code for `/api/disk/rename` (PR #1030) +- [x] (Added) _Back-end_ no request validation and 400 status code for `/api/disk/rename` (PR + #1030) - [x] (Added) _Back-end_ no request validation and 400 status code for `/api/update` (PR #1030) - [x] (Changed) _Tests_ Update create directory end2end tests (PR #1030) - [x] (Changed) _Tests_ retry end2end test: Create Rename Dir > delete it afterwards (PR #1032) @@ -200,10 +239,13 @@ _Known issues #1106, #1107 and #1108_ - [x] (Fixed) _Back-end_ starskyWebHtmlCli missing db context and crashed (PR #1032) - [x] (Fixed) _Back-end_ fixing import disposed exception (issue #1033 / PR #1034) - [x] (Security) _Back-end_ Run default user in container as non-root (PR #1035) -- [x] (Changed) _Back-end_ move port environment variable to application instead of docker file (PR #1036) +- [x] (Changed) _Back-end_ move port environment variable to application instead of docker file (PR + #1036) - [x] (Changed) _Back-end_ set default port to 4000 (PR #1036) -- [x] (Added) _Back-end_ add feature flag GeoFilesSkipDownloadOnStartup, recommend to keep false or null (PR #1036) -- [x] (Added) _Back-end_ add feature flag ExiftoolSkipDownloadOnStartup, recommend to keep false or null (PR #1036) +- [x] (Added) _Back-end_ add feature flag GeoFilesSkipDownloadOnStartup, recommend to keep false or + null (PR #1036) +- [x] (Added) _Back-end_ add feature flag ExiftoolSkipDownloadOnStartup, recommend to keep false or + null (PR #1036) - [x] (Added) _Back-end_ add unit tests for dependency injection helpers (PR #1038) - [x] (Fixed) _Back-end_ GetFileName Regex timeout (PR #1041) - [x] (Added) _Docs_ Improve documentation (PR #1042, #1043) @@ -214,36 +256,45 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Docs_ Add section about how to install desktop, macOS and Linux (PR #1015) - [x] (Added) _Back-end_ Database table that stores the status of thumbnails (PR #1020, #1013) - [x] (Changed) _Back-end_ Update telemetry fields (PR #1020) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.405 (Runtime: 6.0.13)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.13/6.0.13.md) (PR #1021) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.405 (Runtime: 6.0.13)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.13/6.0.13.md) ( + PR #1021) - [x] (Changed) _Back-end_ Update thumbnail list on MetaUpdate (PR #1022) -- [x] (Changed) _Back-end_ Upgrade nuget / docusaurus / client app / desktop dependencies (PR #1022) +- [x] (Changed) _Back-end_ Upgrade nuget / docusaurus / client app / desktop dependencies (PR + #1022) - [x] (Changed) _Tests_ Upgrade cypress dependencies and fix some tests (PR #1022) - [x] (Changed) _Back-end_ Telemetry fallback values (PR #1022) - [x] (Changed) _Back-end_ Thumbnail Generation Controller refactor to service (PR #1022) - [x] (Fixed) _Back-end_ Thumbnail Query rename to already existing thumbnail name fix (PR #1022) -- [x] (Fixed) _Back-end_ Thumbnail upload with `@` is allowed to match the right size version e.g. `@2000` (PR #1022) -- [x] (Changed) _Back-end_ Move `api/import/thumbnail` to separate controller, but does **not** change url (PR #1022) +- [x] (Fixed) _Back-end_ Thumbnail upload with `@` is allowed to match the right size version + e.g. `@2000` (PR #1022) +- [x] (Changed) _Back-end_ Move `api/import/thumbnail` to separate controller, but does **not** + change url (PR #1022) - [x] (Added) _Back-end_ Add Periodic Thumbnail Create service (PR #1022) ## version 0.5.2 - 2022-12-22 -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.404 (Runtime: 6.0.12)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.12/6.0.12.md) (PR #997) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.404 (Runtime: 6.0.12)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.12/6.0.12.md) ( + PR #997) - [x] (Changed) _Front-end_ Upgrade Create React App / Typescript / storybook (PR #998) - [x] (Changed) _Front-end_ Geo location edit in detail view (PR #996) - [x] (Changed) _Front-end_ Dark-mode UI tweaks (PR #999) -- [x] (Fixed) _Back-end_ Avoid duplicate input when replace (Issue #995 / PR #1000) +- [x] (Fixed) _Back-end_ Avoid duplicate input when replace (Issue #995 / PR #1000) - [x] (Fixed) _Back-end_ Rename Exception (Issue #994 / PR #1001) - [x] (Fixed) _Back-end_ GPX file loaded (Issue #763 / PR #1002) -- [x] (Fixed) _Desktop_ Upgrade dependencies desktop / add script update deps in docs (PR #1003) +- [x] (Fixed) _Desktop_ Upgrade dependencies desktop / add script update deps in docs (PR #1003) - [x] (Fixed) _Front-end_ Geo updates are now realtime and Update documentation (PR #1005) ## version 0.5.1 - 2022-12-10 - [x] (Added) _Docs_ New documentation site (PR #971) -- [x] (Changed) _Back-end_ First user after registration is Admin to avoid issues with editing storage folder (PR #977) +- [x] (Changed) _Back-end_ First user after registration is Admin to avoid issues with editing + storage folder (PR #977) - [x] (Fixed) _Back-end_ when importing --move false is fixed (PR #978) - [x] (Fixed) _Back-end_ DiskWatcher with a non-existing folder does not crash (PR #978) -- [x] (Fixed) _Back-end_ Import from read only folder does not partly import files and crash (PR #978) +- [x] (Fixed) _Back-end_ Import from read only folder does not partly import files and crash (PR + #978) - [x] (Fixed) _Back-end_ Docker compose issues with file rights on Mac OS (PR #980) - [x] (Added) _Back-end_ More docs about how use the software (PR #981) - [x] (Fixed) _Back-end_ Publish on read-only files gives 0 items back (PR #938) @@ -257,7 +308,9 @@ _Known issues #1106, #1107 and #1108_ - [x] (Changed) _Desktop_ Save minimum size for windows (all platforms) (PR #948) - [x] (Changed) _Back-end_ Windows OS Camera Timezone issues and SQLite startup issues (PR #952) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.403 (Runtime: 6.0.11)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.11/6.0.11.md) (PR #958) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.403 (Runtime: 6.0.11)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.11/6.0.11.md) ( + PR #958) - [x] (Changed) _Back-end_ GlobalJson for specific version .NET (PR #957) - [x] (Changed) _Back-end_ Get thumbnail files from raw files, now shown yet (PR #959) - [x] (Changed) _Desktop_ Download first to tmp file and then rename (PR #961) @@ -273,11 +326,14 @@ _Known issues #1106, #1107 and #1108_ - [x] (0.5.0-beta.4) _Back-end_ WebSocket Data Model is changed (PR #712) - [x] (0.5.0-beta.4) _Back-end_ remove System messages and replaced it with type keyword (PR #712) - [x] (0.5.0-beta.4) _Back-end_ Add types for web sockets (PR #712) -- [x] (0.5.0-beta.4) _Back-end_ for mysql: utf8mb4 is now used for the database and applied after the migrations are executed (PR #723) +- [x] (0.5.0-beta.4) _Back-end_ for mysql: utf8mb4 is now used for the database and applied after + the migrations are executed (PR #723) - [x] (0.5.0-beta.3) _Back-end_ Upgrade to .NET 6 - [x] (0.5.0-beta.3) _Back-end_ Change mirror locations (exiftool/geonames) (PR #642) -- [x] (0.5.0-beta.1) _Back-end_ change default option in Thumbnail-er cli to scan directories to enabled (-t true default) (PR #601) -- [x] (0.5.0-beta.0) _CLI_ Removed sync cli (starskysynccli) which is replaced by starskysynchronizecli (PR #563) +- [x] (0.5.0-beta.1) _Back-end_ change default option in Thumbnail-er cli to scan directories to + enabled (-t true default) (PR #601) +- [x] (0.5.0-beta.0) _CLI_ Removed sync cli (starskysynccli) which is replaced by + starskysynchronizecli (PR #563) - [x] (0.5.0-beta.0) _Back-end_ rename "/api/sync/mkdir" to /api/disk/mkdir (PR #574) - [x] (0.5.0-beta.0) _Back-end_ rename "/api/sync/rename" to /api/disk/rename (PR #574) - [x] (0.5.0-beta.0) _Back-end_ Dropped support for older Mac OS version: now 10.15+ is required @@ -285,11 +341,16 @@ _Known issues #1106, #1107 and #1108_ ## version 0.5.0-beta.9 - 2022-11-04 - [x] (Changed) _Back-end_ Last Edited is updated when Single Sync a file (PR #916) -- [x] (Changed) _Back-end_ Code style quality, move search to feature, sealed classes (PR #917, #919, #922, #921) -- [x] **(Breaking Change)** _Back-end_ Use Application Insights Connection String instead of Instrumentation Key (PR #920, Issue #908) +- [x] (Changed) _Back-end_ Code style quality, move search to feature, sealed classes (PR #917, + #919, #922, #921) +- [x] **(Breaking Change)** _Back-end_ Use Application Insights Connection String instead of + Instrumentation Key (PR #920, Issue #908) - [x] (Added) _Back-end_ Use Country code in geo services (PR #923) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.402 (Runtime: 6.0.10)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.10/6.0.10.md) (PR #931) -- [x] **(Breaking Change)** _Back-end_ Use Data Protection Keys in Database instead of on disk (PR #933) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.402 (Runtime: 6.0.10)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.10/6.0.10.md) ( + PR #931) +- [x] **(Breaking Change)** _Back-end_ Use Data Protection Keys in Database instead of on disk (PR + #933) - [x] (Added) _Back-end_ Demo mode in application (PR #943, #944, #945, #946) - [x] (Changed) _App_ Upgrade Electron to 21.x (PR #887) - [x] **(Breaking Change)** _App_ Rename StarskyApp to StarskyDesktop (PR #887) @@ -298,53 +359,68 @@ _Known issues #1106, #1107 and #1108_ - [x] (Security) _Back-end_ Upgrade Nuget packages (PR #878) - [x] (Security) _Back-end_ Update Security Headers e.g. CSP, Permissions Policy (PR #880, #881) -- [x] (Security) _Tools_ Update node dependencies (PR #888, #884, #883, #879, #898, #901, #902, #904) +- [x] (Security) _Tools_ Update node dependencies (PR #888, #884, #883, #879, #898, #901, #902, + #904) - [x] (Fixed) _Back-end_ Manual sync exception should not keep lock activated (PR #889) - [x] (Changed) _Back-end_ Use node 18.x in Dockerfile (PR #895) - [x] (Changed) _Tools_ Allow other projects as argument in dotnet-sdk-version-update.js (PR #895) - [x] (Security) _Back-end_ Add option for secure cookies App Settings: `HttpsOn` (PR #896) - [x] (Changed) _Back-end_ Refactor: MultiFile directory sync to avoid database calls (PR #894) -- [x] (Changed) _Back-end_ Performance update for SyncService to avoid database calls and multithreading (PR #900) -- [x] (Changed) _Back-end_ UseDiskWatcher to queue every 20 seconds to avoid database calls (PR #903) +- [x] (Changed) _Back-end_ Performance update for SyncService to avoid database calls and + multithreading (PR #900) +- [x] (Changed) _Back-end_ UseDiskWatcher to queue every 20 seconds to avoid database calls (PR + #903) - [x] (Added) _Back-end_ Add Settings Database Table incl. migration (PR #905) - [x] (Added) _Back-end_ Add feature toggle in AppSettings: `SyncOnStartup` (PR #905) - [x] (Added) _Back-end_ Sync latest changes on startup of application (PR #905) -- [x] (Changed) _Back-end_ Code quality: Apply C# nullable for foundation.database project (PR #905 & rework PR #906) +- [x] (Changed) _Back-end_ Code quality: Apply C# nullable for foundation.database project (PR + #905 & rework PR #906) - [x] (Security) _Front-end_ Client App - Create React App - Upgrade dependencies (PR #910) - [x] (Issue) _Tools_ Upgrade Cypress end2end testing tool to v10 (PR #911) ## version 0.5.0-beta.7 - 2022-09-20 -- [x] (Changed) _Back-end_ _Change is overwritten in same release_ Upgrade to .NET 6 - SDK 6.0.302 (Runtime: 6.0.7) (PR #838) +- [x] (Changed) _Back-end_ _Change is overwritten in same release_ Upgrade to .NET 6 - SDK 6.0.302 ( + Runtime: 6.0.7) (PR #838) - [x] (Fixed) _Back-end_ Null reference exceptions on mysql (PR #789 & Issue #787) - [x] (Fixed) _Back-end_ Retry for InvalidOperationException when Add Item (PR #789 & Issue #802) - [x] (Fixed) _Back-end_ Slug should not be `---` (PR #789 & Issue #797) - [x] (Security) _Back-end_ Upgrade nuget packages (PR #845) -- [x] (Changed) _Back-end_ _Change is overwritten in same release_ Upgrade to .NET 6 - SDK 6.0.400 (Runtime: 6.0.8) (PR #855) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.401 (Runtime: 6.0.9)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.9/6.0.9.md) (PR #870) +- [x] (Changed) _Back-end_ _Change is overwritten in same release_ Upgrade to .NET 6 - SDK 6.0.400 ( + Runtime: 6.0.8) (PR #855) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.401 (Runtime: 6.0.9)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.9/6.0.9.md) ( + PR #870) - [x] (Issue) _Tools_ Re-enable end2end test in CI (2022-09-20) ## version 0.5.0-beta.6 - 2022-07-13 - [x] (Changed) _Front-end_ Upgrade React 17.x to React 18.x (Part 2) CreateRoot change (PR #748) - [x] (Fixed) _Front-end_ Also allow realtime updates on home page (PR #748) -- [x] (Security) _Back-end_ Upgrade HealthChecks-packages, RazorLight, MetadataExtractor, System.Text.Json to latest version (PR #749) +- [x] (Security) _Back-end_ Upgrade HealthChecks-packages, RazorLight, MetadataExtractor, + System.Text.Json to latest version (PR #749) - [x] (Security) _Back-end_ Upgrade Swashbuckle, Test.Sdk, TestFramework to latest version (PR #749) - [x] (Fixed) _Back-end_ retry: InvalidOperationException: Can't replace active reader (PR #745) - [x] (Fixed) _Front-end_ Cmd or Ctrl + A in Search/Trash is selecting all items (PR #755) - [x] (Changed) _Tools_ Change build tool to from Cake to Nuke (PR #801, PR #791, PR #805, PR #806) -- [x] (Changed) _Back-end_ [Upgrade to .NET 6 - SDK 6.0.301 (Runtime: 6.0.6)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.6/6.0.6.md) (PR #796) -- [x] (Changed) _Back-end_ Include exiftool, admin1CodesASCII and cities1000 in build script (PR #815) -- [x] (Changed) _Back-end_ Change exiftool, admin1CodesASCII and cities1000 location to dependencies folder instead of temp (PR #815) +- [x] (Changed) + _Back-end_ [Upgrade to .NET 6 - SDK 6.0.301 (Runtime: 6.0.6)](https://github.com/dotnet/core/blob/main/release-notes/6.0/6.0.6/6.0.6.md) ( + PR #796) +- [x] (Changed) _Back-end_ Include exiftool, admin1CodesASCII and cities1000 in build script (PR + #815) +- [x] (Changed) _Back-end_ Change exiftool, admin1CodesASCII and cities1000 location to dependencies + folder instead of temp (PR #815) - [x] (Added) _Back-end_ Add 'osx-arm64' target to download and build scripts (PR #815) - [x] (Issue) Need to be fixed issue: #771 ## version 0.5.0-beta.5 - 2022-05-11 -- [x] (Changed) _Back-end_ Upgraded in same release ~ Upgrade to .NET 6 - SDK 6.0.202 (Runtime: 6.0.4) (PR #720) +- [x] (Changed) _Back-end_ Upgraded in same release ~ Upgrade to .NET 6 - SDK 6.0.202 (Runtime: + 6.0.4) (PR #720) - [x] (Changed) _Front-end_ Upgrade React 17.x to React 18.x (except createRoot change) (PR #724) - [x] (Security) _Frond-end_ Upgrade ClientApp CRA _(Create React App 5.0.1 (2022-04-12))_ (PR #724) -- [x] (Added) _Back-end_ Fixed locale issue with Notification API _(CultureInfo.CurrentCulture)_ (PR #730) +- [x] (Added) _Back-end_ Fixed locale issue with Notification API _(CultureInfo.CurrentCulture)_ (PR + #730) - [x] (Change) _Back-end_ Notification Content change from text to mediumtext (PR #731) - [x] (Change) _Back-end_ FileIndexItem Size column change from int to bigint (PR #731) - [x] (Security) _App_ Upgrade Electron to 18.0.4 (Node 16.x and Chromium 100.0.x) (PR #729) @@ -352,35 +428,45 @@ _Known issues #1106, #1107 and #1108_ - [x] (Change) _Back-end_ Changed SHA1CryptoServiceProvider to SHA1.Create (PR #733) - [x] (Change) _Back-end_ For Development change http port to 4000 instead of 5000 (PR #738) - [x] (Changed) Back-end Upgrade to .NET 6 - SDK 6.0.300 (Runtime: 6.0.5) (PR #746) -- [x] (Fixed) _App_ In the StarskyApp click with the middle mouse button on item gives a blank page (Issue #743 / PR #743) -- [x] (Fixed) _App_ In the StarskyApp Reload waiting to go to app keeps hanging (Issue #737 / PR #743) +- [x] (Fixed) _App_ In the StarskyApp click with the middle mouse button on item gives a blank + page (Issue #743 / PR #743) +- [x] (Fixed) _App_ In the StarskyApp Reload waiting to go to app keeps hanging (Issue #737 / PR + #743) ## version 0.5.0-beta.4 - 2022-04-15 - [x] (Changed) _Back-end_ Upgrade to .NET 6 - SDK 6.0.201 (Runtime: 6.0.3) (PR #674) -- [x] (Added) _Back-end_ Added package telemetry (Disable using: EnablePackageTelemetry setting) (PR #657) +- [x] (Added) _Back-end_ Added package telemetry (Disable using: EnablePackageTelemetry setting) (PR + #657) - [x] (Added) _Back-end_ Add Package Telemetry to Background Service (PR #683) - [x] (Added) _Back-end_ Add Telemetry debug option: `app__EnablePackageTelemetryDebug` (PR #701) - [x] (Fixed) _Tools_ Show Quality Gate during Pull Requests (PR #707) -- [x] (Fixed) _Front-end_ React unit tests are now succeeding using Windows, Mac/Linux did already work (PR #708) +- [x] (Fixed) _Front-end_ React unit tests are now succeeding using Windows, Mac/Linux did already + work (PR #708) - [x] (Fixed) _Back-end_ Reference errors for Telemetry (PR #709 / Issue #710) -- [x] (Fixed) _Back-end_ Issue where colorClass import transform gives a wrong fileHash in database (PR #709) +- [x] (Fixed) _Back-end_ Issue where colorClass import transform gives a wrong fileHash in + database (PR #709) - [x] (Fixed) _Back-end_ Parent database items missing, added check (PR #713 / Issue #711) - [x] (Fixed) _Back-end_ ColorClass is not written down (bug from #709) (PR #717) - [x] (Breaking Change) _Back-end_ WebSocket Data Model is changed (PR #712) -- [x] (Breaking Change) _Back-end_ remove System messages and replaced it with type keyword (PR #712) +- [x] (Breaking Change) _Back-end_ remove System messages and replaced it with type keyword (PR + #712) - [x] (Breaking Change) _Back-end_ Add types for web sockets (PR #712) - [x] (Change) _Back-end_ Notification Table (including Data Migration) (PR #712) -- [x] (Change) _Back-end_ The following Import Table fields: ColorClass and DateTimeFromFileName are added (including Data Migration) (PR #712) +- [x] (Change) _Back-end_ The following Import Table fields: ColorClass and DateTimeFromFileName are + added (including Data Migration) (PR #712) - [x] (Fixed) _Back-end_ TrackDependency will be ignored when null (PR #712) - [x] (Change) _Back-end_ Split MetaReplace and MetaUpdate into two separate controllers (PR #712) - [x] (Change) _Back-end_ Fix null checks for ReadGpxFile (PR #712) -- [x] (Change) _Back-end_ Add Notification controller to get recent history of notifications (PR #712) +- [x] (Change) _Back-end_ Add Notification controller to get recent history of notifications (PR + #712) - [x] (Added) _Back-end_ Default values `.stfolder`, `.git` to SyncIgnore (PR #712) - [x] (Added) _Front-end_ Change checks for WebSocket Messages to support new pattern (PR #712) -- [x] (Added) _Front-end_ Save server side datetime objects to query history notifications api (PR #712) +- [x] (Added) _Front-end_ Save server side datetime objects to query history notifications api (PR + #712) - [x] (Added) _Back-end_ Add cleanup job for old notifications in database (PR #712) -- [x] (Breaking Change) _Back-end_ for mysql: utf8mb4 is now used for the database and applied after the migrations are executed (PR #723) +- [x] (Breaking Change) _Back-end_ for mysql: utf8mb4 is now used for the database and applied after + the migrations are executed (PR #723) - [x] (Added) _Back-end_ for mysql: AutoIncrement on Notifications table (PR #723) - [x] (Removed) ImportQuery.NetFramework class is removed (PR #723) - [x] (Change) _Back-end_ Retry when: Can't replace active reader (mysql) (PR #723) @@ -391,14 +477,19 @@ _Known issues #1106, #1107 and #1108_ - [x] (Breaking change) _Back-end_ Upgrade to .NET 6 - SDK 6.0.200 (PR #642) - [x] (Breaking change) _Back-end_ Change mirror locations (exiftool/geonames) (PR #642) - [x] (Changed) _Back-end_ Upgrade deps ImageSharp and RazorLight (PR #652) -- [x] (Changed) _Back-end_ Write stream to unique temp folder to avoid collision with filenames (PR #653) +- [x] (Changed) _Back-end_ Write stream to unique temp folder to avoid collision with filenames (PR + #653) - [x] (Changed) _Tools_ Fix some end2end tests (PR #653) -- [x] (Fixed) _Back-end_ System.OutOfMemoryException trigger Garbage collection (PR #661 / Issue #660) +- [x] (Fixed) _Back-end_ System.OutOfMemoryException trigger Garbage collection (PR #661 / Issue + #660) - [x] (Fixed) _Back-end_ Remove Apple from VideoUseLocalTime since they use UTC (PR #661) -- [x] (Fixed) _Back-end_ Write first tmp file in upload controller to avoid partly written stream (PR #661 / Issue #662) +- [x] (Fixed) _Back-end_ Write first tmp file in upload controller to avoid partly written stream ( + PR #661 / Issue #662) - [x] (Fixed) _Back-end_ PreserveCompilationContext set for RazorLight cshtml generation -- [x] (Fixed) _Back-end_ Fix ImageSharp default behavior for writing base64 strings (PR #665 / Issue #664) -- [x] (Fixed) _Back-end_ Should not add TelemetryClient, instead re-use it to avoid memory issues (PR #666) +- [x] (Fixed) _Back-end_ Fix ImageSharp default behavior for writing base64 strings (PR #665 / Issue + #664) +- [x] (Fixed) _Back-end_ Should not add TelemetryClient, instead re-use it to avoid memory issues ( + PR #666) - [x] (Fixed) _Back-end_ When publish use extension of output type instead of source type (PR #666) - [x] (Fixed) _Back-end_ Add retry with delay for QueryGetAllObjects (PR #666) - [x] (Fixed) _Back-end_ Fix culture for tests and mp4/quicktime (PR #673) @@ -417,28 +508,33 @@ _Known issues #1106, #1107 and #1108_ - [x] (Changed) _Back-end_ Add request tracking for FSW SyncWatcherConnector (PR #589) - [x] (Changed) _Tools_ Add insider script for download Github artifacts (PR #589) -- [x] (Changed) _App_ Middle mouse click in Electron app shows login page instead of content (PR #596 Issue #592 and PR #600) +- [x] (Changed) _App_ Middle mouse click in Electron app shows login page instead of content (PR + #596 Issue #592 and PR #600) - [x] (Changed) _Front-end_ Add Trash title instead of !delete! (PR #597) - [x] (Changed) _Front-end_ Add Search query title instead (PR #597) - [x] (Changed) _Front-end_ Order by ImageFormat and then by filename (PR #598) -- [x] (Breaking change) _Back-end_ change default option in Thumbnail-er cli to scan directories to enabled (-t true default) (PR #601) +- [x] (Breaking change) _Back-end_ change default option in Thumbnail-er cli to scan directories to + enabled (-t true default) (PR #601) - [x] (Added) _Back-end_ env variable to create swagger export and exit (PR #601) - [x] (Added) _Back-end_ ARW SubIfd does contain multiple objects (PR #639) - [x] (Fixed) _Back-end_ When zoom, edit and go back the image is gone (PR #638) ## version 0.5.0-beta.0 - 2021-12-29 -- [x] (Breaking change) _CLI_ Removed sync cli (starskysynccli) which is replaced by starskysynchronizecli (PR #563) +- [x] (Breaking change) _CLI_ Removed sync cli (starskysynccli) which is replaced by + starskysynchronizecli (PR #563) - [x] (Removed) _CLI_ Removed Net framework version which is replaced by .NET Core (PR #563) - [x] (Breaking change) _Back-end_ Removed obsolete SubPathSlashRemove API (PR #563) - [x] (Breaking change) _Back-end_ Removed old sync API (PR #563) - [x] (Security) _Front-end_ Upgrade Prettier 2.5.1 and React scripts 5.0.0 (PR #569) - [x] (Breaking change) _Front-end_ Prettier new eslint rules 4.0.0 (PR #569) -- [x] (Fixed) _Back-end_ IndexController with empty string introduced with removal of SubPathSlashRemove (PR #571) +- [x] (Fixed) _Back-end_ IndexController with empty string introduced with removal of + SubPathSlashRemove (PR #571) - [x] (Changed) _Back-end_ Upgrade Electron to 16.x and Electron Builder to 22.14.x (PR #571) - [x] (Breaking change) _Back-end_ rename "/api/sync/mkdir" to /api/disk/mkdir (PR #574) - [x] (Breaking change) _Back-end_ rename "/api/sync/rename" to /api/disk/rename (PR #574) -- [x] (Changed) _Tools_ Upgrade local build tools Cake __(Cake isn't used anymore)__ and dotnet-reportgenerator-globaltool and dotnet-sonarscanner (PR #575) +- [x] (Changed) _Tools_ Upgrade local build tools Cake __(Cake isn't used anymore)__ and + dotnet-reportGenerator-globalTool and dotnet-sonarScanner (PR #575) - [x] (Changed) _Back-end_ Avoid Disposed Query objects in syncWatcherConnector (PR #575) - [x] (Changed) _Back-end_ change FileSystemWatcher to BufferingFileSystemWatcher (PR #575) - [x] (Changed) _Back-end_ Add filter for FileSystemWatcher spamming with lots of events (PR #575) @@ -447,11 +543,14 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Front-end_ Setup with wrong database connection give now explanation (PR #581) - [x] (App) _Back-end_ UI update with storage folder is reverted after restart (PR #584 Issue #582) - [x] (Fixed) _Back-end_ NoAccountLocalhostMiddleware with no database has no roles error (PR #483) -- [x] (Fixed) _Back-end_ Add ImageStabilisation and database migration (only add new field) (PR #483) -- [x] (Fixed) _Back-end_ Fixed issue with Sony Lens Tamron lenses are diplaying dashes (PR #483) +- [x] (Fixed) _Back-end_ Add ImageStabilisation and database migration (only add new field) (PR + #483) +- [x] (Fixed) _Back-end_ Fixed issue with Sony Lens Tamron lenses are displaying dashes (PR #483) - [x] (App) _Back-end_ UI update with storage folder is reverted after restart (PR #584 Issue #582) -- [x] (Breaking change) _Back-end_ Dropped support for older Mac OS version: now 10.15+ is required see: -- [x] (Breaking change) Dropped support link: https://github.com/dotnet/core/blob/main/release-notes/3.1/3.1-supported-os.md +- [x] (Breaking change) _Back-end_ Dropped support for older Mac OS version: now 10.15+ is required + see: +- [x] (Breaking change) Dropped support + link: https://github.com/dotnet/core/blob/main/release-notes/3.1/3.1-supported-os.md - [x] (Added) _Back-end_ Application Insights track events in DiskWatcherQueue (PR #583) - [x] (Changed) _App_ Missing content length (PR #587) - [x] (Changed) _App_ Use generic OSX id (PR #588) @@ -463,66 +562,94 @@ _Known issues #1106, #1107 and #1108_ - [x] (Fixed) _Back-end_ Fix for type LockoutEnd (PR #510) - [x] (Changed) _Back-end_ Add migration for MakeModel in ImportIndex (PR #510) - [x] (Fixed) _Tools_ Add push to gpx loader for mail (PR #510) -- [x] (Added) _Back-end_ Add feature (appSettings) `ApplicationInsightsDatabaseTracking` - Track database dependencies (PR #528) -- [x] (Added) _Back-end_ Add feature toggle (appSettings) `ApplicationInsightsLog` - Add WebLogger output to Application Insights (PR #528) +- [x] (Added) _Back-end_ Add feature (appSettings) `ApplicationInsightsDatabaseTracking` - Track + database dependencies (PR #528) +- [x] (Added) _Back-end_ Add feature toggle (appSettings) `ApplicationInsightsLog` - Add WebLogger + output to Application Insights (PR #528) - [x] (Added) _Back-end_ Filter for DiskWatcher sync to prevent database overload (PR #529) -- [x] (Changed) _Back-end_ Upgrade dependencies for SixLabors.ImageSharp, ApplicationInsights, (PR #533) -- [x] (Changed) _Back-end_ Upgrade dependencies: System.Threading.Tasks.Dataflow, Swashbuckle.AspNetCore and MSTest (PR #533) +- [x] (Changed) _Back-end_ Upgrade dependencies for SixLabors.ImageSharp, ApplicationInsights, (PR + #533) +- [x] (Changed) _Back-end_ Upgrade dependencies: System.Threading.Tasks.Dataflow, + Swashbuckle.AspNetCore and MSTest (PR #533) - [x] (Changed) _Back-end_ Upgrade SDK Version to 3.1.415 & Runtime version to 3.1.21 (PR #535) -- [x] (Changed) _Back-end_ Rewrite thumbnail cleaner with chunks (CleanAllUnusedFilesAsync) (PR #531) +- [x] (Changed) _Back-end_ Rewrite thumbnail cleaner with chunks (CleanAllUnusedFilesAsync) (PR + #531) - [x] (Changed) _Back-end_ Auto download Exiftool from mirror when main source is not up (PR #531) -- [x] (Changed) _Back-end_ Change default LogLevel settings in appsettings.json (PR #531) -- [x] (Changed) _Back-end_ Handle exceptions for HttpClientHelper to not interupt (PR #531) +- [x] (Changed) _Back-end_ Change default LogLevel settings in appSettings.json (PR #531) +- [x] (Changed) _Back-end_ Handle exceptions for HttpClientHelper to not interrupt (PR #531) - [x] (Changed) _Back-end_ Change DiskWatcher background queue system (PR #536) - [x] (Changed) _Back-end_ Add disk telemetry-channels when app is crashed (PR #536) - [x] (Changed) _Back-end_ Flush Application Insights on ApplicationStopping (PR #536) - [x] (Changed) _Back-end_ Move GeoBackgroundTask to GeoLookUp feature (PR #540) -- [x] (Changed) _Back-end_ Add 10 seconds cache to UpdateAsync for performance reasons / diskWatcher catch up SetGetObjectByFilePathCache (PR #540) -- [x] (Changed) _Back-end_ Remove NewtonSoftJson from PublishManifest and use System.Text.Json (PR #540) +- [x] (Changed) _Back-end_ Add 10 seconds cache to UpdateAsync for performance reasons / diskWatcher + catch up SetGetObjectByFilePathCache (PR #540) +- [x] (Changed) _Back-end_ Remove NewtonSoftJson from PublishManifest and use System.Text.Json (PR + #540) - [x] (Changed) _Back-end_ Remove NewtonSoftJson from various models (PR #540) - [x] (Changed) _Back-end_ Remove sync CleanAllUnusedFiles (PR #540) -- [x] (Added) _Back-end_ Add event-counters to application insights https://docs.microsoft.com/en-us/azure/azure-monitor/app/eventcounters +- [x] (Added) _Back-end_ Add event-counters to application + insights https://docs.microsoft.com/en-us/azure/azure-monitor/app/eventcounters - [x] (Added) _Back-end_ setAuthenticatedUserContext for Application Insights (PR #540) -- [x] (Added) _Back-end_ OperationId in RequestTelemetryHelper to track background Tasks in Application Insights (PR #540) +- [x] (Added) _Back-end_ OperationId in RequestTelemetryHelper to track background Tasks in + Application Insights (PR #540) - [x] (Added) _Back-end_ QueueBackgroundWorkItem for DiskWatcher to have a separate queue (PR #540) - [x] (Changed) _Back-end_ Change GeoLocationWrite to async variant (PR #540) -- [x] (Security) _Back-end_ Upgrade dependencies (PR #548 & #547 & #546 & #545 & #544 & #543 & #542 & #541) -- [x] (Fixed) _Back-end_ Extend ServiceCollectionExtensions to load more Assemblies to get auto mapped by the service attribute (PR #550) -- [x] (Added) _Back-end_ Add Application Insights logging for CLI Applications (Admin, Geo, Import, Synchronize, Thumbnail) (PR #552) +- [x] (Security) _Back-end_ Upgrade dependencies (PR #548 & #547 & #546 & #545 & #544 & #543 & + #542 & #541) +- [x] (Fixed) _Back-end_ Extend ServiceCollectionExtensions to load more Assemblies to get auto + mapped by the service attribute (PR #550) +- [x] (Added) _Back-end_ Add Application Insights logging for CLI Applications (Admin, Geo, Import, + Synchronize, Thumbnail) (PR #552) - [x] (Changed) _Back-end_ Add dispose on parallel jobs (PR #552) -- [x] (Added) _Back-end_ Add index for IX_ImportIndex_FileHash and IX_Credentials_Id_Identifier (PR #555) -- [x] (Added) _Back-end_ Fix for cache ManualSync when item is removed or added its now correct updated (PR #555) -- [x] (Fixed) _Front-end_ Fix for Safari 14.x and newer that after close a modal, the scroll isn't locked anymore (PR #555) -- [x] (Fixed) _Back-end_ Add port to websocket url in connect-src for Safari 14.x using different port numbers (PR #555) -- [x] (Fixed) _Back-end_ Exception fix SQLite System.InvalidOperationException: ExecuteReader (PR #556) -- [x] (Fixed) _Back-end_ Fix FlushApplicationInsights.FlushAsync System.NullReferenceException (PR #557) +- [x] (Added) _Back-end_ Add index for IX_ImportIndex_FileHash and IX_Credentials_Id_Identifier (PR + #555) +- [x] (Added) _Back-end_ Fix for cache ManualSync when item is removed or added its now correct + updated (PR #555) +- [x] (Fixed) _Front-end_ Fix for Safari 14.x and newer that after close a modal, the scroll isn't + locked anymore (PR #555) +- [x] (Fixed) _Back-end_ Add port to websocket url in connect-src for Safari 14.x using different + port numbers (PR #555) +- [x] (Fixed) _Back-end_ Exception fix SQLite System.InvalidOperationException: ExecuteReader (PR + #556) +- [x] (Fixed) _Back-end_ Fix FlushApplicationInsights.FlushAsync System.NullReferenceException (PR + #557) - [x] (Changed) _Back-end_ Upgrade SDK Version to 3.1.416 & Runtime version to 3.1.22 (PR #558) ## version 0.4.12 - 2021-11-04 -- [x] (Changed) _Back-end_ Your account is locked for an hour when you enter 3 non valid passwords (PR #443 & #445 & #446) -- [x] (Changed) _Back-end_ Database migration for AccessFailedCount, LockoutEnabled and LockoutEnd in Users table (PR #443 & #445) -- [x] (Fixed) _Back-end_ Group parts of the regex together to make the intended operator precedence explicit for getting Filename in clientApp (PR #444) -- [x] (Breaking change) _Tools_ Dropbox has changed the way it authorized (September 30th, 2021), in dropbox-tools the refresh token is now used (PR #448) +- [x] (Changed) _Back-end_ Your account is locked for an hour when you enter 3 non valid passwords ( + PR #443 & #445 & #446) +- [x] (Changed) _Back-end_ Database migration for AccessFailedCount, LockoutEnabled and LockoutEnd + in Users table (PR #443 & #445) +- [x] (Fixed) _Back-end_ Group parts of the regex together to make the intended operator precedence + explicit for getting Filename in clientApp (PR #444) +- [x] (Breaking change) _Tools_ Dropbox has changed the way it authorized (September 30th, 2021), in + dropbox-tools the refresh token is now used (PR #448) - [x] (Fixed) _Back-end_ Dispose error on index page (Issue #424 / PR #449) - [x] (Added) _Back-end_ Support for `-software` search (issue #441 / PR #450) - [x] (Added) _Back-end_ Docker compose support (PR #469) -- [x] (Change) _Front-end_ Remove Enzeme as framework for unittests and use react testing framework (PR #463) +- [x] (Change) _Front-end_ Remove Enzeme as framework for unittests and use react testing + framework (PR #463) - [x] (Change) _Back-end_ Retry for DiskWatcher (PR #479) -- [x] (Change) _Back-end_ Max amount of retry for DiskWatcher when folders are not accessible (chown) (PR #490) -- [x] (Changed) _Back-end_ DiskWatcher in combination with child folders that have no access keeps a known issue -- [x] (Fixed) _Back-end_ Skip folders with meta thumbnail tool when folder has no read rights (PR #490) +- [x] (Change) _Back-end_ Max amount of retry for DiskWatcher when folders are not accessible ( + chown) (PR #490) +- [x] (Changed) _Back-end_ DiskWatcher in combination with child folders that have no access keeps a + known issue +- [x] (Fixed) _Back-end_ Skip folders with meta thumbnail tool when folder has no read rights (PR + #490) - [x] (Added) _Back-end_ Filter for import (ImportIgnore) (PR #490) - [x] (Added) _Back-end_ Add to docker hub and multi-arch build with buildx - [x] (Added) _Back-end_ use docker hub to pull images: `docker pull qdraw/starsky` ## version 0.4.11 - 2021-09-17 -- [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.17 (using SDK 3.1.411) (PR #428) +- [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.17 (using SDK 3.1.411) (PR + #428) - [x] (Fixed) _Back-end_ Make StorageFolder setting more clear (PR #429) - [x] (Fixed) _Back-end_ Change how appSettings are read to merge patch files (PR #429) - [x] (Security) _Front-end_ Upgrade npm packages for clientapp/starskyapp (PR #431) -- [x] (Changed) _Back-end_ Config order is documented in verbose help (add: -h -v to cli apps) (PR #432) +- [x] (Changed) _Back-end_ Config order is documented in verbose help (add: -h -v to cli apps) (PR + #432) - [x] (Changed) _Back-end_ When new, make more clear how to setup storageFolder path (PR #429) - [x] (Fixed) _Back-end_ When download.geonames.org is down pick mirror (PR #434) - [x] (Added) _Back-end_ more logging for exiftool downloader (PR #434) @@ -530,74 +657,102 @@ _Known issues #1106, #1107 and #1108_ ## version 0.4.10 - 2021-07-15 -- [x] (Fixed) _Back-end_ Performance change, FileIndexItem uses less memory in the application (PR #410) -- [x] (Fixed) _Back-end_ Change Replace to use a single database query and update to empty string (PR #412) +- [x] (Fixed) _Back-end_ Performance change, FileIndexItem uses less memory in the application (PR + #410) +- [x] (Fixed) _Back-end_ Change Replace to use a single database query and update to empty string ( + PR #412) - [x] (Fixed) _Back-end_ Fix fast updating items to update the cache before update (PR #412) -- [x] (Change) _Back-end_ Push direct to socket when update or replace to avoid undo after a second (PR #412) -- [x] (Change) _Back-end_ Add 2000 px and 300 px size for thumbnails to match better with larger and smaller screens (PR #380) -- [x] (Change) _Back-end_ Add Meta Thumbnail (150px) to get faster archive and search pages (PR #380) +- [x] (Change) _Back-end_ Push direct to socket when update or replace to avoid undo after a + second (PR #412) +- [x] (Change) _Back-end_ Add 2000 px and 300 px size for thumbnails to match better with larger and + smaller screens (PR #380) +- [x] (Change) _Back-end_ Add Meta Thumbnail (150px) to get faster archive and search pages (PR + #380) - [x] (Change) _Back-end_ Use 2000 px image in overlay (Publish) when available (PR #380) -- [x] (Change) _Back-end_ Start /api/thumbnail-generation in different thread instead of que (PR #380) -- [x] (Added) _Back-end_ Add API "/api/thumbnail/list-sizes/\{HashHere\}" to check if the multiple sizes are there (PR #414) +- [x] (Change) _Back-end_ Start /api/thumbnail-generation in different thread instead of que (PR + #380) +- [x] (Added) _Back-end_ Add API "/api/thumbnail/list-sizes/\{HashHere\}" to check if the multiple + sizes are there (PR #414) - [x] (Change) _Back-end_ Update thumbnail starsky-tools to use list-sizes API (PR #414) - [x] (Change) _Back-end_ Add support for multiple sizes for the Thumbnail cleaner (PR #419) -- [x] (Fixed) _Back-end_ Set fallback image of ToBase64DataUriList when generation failed, instead of exception (PR #418) +- [x] (Fixed) _Back-end_ Set fallback image of ToBase64DataUriList when generation failed, instead + of exception (PR #418) - [x] (Fixed) _Back-end_ Publish retry when output is corrupt (PR #418) - [x] (Fixed) _Front-end_ Fix check when no results are returned in publish modal (hotfix) -- [x] (Fixed) _Tools_ Change image resampler in starsky-tools to bicubic for sharper output (hotfix 20210703) -- [x] (Fixed) _Back-end_ Change image resampler in .NET to Lanczos3 for sharper output (hotfix 20210703) -- [x] (Changed) _Front-end_ Change default option to load smaller images (isSingleItem to alwaysLoadImage) (PR #420) +- [x] (Fixed) _Tools_ Change image re-sampler in starsky-tools to bicubic for sharper output (hotfix + 2021-07-03) +- [x] (Fixed) _Back-end_ Change image re-sampler in .NET to Lanczos3 for sharper output (hotfix + 2021-07-03) +- [x] (Changed) _Front-end_ Change default option to load smaller images (isSingleItem to + alwaysLoadImage) (PR #420) - [x] (Changed) _Front-end_ Upgrade npm packages in clientapp (PR #421) - [x] (Changed) _Tools_ Upgrade npm packages in starsky-tools/thumbnail (PR #422) - [x] (Added) _App_ Add logging to app and write it to disk (PR #423) -- [x] (Fixed) _Back-end_ Fix issue where sync with empty database adds a folder with only / to view (PR #423) -- [x] (Changed) _Back-end_ Enable useDiskWatcher by default, so file changes are picked up directly (PR #423) -- [x] (Added) _App_ Logs are stored by default in AppData or Application Support or .config folder (PR #423) +- [x] (Fixed) _Back-end_ Fix issue where sync with empty database adds a folder with only / to + view (PR #423) +- [x] (Changed) _Back-end_ Enable useDiskWatcher by default, so file changes are picked up + directly (PR #423) +- [x] (Added) _App_ Logs are stored by default in AppData or Application Support or .config folder ( + PR #423) ## version 0.4.9 - 2021-06-17 - [x] (Fixed) _Front-end_ Show error when update fails in archive list (PR #391) -- [x] (Fixed) _Front-end_ Fix for keeps loading forever if use fileList (archive) fails (issue #382 & PR #392) +- [x] (Fixed) _Front-end_ Fix for keeps loading forever if use fileList (archive) fails (issue + #382 & PR #392) - [x] (Fixed) _Front-end_ Add retry/reload button in Application Exception page (PR #392) -- [x] (Fixed) _Back-end_ Refactor Update validation to perform faster _(using a single query)_ (PR #394) +- [x] (Fixed) _Back-end_ Refactor Update validation to perform faster _(using a single query)_ (PR + #394) - [x] (Fixed) _Back-end_ Rename thumbnail before exifTool writes the file (PR #396) - [x] (Fixed) _Back-end_ Issue where filePath is marked as change (PR #401) - [x] (Fixed) _Back-end_ SolveConcurrencyException also fixed for disposed objects (PR #401) - [x] (Fixed) _Back-end_ Skip socket push when item is not changed (Issue #399 & PR #402) -- [x] (Fixed) _Back-end_ When updating the tags fast, the tool isn't keep track _(now only works when cache is enabled)_ (PR #402) +- [x] (Fixed) _Back-end_ When updating the tags fast, the tool isn't keep track _(now only works + when cache is enabled)_ (PR #402) ## version 0.4.8 - 2021-05-07 - [x] (Changed) _Front-end_ Make Archive UI more white & Dark mode UI fixes (PR #358) -- [x] (Added) _Front-end_ In select mode press delete key should move to trash in archive & search view (PR #360 / Issue #357) -- [x] (Fixed) _Back-end_ Remove check if byte size is the same for example when updating colorClass is the same (PR #362) +- [x] (Added) _Front-end_ In select mode press delete key should move to trash in archive & search + view (PR #360 / Issue #357) +- [x] (Fixed) _Back-end_ Remove check if byte size is the same for example when updating colorClass + is the same (PR #362) - [x] (Fixed) _Back-end_ Change Byte size to datetime last-edited (PR #362) - [x] (Changed) _Back-end_ Need to re-sync thumbnails due changed fileHash (PR #362 & PR #361) -- [x] (Changed) _Back-end_ When run sync v2, only check on last edit time instead of filesize (PR #362 & PR #361) +- [x] (Changed) _Back-end_ When run sync v2, only check on last edit time instead of filesize (PR + #362 & PR #361) - [x] (Added) _Back-end_ Added logs to Application Insights when key is configured (PR #363) -- [x] (Added) _Back-end_ Add manual sync for new api (/api/synchronize) and update via websockets (PR #363) +- [x] (Added) _Back-end_ Add manual sync for new api (/api/synchronize) and update via websockets ( + PR #363) - [x] (Added) _Front-end_ Change manual sync to new api (/api/synchronize) (PR #363) -- [x] (Fixed) _Front-end_ Force sync is not endless loading after socket update (Issue #371 & PR #375) +- [x] (Fixed) _Front-end_ Force sync is not endless loading after socket update (Issue #371 & PR + #375) - [x] (Fixed) _Back-end_ Publish name with underscore breaks publish api (Issue #369 & PR #376) ## version 0.4.7 - 2021-04-11 -- [x] (Changed) _Back-end_ add cache for health check and timeout for 10 seconds on health calls (PR #332) +- [x] (Changed) _Back-end_ add cache for health check and timeout for 10 seconds on health calls (PR + #332) - [x] (Fixed) _Front-end_ Zoom function for mobile (DetailView) (PR #327/ Issue #317) - [x] (Added) _Front-end_ Keyboard shortcuts Cmd + = and Cmd + - (DetailView) (PR #327/ Issue #317) - [x] (Fixed) _Back-end_ Sending empty string on "/api/publish/exist" should return true (PR #334) - [x] (Added) _Front-end_ Add publish option to Search and DetailView (PR #335/ Issue #298) -- [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.13 (using SDK 3.1.407) (PR #338 & #337) -- [x] (Changed) _Tools_ make it easier to deploy starsky with the new pm2 instances bash script to auto download releases (PR #341) -- [x] (Fixed) _Front-end_ Publish selection click in modal closes and opens more menu in the right corner of the screen (PR #339/ Issue #336) +- [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.13 (using SDK 3.1.407) (PR + #338 & #337) +- [x] (Changed) _Tools_ make it easier to deploy starsky with the new pm2 instances bash script to + auto download releases (PR #341) +- [x] (Fixed) _Front-end_ Publish selection click in modal closes and opens more menu in the right + corner of the screen (PR #339/ Issue #336) - [x] (Fixed) _Back-end_ Performance improvement by hash size limit (pull/348 issue/345) - [x] (Fixed) _Back-end_ Fix for SQLite exception (pull/348 issue/344) - [x] (Fixed) _Tools_ Make install scripts easier for the server in combination with PM2 (pull/348) - [x] (Fixed) _Back-end_ DbUpdateConcurrencyException save after, instead of nothing (pull #349) -- [x] (Fixed) _Back-end_ fix issue where rename did not work in combination with useDiskWatcher (issue #347 pull #349) +- [x] (Fixed) _Back-end_ fix issue where rename did not work in combination with useDiskWatcher ( + issue #347 pull #349) - [x] (Fixed) _Front-end_ input field when using safari you should not break words (pull #359) - [x] (Changed) _Back-end_ Geo CLI downloads now on startup dependencies (Issue #340 / pull #351) -- [x] (Fixed) _Back-end_ Rename service should now work with useDiskWatcher:true (Issue #352 / pull #354 & #355) +- [x] (Fixed) _Back-end_ Rename service should now work with useDiskWatcher:true (Issue #352 / pull + #354 & #355) - [x] (Fixed) _Back-end_ Delete floating folders in database on scan synchronize (pull #354) ## version 0.4.6 - 2021-03-21 @@ -605,23 +760,32 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Front-end_ add prefilled selected option for - [x] (Added) _Front-end_ add sort option for fileName and ImageFormat but only on archive pages - [x] (Fixed) _Front-end_ Switch the text of the show raw button in Display options -- [x] (Fixed) _Front-end_ When last file with colorClass is removed, the display is now correct (PR #313) -- [x] (Fixed) _Front-end_ Implicit delete by updating from sockets should now not cover collection items with the same base name (PR #313) -- [x] (Fixed) _Back-end_ When use DeleteItem the child directories are not stored in the database (PR #314) -- [x] (Fixed) _Back-end_ Give removed items back when using `/api/rename` as status NotFoundSourceMissing (PR #314) -- [x] (Fixed) _Back-end_ Don't create duplicate database items when there is already a database item in the output folder, but not on disk (PR #314) +- [x] (Fixed) _Front-end_ When last file with colorClass is removed, the display is now correct (PR + #313) +- [x] (Fixed) _Front-end_ Implicit delete by updating from sockets should now not cover collection + items with the same base name (PR #313) +- [x] (Fixed) _Back-end_ When use DeleteItem the child directories are not stored in the database ( + PR #314) +- [x] (Fixed) _Back-end_ Give removed items back when using `/api/rename` as status + NotFoundSourceMissing (PR #314) +- [x] (Fixed) _Back-end_ Don't create duplicate database items when there is already a database item + in the output folder, but not on disk (PR #314) - [x] (Security) _Frond-end_ Upgrade ClientApp CRA _(Create React App 4.0.3 2021-02-22)_ (PR #318) - [x] (Security) _App_ Upgrade Electron to 12.x (PR #318) - [x] (Fixed) _App_ Fix local remote toggle in settings not switching the file watcher (PR #318) - [x] (Fixed) _Back-end_ DbUpdateConcurrencyException when renaming (PR #320 / Issue #312) -- [x] (Fixed) _Front-end_ Connection error gives now ServerError instead of failing silence (PR #323 / Issue #322 ) -- [x] (Fixed) _Front-end_ Flat list behind query parameter `?list=true`, on archive pages, there is no UI option yet (PR #302 Issue #251) -- [x] (Fixed) _Front-end_ Detailview command click on close keeps loading (PR #324 Issue #316) -- [x] (Changed) _Front-end_ Rename of 'Close' to 'Parent Folder' because its looks like closing a window and it is't the same (PR #324) +- [x] (Fixed) _Front-end_ Connection error gives now ServerError instead of failing silence (PR + #323 / Issue #322 ) +- [x] (Fixed) _Front-end_ Flat list behind query parameter `?list=true`, on archive pages, there is + no UI option yet (PR #302 Issue #251) +- [x] (Fixed) _Front-end_ DetailView command click on close keeps loading (PR #324 Issue #316) +- [x] (Changed) _Front-end_ Rename of 'Close' to 'Parent Folder' because its looks like closing a + window and it isn't the same (PR #324) ## version 0.4.5 - 2021-02-14 -- [x] (Fixed) _Back-end_ When remove a folder, the files within the folder are still in the database bug _issue #188_ +- [x] (Fixed) _Back-end_ When remove a folder, the files within the folder are still in the database + bug _issue #188_ - [x] (Fixed) _Front-end_ Displaying files in realtime works now _issue #275_ - [x] (Fixed) _Front-end_ Archive when added tag/description is cleared is still send _issue #279_ - [x] (Changed) _Back-end_ "/api/thumbnail/\{f\}" status 409 is changed to status 210 @@ -630,32 +794,39 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Front-end_ Keyboard accelerator Command / Ctrl A _issue #247_ - [x] (Added) _Back-end_ add logger (Microsoft.Extensions.Logging.Abstractions) - [x] (Added) _Back-end_ RetryHelper for IOExceptions using Windows OS -- [x] (Changed) _Back-end_ Change default logging settings in appsettings.json to have less Information -- [x] (Changed) _Back-end_ Disable TieredCompilationQuickJit and TieredCompilation are disabled for optimization -- [x] (Changed) _Back-end_ performance update for metaPreflight, reduced a cache call. Helpful for large folders +- [x] (Changed) _Back-end_ Change default logging settings in appsettings.json to have less + Information +- [x] (Changed) _Back-end_ Disable TieredCompilationQuickJit and TieredCompilation are disabled for + optimization +- [x] (Changed) _Back-end_ performance update for metaPreflight, reduced a cache call. Helpful for + large folders - [x] (Security) _Frond-end_ Upgrade ClientApp CRA _(Create React App 4.0.2 2021-02-03)_ - [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.12 (using SDK 3.1.112) ## version 0.4.4 - 2021-01-10 - [x] (Security) _App_ npm audit fix node_modules/ini 1.3.8 -- [x] (Fixed) _Front-end_ When updating tags in sidebar and refresh afterwards its now not the old value anymore +- [x] (Fixed) _Front-end_ When updating tags in sidebar and refresh afterwards its now not the old + value anymore - [x] (Fixed) _App_ Starting from another user in Mac OS should work now - [x] (Fixed) _Front-end_ Label copy (press c and v) does not save with titles - issue #248 -- [x] (Fixed) _Front-end_ update websocket data for other items outside view when receiving data bug - issue #265 +- [x] (Fixed) _Front-end_ update websocket data for other items outside view when receiving data + bug - issue #265 - [x] (Fixed) _App_ when changing from local to remote it should open new window - issue #271 - [x] (Fixed) _App_ when changing from local to remote it should add watcher be updated - issue #271 - [x] (Fixed) _Front-end_ hide 'sign in instead' button on register page when there are no users yet ## version 0.4.3 - 2020-12-24 -- [x] (Fixed) _Back-end_ the latest version isn't checked right, it takes the oldest version to compare with +- [x] (Fixed) _Back-end_ the latest version isn't checked right, it takes the oldest version to + compare with - [x] (Changed) _App_ Rewrite of desktop application - [x] (Changed) _App_ Desktop settings app-settings is changed to "starksy-app-settings.json" - [x] (Changed) _Back-end_ Allow version parameter for "/api/health/version" - [x] (Fixed) _Front-end_ Use real-time update Color class outside selection #252 - [x] (Added) _App_ Add Dutch translation to menu's -- [x] (Fixed) _Back-end_ When saving StorageFolder from Preferences its now saved in the right format +- [x] (Fixed) _Back-end_ When saving StorageFolder from Preferences its now saved in the right + format - [x] (Fixed) _Back-end_ Files that are not in the index should not be listed in the cache - [x] (Security) _App_ node-notifier from 8.0.0 to 8.0.1 #258 - [x] (Fixed) _Back-end_ Add check for duplicate folders in the database in synchronize @@ -672,7 +843,8 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Front-end_ Add menu text & Rename Collection mode to Show raw files - [x] (Added) _Back-end_ When making new directory this broadcast it correctly using sockets - [x] (Added) _Front-end_ Enable touch swipe right and left on detailView pages to go next/prev -- [x] (Fixed) _Back-end_ Import is now not adding duplicate content if UseDiskWatcher is faster to add items +- [x] (Fixed) _Back-end_ Import is now not adding duplicate content if UseDiskWatcher is faster to + add items - [x] (Fixed) _Back-end_ Add filter (AppSettings.SyncIgnore) for sync (starsky.foundation.sync) #73 - [x] (Added) _Back-end_ Update Sidecar field when running sync - [x] (Added) _Front-end_ Socket notification close causes app crash @@ -686,7 +858,8 @@ _Known issues #1106, #1107 and #1108_ - [x] (Added) _Back-end_ Realtime Files API (issue #75) behind _useDiskWatcher_ feature toggle - [x] (Added) _Back-end_ New Sync service 'starsky.foundation.sync' behind new API - [x] (Added) _Back-end_ Split Sync in starskysynchronizecli and starskythumbnailcli -- [x] (Deprecated) _Back-end_ Old Sync CLI, replaced by starskysynchronizecli (to be removed in future release) +- [x] (Deprecated) _Back-end_ Old Sync CLI, replaced by starskysynchronizecli (to be removed in + future release) - [x] (Added) _Back-end_ Notify realtime websockets when DiskWatcher detects changes - [x] (Added) _Back-end_ Notify other users when a file or folder is moved #212 - [x] (Changed) _Back-end_ Importer does update the database when file copy happens #104 @@ -699,28 +872,35 @@ _Please check the breaking changes of 0.4.0-beta.0 and 0.4.0-beta.1_ - [x] (Changed) _App_ Add styling to settings UI in App - [x] (Fixed) _Back-end_ Add extra catch to prevent sync issues when exif reading fails -- [x] (Deprecated) _Back-end_ Json Sidecar format is very likely to change in future releases and be incompatible +- [x] (Deprecated) _Back-end_ Json Sidecar format is very likely to change in future releases and be + incompatible - [x] (Added) _App_ Add extra delay to check for updates to avoid issues when local - [x] (Added) _App_ Add fix for selecting wrong domains to avoid an exception -- [x] (Fixed) _Back-end_ When switching very fast after update, info isn't updated until process is done (this is fixed) +- [x] (Fixed) _Back-end_ When switching very fast after update, info isn't updated until process is + done (this is fixed) - [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.9 (using SDK 3.1.403) - [x] (Fixed) _Front-end_ Clean Front-end cache when moving file/renaming file - [x] (Fixed) _Front-end_ Change text when selecting an non existing filter combination - [x] (Fixed) _Back-end_ Fix for dispose Errors in Query - [x] (Fixed) _Back-end_ Allow upload to folder with files that are uppercase -- [x] (Fixed) _Back-end_ Database-item is now correct updated when you move an item to the root folder (/) +- [x] (Fixed) _Back-end_ Database-item is now correct updated when you move an item to the root + folder (/) - [x] (Security) _App_ Update Electron to 10.1.5 (Node 12.16.x and Chromium 85.0.x) -- [x] (Added) _Back-end_ In the rename/move API When enable Collections, this files are also moved (file to folder) +- [x] (Added) _Back-end_ In the rename/move API When enable Collections, this files are also moved ( + file to folder) - [x] (Added) _Back-end_ Xmp sidecar files are moved with gif/bmp/Raw/mp4 file types -- [x] (Added) _Back-end_ In the rename API When enable Collections, this files are also moved (file to deleted) -- [x] (Deprecated) _App_ The current app-settings (so only the default app/remote location) are going to change. - if you update those could be gone. but you could set them again +- [x] (Added) _Back-end_ In the rename API When enable Collections, this files are also moved (file + to deleted) +- [x] (Deprecated) _App_ The current app-settings (so only the default app/remote location) are + going to change. + if you update those could be gone. but you could set them again ## version 0.4.0-beta.2 - 2020-11-04 - [x] (Changed) _Front-end_ Enable sockets client side option by default - [x] (Changed) _Back-end_ UseRealtime (sockets) backend option changed to enable by default -- [x] (Fixed) _Front-end_ When updating files with realtime mode on, collection mode raws are shown after update +- [x] (Fixed) _Front-end_ When updating files with realtime mode on, collection mode raws are shown + after update - [x] (Added) _Back-end_ API to check if current version is the latest on github releases - [x] (Added) _Front-end_ Clientside check for latest version (click away for 4 days) - [x] (Added) _App_ Check for latest version and click away for 4 days @@ -732,15 +912,19 @@ _First release on Github Releases_ - [x] (Added) _App_ Press 'Command/Ctrl + E' to Edit a file with local tools (Mac OS & Windows) - [x] (Fixed) _Front-end_ Going next en prev in search detail view context is going more smooth - [x] (Fixed) _Back-end_ Allow websockets in CSP for Safari and old Firefox -- [x] (Breaking change) _Back-end_ Change "/api/health/version" now its needed to upgrade StarskyApp to 0.3 or newer +- [x] (Breaking change) _Back-end_ Change "/api/health/version" now its needed to upgrade StarskyApp + to 0.3 or newer - [x] (Added) _Back-end_ Add Sidecar API (xmp files) for getting by filepath - [x] (Added) _Back-end_ Uploading Sidecar API (xmp files) - [x] (Fixed) _Back-end_ Fix issue where rename did serve a 500 page after successful renaming -- [x] (Fixed) _Back-end_ Uploading image with colorClass keeps it own colorClass instead of number 0/ grey -- [x] (Fixed) _Back-end_ Remove file from temp folder after thumbnail upload (and copy it to thumbnailTemp) +- [x] (Fixed) _Back-end_ Uploading image with colorClass keeps it own colorClass instead of number + 0/ grey +- [x] (Fixed) _Back-end_ Remove file from temp folder after thumbnail upload (and copy it to + thumbnailTemp) - [x] (Deprecated) _inotify-settings_ Plans to integrate inotify-wait in to the core product - [x] (Added) _Back-end_ Add Caching back for /api/info to 1 minute -- [x] (Added) _Back-end_ Add Lens Info as field within MakeModel (exif read / xmp read / exiftool write) +- [x] (Added) _Back-end_ Add Lens Info as field within MakeModel (exif read / xmp read / exiftool + write) - [x] (Added) _Back-end_ Update Exif Height/ Width when writing XMP files - [x] (Added) _Front-end_ Hide large aspect ratios, so show 4:3 but hide 120:450 - [x] (Added) _App_ Use separate config vars when in non-package mode and production @@ -751,26 +935,34 @@ _First release on Github Releases_ _New Feature: In this release websockets are used (note: when using reverse config)_ - [x] (Added) _Front-end_ Update view when other clients are updating content -- [x] (Changed) _Front-end_ In GPX view mode & when unlocked: touchZoom and doubleClickZoom are enabled +- [x] (Changed) _Front-end_ In GPX view mode & when unlocked: touchZoom and doubleClickZoom are + enabled - [x] (Fixed) _Front-end_ When file is added to view, the colorClassActiveList is updated - [x] (Fixed) _Front-end_ When folder or file is renamed the clientside cache is not correct - [x] (Fixed) _Front-end_ When in Archive mode and 'Move file to trash' client cache is cleared - [x] (Added) _Back-end_ Add identifier to '/api/account/status' - [x] (Breaking change) _Back-end_ rename api "/account/login" to "/api/account/login" - [x] (Breaking change) _Back-end_ rename api "/account/register" to "/api/account/register" -- [x] (Breaking change) _Back-end_ rename api "/account/register/status" to "/api/account/register/status" +- [x] (Breaking change) _Back-end_ rename api "/account/register/status" to " + /api/account/register/status" - [x] (Breaking change) _Back-end_ rename api from "/api/removeCache" to "/api/remove-cache" - [x] (Breaking change) _Back-end_ rename api from "/api/downloadPhoto" to "/api/download-photo" -- [x] (Breaking change) _Back-end_ rename api from "/api/export/createZip" to "/api/export/create-zip" -- [x] (Breaking change) _Back-end_ rename api from "/export/zip/\{f\}.zip" to "/api/export/zip/\{f\}.zip" -- [x] (Breaking change) _Back-end_ rename api from "/redirect/SubpathRelative" to "/redirect/sub-path-relative" -- [x] (Breaking change) _Back-end_ rename api from "/api/search/relativeObjects" to "/api/search/relative-objects" -- [x] (Breaking change) _Back-end_ rename api from "/api/search/removeCache" to "/api/search/remove-cache" +- [x] (Breaking change) _Back-end_ rename api from "/api/export/createZip" to " + /api/export/create-zip" +- [x] (Breaking change) _Back-end_ rename api from "/export/zip/\{f\}.zip" to " + /api/export/zip/\{f\}.zip" +- [x] (Breaking change) _Back-end_ rename api from "/redirect/SubpathRelative" to " + /redirect/sub-path-relative" +- [x] (Breaking change) _Back-end_ rename api from "/api/search/relativeObjects" to " + /api/search/relative-objects" +- [x] (Breaking change) _Back-end_ rename api from "/api/search/removeCache" to " + /api/search/remove-cache" - [x] (Breaking change) _Back-end_ rename api from "/sync/mkdir" to "/api/sync/mkdir" - [x] (Breaking change) _Back-end_ rename api from "/sync" to "/api/sync" - [x] (Breaking change) _Back-end_ rename api from "/sync/rename" to "/api/sync/rename" - [x] (Added) _Front-end_ When source is missing don't allow user to perform actions in DetailView -- [x] (Added) _Front-end_ Add link in "/account/login" to account register when user is already logged-in +- [x] (Added) _Front-end_ Add link in "/account/login" to account register when user is already + logged-in - [x] (Fixed) _Back-end_ Upload with direct path is working again ## version 0.3.3 - 2020-10-10 @@ -779,7 +971,8 @@ _In the next major release websockets are used, please note when using a reverse - [x] (Fixed) _Back-end_ Allow web app to run outside current folder - [x] (Fixed) _Back-end_ Allow linking existing env variables to make configuration easier -- [x] (Added) _Back-end_ Realtime foundation project to support WebSocket updates (start on issue #75) +- [x] (Added) _Back-end_ Realtime foundation project to support WebSocket updates (start on issue + #75) - [x] (Added) _Back-end_ Importer asterisk does not always pick first item (fix issue #140) - [x] (Added) _Back-end_ Health Details are logged without Json Exception in Application Insights - [x] (Added) _Front-end_ Add link to register page on login screen @@ -791,49 +984,63 @@ _In the next major release websockets are used, please note when using a reverse - [x] (Changed) _Front-end_ Upload multiple files after each other instead of in once - [x] (Fixed) _Front-end_ Show error status when upload fails instead of loading - [x] (Added) _Front-end_ Archive/Search/Trash - When in select mode you can add multiple files - to the selection by pressing the shift key and click + to the selection by pressing the shift key and click - [x] (Added) _Front-end_ In the search suggestion field arrow up and down keys select next / prev - [x] (Fixed) _Front-end_ When typing a suggestion remove the field gives you the main menu back - [x] (Security) _App_ update Electron to 9.3.1 ## version 0.3.2 - 2020-09-19 -- [x] (Fixed) _Front-end_ DetailView - DateTime push in DetailView has no influence on colorClass anymore +- [x] (Fixed) _Front-end_ DetailView - DateTime push in DetailView has no influence on colorClass + anymore - [x] (Fixed) _Front-end_ DetailView - Links to collections are always with `details=true` -- [x] (Fixed) _Front-end_ DetailView - When pressing delete the entire clientSide cache is cleared (to avoid next/prev issues) +- [x] (Fixed) _Front-end_ DetailView - When pressing delete the entire clientSide cache is cleared ( + to avoid next/prev issues) - [x] (Fixed) _Front-end_ Archive - When selecting a new colorClass this is added to the filter - [x] (Fixed) _Front-end_ DetailView - Safari 12 and lower does autorotate the image correct -- [x] (Added) _CLI_ Stop with warning when running WebHtmlPublish over the same folder (checks for `_settings.json`) -- [x] (Fixed) _Front-end_ Archive - When click on a Link in Archive, with command key it should ignore preloader +- [x] (Added) _CLI_ Stop with warning when running WebHtmlPublish over the same folder (checks + for `_settings.json`) +- [x] (Fixed) _Front-end_ Archive - When click on a Link in Archive, with command key it should + ignore preloader - [x] (Fixed) _Front-end_ Modal Sync Manually - Folders with plus `+` in the url are synced -- [x] (Fixed) _Front-end_ Modal Sync Manually - When ColorClass is selected, its now updating the state to keep the selection -- [x] (Fixed) _Front-end_ Modal Sync Manually - Sync Manual and Clears Cache cleans now also the client cache. -- [x] (Fixed) _Front-end_ DetailView - When pressing ColorClass it also updated when going to the next and back to the same image. -- [x] (Fixed) _Front-end_ DetailView formcontrol fix styling issue when insert 40 or 00 on a datetime input -- [x] (Fixed) _Front-end_ Form Control allow command a or ctrl a when a field is full to select the entire text +- [x] (Fixed) _Front-end_ Modal Sync Manually - When ColorClass is selected, its now updating the + state to keep the selection +- [x] (Fixed) _Front-end_ Modal Sync Manually - Sync Manual and Clears Cache cleans now also the + client cache. +- [x] (Fixed) _Front-end_ DetailView - When pressing ColorClass it also updated when going to the + next and back to the same image. +- [x] (Fixed) _Front-end_ DetailView formcontrol fix styling issue when insert 40 or 00 on a + datetime input +- [x] (Fixed) _Front-end_ Form Control allow command a or ctrl a when a field is full to select the + entire text - [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.8 (using SDK 3.1.402) - [x] (Added) _CLI_ Add account creation by StarskyAdminCli - [x] (Added) _AppSettings.UseHttpsRedirection_ - Redirect users to https page. - You should enable before going to production. Always disabled in debug/develop mode + You should enable before going to production. Always disabled in debug/develop mode - [x] (Added) _CLI_ Show DateTime when the Assemblies are build with the flags: `-h -v` ## version 0.3.1 - 2020-09-08 - [x] (Added) _Front-end_ UI improvement on Archive add t/i keyboard shortcut to select tags -- [x] (Added) _Front-end_ Client Side caching for 3 minutes to avoid requests and speed on slow devices +- [x] (Added) _Front-end_ Client Side caching for 3 minutes to avoid requests and speed on slow + devices - [x] (Added) _Front-end_ Warning when video is not found - [x] (Added) _Front-end_ Warning when playback is not supported or not working - [x] (Added) _Back-end_ Download API has now default client side caching -- [x] (Added) _Front-end_ Add Preloader for ColorClass filter, only used when using this app on a slow server +- [x] (Added) _Front-end_ Add Preloader for ColorClass filter, only used when using this app on a + slow server - [x] (Added) _Front-end_ Add updating parent items in the front-end cache - [x] (Added) _Back-end_ Publish - Files that are not found while publishing are ignored - [x] (Added) _Back-end_ Publish - Show status when there a no items found before publishing - [x] (Added) _Back-end_ Search - search for colorClass by indexer `--colorclass=1` -- [x] (Added) _Front-end_ DetailView - Add fast copy for DetailView (press c to save tags, title and description) -- [x] (Added) _Front-end_ DetailView - Add fast paste for DetailView (press v to overwrite tags, title and description) +- [x] (Added) _Front-end_ DetailView - Add fast copy for DetailView (press c to save tags, title and + description) +- [x] (Added) _Front-end_ DetailView - Add fast paste for DetailView (press v to overwrite tags, + title and description) - [x] (Added) _Front-end_ DetailView - Show Notification dialog when Copy or Paste action happens -- [x] (Fixed) _Front-end_ Search/DetailView - When going fast to the next/prev items this is requesting - relativeObjects again to avoid displaying the next icon but not able to click on it +- [x] (Fixed) _Front-end_ Search/DetailView - When going fast to the next/prev items this is + requesting + relativeObjects again to avoid displaying the next icon but not able to click on it - [x] (Added) _Back-end_ Add Response compression in ASP.NET Core - [x] (Fixed) _Back-end_ Change Cache time to 365 days for clientapp and wwwroot @@ -852,12 +1059,13 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Security) _Frond-end_ Upgrade ClientApp CRA _(Create React App 3.4.3 2020-08-12)_ - [x] (Fixed) _Front-end_ Add Preloader icon when pressing ColorClassSelect - [x] (Fixed) _Front-end_ For Archive and Search: When in select mode and navigate next to - the select mode is still on but there are no items selected + the select mode is still on but there are no items selected ## version 0.3.0-beta.1 - 2020-08-16 - [x] **(Breaking change)** _Back-end_ Manifest (\_settings.json) for exporting -- [x] **(Breaking change)** _Back-end_ AppSettings config for: AppSettingsPublishProfiles **(need manual config changes)** +- [x] **(Breaking change)** _Back-end_ AppSettings config for: AppSettingsPublishProfiles **(need + manual config changes)** - [x] (Added) Add new Publish UI in Web Interface - [x] (Fixed) _Back-end_ change `/api/delete` collections default option @@ -872,7 +1080,8 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Fixed) _Back-end_ GPX rename file does not work - [x] (Added) _Back-end_ FileSize update for add item - [x] (Added) _Back-end_ FileSize on add item -- [x] (Breaking change) _Back-end_ Need to run migrations to add FileSize field (done by starting the mvc application) +- [x] (Breaking change) _Back-end_ Need to run migrations to add FileSize field (done by starting + the mvc application) - [x] (Added) _Back-end_ Creating thumbnails from Web Interface (no status) - [x] (Changed) _Front-end_ Move options from display options to Synchronize manually in the UI @@ -889,7 +1098,8 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Added) _Back-end_ API to update some `appSettings` from the UI - [x] (Fixed) _Tools_ Ignore non-jpeg files for thumbnail tool - [x] (Fixed) _Tools_ ./build.sh `--no-sonar` build flag, to ignore sonarQube -- [x] (Added) _Back-end_ Add Permissions `UserManager.AppPermissions.AppSettingsWrite` in Admin scope. +- [x] (Added) _Back-end_ Add Permissions `UserManager.AppPermissions.AppSettingsWrite` in Admin + scope. - [x] (Added) _Back-end_ `SYSTEM_TEXT_ENABLED` flag is enabled - [x] (Changed) _App_ update Electron to 9.0 - [x] (Changed) _App_ remove inline javascript @@ -897,12 +1107,14 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Added) _Front-end_ Add preferences pane - [x] (Added) _Front-end_ Add first version of preferences-app-settings - [x] (Added) _Front-end_ Add first version of preferences-password -- [x] (Fixed) _Back-end_ AppSettings Update API Values that are true are overwritten when summing new value #45 +- [x] (Fixed) _Back-end_ AppSettings Update API Values that are true are overwritten when summing + new value #45 - [x] (Fixed) _Back-end_ Importer disposed object #46 -- [x] (Fixed) _Back-end_ In /api/update allow null `\\0` to support emthy overwrites -- [x] (Fixed) _Front-end_ Send null `\\0` value when a user the content in detailView a tags/description field removes +- [x] (Fixed) _Back-end_ In /api/update allow null `\\0` to support empty overwrites +- [x] (Fixed) _Front-end_ Send null `\\0` value when a user the content in detailView a + tags/description field removes - [x] (Fixed) _Front-end_ Chrome 81+ Exif rotation on non-thumbnail images #48 -- [x] (Fixed) _Back-end_ Redirect with Prefix issu #49 +- [x] (Fixed) _Back-end_ Redirect with Prefix issue #49 - [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.4 (using SDK 3.1.300) - [x] (Fixed) _App_ Add playback for video in App Issue #53 - [x] (Fixed) _App_ StarskyApp should see map Issue #52 @@ -915,9 +1127,10 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Added) _Tools_ docs.js styling update - [x] (Added) _Tools_ show `/api/health` results in Application Insights when it fails - [x] (Added) _Back-end_ Fix for `Exist_ExifToolPath` on first run -- [x] (Added) _Back-end_ Include ExifTool on first run for Windows and Unix (Perl is needed on \*nix) -- [x] (Fixed) _Front-end_ Files that already are deleted is not shown visualy Issue #26 -- [x] (Fixed) _Back-end_ starskygeocli -g 0 Not found +- [x] (Added) _Back-end_ Include ExifTool on first run for Windows and Unix (Perl is needed on + \*nix) +- [x] (Fixed) _Front-end_ Files that already are deleted is not shown visually Issue #26 +- [x] (Fixed) _Back-end_ starskyGeoCli -g 0 Not found - [x] (Fixed) _Back-end_ Bug upload or import gpx fails FileError - [x] (Added) _App_ Starsky App Allow Remote connections - [x] (Added) _App_ Starsky App Menu Cleanup @@ -933,13 +1146,15 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Added) _Tools_ add check for ProjectGuids to be valid/exist and non-duplicate - [x] (Added) _Back-end_ Show version number in command line - [x] (Added) _Back-end_ Fix for import Gpx -- [x] (Fixed) _Front-end_ In DetailView click on colorClass move to next item, the colorClass should match the file +- [x] (Fixed) _Front-end_ In DetailView click on colorClass move to next item, the colorClass should + match the file - [x] (Added) _Front-end_ Add Storybook for keep components easier to manage. - [x] (Changed) _Back-end_ `/api/env` behind login - [x] (Added) _Back-end_ allow multiple inputs in importer CLI (dot comma ; separated ) - [x] (Added) _Tools_ allow multiple inputs in `dropbox-importer` -- [x] (Fixed) _Back-end_ QueueBackgroundWorkItem has now Application Insights Telemetry tracking for exceptions -- [x] (Fixed) _Back-end_ Fix for imageFormat GPX. does now support wihout xml prefix +- [x] (Fixed) _Back-end_ QueueBackgroundWorkItem has now Application Insights Telemetry tracking for + exceptions +- [x] (Fixed) _Back-end_ Fix for imageFormat GPX. does now support without xml prefix - [x] (Fixed) _Back-end_ Bugfix for Importer to allow .XMP files read and copy ## version 0.2.3 - 2020-05-04 @@ -951,8 +1166,9 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Fixed) _Front-end_ use appendChild instead of append in portal for older browsers - [x] (Fixed) _Front-end_ order when files are added does now match the backend (archive-context) - [x] (Removed) _Back-end_ Import to filter on files older than 2 years -- [x] (Fixed) _Back-end_ Import UnitTests **Can't build after 2020-04-22, Import UnitTests have a date bug.** - **For all versions older than 0.2.2** +- [x] (Fixed) _Back-end_ Import UnitTests **Can't build after 2020-04-22, Import UnitTests have a + date bug.** + **For all versions older than 0.2.2** - [x] (feature) _Back-end_ Import to async function refactor - [x] (Fixed) _Back-end_ Fixes for bugs introduced after refactoring - [x] (Fixed) _Back-end_ Bugfixes for starskyImporter @@ -963,11 +1179,13 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Fixed) _Front-end_ video invalid datetime (UTC Time issues) - [x] (Fixed) _Back-end_ Force Sync fail (Object Disposed) - [x] (Fixed) _Back-end_ Export fail (Object Disposed) -- [x] (Fixed) _Back-end_ Upload with filename the same name does add item to cache + should update thumbnail cache +- [x] (Fixed) _Back-end_ Upload with filename the same name does add item to cache + should update + thumbnail cache ## version 0.2.2 - 2020-04-17 -**Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than 0.2.2** +**Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than +0.2.2** - [x] (Added) _Front-end_ Timezone issues in Safari - [x] (Feature) _Front-end_ Add menu for search @@ -979,7 +1197,8 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu - [x] (Fixed) _Front-end_ with prefix on the archive page navigate to the right url - [x] (Fixed) _Front-end_ Search page cache not cleared after edit multiple images - [x] (Fixed) _Front-end_ Delete multiple images collections no applied -- [x] (Other) _Front-end_ search tags detailView cache not cleared only if you switch very fast _known issue_ _won't fix_ +- [x] (Other) _Front-end_ search tags detailView cache not cleared only if you switch very fast + _known issue_ _won't fix_ - [x] (Fixed) _Front-end_ search update read only files, Created an error message if this happens - [x] (Fixed) _Front-end_ sync API 404 fix from UI - [x] (Fixed) _Back-end_ QuickTime DateTime creates error while checking GPX files @@ -987,7 +1206,8 @@ _Note: When you upgrade from 0.2.7 please make sure you have applied the configu ## version 0.2.1 - 2020-04-08 -_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than 0.2.2_ +_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than +0.2.2_ - [x] (Fixed) _Front-end_ Readonly mode and modals - [x] (Added) _Back-end_ ReadOnly status to DetailView @@ -997,11 +1217,12 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (Security) _Back-end_ Upgrade .NET Core (TargetFramework) to 3.1.3 (using SDK 3.1.201) - [x] (Security) _Back-end_ Lots of dependencies (EF Core to 3.1.3) - [x] (Security) _Frond-end_ Upgrade ClientApp CRA _(Create React App 3.4.1 2020-03-20)_ -- [x] (Changed) _Back-end_ Use vstest instead of mstest +- [x] (Changed) _Back-end_ Use vsTest instead of mstest ## version 0.2.0 - 2020-03-20 -_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than 0.2.2_ +_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than +0.2.2_ - [x] (feature) _Front-end_ icons for xmp and raw (tiff-based) in archive mode - [x] (feature) _Back-end_ support for Canon's way of reading ISO-Speed @@ -1010,18 +1231,20 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (rename) _Back-end_ Feature renaming and docs updates - [x] (feature) _Back-end support for RAW that is not Sony for example Nikon `.NEF` - [x] (feature) tiff, `arw`:sony, `dng`:adobe, `nef`:nikon, `raf`:fuji, `cr2`:canon, - `orf`:olympus, `rw2`:panasonic, `pef`:pentax, + `orf`:olympus, `rw2`:panasonic, `pef`:pentax, - [x] (bugfix) _Back-end_ allow underscore import/upload (api name changed in later version) - [x] (bugfix) _Front-end_ Download selection thumbnail right extension suggestion - [x] (version) _Back-end_ **breaking change** rename of api `/api/import/history` - [x] (version) _Back-end_ **breaking change** rename of api `/api/import/thumbnail` - [x] (version) _Back-end_ **breaking change** rename of api `/api/import` -- [x] (version) \_Back-end **breaking change** remame `"Path": "{AssemblyDirectory}/WebHtmlPublish/EmbeddedViews/` +- [x] (version) \_Back-end **breaking change** + rename `"Path": "{AssemblyDirectory}/WebHtmlPublish/EmbeddedViews/` - [x] (version) _Back-end_ **namespace changes** Introduction of feature/foundation projects ## version 0.1.17 - 2020-03-07 -_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than 0.2.2_ +_Should build before 2020-04-22, Import UnitTests have a date bug. For all versions older than +0.2.2_ - [x] (feature) _Front-end_ DateTime editing in detailView - [x] (feature) _Front-end_ change DateTime layout @@ -1046,15 +1269,16 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (bugfix) _Back-end_ `/api/import/fromUrl` Path Traversal Injection fix - [x] (feature) _Back-end_ Feature toggle to change from `Newtonsoft.Json` to `System.Text.Json` - _using Newtonsoft for this version_ + _using Newtonsoft for this version_ - [x] (bugfix) _Frond-end_ Trash display content after deleted (changes in wrapper) - [x] (rename) _Back-end_ `/api/import/allowed` to `/api/allowed-types/mimetype/sync` - [x] (upgrade) _Frond-end_ Upgrade ClientApp CRA _(Create React App 3.3.1, 2020-01-31)_ - [x] (bugfix) _Frond-end/Back-end_ Add length limit length for search queries - [x] (bugfix) _Frond-end_ Add length limit length for tags - [x] (feature) _Back-end_ Change Password for current user (API only) -- [x] (bugfix) _Back-end_ System.IO.EndOfStreamException: Expected to read 372 payload bytes but only received 21. - on `/api/search?t=-Datetime>1+-Datetime<0+-ImageFormat:jpg` (Timeout issue) +- [x] (bugfix) _Back-end_ System.IO.EndOfStreamException: Expected to read 372 payload bytes but + only received 21. + on `/api/search?t=-Datetime>1+-Datetime<0+-ImageFormat:jpg` (Timeout issue) - [x] (bugfix) Unit tests for NOT queries `/search?t=-Datetime%3E7%20-ImageFormat-%22tiff%22` - [x] (performance) _Back-end_ refactoring of `/api/search` - [x] (performance) _Back-end_ refactoring of `SearchSuggestionsService` @@ -1068,9 +1292,11 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi ## version 0.1.15 - 2020-02-06 - [x] (bugfix) _Front-end_ Drag'n drop is now only with files -- [x] (version) _Back-end_ _Legacy starsky.netframework_ 0.1.15 release included -- [x] (version) _Back-end_ _dependecies_ Microsoft.EntityFrameworkCore, Microsoft.Extensions.Configuration to 3.1.1 -- [x] (version) _Back-end_ _dependecies_ starskycore.dll from [netstandard2.0;netstandard2.1] to netstandard2.0 +- [x] (version) _Back-end_ _Legacy starsky.netFramework_ 0.1.15 release included +- [x] (version) _Back-end_ _dependencies_ Microsoft.EntityFrameworkCore, + Microsoft.Extensions.Configuration to 3.1.1 +- [x] (version) _Back-end_ _dependencies_ starskycore.dll from [netstandard2.0;netstandard2.1] to + netstandard2.0 - [x] (version) _Back-end_ _rename_ starskySyncNetFrameworkCli and starskyImporterNetFrameworkCli - [x] (version) _Back-end_ **breaking change** add Software as field in database (run migrations) @@ -1079,14 +1305,18 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (bugfix) _back-end_ Security fixes in controllers - [x] (bugfix) _back-end + front-end_ name: colorClassActiveList replace everywhere - [x] (version) _Back-end_ update to .NET .Core SDK 3.1.101 and version 3.0.2 (TargetFramework). - Run `./build.sh` before you start developing + Run `./build.sh` before you start developing - [x] (bugfix) _Front-end_ preloader when uploading - [x] (bugfix) _Front-end_ translations in item-list-view, item-text-list-view, -- [x] (bugfix) _Front-end_ translations in containers/search, containers/trash, search, trash and trash-page -- [x] (bugfix) _Front-end_ translations in menu-trash and modal-export (isProcessing === ProcessingState.server) +- [x] (bugfix) _Front-end_ translations in containers/search, containers/trash, search, trash and + trash-page +- [x] (bugfix) _Front-end_ translations in menu-trash and modal-export (isProcessing === + ProcessingState.server) - [x] (feature) _Front-end_ tags on folder change to two line -- [x] (feature) _Front-end_ _Back-end_ Health view, to make more clear when paths are configured right -- [x] (feature) _Front-end_ _Back-end_ Health view, to make more clear when the server time is not correct +- [x] (feature) _Front-end_ _Back-end_ Health view, to make more clear when paths are configured + right +- [x] (feature) _Front-end_ _Back-end_ Health view, to make more clear when the server time is not + correct - [x] (feature) _Front-end_ _Back-end_ Health view (feature) when a disk is full, show a warning ## version 0.1.13 - 2020-01-25 @@ -1098,7 +1328,7 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (bugfix) add filter for backslashes in structure: `\\\\d` - [x] (breaking change) removal of GetColor in razor views - [x] (breaking change) rename of field colorClassFilterList={[]} ==> colorClassActiveList={[]} -- [x] (bugfix) colorclass filter are selecting +- [x] (bugfix) colorClass filter are selecting - [x] (bugfix) export poll after 206 'not ready' - [x] (feature) _Front-end_ make folder layout smooth responsive @@ -1110,34 +1340,39 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi - [x] (remove) _General_ starskyApp content - [x] (docs) _General_ add html generation to build process - [x] (remove) _API_ only the retryThumbnail is removed `api/thumbnail?retryThumbnail=true` - (remove thumbnail if corrupt) due public facing + (remove thumbnail if corrupt) due public facing - [x] (remove) _Front-end_ search replace is no longer a beta feature, so no feature toggle - [x] (bugfix) _Front-end_ archive updating multiple values didn't provide the right results -- [x] (bugfix) _Front-end_ when pressing multiple colorclass items with the value 0 (colorless/no-color) these are updated +- [x] (bugfix) _Front-end_ when pressing multiple colorClass items with the value 0 ( + colorless/no-color) these are updated - [x] (bugfix) _Front-end_ fix issue where force sync and clear cache didn't update the view - [x] (bugfix) _Front-end_ fix issue Collections toggle where not correct shown - [x] (feature) _API_ Add `/sync/mkdir` to create directories and sync to the db - [x] (feature) _Front-end_ Add Modal for Make Directory to the Archive Menu - [x] (build) _CI_ With `CI=true` eslint errors will break the build -- [x] (feature) _Front-end_ Add English language to most of the menu items (switched by browser language) +- [x] (feature) _Front-end_ Add English language to most of the menu items (switched by browser + language) - [x] (bugfix) _Front-end_ When changing search page there is a preloader icon shown -- [x] (feature) _Front-end_ clear search cache after updating values in detailview +- [x] (feature) _Front-end_ clear search cache after updating values in detailView ## version 0.1.11 - 2020-01-02 -- [x] (bugfix) _Front-end_ _Detailview_ when press Delete and switch image, the next image should be marked as not deleted (Fixed) +- [x] (bugfix) _Front-end_ _DetailView_ when press Delete and switch image, the next image should be + marked as not deleted (Fixed) - [x] (bugfix) _Front-end_ _Archive_ when press 'Select' the images are not reloaded (Fixed) -- [x] (bugfix) _Front-end_ _Archive_ _iOS_ After press 'Select' and return the scrollstate keeps on the same position (fixed) -- [x] (bugfix) _Front-end_ When going from Archive to Detailview and back the scrollstate is still the same (fixed) +- [x] (bugfix) _Front-end_ _Archive_ _iOS_ After press 'Select' and return the scrollstate keeps on + the same position (fixed) +- [x] (bugfix) _Front-end_ When going from Archive to Detailview and back the scrollstate is still + the same (fixed) - [x] (feature) _Front-end_ Dark theme style added -- [x] (bugfix) _Front-end_ _Chrom(e,ium)_ the location after loging in now updated (fixed) +- [x] (bugfix) _Front-end_ _Chrom(e,ium)_ the location after logging in now updated (fixed) - [x] (bugfix) _CORS_ Add AllowCredentials policy for production - [x] (feature) _Front-end_ Next/Prev back in Detailview is now also support when searching - [x] (change) _Front-end_ Remove V1 from main menu - [x] (feature) _API_ Add new endpoint `/api/search/relativeObjects` - [x] (bugfix) _Front-end_ change default outline for Chrome/Safari - [x] (bugfix) _Front-end_ fix document.title undefined error -- [x] (bugfix) _Front-end_ fix issue where on empty searchquery a sidebar is shown +- [x] (bugfix) _Front-end_ fix issue where on empty search query a sidebar is shown - [x] (bugfix) _Front-end_ When import a non supported image Ok is shown - [x] (feature) _Front-end_ Show GPX Files with a map (powered by leaflet/openstreet maps) - [x] (change) _Back-end_ **Breaking change** Rename suggest API from `/suggest` to `/api/suggest` @@ -1147,10 +1382,12 @@ _Should build before 2020-04-22, Import UnitTests have a date bug. For all versi ## version 0.1.10 - 2019-12-15 - [x] (bugfix) Archive => After pressing 'Apply' the updates are not shown -- [x] (version) _Front-end_ Upgrade ClientApp from React 16.9.0 to 16.9.15 _(Create React App 3.3.0, 5 Dec 2019)_ +- [x] (version) _Front-end_ Upgrade ClientApp from React 16.9.0 to 16.9.15 _(Create React App 3.3.0, + 5 Dec 2019)_ - [x] (bugfix) _Front-end_ Front-end for Rename files (in detailview) - [x] (feature) _Front-end_ (front-end) 'Rotate to Right' -- [x] (bugfix) _Front-end_ Improve Unit test coverage (at least 80% on coverage-report _561 mstest and 271 jest tests_) +- [x] (bugfix) _Front-end_ Improve Unit test coverage (at least 80% on coverage-report _561 mstest + and 271 jest tests_) - [] (bug) _Front-end_ `/starsky` paths are not supported **not fixed** ## version 0.1.9 - 2019-12-01 @@ -1175,14 +1412,16 @@ _Upgrade to .NET Core 3.0 (TargetFramework) & EF Core 3.1-preview3_ - [x] Login in V2 layout - (bugfix) Catch is used for example the region VA (Vatican City) - [x] (bugfix) when offline geoReverseLookup creates an 0 byte zip -- [x] (bugfix) (UI) in archive mode, selecting and deselecting ColorClass does not include filepaths in request. +- [x] (bugfix) (UI) in archive mode, selecting and deselecting ColorClass does not include filepaths + in request. - [x] (bugfix) (UI) when pressing force sync and renew now the view is updated - [x] (tools) add Dropbox Import tool - **Breaking API change** from `/import/fromUrl/` to `/api/import/fromUrl` - [x] Import page (without link) - [x] (bug) GPX, tiff, dng files uploads are not allowed in new UI (fixed) - [x] (feature) Geo from Web Interface (including status) - in preview status -- [x] (bug) Force sync and renew for directories that contain a + sign are passing the wrong values (fixed) +- [x] (bug) Force sync and renew for directories that contain a + sign are passing the wrong + values (fixed) - [x] Add unit tests for importing raw's with .xmp files - [x] (starsky-tools) add Dropbox import helper tool @@ -1218,24 +1457,24 @@ _Works with .NET Core SDK 3.0.100_ - **Breaking change** the V1 layout is now at `/v1` - Add Renewed UI with most of the functionality of the old UI (default on) - - [x] Folder/Archive UI - - [x] Folder/Archive ColorClass filter UI - - [x] Folder/Archive Select UI - - [x] Folder/Archive Labels Add UI - - [x] Folder/Archive Labels Overwrite UI - - [x] Search UI - - [x] Export/ Dialog/ Single + Select UI - - [x] DetailView (include details) UI - - [x] Collections toggle in UI - - [x] ForceSync in UI (under Display options) - - [x] Cache-clean for folders in UI (under Display options) - - [x] Toggle for isSingleItem (under Display options) - - [x] Toggle for Collections view (under Display options) - - [x] Import page **Has link to V1 layout** - - [x] Account page **Deprecated in V2 layout** - - [x] Login **is in V1 layout style** - - [x] Not Found page - - [x] Trash page + - [x] Folder/Archive UI + - [x] Folder/Archive ColorClass filter UI + - [x] Folder/Archive Select UI + - [x] Folder/Archive Labels Add UI + - [x] Folder/Archive Labels Overwrite UI + - [x] Search UI + - [x] Export/ Dialog/ Single + Select UI + - [x] DetailView (include details) UI + - [x] Collections toggle in UI + - [x] ForceSync in UI (under Display options) + - [x] Cache-clean for folders in UI (under Display options) + - [x] Toggle for isSingleItem (under Display options) + - [x] Toggle for Collections view (under Display options) + - [x] Import page **Has link to V1 layout** + - [x] Account page **Deprecated in V2 layout** + - [x] Login **is in V1 layout style** + - [x] Not Found page + - [x] Trash page - Build CI changes to run Jest tests (1.2% coverage yet) - IE11 (Internet Explorer) is not working anymore with this application - Some older Safari, Chrome and Firefox browsers are not supported in the new layout @@ -1243,7 +1482,7 @@ _Works with .NET Core SDK 3.0.100_ - **Breaking API change** from `/search/` to `/api/search` - **Breaking API change** from `/search/trash` to `/api/search/trash` - **API change** change number of search results per page from 20 to 120 -- _Legacy starsky.netframework_ 0.1.6 release included +- _Legacy starsky.netFramework_ 0.1.6 release included ## version 0.1.5.9 - 2019-08-19 @@ -1251,7 +1490,7 @@ _Version number does not match SemVer_ - Entity Framework add database indexes - **Breaking Change** Entity Framework add database Field for FocalLength -- _Legacy starsky.netframework_ 0.1.5.9 release included +- _Legacy starsky.netFramework_ 0.1.5.9 release included ## version 0.1.5.8 - 2019-08-14 @@ -1267,7 +1506,7 @@ _Version number does not match SemVer_ - **Breaking API change** from `/api/` to `/api/index` - Add support for command line -x or don't add xmp sidecar file - [x] XMP disable option when importing using a flag (used for copying photos) -- _Legacy starsky.netframework_ 0.1.5.8 release included +- _Legacy starsky.netFramework_ 0.1.5.8 release included ## version 0.1.5.7 - 2019-08-09 @@ -1281,7 +1520,7 @@ _Version number does not match SemVer_ - **Known issue** Swagger support is disabled - Add support for command line -x or don't add xmp sidecar file - [x] XMP disable option when importing using a flag (used for copying photos) -- _Legacy starsky.netframework_ 0.1.5.7 release included +- _Legacy starsky.netFramework_ 0.1.5.7 release included ## version 0.1.5.6 - 2019-08-07 @@ -1310,7 +1549,7 @@ _Version number does not match SemVer_ - add: `/import/history` API for viewing recent uploads (today only) _subject to change_ - **CHANGE** Database Structure: Field added in ImportDatabas Update all your clients at once to avoid issues between -3 and -4 -- _Legacy starsky.netframework_ 0.1.5.4 release included +- _Legacy starsky.netFramework_ 0.1.5.4 release included ## version 0.1.5.3 - 2019-03-31 @@ -1318,7 +1557,7 @@ _Version number does not match SemVer_ - refactoring thumbnail service - changed Basic Auth middleware to use scoped - bugFix: sync from webUI with '+' in name -- _Legacy starsky.netframework_ 0.1.5.3 release included +- _Legacy starsky.netFramework_ 0.1.5.3 release included ## Features that are affected: @@ -1347,18 +1586,18 @@ _Version number does not match SemVer_ - ExifToolImportXmpCreate in appsettings - Bugfix / bug fix for: issue where import with spaces creates multiple items in the database - Already exist: config scheme overwrite feature for command line e.g. --scheme:/yyyy -- _Legacy starsky.netframework_ 0.1.5.2 release included +- _Legacy starsky.netFramework_ 0.1.5.2 release included ## version 0.1.5.1 - 2019-03-17 - Breaking Change: added `LastEdited` field - Add `LastEdited` to search as field -- _Legacy starsky.netframework_ 0.1.5.1 release included +- _Legacy starsky.netFramework_ 0.1.5.1 release included ## version 0.1.5 - 2019-03-17 - add partial support for || (or) queries using search - - the type datetime e.g. `-datetime=1 || -datetime=2` is not supported yet + - the type datetime e.g. `-datetime=1 || -datetime=2` is not supported yet - bugfix to large int relative to today - add support for not queries `-file` to ignore the word file - performance improvements to importer @@ -1369,7 +1608,8 @@ _Version number does not match SemVer_ - Search: performance update for searching multiple tags - Replace API introduced, search and replace in strings - Done some IStorage refactorings, but not complete yet -- Next/Prev links are now served by backend code to avoid when javascript is not loaded, your selection is reset +- Next/Prev links are now served by backend code to avoid when javascript is not loaded, your + selection is reset - Add Collections to DetailView model - Add more Update/Replace Tests @@ -1390,7 +1630,7 @@ _Version number does not match SemVer_ - add: replace `{AssemblyDirectory}` in `AppSettingsPublishProfiles.Path` - change settings to enable swagger: use now `app__AddSwagger` to enable - Create build scripts using Cake __(Cake isn't used anymore)__ -- _Legacy starsky.netframework_ 0.1.3 release included +- _Legacy starsky.netFramework_ 0.1.3 release included ## version 0.1.2 - 2019-02-01 @@ -1399,7 +1639,7 @@ _Version number does not match SemVer_ - bugfix: migrations - change to runtime: 2.1.7 - add 'import/FromUrl' api -- _Legacy starsky.netframework_ 0.1.2 release included +- _Legacy starsky.netFramework_ 0.1.2 release included ### Known issues in this release: _(all fixed in 0.1.3)_ @@ -1411,7 +1651,7 @@ _Version number does not match SemVer_ ## version 0.1.1 - 2019-01-25 - add ignore index feature to importer -- _Legacy starsky.netframework_ 0.1.1 release included +- _Legacy starsky.netFramework_ 0.1.1 release included ## version 0.1.0 - 2019-01-22 diff --git a/starsky/starsky.feature.webhtmlpublish/Services/PublishPreflight.cs b/starsky/starsky.feature.webhtmlpublish/Services/PublishPreflight.cs index ceea9598e3..9e469aa5bc 100644 --- a/starsky/starsky.feature.webhtmlpublish/Services/PublishPreflight.cs +++ b/starsky/starsky.feature.webhtmlpublish/Services/PublishPreflight.cs @@ -21,7 +21,8 @@ public class PublishPreflight : IPublishPreflight private readonly IWebLogger _logger; private readonly IStorage _hostStorage; - public PublishPreflight(AppSettings appSettings, IConsole console, ISelectorStorage selectorStorage, IWebLogger logger) + public PublishPreflight(AppSettings appSettings, IConsole console, + ISelectorStorage selectorStorage, IWebLogger logger) { _appSettings = appSettings; _console = console; @@ -43,6 +44,7 @@ public List> GetPublishProfileNames() returnList.Add(new Tuple(i, profile.Key)); i++; } + return returnList; } @@ -64,11 +66,13 @@ public Tuple> IsProfileValid( /// /// profile object /// (bool and list of errors) - internal Tuple> IsProfileValid(KeyValuePair> profiles) + internal Tuple> IsProfileValid( + KeyValuePair> profiles) { if ( profiles.Key == null || profiles.Value == null ) { - return new Tuple>(false, new List { "Profile not found" }); + return new Tuple>(false, + new List { "Profile not found" }); } var errors = new List(); @@ -80,15 +84,15 @@ internal Tuple> IsProfileValid(KeyValuePair /// full filepath to give default user input option /// argument list - /// name, nothing is string.emthy + /// name, nothing is string.empty public string GetNameConsole(string inputPath, IReadOnlyList args) { var name = ArgsHelper.GetName(args); @@ -134,15 +138,16 @@ public string GetNameConsole(string inputPath, IReadOnlyList args) var suggestedInput = Path.GetFileName(inputPath); - _console.WriteLine("\nWhat is the name of the item? (for: " + suggestedInput + " press Enter)\n "); + _console.WriteLine("\nWhat is the name of the item? (for: " + suggestedInput + + " press Enter)\n "); name = _console.ReadLine(); if ( string.IsNullOrEmpty(name) ) { name = suggestedInput; } + return name.Trim(); } } - } diff --git a/starsky/starsky.foundation.accountmanagement/Interfaces/IUserManager.cs b/starsky/starsky.foundation.accountmanagement/Interfaces/IUserManager.cs index dc6477e72c..05c63af249 100644 --- a/starsky/starsky.foundation.accountmanagement/Interfaces/IUserManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Interfaces/IUserManager.cs @@ -17,7 +17,8 @@ public class SignUpResult public bool Success { get; private set; } public SignUpResultError? Error { get; } - public SignUpResult(User? user = null, bool success = false, SignUpResultError? error = null) + public SignUpResult(User? user = null, bool success = false, + SignUpResultError? error = null) { User = user; Success = success; @@ -60,7 +61,7 @@ public interface IUserManager /// /// Add a new user, including Roles and UserRoles /// - /// Nice Name, default string.Emthy + /// Nice Name, default string.Empty /// default is: Email /// an email address, e.g. dont@mail.us /// Password @@ -72,19 +73,25 @@ Task SignUpAsync(string name, string credentialTypeCode, void AddToRole(User user, Role role); void RemoveFromRole(User user, string roleCode); void RemoveFromRole(User user, Role role); - ChangeSecretResult ChangeSecret(string credentialTypeCode, string? identifier, string secret); + + ChangeSecretResult ChangeSecret(string credentialTypeCode, string? identifier, + string secret); + Task ValidateAsync(string credentialTypeCode, string? identifier, string secret); Task SignIn(HttpContext httpContext, User? user, bool isPersistent = false); + void SignOut(HttpContext httpContext); int GetCurrentUserId(HttpContext httpContext); User? GetCurrentUser(HttpContext httpContext); User? GetUser(string credentialTypeCode, string identifier); Credential? GetCredentialsByUserId(int userId); + Task RemoveUser(string credentialTypeCode, string identifier); + User? Exist(string identifier); Task ExistAsync(int userTableId); diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs index 31370ebbb9..3a905f58e1 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs @@ -30,16 +30,17 @@ public QueryTest() var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); _logger = new FakeIWebLogger(); - _query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope,_logger ,_memoryCache); - _queryNoVerbose = new Query(dbContext, - new AppSettings{Verbose = false}, serviceScope,_logger ,_memoryCache); + _query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, _logger, _memoryCache); + _queryNoVerbose = new Query(dbContext, + new AppSettings { Verbose = false }, serviceScope, _logger, _memoryCache); } private static IServiceScopeFactory CreateNewScope() { var services = new ServiceCollection(); - services.AddDbContext(options => options.UseInMemoryDatabase(nameof(QueryTest))); + services.AddDbContext(options => + options.UseInMemoryDatabase(nameof(QueryTest))); var serviceProvider = services.BuildServiceProvider(); return serviceProvider.GetRequiredService(); } @@ -47,17 +48,17 @@ private static IServiceScopeFactory CreateNewScope() private readonly Query _query; private static FileIndexItem _insertSearchDatahiJpgInput = new FileIndexItem(); - private static FileIndexItem _insertSearchDatahi2JpgInput= new FileIndexItem(); - private static FileIndexItem _insertSearchDatahi3JpgInput= new FileIndexItem(); - private static FileIndexItem _insertSearchDatahi4JpgInput= new FileIndexItem(); - private static FileIndexItem _insertSearchDatahi2SubfolderJpgInput= new FileIndexItem(); + private static FileIndexItem _insertSearchDatahi2JpgInput = new FileIndexItem(); + private static FileIndexItem _insertSearchDatahi3JpgInput = new FileIndexItem(); + private static FileIndexItem _insertSearchDatahi4JpgInput = new FileIndexItem(); + private static FileIndexItem _insertSearchDatahi2SubfolderJpgInput = new FileIndexItem(); private readonly IMemoryCache _memoryCache; private readonly FakeIWebLogger _logger; private readonly Query _queryNoVerbose; private async Task InsertSearchData() { - if (string.IsNullOrEmpty(await _query.GetSubPathByHashAsync("09876543456789"))) + if ( string.IsNullOrEmpty(await _query.GetSubPathByHashAsync("09876543456789")) ) { _insertSearchDatahiJpgInput = await _query.AddItemAsync(new FileIndexItem { @@ -69,32 +70,32 @@ private async Task InsertSearchData() Title = "", IsDirectory = false }); - - _insertSearchDatahi2JpgInput = await _query.AddItemAsync(new FileIndexItem + + _insertSearchDatahi2JpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi2.jpg", Tags = TrashKeyword.TrashKeywordString, ParentDirectory = "/basic", IsDirectory = false }); - - _insertSearchDatahi3JpgInput = await _query.AddItemAsync(new FileIndexItem + + _insertSearchDatahi3JpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi3.jpg", ParentDirectory = "/basic", ColorClass = ColorClassParser.Color.Trash, // 9 IsDirectory = false }); - - _insertSearchDatahi4JpgInput = await _query.AddItemAsync(new FileIndexItem + + _insertSearchDatahi4JpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi4.jpg", ParentDirectory = "/basic", ColorClass = ColorClassParser.Color.Winner, // 1 IsDirectory = false }); - - _insertSearchDatahi2SubfolderJpgInput = await _query.AddItemAsync(new FileIndexItem + + _insertSearchDatahi2SubfolderJpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi2.jpg", ParentDirectory = "/basic/subfolder", @@ -112,62 +113,60 @@ public async Task QueryForHomeDoesNotExist_Null() if ( homeItem?.FileIndexItem != null ) { await _query.RemoveItemAsync(homeItem.FileIndexItem); - + // Query again if needed homeItem = _query.SingleItem("/"); } - + // retry 2 if ( homeItem?.FileIndexItem != null ) { await _query.RemoveItemAsync(homeItem.FileIndexItem); - + // Query again if needed homeItem = _query.SingleItem("/"); } - - Assert.AreEqual(null,homeItem); + + Assert.AreEqual(null, homeItem); } - + [TestMethod] public async Task QueryForHome() { var item = await _query.AddItemAsync(new FileIndexItem("/")); var home = _query.SingleItem("/")?.FileIndexItem; - Assert.AreEqual("/",home?.FilePath); + Assert.AreEqual("/", home?.FilePath); await _query.RemoveItemAsync(item); } - + [TestMethod] public async Task QueryAddSingleItemHiJpgOutputTest() { await InsertSearchData(); - var hiJpgOutput = _query.SingleItem(_insertSearchDatahiJpgInput.FilePath!)?.FileIndexItem; + var hiJpgOutput = _query.SingleItem(_insertSearchDatahiJpgInput.FilePath!) + ?.FileIndexItem; Console.WriteLine(_insertSearchDatahiJpgInput.FileHash); Console.WriteLine(hiJpgOutput?.FileHash); Assert.AreEqual(_insertSearchDatahiJpgInput.FileHash, hiJpgOutput?.FileHash); - + // other api Get Object By FilePath hiJpgOutput = _query.GetObjectByFilePath(_insertSearchDatahiJpgInput.FilePath!); Assert.AreEqual(_insertSearchDatahiJpgInput.FilePath, hiJpgOutput?.FilePath); } - + /// /// Item exist but not in folder cache, it now add this item to cache #228 /// [TestMethod] public async Task SingleItem_ItemExistInDbButNotInFolderCache() { - await _query.AddItemAsync(new FileIndexItem("/cache_test") - { - IsDirectory = true - }); + await _query.AddItemAsync(new FileIndexItem("/cache_test") { IsDirectory = true }); var existingItem = new FileIndexItem("/cache_test/test.jpg"); await _query.AddItemAsync(existingItem); - _query.AddCacheParentItem("/cache_test", new List{existingItem}); + _query.AddCacheParentItem("/cache_test", new List { existingItem }); const string newItem = "/cache_test/test2.jpg"; await _query.AddItemAsync(new FileIndexItem(newItem)); @@ -178,25 +177,25 @@ await _query.AddItemAsync(new FileIndexItem("/cache_test") await _query.RemoveItemAsync(queryResult.FileIndexItem!); } - + [TestMethod] public async Task GetAllFilesAsync_Disposed() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, - new FakeIWebLogger(),_memoryCache); - - await dbContext.FileIndex.AddAsync(new FileIndexItem("/") {IsDirectory = true}); + var query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, + new FakeIWebLogger(), _memoryCache); + + await dbContext.FileIndex.AddAsync(new FileIndexItem("/") { IsDirectory = true }); await dbContext.FileIndex.AddAsync(new FileIndexItem("/test.jpg")); await dbContext.SaveChangesAsync(); // And dispose await dbContext.DisposeAsync(); - - var items = await query.GetAllFilesAsync(new List{"/"},0); + + var items = await query.GetAllFilesAsync(new List { "/" }, 0); Assert.AreEqual("/test.jpg", items[0].FilePath); Assert.AreEqual(FileIndexItem.ExifStatus.Ok, items[0].Status); @@ -210,17 +209,20 @@ public async Task GetAllRecursiveAsync_GetResult() DatabaseType = AppSettings.DatabaseTypeList.InMemoryDatabase }; var dbContext = new SetupDatabaseTypes(appSettings).BuilderDbFactory(); - var query = new Query(dbContext, null!, null!, new FakeIWebLogger()); + var query = new Query(dbContext, null!, null!, new FakeIWebLogger()); - await dbContext.FileIndex.AddAsync(new FileIndexItem("/GetAllRecursiveAsync") {IsDirectory = true}); - await dbContext.FileIndex.AddAsync(new FileIndexItem("/GetAllRecursiveAsync/test") {IsDirectory = true}); + await dbContext.FileIndex.AddAsync( + new FileIndexItem("/GetAllRecursiveAsync") { IsDirectory = true }); + await dbContext.FileIndex.AddAsync( + new FileIndexItem("/GetAllRecursiveAsync/test") { IsDirectory = true }); await dbContext.FileIndex.AddAsync(new FileIndexItem("/GetAllRecursiveAsync/test.jpg")); - await dbContext.FileIndex.AddAsync(new FileIndexItem("/GetAllRecursiveAsync/test/test.jpg")); + await dbContext.FileIndex.AddAsync( + new FileIndexItem("/GetAllRecursiveAsync/test/test.jpg")); await dbContext.SaveChangesAsync(); - + var items = await query.GetAllRecursiveAsync("/GetAllRecursiveAsync"); - Assert.AreEqual(3,items.Count); + Assert.AreEqual(3, items.Count); Assert.AreEqual("/GetAllRecursiveAsync/test", items[0].FilePath); Assert.AreEqual("/GetAllRecursiveAsync/test.jpg", items[1].FilePath); Assert.AreEqual("/GetAllRecursiveAsync/test/test.jpg", items[2].FilePath); @@ -229,31 +231,31 @@ public async Task GetAllRecursiveAsync_GetResult() Assert.AreEqual(FileIndexItem.ExifStatus.Default, items[1].Status); Assert.AreEqual(FileIndexItem.ExifStatus.Default, items[2].Status); } - + [TestMethod] public async Task GetAllRecursiveAsync_Disposed() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, - new FakeIWebLogger(),_memoryCache); - - await dbContext.FileIndex.AddAsync(new FileIndexItem("/gar") {IsDirectory = true}); + var query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, + new FakeIWebLogger(), _memoryCache); + + await dbContext.FileIndex.AddAsync(new FileIndexItem("/gar") { IsDirectory = true }); await dbContext.FileIndex.AddAsync(new FileIndexItem("/gar/test.jpg")); await dbContext.SaveChangesAsync(); // And dispose await dbContext.DisposeAsync(); - + var items = await query.GetAllRecursiveAsync("/gar"); - Assert.AreEqual(1,items.Count); + Assert.AreEqual(1, items.Count); Assert.AreEqual("/gar/test.jpg", items[0].FilePath); Assert.AreEqual(FileIndexItem.ExifStatus.Default, items[0].Status); } - + [TestMethod] public async Task QueryAddSingleItemGetAllRecursiveTest() { @@ -268,37 +270,38 @@ public async Task QueryAddSingleItemGetAllRecursiveTest() _insertSearchDatahi3JpgInput, _insertSearchDatahi4JpgInput }.OrderBy(p => p.FileName).ToList(); - - var getAllRecursive123 = (await _query.GetAllRecursiveAsync()) + + var getAllRecursive123 = ( await _query.GetAllRecursiveAsync() ) .Where(p => p.FilePath?.Contains("/basic") == true) .OrderBy(p => p.FileName).ToList(); - Assert.AreEqual(getAllRecursive123.Count,getAllRecursiveExpectedResult123.Count); - - CollectionAssert.AreEqual(getAllRecursive123.Select(p => p.FileHash).ToList(), + Assert.AreEqual(getAllRecursive123.Count, getAllRecursiveExpectedResult123.Count); + + CollectionAssert.AreEqual(getAllRecursive123.Select(p => p.FileHash).ToList(), getAllRecursiveExpectedResult123.Select(p => p.FileHash).ToList()); await _query.RemoveItemAsync(getAllRecursive123); } - + [TestMethod] public async Task QueryAddSingleItemGetAllRecursiveTest_DisposedItem() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); + // item sub folder var item = new FileIndexItem("/test_1231331/sub/test_0191919.jpg"); dbContext.FileIndex.Add(item); await dbContext.SaveChangesAsync(); - + // normal item var item2 = new FileIndexItem("/test_1231331/test_0191919.jpg"); dbContext.FileIndex.Add(item2); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); @@ -334,17 +337,18 @@ public async Task QueryAddSingleItemNextWinnerTest() [TestMethod] public async Task QueryAddSingleItemPrevWinnerTest() - { + { await InsertSearchData(); // Prev Winner var colorClassActiveList = FileIndexItem.GetColorClassList("1"); - var prev = _query.SingleItem("/basic/hi4.jpg", colorClassActiveList)?.RelativeObjects.PrevFilePath; + var prev = _query.SingleItem("/basic/hi4.jpg", colorClassActiveList)?.RelativeObjects + .PrevFilePath; Assert.AreEqual("/basic/hi.jpg", prev); } - + [TestMethod] public async Task QueryAddSingleItemDeletedStatus() - { + { await InsertSearchData(); var status = _query.SingleItem("/basic/hi2.jpg")?.FileIndexItem?.Status; Assert.AreEqual(FileIndexItem.ExifStatus.Deleted, status); @@ -354,22 +358,22 @@ public async Task QueryAddSingleItemDeletedStatus() [ExcludeFromCoverage] public async Task QueryFolder_DisplayFileFoldersTest() { - var hiJpgInput = await _query.AddItemAsync(new FileIndexItem + var hiJpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi.jpg", ParentDirectory = "/display", // without slash FileHash = "123458465522", ColorClass = ColorClassParser.Color.Winner // 1 }); - - var hi3JpgInput = await _query.AddItemAsync(new FileIndexItem + + var hi3JpgInput = await _query.AddItemAsync(new FileIndexItem { FileName = "hi3.jpg", ParentDirectory = "/display", // without slash FileHash = "78539048765", ColorClass = ColorClassParser.Color.Extras }); - + await _query.AddItemAsync(new FileIndexItem { FileName = "hi2.jpg", @@ -377,9 +381,9 @@ await _query.AddItemAsync(new FileIndexItem FileHash = "98765432123456", Tags = TrashKeyword.TrashKeywordString }); - + // All Color Classes - var getDisplayExpectedResult = new List {hiJpgInput,hi3JpgInput}; + var getDisplayExpectedResult = new List { hiJpgInput, hi3JpgInput }; var getDisplay = _query.DisplayFileFolders("/display").ToList(); @@ -401,13 +405,14 @@ await _query.AddItemAsync(new FileIndexItem getDisplay.Find(p => p.FileHash == expectedResult.FileHash)?.FileHash); } - + // Compare filter - var getDisplayExpectedResultSuperior = new List {hiJpgInput}; + var getDisplayExpectedResultSuperior = new List { hiJpgInput }; var colorClassActiveList = FileIndexItem.GetColorClassList("1"); - - var getDisplaySuperior = _query.DisplayFileFolders("/display",colorClassActiveList).ToList(); - + + var getDisplaySuperior = + _query.DisplayFileFolders("/display", colorClassActiveList).ToList(); + foreach ( var expectedResult in getDisplayExpectedResultSuperior ) { Assert.AreEqual(expectedResult.FilePath, @@ -424,19 +429,19 @@ await _query.AddItemAsync(new FileIndexItem p.ColorClass == expectedResult.ColorClass)?.ColorClass); Assert.AreEqual(expectedResult.FileHash, getDisplaySuperior.Find(p => - p.FileHash == expectedResult.FileHash)?.FileHash); + p.FileHash == expectedResult.FileHash)?.FileHash); } - + // This feature is normal used for folders, for now it is done on files // Hi3.jpg Previous -- all mode var releative = _query.GetNextPrevInFolder("/display/hi3.jpg"); - + // Folders ignore deleted items Assert.AreEqual("/display/hi2.jpg", releative.PrevFilePath); // Next Relative -- all mode var releative2 = _query.GetNextPrevInFolder("/display/hi.jpg"); - + Assert.AreEqual("/display/hi2.jpg", releative2.NextFilePath); Assert.AreEqual(null, releative2.PrevFilePath); } @@ -444,14 +449,22 @@ await _query.AddItemAsync(new FileIndexItem [TestMethod] public async Task QueryFolder_NextPrevDuplicates() { - var folder01 = await _query.AddItemAsync(new FileIndexItem("/test_duplicate_01"){IsDirectory = true}); - var folder02 = await _query.AddItemAsync(new FileIndexItem("/test_duplicate_02"){IsDirectory = true}); - var folder02duplicate = await _query.AddItemAsync(new FileIndexItem("/test_duplicate_02"){IsDirectory = true}); - var folder03 = await _query.AddItemAsync(new FileIndexItem("/test_duplicate_03"){IsDirectory = true}); + var folder01 = + await _query.AddItemAsync( + new FileIndexItem("/test_duplicate_01") { IsDirectory = true }); + var folder02 = + await _query.AddItemAsync( + new FileIndexItem("/test_duplicate_02") { IsDirectory = true }); + var folder02duplicate = + await _query.AddItemAsync( + new FileIndexItem("/test_duplicate_02") { IsDirectory = true }); + var folder03 = + await _query.AddItemAsync( + new FileIndexItem("/test_duplicate_03") { IsDirectory = true }); var result = _query.GetNextPrevInFolder("/test_duplicate_02"); - Assert.AreEqual("/test_duplicate_01",result.PrevFilePath); - Assert.AreEqual("/test_duplicate_03",result.NextFilePath); + Assert.AreEqual("/test_duplicate_01", result.PrevFilePath); + Assert.AreEqual("/test_duplicate_03", result.NextFilePath); await _query.RemoveItemAsync(folder01); await _query.RemoveItemAsync(folder02); @@ -465,29 +478,29 @@ public async Task QueryDisplayFileFolders_Duplicates_Test() var image0 = await _query.AddItemAsync(new FileIndexItem { FileName = "0.jpg", - ParentDirectory = "/duplicates_test", + ParentDirectory = "/duplicates_test", FileHash = "45782347832", ColorClass = ColorClassParser.Color.Winner // 1 }); - + var image1 = await _query.AddItemAsync(new FileIndexItem { FileName = "1.jpg", - ParentDirectory = "/duplicates_test", + ParentDirectory = "/duplicates_test", FileHash = "123458465522", ColorClass = ColorClassParser.Color.Winner // 1 }); - + var image2 = await _query.AddItemAsync(new FileIndexItem { FileName = "2.jpg", ParentDirectory = "/duplicates_test", FileHash = "98765432123456", }); - + var result = _query.QueryDisplayFileFolders("/duplicates_test"); - Assert.AreEqual(3,result.Count); + Assert.AreEqual(3, result.Count); Assert.AreEqual(image0.FilePath, result[0].FilePath); Assert.AreEqual(image1.FilePath, result[1].FilePath); @@ -500,75 +513,76 @@ public async Task QueryDisplayFileFolders_XmpShowInQuery_Test() var image1 = await _query.AddItemAsync(new FileIndexItem { FileName = "1.xmp", - ParentDirectory = "/test_xmp", + ParentDirectory = "/test_xmp", FileHash = "123458465522", ImageFormat = ExtensionRolesHelper.ImageFormat.xmp, }); - + var image1Jpg = await _query.AddItemAsync(new FileIndexItem { FileName = "1.jpg", - ParentDirectory = "/test_xmp", + ParentDirectory = "/test_xmp", FileHash = "123458465522", ImageFormat = ExtensionRolesHelper.ImageFormat.jpg, }); - + var result = _query.QueryDisplayFileFolders("/test_xmp"); - Assert.AreEqual(2,result.Count); - + Assert.AreEqual(2, result.Count); + Assert.AreEqual(image1Jpg.FilePath, result[0].FilePath); await _query.RemoveItemAsync(image1); await _query.RemoveItemAsync(image1Jpg); } - + [TestMethod] public async Task DisplayFileFolders_hide_xmp() { var image1 = await _query.AddItemAsync(new FileIndexItem { FileName = "1.xmp", - ParentDirectory = "/test_xmp2", + ParentDirectory = "/test_xmp2", FileHash = "123458465522", ImageFormat = ExtensionRolesHelper.ImageFormat.xmp, }); - + var image1Jpg = await _query.AddItemAsync(new FileIndexItem { FileName = "1.jpg", - ParentDirectory = "/test_xmp2", + ParentDirectory = "/test_xmp2", FileHash = "123458465522", ImageFormat = ExtensionRolesHelper.ImageFormat.jpg, }); - - var result = _query.DisplayFileFolders(new List{image1,image1Jpg}).ToList(); - Assert.AreEqual(1,result.Count); - + var result = _query.DisplayFileFolders(new List { image1, image1Jpg }) + .ToList(); + + Assert.AreEqual(1, result.Count); + Assert.AreEqual(image1Jpg.FilePath, result[0].FilePath); } - + [TestMethod] public void QueryFolder_DisplayFileFoldersNoResultTest() { var getDisplay = _query.DisplayFileFolders("/12345678987654").ToList(); Assert.AreEqual(0, getDisplay.Count); } - + [TestMethod] public async Task QueryFolder_DisplayFileFolders_OneItemInFolder_DisposedItem() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings(), serviceScope, new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, + new AppSettings(), serviceScope, new FakeIWebLogger(), _memoryCache); + var item = new FileIndexItem("/test_0191919/test_0191919.jpg"); dbContext.FileIndex.Add(item); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); @@ -578,7 +592,7 @@ public async Task QueryFolder_DisplayFileFolders_OneItemInFolder_DisposedItem() var getItem = query.DisplayFileFolders("/test_0191919").ToList(); Assert.IsNotNull(getItem); Assert.AreEqual("test", getItem.FirstOrDefault()?.Tags); - + Assert.IsNotNull(getItem.FirstOrDefault()); await query.RemoveItemAsync(getItem.FirstOrDefault()!); } @@ -596,10 +610,10 @@ await _query.AddItemAsync(new FileIndexItem ColorClass = ColorClassParser.Color.Extras, IsDirectory = false }); - - var exptectedOutput = new List{"/","/bread"}; + + var exptectedOutput = new List { "/", "/bread" }; var output = _query.SingleItem("/bread/hi3.jpg")?.Breadcrumb; - CollectionAssert.AreEqual(exptectedOutput,output); + CollectionAssert.AreEqual(exptectedOutput, output); } [TestMethod] @@ -614,13 +628,13 @@ await _query.AddItemAsync(new FileIndexItem ColorClass = ColorClassParser.Color.Extras, IsDirectory = false }); - + // Used for react to get the context var pageTypeReact = _query.SingleItem("/bread/hi4.jpg")?.PageType; - Assert.AreEqual("DetailView",pageTypeReact); + Assert.AreEqual("DetailView", pageTypeReact); } - - + + [TestMethod] public async Task QueryTest_NextFilePathCachingConflicts_Deleted() { @@ -633,7 +647,7 @@ await _query.AddItemAsync(new FileIndexItem Tags = string.Empty, IsDirectory = false }); - + await _query.AddItemAsync(new FileIndexItem { FileName = "CachingDeleted_002.jpg", @@ -642,27 +656,27 @@ await _query.AddItemAsync(new FileIndexItem Tags = string.Empty, IsDirectory = false }); - - var single001 = + + var single001 = _query.SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_001.jpg"); Assert.AreEqual("/QueryTest_NextPrevCachingDeleted/CachingDeleted_002.jpg", single001?.RelativeObjects.NextFilePath); var single002 = _query - .SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_002.jpg")?.FileIndexItem; + .SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_002.jpg") + ?.FileIndexItem; single002!.Tags = TrashKeyword.TrashKeywordString; await _query.UpdateItemAsync(single002); - + // Request new; and check if content is updated in memory cache - single001 = + single001 = _query.SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_001.jpg"); - Assert.AreEqual(null,single001?.RelativeObjects.NextFilePath); - + Assert.AreEqual(null, single001?.RelativeObjects.NextFilePath); + // For avoiding conflicts when running multiple unit tests single001!.FileIndexItem!.Tags = TrashKeyword.TrashKeywordString; await _query.UpdateItemAsync(single001.FileIndexItem); - } [TestMethod] @@ -671,13 +685,14 @@ public async Task Query_UpdateItem_1_DisposedItem() var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, new FakeIWebLogger(), + _memoryCache); + var item = new FileIndexItem("/test/010101.jpg"); dbContext.FileIndex.Add(item); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); @@ -694,39 +709,39 @@ public async Task Query_UpdateItem_1_DisposedItem() [TestMethod] public async Task Query_GetObjectByFilePath_home() { - var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),_memoryCache); + var query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, new FakeIWebLogger(), + _memoryCache); await query.AddItemAsync(new FileIndexItem("/")); - + var item = query.GetObjectByFilePath("/"); Assert.IsNotNull(item); Assert.AreEqual("/", item.FilePath); Assert.AreEqual("/", item.FileName); } - + [TestMethod] public async Task Query_GetObjectByFilePathAsync_home() { var dbItem = await _query.AddItemAsync(new FileIndexItem("/")); - + var item = await _query.GetObjectByFilePathAsync("/"); Assert.IsNotNull(item); Assert.AreEqual("/", item.FilePath); Assert.AreEqual("/", item.FileName); - + await _query.RemoveItemAsync(dbItem); } - + [TestMethod] public async Task Query_GetObjectByFilePathAsync_Cache_Ok() { _memoryCache.Set(Query.GetObjectByFilePathAsyncCacheName("/test135"), new FileIndexItem("/test135")); - + var item = await _query.GetObjectByFilePathAsync("/test135", TimeSpan.MaxValue); Assert.IsNotNull(item); Assert.AreEqual("/test135", item.FilePath); @@ -735,40 +750,41 @@ public async Task Query_GetObjectByFilePathAsync_Cache_Ok() _memoryCache.Remove( Query.GetObjectByFilePathAsyncCacheName("/test135")); } - + [TestMethod] public async Task Query_GetObjectByFilePathAsync_Cache_NoDateSet_SoIgnored() { _memoryCache.Set(Query.GetObjectByFilePathAsyncCacheName("/test135"), new FileIndexItem("/test135")); - + var item = await _query.GetObjectByFilePathAsync("/test135"); // <- - no date added Assert.IsNull(item); // <- no date is added so cache is ignored _memoryCache.Remove( Query.GetObjectByFilePathAsyncCacheName("/test135")); } - + [TestMethod] public async Task Query_GetObjectByFilePathAsync_Disposed() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),_memoryCache); - var item = await query.AddItemAsync(new FileIndexItem("/GetObjectByFilePathAsync/test.jpg") - { - Tags = "hi" - }); + var query = new Query(dbContext, + new AppSettings { Verbose = true }, serviceScope, new FakeIWebLogger(), + _memoryCache); + var item = + await query.AddItemAsync( + new FileIndexItem("/GetObjectByFilePathAsync/test.jpg") { Tags = "hi" }); // important to Dispose await dbContext.DisposeAsync(); item.Tags = "test"; await query.UpdateItemAsync(item); - - var getItem = await query.GetObjectByFilePathAsync("/GetObjectByFilePathAsync/test.jpg"); + + var getItem = + await query.GetObjectByFilePathAsync("/GetObjectByFilePathAsync/test.jpg"); Assert.IsNotNull(getItem); Assert.AreEqual("/GetObjectByFilePathAsync/test.jpg", getItem.FilePath); Assert.AreEqual("test.jpg", getItem.FileName); @@ -781,18 +797,18 @@ public async Task Query_UpdateItem_Multiple_DisposedItem() var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, - new AppSettings(), serviceScope, new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, + new AppSettings(), serviceScope, new FakeIWebLogger(), _memoryCache); + var item = new FileIndexItem("/test/010101.jpg"); dbContext.FileIndex.Add(item); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); item.Tags = "test"; - await query.UpdateItemAsync(new List{item}); + await query.UpdateItemAsync(new List { item }); var getItem = query.GetObjectByFilePath("/test/010101.jpg"); Assert.IsNotNull(getItem); @@ -806,7 +822,7 @@ public async Task UpdateItemAsync_Single() { var item2 = new FileIndexItem("/test2.jpg"); await _query.AddItemAsync(item2); - + item2.Tags = "test"; await _query.UpdateItemAsync(item2); @@ -822,33 +838,35 @@ public async Task UpdateItemAsync_Single() public async Task AddItemAsync_SqliteRetry() { var services = new ServiceCollection(); - services.AddDbContext(options => options.UseSqlite("Data Source=app__data.db")); + services.AddDbContext(options => + options.UseSqlite("Data Source=app__data.db")); var serviceProvider = services.BuildServiceProvider(); var logger = new FakeIWebLogger(); var serviceScope = serviceProvider.GetRequiredService(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope, logger,_memoryCache); + var query = new Query(dbContext, new AppSettings(), serviceScope, logger, _memoryCache); var item = new FileIndexItem("/test/010101.jpg"); await query.AddItemAsync(item); // should fail due update } - + [TestMethod] public async Task UpdateItemAsync_Single_DisposedItem() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope,new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); + var item = new FileIndexItem("/test/010101.jpg"); await dbContext.FileIndex.AddAsync(item); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); @@ -861,7 +879,7 @@ public async Task UpdateItemAsync_Single_DisposedItem() await query.RemoveItemAsync(getItem); } - + [TestMethod] public async Task UpdateItemAsync_Multiple() { @@ -874,7 +892,7 @@ public async Task UpdateItemAsync_Multiple() item1.Tags = "test"; item2.Tags = "test"; - await _query.UpdateItemAsync(new List{item1,item2}); + await _query.UpdateItemAsync(new List { item1, item2 }); var getItem = await _query.GetObjectByFilePathAsync("/test24f1s54.jpg"); Assert.IsNotNull(getItem); @@ -887,30 +905,31 @@ public async Task UpdateItemAsync_Multiple() await _query.RemoveItemAsync(getItem); await _query.RemoveItemAsync(getItem2); } - + [TestMethod] public async Task UpdateItemAsync_Multiple_DisposedItem() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope,new FakeIWebLogger(),_memoryCache); - + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); + var item = new FileIndexItem("/test/8284574.jpg"); await dbContext.FileIndex.AddAsync(item); await dbContext.SaveChangesAsync(); - + var item2 = new FileIndexItem("/test/8284575.jpg"); await dbContext.FileIndex.AddAsync(item2); await dbContext.SaveChangesAsync(); - + // Important to dispose! await dbContext.DisposeAsync(); item.Tags = "test"; item2.Tags = "test"; - await query.UpdateItemAsync(new List{item,item2}); + await query.UpdateItemAsync(new List { item, item2 }); var getItem = await query.GetObjectByFilePathAsync("/test/8284574.jpg"); Assert.IsNotNull(getItem); @@ -919,7 +938,7 @@ public async Task UpdateItemAsync_Multiple_DisposedItem() var getItem2 = await query.GetObjectByFilePathAsync("/test/8284575.jpg"); Assert.IsNotNull(getItem2); Assert.AreEqual("test", getItem2.Tags); - + await query.RemoveItemAsync(getItem); await query.RemoveItemAsync(getItem2); } @@ -928,7 +947,7 @@ public async Task UpdateItemAsync_Multiple_DisposedItem() public async Task QueryTest_PrevFilePathCachingConflicts_Deleted() { // For previous item check if caching has no conflicts - + await _query.AddItemAsync(new FileIndexItem { FileName = "CachingDeleted_003.jpg", @@ -937,7 +956,7 @@ await _query.AddItemAsync(new FileIndexItem Tags = string.Empty, IsDirectory = false }); - + await _query.AddItemAsync(new FileIndexItem { FileName = "CachingDeleted_004.jpg", @@ -946,9 +965,9 @@ await _query.AddItemAsync(new FileIndexItem Tags = string.Empty, IsDirectory = false }); - + // For previous item - var single004 = + var single004 = _query.SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_004.jpg"); Assert.IsNotNull(single004); Assert.IsNotNull(single004.FileIndexItem); @@ -958,19 +977,19 @@ await _query.AddItemAsync(new FileIndexItem var single003 = _query - .SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_003.jpg")?.FileIndexItem; + .SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_003.jpg") + ?.FileIndexItem; single003!.Tags = TrashKeyword.TrashKeywordString; await _query.UpdateItemAsync(single003); - + // Request new; item must be updated in cache - single004 = + single004 = _query.SingleItem("/QueryTest_NextPrevCachingDeleted/CachingDeleted_004.jpg"); - Assert.AreEqual(null,single004?.RelativeObjects.PrevFilePath); - + Assert.AreEqual(null, single004?.RelativeObjects.PrevFilePath); + // For avoiding conflicts when running multiple unit tests single004!.FileIndexItem!.Tags = TrashKeyword.TrashKeywordString; await _query.UpdateItemAsync(single004.FileIndexItem); - } @@ -1000,17 +1019,17 @@ await _query.AddItemAsync(new FileIndexItem // For previous item var single004 = _query.SingleItem("/QueryTest_prev_hash/002.jpg"); - + // check hash Assert.AreEqual("09457777777", single004?.RelativeObjects.PrevHash); - + // check path Assert.AreEqual("/QueryTest_prev_hash/001.jpg", single004?.RelativeObjects.PrevFilePath); } - - + + [TestMethod] public async Task QueryTest_TestNextFileHash() { @@ -1037,11 +1056,11 @@ await _query.AddItemAsync(new FileIndexItem // For previous item var single004 = _query.SingleItem("/QueryTest_next_hash/001.jpg"); - + // check hash Assert.AreEqual("09457847385873", single004?.RelativeObjects.NextHash); - + // check path Assert.AreEqual("/QueryTest_next_hash/002.jpg", single004?.RelativeObjects.NextFilePath); @@ -1057,20 +1076,21 @@ await _query.AddItemAsync(new FileIndexItem FileHash = "567897", IsDirectory = false }); - + // trigger caching _query.DisplayFileFolders("/CheckIfContentIsInCacheUpdated"); - - var cachingDeleted001 = - _query.SingleItem("/CheckIfContentIsInCacheUpdated/CachingDeleted_001.jpg")?.FileIndexItem; + + var cachingDeleted001 = + _query.SingleItem("/CheckIfContentIsInCacheUpdated/CachingDeleted_001.jpg") + ?.FileIndexItem; cachingDeleted001!.Tags = "#"; await _query.UpdateItemAsync(cachingDeleted001); - var cachingDeleted001Update = - _query.SingleItem("/CheckIfContentIsInCacheUpdated/CachingDeleted_001.jpg")!.FileIndexItem; + var cachingDeleted001Update = + _query.SingleItem("/CheckIfContentIsInCacheUpdated/CachingDeleted_001.jpg")! + .FileIndexItem; Assert.AreEqual("#", cachingDeleted001Update!.Tags); Assert.AreNotEqual(string.Empty, cachingDeleted001Update.Tags); - // AreNotEqual: When it item used cache it will return string.Emthy - + // AreNotEqual: When it item used cache it will return string.empty } [TestMethod] @@ -1078,55 +1098,59 @@ public void QueryFolder_Add_And_UpdateFolderCache_UpdateCacheItemTest() { var name = _query.CachingDbName(nameof(FileIndexItem), "/"); - + // Add folder to cache normally done by: CacheQueryDisplayFileFolders - _memoryCache.Set(name, new List(), - new TimeSpan(1,0,0)); + _memoryCache.Set(name, new List(), + new TimeSpan(1, 0, 0)); // "List`1_" is from CachingDbName - - var item = new FileIndexItem {Id = 400, FileName = "cache"}; + + var item = new FileIndexItem { Id = 400, FileName = "cache" }; _query.AddCacheItem(item); - - var item1 = new FileIndexItem {Id = 400, Tags = "hi", FileName = "cache"}; - _query.CacheUpdateItem(new List{item1}); - + + var item1 = new FileIndexItem { Id = 400, Tags = "hi", FileName = "cache" }; + _query.CacheUpdateItem(new List { item1 }); + _memoryCache.TryGetValue(name, out var objectFileFolders); - var displayFileFolders = (List?) objectFileFolders; + var displayFileFolders = ( List? )objectFileFolders; Assert.IsNotNull(displayFileFolders); - Assert.AreEqual("hi",displayFileFolders.Find(p => p.FileName == "cache")?.Tags); - - Assert.AreEqual(1,displayFileFolders.Count(p => p.FileName == "cache")); + Assert.AreEqual("hi", displayFileFolders.Find(p => p.FileName == "cache")?.Tags); + + Assert.AreEqual(1, displayFileFolders.Count(p => p.FileName == "cache")); } [TestMethod] public void CacheUpdateItem_Skip_ShouldSetItem() { - var item1 = new FileIndexItem {Id = 400, Tags = "hi", FileName = "cache"}; - + var item1 = new FileIndexItem { Id = 400, Tags = "hi", FileName = "cache" }; + // already verbose - _query.CacheUpdateItem(new List{item1}); - - Assert.IsTrue(_logger.TrackedInformation.Count != 0); - Assert.IsTrue(_logger.TrackedInformation.FirstOrDefault().Item2?.Contains("[CacheUpdateItem]")); + _query.CacheUpdateItem(new List { item1 }); + + Assert.IsTrue(_logger.TrackedInformation.Count != 0); + Assert.IsTrue(_logger.TrackedInformation.FirstOrDefault().Item2 + ?.Contains("[CacheUpdateItem]")); } - + [TestMethod] public void CacheUpdateItem_Skip_ShouldSetItem1() { _logger.TrackedInformation = new List<(Exception?, string?)>(); - var item1 = new FileIndexItem {Id = 400, Tags = "hi", FileName = "cache"}; + var item1 = new FileIndexItem { Id = 400, Tags = "hi", FileName = "cache" }; // not verbose - _queryNoVerbose.CacheUpdateItem(new List{item1}); - - Assert.AreEqual(0,_logger.TrackedInformation.Count); + _queryNoVerbose.CacheUpdateItem(new List { item1 }); + + Assert.AreEqual(0, _logger.TrackedInformation.Count); } [TestMethod] public void CacheUpdateItem_ignore_when_parent_does_notExist() { - var item1 = new FileIndexItem {Id = 400, Tags = "hi", ParentDirectory = "/_fail_test1", FileName = "cache"}; - _query.CacheUpdateItem(new List{item1}); + var item1 = new FileIndexItem + { + Id = 400, Tags = "hi", ParentDirectory = "/_fail_test1", FileName = "cache" + }; + _query.CacheUpdateItem(new List { item1 }); var name = _query.CachingDbName(nameof(FileIndexItem), "/_fail_test1"); @@ -1138,9 +1162,12 @@ public void CacheUpdateItem_ignore_when_parent_does_notExist() public void CacheUpdateItem_ImplicitAdd() { _query.AddCacheParentItem("/456789", new List()); - - var item1 = new FileIndexItem {Id = 400, Tags = "hi", ParentDirectory = "/456789", FileName = "cache"}; - _query.CacheUpdateItem(new List{item1}); + + var item1 = new FileIndexItem + { + Id = 400, Tags = "hi", ParentDirectory = "/456789", FileName = "cache" + }; + _query.CacheUpdateItem(new List { item1 }); var result = _query.DisplayFileFolders("/456789").ToList(); @@ -1151,48 +1178,67 @@ public void CacheUpdateItem_ImplicitAdd() [TestMethod] public void CacheUpdateItem_UpdateByName() { - _query.AddCacheParentItem("/3479824783", new List + _query.AddCacheParentItem("/3479824783", + new List + { + new FileIndexItem + { + Id = 401, + Tags = "___not___", + ParentDirectory = "/3479824783", + FileName = "cache" + } + }); + + var item1 = new FileIndexItem { - new FileIndexItem {Id = 401, Tags = "___not___", ParentDirectory = "/3479824783", FileName = "cache"} - }); - - var item1 = new FileIndexItem {Id = 400, Tags = "hi", ParentDirectory = "/3479824783", FileName = "cache"}; - _query.CacheUpdateItem(new List{item1}); + Id = 400, Tags = "hi", ParentDirectory = "/3479824783", FileName = "cache" + }; + _query.CacheUpdateItem(new List { item1 }); var result = _query.DisplayFileFolders("/3479824783").ToList(); Assert.AreEqual(1, result.Count); Assert.AreEqual("hi", result[0].Tags); } - + [TestMethod] public void CacheUpdateItem_ignore_when_parent_does_notExistFakeLogger() { var logger = new FakeIWebLogger(); - var query = new Query(null!, new AppSettings(), null!,logger,_memoryCache); - - var item1 = new FileIndexItem {Id = 400, Tags = "hi", ParentDirectory = "/_fail_test2", FileName = "cache"}; - query.CacheUpdateItem(new List{item1}); + var query = new Query(null!, new AppSettings(), null!, logger, _memoryCache); + + var item1 = new FileIndexItem + { + Id = 400, Tags = "hi", ParentDirectory = "/_fail_test2", FileName = "cache" + }; + query.CacheUpdateItem(new List { item1 }); var success = _memoryCache.TryGetValue("List`1_/_fail_test2", out _); - + Assert.IsFalse(success); } - + [TestMethod] public void CacheUpdateItem_shouldHitParentCache() { var folderPath = "/_fail_test"; // Add folder to cache normally done by: CacheQueryDisplayFileFolders - _memoryCache.Set($"List`1_{folderPath}", new List(), - new TimeSpan(1,0,0)); + _memoryCache.Set($"List`1_{folderPath}", new List(), + new TimeSpan(1, 0, 0)); // "List`1_" is from CachingDbName - var item = new FileIndexItem {Id = 400, FileName = "cache", ParentDirectory = folderPath}; - _query.AddCacheParentItem(folderPath, new List{item}); - - var item1 = new FileIndexItem {Id = 400, Tags = "hi", ParentDirectory = folderPath, FileName = "cache"}; - _query.CacheUpdateItem(new List{item1}); + var item = new FileIndexItem + { + Id = 400, FileName = "cache", ParentDirectory = folderPath + }; + _query.AddCacheParentItem(folderPath, new List { item }); + + var item1 = new FileIndexItem + { + Id = 400, Tags = "hi", ParentDirectory = folderPath, FileName = "cache" + }; + _query.CacheUpdateItem(new List { item1 }); var success = _memoryCache.TryGetValue($"List`1_{folderPath}", out _); Assert.IsTrue(success); @@ -1209,7 +1255,7 @@ await _query.AddItemAsync(new FileIndexItem Tags = string.Empty, IsDirectory = false }); - + await _query.AddItemAsync(new FileIndexItem { FileName = "StackCollection001.dng", @@ -1220,57 +1266,65 @@ await _query.AddItemAsync(new FileIndexItem }); var dp1 = _query.DisplayFileFolders("/StackCollection"); - Assert.AreEqual(1,dp1.Count()); - - var dp2 = _query.DisplayFileFolders("/StackCollection",null,false); - Assert.AreEqual(2,dp2.Count()); + Assert.AreEqual(1, dp1.Count()); + + var dp2 = _query.DisplayFileFolders("/StackCollection", null, false); + Assert.AreEqual(2, dp2.Count()); } [TestMethod] public async Task Query_updateStatusContentList() { // for updateing multiple items - var toUpdate = new List{new FileIndexItem + var toUpdate = new List { - Tags = "test", - FileName = "3456784567890987654.jpg", - ParentDirectory = "/3456784567890987654", - FileHash = "3456784567890987654" - }}; + new FileIndexItem + { + Tags = "test", + FileName = "3456784567890987654.jpg", + ParentDirectory = "/3456784567890987654", + FileHash = "3456784567890987654" + } + }; await _query.AddItemAsync(toUpdate.FirstOrDefault()!); - foreach (var item in toUpdate) + foreach ( var item in toUpdate ) { item.Tags = "updated"; } + await _query.UpdateItemAsync(toUpdate); - var fileObjectByFilePath = _query.GetObjectByFilePath("/3456784567890987654/3456784567890987654.jpg"); - Assert.AreEqual("updated",fileObjectByFilePath?.Tags); + var fileObjectByFilePath = + _query.GetObjectByFilePath("/3456784567890987654/3456784567890987654.jpg"); + Assert.AreEqual("updated", fileObjectByFilePath?.Tags); } - + [TestMethod] public async Task Query_updateStatusContentList_Async() { // for updateing multiple items - var toUpdate = new List{new FileIndexItem + var toUpdate = new List { - Tags = "test", - FileName = "9278521.jpg", - ParentDirectory = "/8118", - FileHash = "3456784567890987654" - }}; + new FileIndexItem + { + Tags = "test", + FileName = "9278521.jpg", + ParentDirectory = "/8118", + FileHash = "3456784567890987654" + } + }; await _query.AddItemAsync(toUpdate.FirstOrDefault()!); - foreach (var item in toUpdate) + foreach ( var item in toUpdate ) { item.Tags = "updated"; } - + await _query.UpdateItemAsync(toUpdate); var fileObjectByFilePath = await _query.GetObjectByFilePathAsync("/8118/9278521.jpg"); - Assert.AreEqual("updated",fileObjectByFilePath?.Tags); + Assert.AreEqual("updated", fileObjectByFilePath?.Tags); } [TestMethod] @@ -1283,12 +1337,12 @@ public void Query_IsCacheEnabled_True() public async Task AddItemAsync() { var item = await _query.AddItemAsync(new FileIndexItem("/test/test.jpg")); - + var result = _query.SingleItem("/test/test.jpg"); Assert.IsNotNull(result?.FileIndexItem); Assert.AreEqual("/test/test.jpg", result.FileIndexItem.FilePath); - + await _query.RemoveItemAsync(item); } @@ -1298,16 +1352,15 @@ public async Task AddItemAsync_Disposed() var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope,new FakeIWebLogger(),_memoryCache); + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); await dbContext.DisposeAsync(); - await query.AddItemAsync(new FileIndexItem("/test982.jpg") - { - Tags = "test" - }); - + await query.AddItemAsync(new FileIndexItem("/test982.jpg") { Tags = "test" }); + var dbContext2 = new InjectServiceScope(serviceScope).Context(); - var itemItShouldContain = await dbContext2.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test982.jpg"); + var itemItShouldContain = + await dbContext2.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test982.jpg"); Assert.IsNotNull(itemItShouldContain); Assert.AreEqual("test", itemItShouldContain.Tags); } @@ -1318,31 +1371,36 @@ public async Task RemoveItemAsync() var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope,new FakeIWebLogger(),_memoryCache); + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); await dbContext.FileIndex.AddAsync(new FileIndexItem("/test44.jpg")); await dbContext.SaveChangesAsync(); - var item = await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); + var item = + await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); Assert.IsNotNull(item); await query.RemoveItemAsync(item); - - var itemItShouldBeNull = await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); + + var itemItShouldBeNull = + await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); Assert.IsNull(itemItShouldBeNull); } - + [TestMethod] public async Task RemoveItemAsync_Disposed() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - var query = new Query(dbContext, new AppSettings(), serviceScope,new FakeIWebLogger(),_memoryCache); + var query = new Query(dbContext, new AppSettings(), serviceScope, new FakeIWebLogger(), + _memoryCache); await dbContext.FileIndex.AddAsync(new FileIndexItem("/test44.jpg")); await dbContext.SaveChangesAsync(); - var item = await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); + var item = + await dbContext.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); await dbContext.DisposeAsync(); @@ -1350,7 +1408,8 @@ public async Task RemoveItemAsync_Disposed() await query.RemoveItemAsync(item); var dbContext2 = new InjectServiceScope(serviceScope).Context(); - var itemItShouldBeNull = await dbContext2.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); + var itemItShouldBeNull = + await dbContext2.FileIndex.FirstOrDefaultAsync(p => p.FilePath == "/test44.jpg"); Assert.IsNull(itemItShouldBeNull); } @@ -1361,18 +1420,18 @@ public void RemoveCacheItem_ShouldKeepOne() var demoItems = new List { - new FileIndexItem(dirPath+ "/01.jpg"), - new FileIndexItem(dirPath+ "/02.jpg"), - new FileIndexItem(dirPath+ "/03.jpg") + new FileIndexItem(dirPath + "/01.jpg"), + new FileIndexItem(dirPath + "/02.jpg"), + new FileIndexItem(dirPath + "/03.jpg") }; - - _query.AddCacheParentItem(dirPath,demoItems); - - _query.RemoveCacheItem(new List{demoItems[0], demoItems[1]}); + + _query.AddCacheParentItem(dirPath, demoItems); + + _query.RemoveCacheItem(new List { demoItems[0], demoItems[1] }); var result = _query.DisplayFileFolders(dirPath).ToList(); - Assert.AreEqual(1,result.Count); - Assert.AreEqual(dirPath+ "/03.jpg",result[0].FilePath); + Assert.AreEqual(1, result.Count); + Assert.AreEqual(dirPath + "/03.jpg", result[0].FilePath); } [TestMethod] @@ -1382,21 +1441,24 @@ public async Task RetrySaveChangesAsync_AggregateException() var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - + var query = new Query(dbContext, new AppSettings(), null!, new FakeIWebLogger()); - await query.RetryQueryUpdateSaveChangesAsync(new FileIndexItem(){Id = 1}, new Exception(),"test",0); + await query.RetryQueryUpdateSaveChangesAsync(new FileIndexItem() { Id = 1 }, + new Exception(), "test", 0); } - + [TestMethod] public async Task RetrySaveChangesAsync_id0_so_skip() { var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); - + var query = new Query(dbContext, new AppSettings(), null!, new FakeIWebLogger()); - var result = await query.RetryQueryUpdateSaveChangesAsync(new FileIndexItem(){Id = 0}, new Exception(),"test",0); - + var result = + await query.RetryQueryUpdateSaveChangesAsync(new FileIndexItem() { Id = 0 }, + new Exception(), "test", 0); + Assert.IsNull(result); } }