* feature(mobile): sync assets, albums & users to local database on device
* try to fix tests
* move DB sync operations to new SyncService
* clear db on user logout
* fix reason for endless loading timeline
* fix error when deleting album
* fix thumbnail of device albums
* add a few comments
* fix Hive box not open in album service when loading local assets
* adjust tests to int IDs
* fix bug: show all albums when Recent is selected
* update generated api
* reworked Recents album isAll handling
* guard against wrongly interleaved sync operations
* fix: timeline asset ordering (sort asset state by created at)
* fix: sort assets in albums by created at
* fix: add correct relations to asset typeorm entity
* fix: add missing createdAt column to asset entity
* ci: run check to make sure generated API is up-to-date
* ci: cancel workflows that aren't for the latest commit in a branch
* chore: add fvm config for flutter
* Try staggered layout for home page
* Introduce setting for dynamic layout
* Fix some provider related bugs
* Make asset grouping configurable
* Add translation keys, refactor group title
* Rename enum values
* Fix enum names
* Reformat long if statement
* Fix timezone related bug
* Minor clean up
* Fix unit test
* Add second assets check back to home screen
* refactor(mobile): add Isar DB & Store class
new Store: globally accessible key-value store like Hive (but based on Isar)
replace first few places of Hive usage with the new Store
* reduce max. DB size to prevent errors on older iOS devices
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* Add album sorting
* Change AppBar to match photos page behaviour
* Add buttons
* First crude implementation of the favorites page
* Clean up
* Add favorite button
* i18n
* Add star indicator to thumbnail
* Add favorite logic to separate provider and fix favorite behavior in album
* Review feedback (Add isFavorite variable)
* dev: style buttons
* dev: styled drop down button
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(.well-known): add .well-known/immich to reference API endpoint
* feat(.well-known): make schema optional (defaults to https)
* adjust method comment to be a little less confusing
* fix casting issue with resovled url
* include when checking Well-known, update server hint
* add validation for login form's server url
* consolidate common process into resolveAndSetEndpoint
* fix missed prettier formatting
* revert translation changes
* update environment variable description, hopefully a bit clearer
* rename environment variable to IMMICH_API_URL_EXTERNAL
* comment out optional env variables
* fix(web): browser-side api client to include authorization token
* Revert "fix(web): browser-side api client to include authorization token"
This reverts commit 60e338938f.
* remove multi-domain related changes
* Improve scroll performance by introducing repaint boundaries and moving more calculations to providers.
* Add error handing for malformed dates.
* Remove unused method
* Use compute in different places to improve app performance during heavy tasks
* Fix test
* Refactor `List<RenderAssetGridElement>` to separate `RenderList` class and make `fromAssetGroups` a static method of this class.
* Fix loading indicator bug
* Use provider directly
* `RenderList` refactoring
* `AssetNotifier` refactoring
* Move `combine` to static private method
* Extract compute methods in cache services to static private methods.
* Use `tryParse` instead of `parse` with try/catch for dates.
* Fix bug in caching mechanism.
* Fixed state not being used to trigger conditional rendering
* styling
* Corrected state
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(mobile): use cached asset info if unchanged instead of downloading all assets
This adds an HTTP ETag to the getAllAssets endpoint and client-side support in the app.
If locally cache content is identical to the content on the server, the potentially large list of all assets does not need to be downloaded.
* use ts import instead of require
* introduce Asset as composition of AssetResponseDTO and AssetEntity
* filter out duplicate assets (that are both local and remote, take only remote for now)
* only allow remote images to be added to albums
* introduce ImmichImage to render Asset using local or remote data
* optimized deletion of local assets
* local video file playback
* allow multiple methods to wait on background service finished
* skip local assets when adding to album from home screen
* fix and optimize delete
* show gray box placeholder for local assets
* add comments
* fix bug: duplicate assets in state after onNewAssetUploaded
Implemented a mechanism to extract the correct time zone from the GPS coordinate if presented in the file's EXIF, and to convert the timestamp to the correct UTC time so that the time will show correctly based on the mobile/web local time zone.
* Refactor sharing to album
* Added library page in the bottom navigation bar
* Refactor SharedAlbumService to album service
* Refactor apiProvider to its file
* Added image grid
* render album thumbnail
* Using the wrap to render thumbnail and album info better
* Navigate to album viewer
* After deletion, navigate to the respective page of the shared and non-shared album
* Correctly remove album in local state
* Refactor create album page
* Implemented create non-shared album
* Fixed app not resuming backup after closing and reopening the app
* Fixed cosmetic effect of backup button doesn't change state right away after pressing start backup
* Fixed grammar
* Fixed deep copy problem that cause incorrect asset count when backing up
* Format code
* chore: remove UPLOAD_LOCATION as it isn't used in the server
* docker: remove network in docker compose as docker creates one by default
* nginx: update reverse proxy to put web at root and api at /api
* docker: remove unneeded exposed ports and docker network
Align dev setup with prod, but with ports exposed for direct connection
Most communication between services happens on the internal network, so we don't need to expose all these services.
With the nginx changes, the api and web panel are both server through the reverse proxy on / for web and /api for the API.
The only service that should expose ports is nginx as that is the entrypoint to the application.
* chore: remove CORS now we serve the api on /api in the default setup
* docs: update README.md to include /api
* Fixed docket-compose file for dev environment and websocket on web and mobile
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor microservices to machine-learning
* Update tGithub issue template with correct task syntax
* Added microservices container
* Communicate between service based on queue system
* added dependency
* Fixed problem with having to import BullQueue into the individual service
* Added todo
* refactor server into monorepo with microservices
* refactor database and entity to library
* added simple migration
* Move migrations and database config to library
* Migration works in library
* Cosmetic change in logging message
* added user dto
* Fixed issue with testing not able to find the shared library
* Clean up library mapping path
* Added webp generator to microservices
* Update Github Action build latest
* Fixed issue NPM cannot install due to conflict witl Bull Queue
* format project with prettier
* Modified docker-compose file
* Add GH Action for Staging build:
* Fixed GH action job name
* Modified GH Action to only build & push latest when pushing to main
* Added Test 2e2 Github Action
* Added Test 2e2 Github Action
* Implemented microservice to extract exif
* Added cronjob to scan and generate webp thumbnail at midnight
* Refactor to ireduce hit time to database when running microservices
* Added error handling to asset services that handle read file from disk
* Added video transcoding queue to process one video at a time
* Fixed loading spinner on web while loading covering the info panel
* Add mechanism to show new release announcement to web and mobile app (#209)
* Added changelog page
* Fixed issues based on PR comments
* Fixed issue with video transcoding run on the server
* Change entry point content for backward combatibility when starting up server
* Added announcement box
* Added error handling to failed silently when the app version checking is not able to make the request to GITHUB
* Added new version announcement overlay
* Update message
* Added messages
* Added logic to check and show announcement
* Add method to handle saving new version
* Added button to dimiss the acknowledge message
* Up version for deployment to the app store
* New features
- Share album. Users can now create albums to share with existing people on the network.
- Owner can delete the album.
- Owner can invite the additional users to the album.
- Shared users and the owner can add additional assets to the album.
* In the asset viewer, the user can swipe up to see detailed information and swip down to dismiss.
* Several UI enhancements.
* Added webp as supported file type, allow continue upload when an image fail
* Added webp as supported file type, allow continue upload when an image fail
* Solved issue with bad assets cause backup to stop
* Handle pause/restart listening to event on_upload_success and reload asset list after navigating back from BackupControllerPage
* Remove unused api endpoint
* Renamed multipart filed name 'files' to 'assetData'.
* Added an additional field name of 'thumbnailData' to multipart form.
* Implemented upload mechanism for thumbnail directly from the mobile client.
* Removed dead code
* Implemented a version checking mechanism.
* refactor serving file function asset service
* Remove PhotoViewer for now since it creates a problem in 2.10
* Added error message for wrong decode file and logo for failed to load file
* Fixed error when read stream cannot be created and crash server
* Added method to get all assets as a raw array
* Implemented cleaner way of grouping image
* Implemented operation to delete assets in the database
* Implemented delete on database operation
* Implemented delete on device operation
* Fixed issue display wrong information when the auto backup is enabled after deleting all assets
* Implementing video upload features
* setup image resize processor
* Add video thumbnail with duration and icon
* Fixed issue with video upload timeout and upper case file type on ios
* Added video player page
* Added video player page
* Fixing video player not play on ios
* Added partial file streaming for ios/android video request
* Added nginx as proxy server for better file serving
* update nginx and docker-compose file
* Video player working correctly
* Video player working correctly
* Split duration to the second