immich/mobile/lib/domain
Brandon Wees 0d60199514
fix(mobile): newest/oldest album sort (#20743)
* fix(mobile): newest/oldest album sort

* chore: use sqlite to determine album asset timestamps

* Fix missing future

Co-authored-by: Alex <alex.tran1502@gmail.com>

* fix: async handling of sort

* chore: tests

* chore: code review changes

* fix: use created at for newest asset

* fix: use localDateTime for sorting

* chore: cleanup

* chore: use final

* feat: loading indicator

---------

Co-authored-by: Alex <alex.tran1502@gmail.com>
2025-08-12 14:46:50 -05:00
..
interfaces refactor(mobile): interfaces refactor (#19415) 2025-06-23 11:27:44 -05:00
models refactor(mobile): sqlite-based map view (#20665) 2025-08-06 10:05:49 -05:00
services fix(mobile): newest/oldest album sort (#20743) 2025-08-12 14:46:50 -05:00
utils fix: not clearing local data when logging out while sync is running (#20646) 2025-08-04 17:14:26 -05:00
README.md refactor(mobile): split store into repo and service (#16199) 2025-02-19 13:05:24 -06:00

Domain Layer

This directory contains the domain layer of Immich. The domain layer is responsible for the business logic of the app. It includes interfaces for repositories, models, services and utilities. This layer should never depend on anything from the presentation layer or from the infrastructure layer.

Structure

  • Interfaces: These are the interfaces that define the contract for data operations.
  • Models: These are the core data classes that represent the business models.
  • Services: These are the classes that contain the business logic and interact with the repositories.
  • Utils: These are utility classes and functions that provide common functionalities used across the domain layer.
domain/
├── interfaces/
│   └── user.interface.dart
├── models/
│   └── user.model.dart
├── services/
│   └── user.service.dart
└── utils/
    └── date_utils.dart

Usage

The domain layer provides services that implement the business logic by consuming repositories through dependency injection. Services are exposed through Riverpod providers in the root providers directory.

// In presentation layer
final userService = ref.watch(userServiceProvider);
final user = await userService.getUser(userId);

The presentation layer should never directly use repositories, but instead interact with the domain layer through services.