* feat: server changes for album timeline
* feat(web): album timeline view
* chore: open api
* chore: remove archive action
* fix: favorite for non-owners
* refactor: time buckets
* feat(web): use new time bucket api
* feat(web): use asset grid in archive/favorites
* chore: open api
* chore: clean up uuid validation
* refactor(web): move memory lane to photos page
* Update web/src/routes/(user)/archive/+page.svelte
Co-authored-by: Sergey Kondrikov <sergey.kondrikov@gmail.com>
* fix: hide archived photos on main timeline
* fix: select exif info
---------
Co-authored-by: Sergey Kondrikov <sergey.kondrikov@gmail.com>
* refactor: add/remove album assets
* chore: open api
* feat: remove owned assets from album
* refactor: move to bulk id req/res dto
* chore: open api
* chore: merge main
* dev: mobile work
* fix: adding asset from web not sync with mobile
* remove print statement
---------
Co-authored-by: Alex Tran <Alex.Tran@conductix.com>
* fix: hide faces
* remove unused variable
* fix: work even if one fails
* better style for hidden people
* add hide face in the menu dropdown
* add buttons to toggle visibility for all faces
* add server test
* close modal with escape key
* fix: explore page
* improve show & hide faces modal
* keep name on people card
* simplify layout
* sticky app bar in show-hide page
* fix format
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Added read-only flag for assets, endpoint to trigger file import vs upload
* updated fixtures with new property
* if upload is 'read-only', ensure there is no existing asset at the designated originalPath
* added test for file import as well as detecting existing image at read-only destination location
* Added storage service test for a case where it should not move read-only assets
* upload doesn't need the read-only flag available, just importing
* default isReadOnly on import endpoint to true
* formatting fixes
* create-asset dto needs isReadOnly, so set it to false by default on create, updated api generation
* updated code to reflect changes in MR
* fixed read stream promise return type
* new index for originalPath, check for existing path on import, reglardless of user, to prevent duplicates
* refactor: import asset
* chore: open api
* chore: tests
* Added externalPath support for individual users, updated UI to allow this to be set by admin
* added missing var for externalPath in ui
* chore: open api
* fix: compilation issues
* fix: server test
* built api, fixed user-response dto to include externalPath
* reverted accidental commit
* bad commit of duplicate externalPath in user response dto
* fixed tests to include externalPath on expected result
* fix: unit tests
* centralized supported filetypes, perform file type checking of asset and sidecar during file import process
* centralized supported filetype check method to keep regex DRY
* fixed typo
* combined migrations into one
* update api
* Removed externalPath from shared-link code, added column to admin user page whether external paths / import is enabled or not
* update mimetype
* Fixed detect correct mimetype
* revert asset-upload config
* reverted domain.constant
* refactor
* fix mime-type issue
* fix format
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Add on this day
* add query for x year
* dev: add query
* dev: front end
* dev: styling
* styling
* more styling
* add new page
* navigating
* navigate back and forth
* styling
* show gallery
* fix test
* fix test
* show previous and next title
* fix test
* show up down scrolling button
* more styling
* styling
* fix app bar
* fix height of next/previous
* autoplay
* auto play
* refactor
* refactor
* refactor
* show date
* Navigate
* finish
* pr feedback
* refactor: tags
* chore: open api
* chore: unused import
* feat: add/remove/get tag assets
* chore: open api
* chore: finish tag tests for add/remove assets
* feat(mobile): partner sharing
* getAllAssets for other users
* i18n
* fix tests
* try to fix web tests
* shared with/by confusion
* error logging
* guard against outdated server version
* initial commit for XMP sidecar support
* Added support for 'missing' metadata files to include those without sidecar files, now detects sidecar files in the filesystem for media already ingested but the sidecar was created afterwards
* didn't mean to commit default log level during testing
* new sidecar logic for video metadata as well
* Added xml mimetype for sidecars only
* don't need capture group for this regex
* wrong default value reverted
* simplified the move here - keep it in the same try catch since the outcome is to move the media back anyway
* simplified setter logic
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
* simplified logic per suggestions
* sidecar is now its own queue with a discover and sync, updated UI for the new job queueing
* queue a sidecar job for every asset based on discovery or sync, though the logic is almost identical aside from linking the sidecar
* now queue sidecar jobs for each assset, though logic is mostly the same between discovery and sync
* simplified logic of filename extraction and asset instantiation
* not sure how that got deleted..
* updated code per suggestions and comments in the PR
* stat was not being used, removed the variable set
* better type checking, using in-scope variables for exif getter instead of passing in every time
* removed commented out test
* ran and resolved all lints, formats, checks, and tests
* resolved suggested change in PR
* made getExifProperty more dynamic with multiple possible args for fallbacks, fixed typo, used generic in function for better type checking
* better error handling and moving files back to positions on move or save failure
* regenerated api
* format fixes
* Added XMP documentation
* documentation typo
* Merged in main
* missed merge conflict
* more changes due to a merge
* Resolving conflicts
* added icon for sidecar jobs
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Modify controller DTOs
* Can check duplicates on server side
* Remove deviceassetid and deviceid
* Remove device ids from file uploader
* Add db migration for removed device ids
* Don't sanitize checksum
* Convert asset checksum to string
* Make checksum not optional for asset
* Use enums when rejecting duplicates
* Cleanup
* Return of the device id, but optional
* Don't use deviceId for upload folder
* Use checksum in thumb path
* Only use asset id in thumb path
* Openapi generation
* Put deviceAssetId back in asset response dto
* Add missing checksum in test fixture
* Add another missing checksum in test fixture
* Cleanup asset repository
* Add back previous /exists endpoint
* Require checksum to not be null
* Correctly set deviceId in db
* Remove index
* Fix compilation errors
* Make device id nullabel in asset response dto
* Reduce PR scope
* Revert asset service
* Reorder imports
* Reorder imports
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Reduce PR scope
* Update openapi
* Reduce PR scope
* refactor: asset bulk upload check
* chore: regenreate open-api
* chore: fix tests
* chore: tests
* update migrations and regenerate api
* Feat: use checksum in web file uploader
* Change to wasm-crypto
* Use crypto api for checksumming in web uploader
* Minor cleanup of file upload
* feat(web): pause and resume jobs
* Make device asset id not nullable again
* Cleanup
* Device id not nullable in response dto
* Update API specs
* Bump api specs
* Remove old TODO comment
* Remove NOT NULL constraint on checksum index
* Fix requested pubspec changes
* Remove unneeded import
* Update server/apps/immich/src/api-v1/asset/asset.service.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove unneeded check
* Update server/apps/immich/src/api-v1/asset/asset-repository.ts
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* Remove hashing in the web uploader
* Cleanup file uploader
* Remove varchar from asset entity fields
* Return 200 from bulk upload check
* Put device asset id back into asset repository
* Merge migrations
* Revert pubspec lock
* Update openapi specs
* Merge upstream changes
* Fix failing asset service tests
* Fix formatting issue
* Cleanup migrations
* Remove newline from pubspec
* Revert newline
* Checkout main version
* Revert again
* Only return AssetCheck
---------
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* First crude implementation of the global asset map in web
* Use single DOM element for all markers
* Minor layout changes
* Refactor
* Add asset viewer
* Add API endpoint that returns only assets with location information (Thanks @EPP100)
* Remove sidebar icon flip
* Add dark theme support
* Center map to most recent asset
* Allow cluster viewing
* Fix linter errors
* Add newlines
* Fix ts errors
* Fix eslint error
* Run prettier
* Server code style
* Fix openapi mobile code generation issues
* Map markers test
* fix: Support video thumbnails
* Update API
* Review suggestions
* Review suggestions
* Linter error
* Chage mapMarker endpoint to map-marker
* Clean up leaflet imports
* chore(server): remove unused device info code
* chore: generate open api
* remove any DeviceTypeEnum usage from mobile
* chore: coverage
* fix: drop device info table
---------
Co-authored-by: Fynn Petersen-Frey <zody22@gmail.com>
* feat: manage authorized devices
* chore: open api
* get header from mobile app
* write header from mobile app
* styling
* fix unit test
* feat: use relative time
* feat: update access time
* fix: tests
* chore: confirm wording
* chore: bump test coverage thresholds
* feat: add some icons
* chore: icon tweaks
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat(server/web): jobs clear button + queue status
* adjust design and colors
* Adjust some styling
* show status next to buttons instead of on top
* Update rounded corner for badge
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* refactor: job to domain
* chore: regenerate open api
* chore: tests
* fix: missing breaks
* fix: get asset with missing exif data
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* feat: explore
* chore: generate open api
* styling explore page
* styling no result page
* style overlay
* style: bluring text on thumbnail card for readability
* explore page tweaks
* fix(web): search urls
* feat(web): use objects for things
* feat(server): filter by motion, sort by createdAt
* More styling
* better navigation
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com>
* build: add typesense to docker
* feat(server): typesense search
* feat(web): search
* fix(web): show api error response message
* chore: search tests
* chore: regenerate open api
* fix: disable typesense on e2e
* fix: number properties for open api (dart)
* fix: e2e test
* fix: change lat/lng from floats to typesense geopoint
* dev: Add smartInfo relation to findAssetById to be able to query against it
---------
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* 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
* fix(web/server): Uploaded asset to shared link does not get added to the shared link/album
* remove unused code
* Add endpoints for each remove and add assets to shared link
* Update api
* Added deletion logic
* Convert callback to async/await
* Fix linter
* Fix test
* Fix server test
* added test
* Test coverage
* modify DTO
* Add notification
* fix test
* Create shared link modal for individual asset
* Added API to create asset shared link
* Added viewer for individual shared link
* Added multiselection app bar
* Refactor gallery viewer to its own component
* Refactor
* Refactor
* Add and remove asset from shared link
* Fixed test
* Fixed notification card doesn't wrap
* Add check asset access when created asset shared link
* pr feedback
* feat(server): support providers without support for custom schemas
* chore: unit tests
* chore: test mobile override
* chore: add details to the docs
* refactor(server): device info service
* use upsertDeviceInfo in mobile app
* fix: return types and dedupe code
Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
* Add generated openapi docs to website
* Uppercase API link in navbar
* fix(docs): open api empty summary (#1069)
* feat(docs): Use /docs/api path for swagger docs
* Sync api version to be the same as the server
* Update version
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
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
* feat: add admin config module for user configured config, uses it for ffmpeg
* feat: add api endpoint to retrieve admin config settings and values
* feat: add settings panel to admin page on web (wip)
* feat: add api endpoint to update the admin config
* chore: re-generate openapi spec after rebase
* refactor: move from admin config to system config naming
* chore: move away from UseGuards to new @Authenticated decorator
* style: dark mode styling for lists and fix conflicting colors
* wip: 2 column design, no edit button
* refactor: system config
* chore: generate open api
* chore: rm broken test
* chore: cleanup types
* refactor: config module names
Co-authored-by: Zack Pollard <zackpollard@ymail.com>
Co-authored-by: Zack Pollard <zack.pollard@moonpig.com>
* delete and restore user from admin UI
* addressed review comments and fix e2e test
* added cron job to delete user, and some formatting changes
* addressed review comments
* adding missing queue registration
* Add new query parameter to API endpoint that allows adding assets to albums which potentially contain assets that are already part of this album.
* Change API endpoint
* Generate new APIs
* Fixed test
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
* Get asset and album count
* Generate APIs
* Added asset count for each type
* Added api on the web
* Added info button for asset and album count to trigger getting info on hover
* Remove websocket event from photo page
* Add route to query albums for a specific asset
* Update API and add to detail-panel
* Fix tests
* Refactor API endpoint
* Added alt attribute to img tag
Co-authored-by: Alex <alex.tran1502@gmail.com>
* build endpoint to get asset count by month
* Added asset repository
* Added create asset
* get asset by device ID
* Added test for existing methods
* Refactor additional endpoint
* Refactor database api to get curated locations and curated objects
* Refactor get search properties
* Fixed cookies parsing for websocket
* Added API to get asset count by time group
* Remove unused code
* Added interaction to select multiple thumbnail
* Fixed stutter transition
* Return AlbumResponseDto after removing an asset from album
* Render correctly when an array of thumbnail is updated
* Fixed wording
* Added native dialog for removing users from album
* Fixed rendering incorrect profile image on share user select dialog
* Added album page
* Refactor sidebar
* Added album assets count info
* Added album viewer page
* Refactor album sorting
* Fixed incorrectly showing selected asset in album selection
* Improve fetching speed with prefetch
* Refactor to use ImmichThubmnail component for all
* Update to the latest version of Svelte
* Implement fixed app bar in album viewer
* Added shared user avatar
* Correctly get all owned albums, including shared