diff --git a/docs/docs/administration/oauth.md b/docs/docs/administration/oauth.md
index 5105d2eb75..833b70f77a 100644
--- a/docs/docs/administration/oauth.md
+++ b/docs/docs/administration/oauth.md
@@ -62,6 +62,7 @@ Once you have a new OAuth client application configured, Immich can be configure
| Scope | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| Signing Algorithm | string | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) |
| Storage Label Claim | string | preferred_username | Claim mapping for the user's storage label**¹** |
+| Role Claim | string | immich_role | Claim mapping for the user's role. (should return "user" or "admin")**¹** |
| Storage Quota Claim | string | immich_quota | Claim mapping for the user's storage**¹** |
| Default Storage Quota (GiB) | number | 0 | Default quota for user without storage quota claim (Enter 0 for unlimited quota) |
| Button Text | string | Login with OAuth | Text for the OAuth button on the web |
diff --git a/docs/docs/features/supported-formats.md b/docs/docs/features/supported-formats.md
index e6fb2c8f00..16f1ab0b6b 100644
--- a/docs/docs/features/supported-formats.md
+++ b/docs/docs/features/supported-formats.md
@@ -16,7 +16,7 @@ For the full list, refer to the [Immich source code](https://github.com/immich-a
| `HEIC` | `.heic` | :white_check_mark: | |
| `HEIF` | `.heif` | :white_check_mark: | |
| `JPEG 2000` | `.jp2` | :white_check_mark: | |
-| `JPEG` | `.webp` `.jpg` `.jpe` `.insp` | :white_check_mark: | |
+| `JPEG` | `.jpeg` `.jpg` `.jpe` `.insp` | :white_check_mark: | |
| `JPEG XL` | `.jxl` | :white_check_mark: | |
| `PNG` | `.png` | :white_check_mark: | |
| `PSD` | `.psd` | :white_check_mark: | Adobe Photoshop |
diff --git a/e2e/src/api/specs/oauth.e2e-spec.ts b/e2e/src/api/specs/oauth.e2e-spec.ts
index 9e4d64892e..58fc43a2d5 100644
--- a/e2e/src/api/specs/oauth.e2e-spec.ts
+++ b/e2e/src/api/specs/oauth.e2e-spec.ts
@@ -227,6 +227,21 @@ describe(`/oauth`, () => {
expect(user.storageLabel).toBe('user-username');
});
+ it('should set the admin status from a role claim', async () => {
+ const callbackParams = await loginWithOAuth(OAuthUser.WITH_ROLE);
+ const { status, body } = await request(app).post('/oauth/callback').send(callbackParams);
+ expect(status).toBe(201);
+ expect(body).toMatchObject({
+ accessToken: expect.any(String),
+ userId: expect.any(String),
+ userEmail: 'oauth-with-role@immich.app',
+ isAdmin: true,
+ });
+
+ const user = await getMyUser({ headers: asBearerAuth(body.accessToken) });
+ expect(user.isAdmin).toBe(true);
+ });
+
it('should work with RS256 signed tokens', async () => {
await setupOAuth(admin.accessToken, {
enabled: true,
diff --git a/e2e/src/setup/auth-server.ts b/e2e/src/setup/auth-server.ts
index 575e97d291..489bda2ee4 100644
--- a/e2e/src/setup/auth-server.ts
+++ b/e2e/src/setup/auth-server.ts
@@ -12,6 +12,7 @@ export enum OAuthUser {
NO_NAME = 'no-name',
WITH_QUOTA = 'with-quota',
WITH_USERNAME = 'with-username',
+ WITH_ROLE = 'with-role',
}
const claims = [
@@ -34,6 +35,12 @@ const claims = [
preferred_username: 'user-quota',
immich_quota: 25,
},
+ {
+ sub: OAuthUser.WITH_ROLE,
+ email: 'oauth-with-role@immich.app',
+ email_verified: true,
+ immich_role: 'admin',
+ },
];
const withDefaultClaims = (sub: string) => ({
@@ -64,7 +71,15 @@ const setup = async () => {
claims: {
openid: ['sub'],
email: ['email', 'email_verified'],
- profile: ['name', 'given_name', 'family_name', 'preferred_username', 'immich_quota', 'immich_username'],
+ profile: [
+ 'name',
+ 'given_name',
+ 'family_name',
+ 'preferred_username',
+ 'immich_quota',
+ 'immich_username',
+ 'immich_role',
+ ],
},
features: {
jwtUserinfo: {
diff --git a/i18n/en.json b/i18n/en.json
index 43b26389bb..4d5a05fae3 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -196,6 +196,8 @@
"oauth_mobile_redirect_uri": "Mobile redirect URI",
"oauth_mobile_redirect_uri_override": "Mobile redirect URI override",
"oauth_mobile_redirect_uri_override_description": "Enable when OAuth provider does not allow a mobile URI, like ''{callback}''",
+ "oauth_role_claim": "Role Claim",
+ "oauth_role_claim_description": "Automatically grant admin access based on the presence of this claim. The claim may have either 'user' or 'admin'.",
"oauth_settings": "OAuth",
"oauth_settings_description": "Manage OAuth login settings",
"oauth_settings_more_details": "For more details about this feature, refer to the docs.",
diff --git a/machine-learning/uv.lock b/machine-learning/uv.lock
index 4e40ede5af..7da2fd3920 100644
--- a/machine-learning/uv.lock
+++ b/machine-learning/uv.lock
@@ -517,16 +517,16 @@ wheels = [
[[package]]
name = "fastapi"
-version = "0.115.13"
+version = "0.115.14"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/20/64/ec0788201b5554e2a87c49af26b77a4d132f807a0fa9675257ac92c6aa0e/fastapi-0.115.13.tar.gz", hash = "sha256:55d1d25c2e1e0a0a50aceb1c8705cd932def273c102bff0b1c1da88b3c6eb307", size = 295680, upload-time = "2025-06-17T11:49:45.575Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/53/8c38a874844a8b0fa10dd8adf3836ac154082cf88d3f22b544e9ceea0a15/fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739", size = 296263, upload-time = "2025-06-26T15:29:08.21Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/59/4a/e17764385382062b0edbb35a26b7cf76d71e27e456546277a42ba6545c6e/fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865", size = 95315, upload-time = "2025-06-17T11:49:44.106Z" },
+ { url = "https://files.pythonhosted.org/packages/53/50/b1222562c6d270fea83e9c9075b8e8600b8479150a18e4516a6138b980d1/fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca", size = 95514, upload-time = "2025-06-26T15:29:06.49Z" },
]
[[package]]
@@ -900,7 +900,7 @@ wheels = [
[[package]]
name = "huggingface-hub"
-version = "0.33.0"
+version = "0.33.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "filelock" },
@@ -912,9 +912,9 @@ dependencies = [
{ name = "tqdm" },
{ name = "typing-extensions" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/91/8a/1362d565fefabaa4185cf3ae842a98dbc5b35146f5694f7080f043a6952f/huggingface_hub-0.33.0.tar.gz", hash = "sha256:aa31f70d29439d00ff7a33837c03f1f9dd83971ce4e29ad664d63ffb17d3bb97", size = 426179, upload-time = "2025-06-11T17:08:07.913Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/fa/42/8a95c5632080ae312c0498744b2b852195e10b05a20b1be11c5141092f4c/huggingface_hub-0.33.2.tar.gz", hash = "sha256:84221defaec8fa09c090390cd68c78b88e3c4c2b7befba68d3dc5aacbc3c2c5f", size = 426637, upload-time = "2025-07-02T06:26:05.156Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/33/fb/53587a89fbc00799e4179796f51b3ad713c5de6bb680b2becb6d37c94649/huggingface_hub-0.33.0-py3-none-any.whl", hash = "sha256:e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3", size = 514799, upload-time = "2025-06-11T17:08:05.757Z" },
+ { url = "https://files.pythonhosted.org/packages/44/f4/5f3f22e762ad1965f01122b42dae5bf0e009286e2dba601ce1d0dba72424/huggingface_hub-0.33.2-py3-none-any.whl", hash = "sha256:3749498bfa91e8cde2ddc2c1db92c79981f40e66434c20133b39e5928ac9bcc5", size = 515373, upload-time = "2025-07-02T06:26:03.072Z" },
]
[[package]]
@@ -1044,7 +1044,7 @@ requires-dist = [
{ name = "onnxruntime", marker = "extra == 'armnn'", specifier = ">=1.15.0,<2" },
{ name = "onnxruntime", marker = "extra == 'cpu'", specifier = ">=1.15.0,<2" },
{ name = "onnxruntime", marker = "extra == 'rknn'", specifier = ">=1.15.0,<2" },
- { name = "onnxruntime-gpu", marker = "extra == 'cuda'", specifier = ">=1.17.0,<2", index = "https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/" },
+ { name = "onnxruntime-gpu", marker = "extra == 'cuda'", specifier = ">=1.17.0,<2", index = "https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple" },
{ name = "onnxruntime-openvino", marker = "extra == 'openvino'", specifier = ">=1.17.1,<1.19.0" },
{ name = "opencv-python-headless", specifier = ">=4.7.0.72,<5.0" },
{ name = "orjson", specifier = ">=3.9.5" },
@@ -1568,7 +1568,7 @@ wheels = [
[[package]]
name = "onnxruntime-gpu"
version = "1.19.2"
-source = { registry = "https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/" }
+source = { registry = "https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple" }
dependencies = [
{ name = "coloredlogs" },
{ name = "flatbuffers" },
@@ -1936,16 +1936,16 @@ wheels = [
[[package]]
name = "pydantic-settings"
-version = "2.9.1"
+version = "2.10.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "python-dotenv" },
{ name = "typing-inspection" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload-time = "2025-04-18T16:44:48.265Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload-time = "2025-04-18T16:44:46.617Z" },
+ { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
]
[[package]]
@@ -2304,27 +2304,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.12.0"
+version = "0.12.2"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/24/90/5255432602c0b196a0da6720f6f76b93eb50baef46d3c9b0025e2f9acbf3/ruff-0.12.0.tar.gz", hash = "sha256:4d047db3662418d4a848a3fdbfaf17488b34b62f527ed6f10cb8afd78135bc5c", size = 4376101, upload-time = "2025-06-17T15:19:26.217Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239, upload-time = "2025-07-03T16:40:19.566Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e6/fd/b46bb20e14b11ff49dbc74c61de352e0dc07fb650189513631f6fb5fc69f/ruff-0.12.0-py3-none-linux_armv6l.whl", hash = "sha256:5652a9ecdb308a1754d96a68827755f28d5dfb416b06f60fd9e13f26191a8848", size = 10311554, upload-time = "2025-06-17T15:18:45.792Z" },
- { url = "https://files.pythonhosted.org/packages/e7/d3/021dde5a988fa3e25d2468d1dadeea0ae89dc4bc67d0140c6e68818a12a1/ruff-0.12.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:05ed0c914fabc602fc1f3b42c53aa219e5736cb030cdd85640c32dbc73da74a6", size = 11118435, upload-time = "2025-06-17T15:18:49.064Z" },
- { url = "https://files.pythonhosted.org/packages/07/a2/01a5acf495265c667686ec418f19fd5c32bcc326d4c79ac28824aecd6a32/ruff-0.12.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:07a7aa9b69ac3fcfda3c507916d5d1bca10821fe3797d46bad10f2c6de1edda0", size = 10466010, upload-time = "2025-06-17T15:18:51.341Z" },
- { url = "https://files.pythonhosted.org/packages/4c/57/7caf31dd947d72e7aa06c60ecb19c135cad871a0a8a251723088132ce801/ruff-0.12.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7731c3eec50af71597243bace7ec6104616ca56dda2b99c89935fe926bdcd48", size = 10661366, upload-time = "2025-06-17T15:18:53.29Z" },
- { url = "https://files.pythonhosted.org/packages/e9/ba/aa393b972a782b4bc9ea121e0e358a18981980856190d7d2b6187f63e03a/ruff-0.12.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:952d0630eae628250ab1c70a7fffb641b03e6b4a2d3f3ec6c1d19b4ab6c6c807", size = 10173492, upload-time = "2025-06-17T15:18:55.262Z" },
- { url = "https://files.pythonhosted.org/packages/d7/50/9349ee777614bc3062fc6b038503a59b2034d09dd259daf8192f56c06720/ruff-0.12.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c021f04ea06966b02614d442e94071781c424ab8e02ec7af2f037b4c1e01cc82", size = 11761739, upload-time = "2025-06-17T15:18:58.906Z" },
- { url = "https://files.pythonhosted.org/packages/04/8f/ad459de67c70ec112e2ba7206841c8f4eb340a03ee6a5cabc159fe558b8e/ruff-0.12.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d235618283718ee2fe14db07f954f9b2423700919dc688eacf3f8797a11315c", size = 12537098, upload-time = "2025-06-17T15:19:01.316Z" },
- { url = "https://files.pythonhosted.org/packages/ed/50/15ad9c80ebd3c4819f5bd8883e57329f538704ed57bac680d95cb6627527/ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0758038f81beec8cc52ca22de9685b8ae7f7cc18c013ec2050012862cc9165", size = 12154122, upload-time = "2025-06-17T15:19:03.727Z" },
- { url = "https://files.pythonhosted.org/packages/76/e6/79b91e41bc8cc3e78ee95c87093c6cacfa275c786e53c9b11b9358026b3d/ruff-0.12.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:139b3d28027987b78fc8d6cfb61165447bdf3740e650b7c480744873688808c2", size = 11363374, upload-time = "2025-06-17T15:19:05.875Z" },
- { url = "https://files.pythonhosted.org/packages/db/c3/82b292ff8a561850934549aa9dc39e2c4e783ab3c21debe55a495ddf7827/ruff-0.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68853e8517b17bba004152aebd9dd77d5213e503a5f2789395b25f26acac0da4", size = 11587647, upload-time = "2025-06-17T15:19:08.246Z" },
- { url = "https://files.pythonhosted.org/packages/2b/42/d5760d742669f285909de1bbf50289baccb647b53e99b8a3b4f7ce1b2001/ruff-0.12.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3a9512af224b9ac4757f7010843771da6b2b0935a9e5e76bb407caa901a1a514", size = 10527284, upload-time = "2025-06-17T15:19:10.37Z" },
- { url = "https://files.pythonhosted.org/packages/19/f6/fcee9935f25a8a8bba4adbae62495c39ef281256693962c2159e8b284c5f/ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b08df3d96db798e5beb488d4df03011874aff919a97dcc2dd8539bb2be5d6a88", size = 10158609, upload-time = "2025-06-17T15:19:12.286Z" },
- { url = "https://files.pythonhosted.org/packages/37/fb/057febf0eea07b9384787bfe197e8b3384aa05faa0d6bd844b94ceb29945/ruff-0.12.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6a315992297a7435a66259073681bb0d8647a826b7a6de45c6934b2ca3a9ed51", size = 11141462, upload-time = "2025-06-17T15:19:15.195Z" },
- { url = "https://files.pythonhosted.org/packages/10/7c/1be8571011585914b9d23c95b15d07eec2d2303e94a03df58294bc9274d4/ruff-0.12.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e55e44e770e061f55a7dbc6e9aed47feea07731d809a3710feda2262d2d4d8a", size = 11641616, upload-time = "2025-06-17T15:19:17.6Z" },
- { url = "https://files.pythonhosted.org/packages/6a/ef/b960ab4818f90ff59e571d03c3f992828d4683561095e80f9ef31f3d58b7/ruff-0.12.0-py3-none-win32.whl", hash = "sha256:7162a4c816f8d1555eb195c46ae0bd819834d2a3f18f98cc63819a7b46f474fb", size = 10525289, upload-time = "2025-06-17T15:19:19.688Z" },
- { url = "https://files.pythonhosted.org/packages/34/93/8b16034d493ef958a500f17cda3496c63a537ce9d5a6479feec9558f1695/ruff-0.12.0-py3-none-win_amd64.whl", hash = "sha256:d00b7a157b8fb6d3827b49d3324da34a1e3f93492c1f97b08e222ad7e9b291e0", size = 11598311, upload-time = "2025-06-17T15:19:21.785Z" },
- { url = "https://files.pythonhosted.org/packages/d0/33/4d3e79e4a84533d6cd526bfb42c020a23256ae5e4265d858bd1287831f7d/ruff-0.12.0-py3-none-win_arm64.whl", hash = "sha256:8cd24580405ad8c1cc64d61725bca091d6b6da7eb3d36f72cc605467069d7e8b", size = 10724946, upload-time = "2025-06-17T15:19:23.952Z" },
+ { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761, upload-time = "2025-07-03T16:39:38.847Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659, upload-time = "2025-07-03T16:39:42.294Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769, upload-time = "2025-07-03T16:39:44.75Z" },
+ { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602, upload-time = "2025-07-03T16:39:47.652Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772, upload-time = "2025-07-03T16:39:49.641Z" },
+ { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173, upload-time = "2025-07-03T16:39:52.069Z" },
+ { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002, upload-time = "2025-07-03T16:39:54.551Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330, upload-time = "2025-07-03T16:39:57.55Z" },
+ { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717, upload-time = "2025-07-03T16:39:59.78Z" },
+ { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659, upload-time = "2025-07-03T16:40:01.934Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012, upload-time = "2025-07-03T16:40:04.363Z" },
+ { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799, upload-time = "2025-07-03T16:40:06.514Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507, upload-time = "2025-07-03T16:40:08.708Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609, upload-time = "2025-07-03T16:40:10.836Z" },
+ { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823, upload-time = "2025-07-03T16:40:13.203Z" },
+ { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831, upload-time = "2025-07-03T16:40:15.478Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334, upload-time = "2025-07-03T16:40:17.677Z" },
]
[[package]]
@@ -2504,27 +2504,27 @@ wheels = [
[[package]]
name = "tokenizers"
-version = "0.21.1"
+version = "0.21.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huggingface-hub" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256, upload-time = "2025-03-13T10:51:18.189Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ab/2d/b0fce2b8201635f60e8c95990080f58461cc9ca3d5026de2e900f38a7f21/tokenizers-0.21.2.tar.gz", hash = "sha256:fdc7cffde3e2113ba0e6cc7318c40e3438a4d74bbc62bf04bcc63bdfb082ac77", size = 351545, upload-time = "2025-06-24T10:24:52.449Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767, upload-time = "2025-03-13T10:51:09.459Z" },
- { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555, upload-time = "2025-03-13T10:51:07.692Z" },
- { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541, upload-time = "2025-03-13T10:50:56.679Z" },
- { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058, upload-time = "2025-03-13T10:50:59.525Z" },
- { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278, upload-time = "2025-03-13T10:51:04.678Z" },
- { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253, upload-time = "2025-03-13T10:51:01.261Z" },
- { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225, upload-time = "2025-03-13T10:51:03.243Z" },
- { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874, upload-time = "2025-03-13T10:51:06.235Z" },
- { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448, upload-time = "2025-03-13T10:51:10.927Z" },
- { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877, upload-time = "2025-03-13T10:51:12.688Z" },
- { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645, upload-time = "2025-03-13T10:51:14.723Z" },
- { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380, upload-time = "2025-03-13T10:51:16.526Z" },
- { url = "https://files.pythonhosted.org/packages/e8/5b/a5d98c89f747455e8b7a9504910c865d5e51da55e825a7ae641fb5ff0a58/tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3", size = 2239506, upload-time = "2025-03-13T10:51:20.643Z" },
- { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481, upload-time = "2025-03-13T10:51:19.243Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/cc/2936e2d45ceb130a21d929743f1e9897514691bec123203e10837972296f/tokenizers-0.21.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:342b5dfb75009f2255ab8dec0041287260fed5ce00c323eb6bab639066fef8ec", size = 2875206, upload-time = "2025-06-24T10:24:42.755Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/e6/33f41f2cc7861faeba8988e7a77601407bf1d9d28fc79c5903f8f77df587/tokenizers-0.21.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:126df3205d6f3a93fea80c7a8a266a78c1bd8dd2fe043386bafdd7736a23e45f", size = 2732655, upload-time = "2025-06-24T10:24:41.56Z" },
+ { url = "https://files.pythonhosted.org/packages/33/2b/1791eb329c07122a75b01035b1a3aa22ad139f3ce0ece1b059b506d9d9de/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a32cd81be21168bd0d6a0f0962d60177c447a1aa1b1e48fa6ec9fc728ee0b12", size = 3019202, upload-time = "2025-06-24T10:24:31.791Z" },
+ { url = "https://files.pythonhosted.org/packages/05/15/fd2d8104faa9f86ac68748e6f7ece0b5eb7983c7efc3a2c197cb98c99030/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8bd8999538c405133c2ab999b83b17c08b7fc1b48c1ada2469964605a709ef91", size = 2934539, upload-time = "2025-06-24T10:24:34.567Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/2e/53e8fd053e1f3ffbe579ca5f9546f35ac67cf0039ed357ad7ec57f5f5af0/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9944e61239b083a41cf8fc42802f855e1dca0f499196df37a8ce219abac6eb", size = 3248665, upload-time = "2025-06-24T10:24:39.024Z" },
+ { url = "https://files.pythonhosted.org/packages/00/15/79713359f4037aa8f4d1f06ffca35312ac83629da062670e8830917e2153/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:514cd43045c5d546f01142ff9c79a96ea69e4b5cda09e3027708cb2e6d5762ab", size = 3451305, upload-time = "2025-06-24T10:24:36.133Z" },
+ { url = "https://files.pythonhosted.org/packages/38/5f/959f3a8756fc9396aeb704292777b84f02a5c6f25c3fc3ba7530db5feb2c/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b9405822527ec1e0f7d8d2fdb287a5730c3a6518189c968254a8441b21faae", size = 3214757, upload-time = "2025-06-24T10:24:37.784Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/74/f41a432a0733f61f3d21b288de6dfa78f7acff309c6f0f323b2833e9189f/tokenizers-0.21.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed9a4d51c395103ad24f8e7eb976811c57fbec2af9f133df471afcd922e5020", size = 3121887, upload-time = "2025-06-24T10:24:40.293Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/6a/bc220a11a17e5d07b0dfb3b5c628621d4dcc084bccd27cfaead659963016/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c41862df3d873665ec78b6be36fcc30a26e3d4902e9dd8608ed61d49a48bc19", size = 9091965, upload-time = "2025-06-24T10:24:44.431Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/bd/ac386d79c4ef20dc6f39c4706640c24823dca7ebb6f703bfe6b5f0292d88/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed21dc7e624e4220e21758b2e62893be7101453525e3d23264081c9ef9a6d00d", size = 9053372, upload-time = "2025-06-24T10:24:46.455Z" },
+ { url = "https://files.pythonhosted.org/packages/63/7b/5440bf203b2a5358f074408f7f9c42884849cd9972879e10ee6b7a8c3b3d/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:0e73770507e65a0e0e2a1affd6b03c36e3bc4377bd10c9ccf51a82c77c0fe365", size = 9298632, upload-time = "2025-06-24T10:24:48.446Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/d2/faa1acac3f96a7427866e94ed4289949b2524f0c1878512516567d80563c/tokenizers-0.21.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:106746e8aa9014a12109e58d540ad5465b4c183768ea96c03cbc24c44d329958", size = 9470074, upload-time = "2025-06-24T10:24:50.378Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/a5/896e1ef0707212745ae9f37e84c7d50269411aef2e9ccd0de63623feecdf/tokenizers-0.21.2-cp39-abi3-win32.whl", hash = "sha256:cabda5a6d15d620b6dfe711e1af52205266d05b379ea85a8a301b3593c60e962", size = 2330115, upload-time = "2025-06-24T10:24:55.069Z" },
+ { url = "https://files.pythonhosted.org/packages/13/c3/cc2755ee10be859c4338c962a35b9a663788c0c0b50c0bdd8078fb6870cf/tokenizers-0.21.2-cp39-abi3-win_amd64.whl", hash = "sha256:58747bb898acdb1007f37a7bbe614346e98dc28708ffb66a3fd50ce169ac6c98", size = 2509918, upload-time = "2025-06-24T10:24:53.71Z" },
]
[[package]]
@@ -2628,16 +2628,16 @@ wheels = [
[[package]]
name = "uvicorn"
-version = "0.34.3"
+version = "0.35.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
{ name = "h11" },
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/de/ad/713be230bcda622eaa35c28f0d328c3675c371238470abdea52417f17a8e/uvicorn-0.34.3.tar.gz", hash = "sha256:35919a9a979d7a59334b6b10e05d77c1d0d574c50e0fc98b8b1a0f165708b55a", size = 76631, upload-time = "2025-06-01T07:48:17.531Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/6d/0d/8adfeaa62945f90d19ddc461c55f4a50c258af7662d34b6a3d5d1f8646f6/uvicorn-0.34.3-py3-none-any.whl", hash = "sha256:16246631db62bdfbf069b0645177d6e8a77ba950cfedbfd093acef9444e4d885", size = 62431, upload-time = "2025-06-01T07:48:15.664Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" },
]
[package.optional-dependencies]
diff --git a/mobile/drift_schemas/main/drift_schema_v1.json b/mobile/drift_schemas/main/drift_schema_v1.json
index 30f92cf8db..493a34cc94 100644
--- a/mobile/drift_schemas/main/drift_schema_v1.json
+++ b/mobile/drift_schemas/main/drift_schema_v1.json
@@ -1 +1 @@
-{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":true},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"user_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_admin","getter_name":"isAdmin","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_admin\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_admin\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"email","getter_name":"email","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"profile_image_path","getter_name":"profileImagePath","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"quota_size_in_bytes","getter_name":"quotaSizeInBytes","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"quota_usage_in_bytes","getter_name":"quotaUsageInBytes","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":1,"references":[0],"type":"table","data":{"name":"remote_asset_entity","was_declared_in_moor":false,"columns":[{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetType.values)","dart_type_name":"AssetType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"duration_in_seconds","getter_name":"durationInSeconds","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"checksum","getter_name":"checksum","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_favorite","getter_name":"isFavorite","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_favorite\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_favorite\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"local_date_time","getter_name":"localDateTime","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"thumb_hash","getter_name":"thumbHash","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"visibility","getter_name":"visibility","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetVisibility.values)","dart_type_name":"AssetVisibility"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":2,"references":[],"type":"table","data":{"name":"local_asset_entity","was_declared_in_moor":false,"columns":[{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetType.values)","dart_type_name":"AssetType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"duration_in_seconds","getter_name":"durationInSeconds","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"checksum","getter_name":"checksum","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_favorite","getter_name":"isFavorite","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_favorite\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_favorite\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":3,"references":[2],"type":"index","data":{"on":2,"name":"idx_local_asset_checksum","sql":null,"unique":false,"columns":["checksum"]}},{"id":4,"references":[1],"type":"index","data":{"on":1,"name":"UQ_remote_asset_owner_checksum","sql":null,"unique":true,"columns":["checksum","owner_id"]}},{"id":5,"references":[1],"type":"index","data":{"on":1,"name":"idx_remote_asset_checksum","sql":null,"unique":false,"columns":["checksum"]}},{"id":6,"references":[0],"type":"table","data":{"name":"user_metadata_entity","was_declared_in_moor":false,"columns":[{"name":"user_id","getter_name":"userId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"preferences","getter_name":"preferences","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"userPreferenceConverter","dart_type_name":"UserPreferences"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["user_id"]}},{"id":7,"references":[0],"type":"table","data":{"name":"partner_entity","was_declared_in_moor":false,"columns":[{"name":"shared_by_id","getter_name":"sharedById","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"shared_with_id","getter_name":"sharedWithId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"in_timeline","getter_name":"inTimeline","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"in_timeline\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"in_timeline\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["shared_by_id","shared_with_id"]}},{"id":8,"references":[],"type":"table","data":{"name":"local_album_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"backup_selection","getter_name":"backupSelection","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BackupSelection.values)","dart_type_name":"BackupSelection"}},{"name":"is_ios_shared_album","getter_name":"isIosSharedAlbum","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_ios_shared_album\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_ios_shared_album\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"marker","getter_name":"marker_","moor_type":"bool","nullable":true,"customConstraints":null,"defaultConstraints":"CHECK (\"marker\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"marker\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":9,"references":[2,8],"type":"table","data":{"name":"local_album_asset_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES local_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES local_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES local_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES local_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id","album_id"]}},{"id":10,"references":[1],"type":"table","data":{"name":"remote_exif_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"city","getter_name":"city","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"state","getter_name":"state","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"country","getter_name":"country","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"date_time_original","getter_name":"dateTimeOriginal","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"exposure_time","getter_name":"exposureTime","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"f_number","getter_name":"fNumber","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"file_size","getter_name":"fileSize","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"focal_length","getter_name":"focalLength","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"latitude","getter_name":"latitude","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"longitude","getter_name":"longitude","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"iso","getter_name":"iso","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"make","getter_name":"make","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"model","getter_name":"model","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"lens","getter_name":"lens","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"orientation","getter_name":"orientation","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"time_zone","getter_name":"timeZone","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rating","getter_name":"rating","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"projection_type","getter_name":"projectionType","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id"]}},{"id":11,"references":[0,1],"type":"table","data":{"name":"remote_album_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"thumbnail_asset_id","getter_name":"thumbnailAssetId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE SET NULL","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE SET NULL"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"is_activity_enabled","getter_name":"isActivityEnabled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_activity_enabled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_activity_enabled\" IN (0, 1))"},"default_dart":"const CustomExpression('1')","default_client_dart":null,"dsl_features":[]},{"name":"order","getter_name":"order","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AlbumAssetOrder.values)","dart_type_name":"AlbumAssetOrder"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":12,"references":[1,11],"type":"table","data":{"name":"remote_album_asset_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id","album_id"]}},{"id":13,"references":[11,0],"type":"table","data":{"name":"remote_album_user_entity","was_declared_in_moor":false,"columns":[{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"user_id","getter_name":"userId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"role","getter_name":"role","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AlbumUserRole.values)","dart_type_name":"AlbumUserRole"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["album_id","user_id"]}}]}
\ No newline at end of file
+{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":true},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"user_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_admin","getter_name":"isAdmin","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_admin\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_admin\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"email","getter_name":"email","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"profile_image_path","getter_name":"profileImagePath","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"quota_size_in_bytes","getter_name":"quotaSizeInBytes","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"quota_usage_in_bytes","getter_name":"quotaUsageInBytes","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":1,"references":[0],"type":"table","data":{"name":"remote_asset_entity","was_declared_in_moor":false,"columns":[{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetType.values)","dart_type_name":"AssetType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"duration_in_seconds","getter_name":"durationInSeconds","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"checksum","getter_name":"checksum","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_favorite","getter_name":"isFavorite","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_favorite\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_favorite\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"local_date_time","getter_name":"localDateTime","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"thumb_hash","getter_name":"thumbHash","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"visibility","getter_name":"visibility","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetVisibility.values)","dart_type_name":"AssetVisibility"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":2,"references":[],"type":"table","data":{"name":"local_asset_entity","was_declared_in_moor":false,"columns":[{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AssetType.values)","dart_type_name":"AssetType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"duration_in_seconds","getter_name":"durationInSeconds","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"checksum","getter_name":"checksum","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_favorite","getter_name":"isFavorite","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_favorite\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_favorite\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":3,"references":[2],"type":"index","data":{"on":2,"name":"idx_local_asset_checksum","sql":null,"unique":false,"columns":["checksum"]}},{"id":4,"references":[1],"type":"index","data":{"on":1,"name":"UQ_remote_asset_owner_checksum","sql":null,"unique":true,"columns":["checksum","owner_id"]}},{"id":5,"references":[1],"type":"index","data":{"on":1,"name":"idx_remote_asset_checksum","sql":null,"unique":false,"columns":["checksum"]}},{"id":6,"references":[0],"type":"table","data":{"name":"user_metadata_entity","was_declared_in_moor":false,"columns":[{"name":"user_id","getter_name":"userId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"preferences","getter_name":"preferences","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"userPreferenceConverter","dart_type_name":"UserPreferences"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["user_id"]}},{"id":7,"references":[0],"type":"table","data":{"name":"partner_entity","was_declared_in_moor":false,"columns":[{"name":"shared_by_id","getter_name":"sharedById","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"shared_with_id","getter_name":"sharedWithId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"in_timeline","getter_name":"inTimeline","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"in_timeline\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"in_timeline\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["shared_by_id","shared_with_id"]}},{"id":8,"references":[],"type":"table","data":{"name":"local_album_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"backup_selection","getter_name":"backupSelection","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(BackupSelection.values)","dart_type_name":"BackupSelection"}},{"name":"is_ios_shared_album","getter_name":"isIosSharedAlbum","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_ios_shared_album\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_ios_shared_album\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"marker","getter_name":"marker_","moor_type":"bool","nullable":true,"customConstraints":null,"defaultConstraints":"CHECK (\"marker\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"marker\" IN (0, 1))"},"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":9,"references":[2,8],"type":"table","data":{"name":"local_album_asset_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES local_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES local_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES local_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES local_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id","album_id"]}},{"id":10,"references":[1],"type":"table","data":{"name":"remote_exif_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"city","getter_name":"city","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"state","getter_name":"state","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"country","getter_name":"country","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"date_time_original","getter_name":"dateTimeOriginal","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"height","getter_name":"height","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"width","getter_name":"width","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"exposure_time","getter_name":"exposureTime","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"f_number","getter_name":"fNumber","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"file_size","getter_name":"fileSize","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"focal_length","getter_name":"focalLength","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"latitude","getter_name":"latitude","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"longitude","getter_name":"longitude","moor_type":"double","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"iso","getter_name":"iso","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"make","getter_name":"make","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"model","getter_name":"model","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"lens","getter_name":"lens","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"orientation","getter_name":"orientation","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"time_zone","getter_name":"timeZone","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rating","getter_name":"rating","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"projection_type","getter_name":"projectionType","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id"]}},{"id":11,"references":[0,1],"type":"table","data":{"name":"remote_album_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"description","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'\\'')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"thumbnail_asset_id","getter_name":"thumbnailAssetId","moor_type":"string","nullable":true,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE SET NULL","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE SET NULL"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"is_activity_enabled","getter_name":"isActivityEnabled","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_activity_enabled\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_activity_enabled\" IN (0, 1))"},"default_dart":"const CustomExpression('1')","default_client_dart":null,"dsl_features":[]},{"name":"order","getter_name":"order","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AlbumAssetOrder.values)","dart_type_name":"AlbumAssetOrder"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":12,"references":[1,11],"type":"table","data":{"name":"remote_album_asset_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id","album_id"]}},{"id":13,"references":[11,0],"type":"table","data":{"name":"remote_album_user_entity","was_declared_in_moor":false,"columns":[{"name":"album_id","getter_name":"albumId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_album_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_album_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"user_id","getter_name":"userId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"role","getter_name":"role","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(AlbumUserRole.values)","dart_type_name":"AlbumUserRole"}}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["album_id","user_id"]}},{"id":14,"references":[0],"type":"table","data":{"name":"memory_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"deleted_at","getter_name":"deletedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"type","getter_name":"type","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(MemoryTypeEnum.values)","dart_type_name":"MemoryTypeEnum"}},{"name":"data","getter_name":"data","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_saved","getter_name":"isSaved","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_saved\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_saved\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"memory_at","getter_name":"memoryAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"seen_at","getter_name":"seenAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"show_at","getter_name":"showAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"hide_at","getter_name":"hideAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}},{"id":15,"references":[1,14],"type":"table","data":{"name":"memory_asset_entity","was_declared_in_moor":false,"columns":[{"name":"asset_id","getter_name":"assetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"memory_id","getter_name":"memoryId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES memory_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES memory_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["asset_id","memory_id"]}},{"id":16,"references":[0,1],"type":"table","data":{"name":"stack_entity","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CURRENT_TIMESTAMP')","default_client_dart":null,"dsl_features":[]},{"name":"owner_id","getter_name":"ownerId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES user_entity (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES user_entity (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"primary_asset_id","getter_name":"primaryAssetId","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES remote_asset_entity (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES remote_asset_entity (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]}],"is_virtual":false,"without_rowid":true,"constraints":[],"strict":true,"explicit_pk":["id"]}}]}
\ No newline at end of file
diff --git a/mobile/lib/domain/models/asset/base_asset.model.dart b/mobile/lib/domain/models/asset/base_asset.model.dart
index dd57456c76..1226d1730f 100644
--- a/mobile/lib/domain/models/asset/base_asset.model.dart
+++ b/mobile/lib/domain/models/asset/base_asset.model.dart
@@ -1,5 +1,5 @@
-part 'remote_asset.model.dart';
part 'local_asset.model.dart';
+part 'remote_asset.model.dart';
enum AssetType {
// do not change this order!
@@ -48,6 +48,13 @@ sealed class BaseAsset {
return null;
}
+ bool get hasRemote =>
+ storage == AssetState.remote || storage == AssetState.merged;
+ bool get hasLocal =>
+ storage == AssetState.local || storage == AssetState.merged;
+ bool get isLocalOnly => storage == AssetState.local;
+ bool get isRemoteOnly => storage == AssetState.remote;
+
// Overridden in subclasses
AssetState get storage;
String get heroTag;
diff --git a/mobile/lib/domain/models/asset/local_asset.model.dart b/mobile/lib/domain/models/asset/local_asset.model.dart
index 8aab1e3431..30a4955fa8 100644
--- a/mobile/lib/domain/models/asset/local_asset.model.dart
+++ b/mobile/lib/domain/models/asset/local_asset.model.dart
@@ -25,8 +25,6 @@ class LocalAsset extends BaseAsset {
@override
String get heroTag => '${id}_${remoteId ?? checksum}';
- bool get hasRemote => remoteId != null;
-
@override
String toString() {
return '''LocalAsset {
diff --git a/mobile/lib/domain/models/asset/remote_asset.model.dart b/mobile/lib/domain/models/asset/remote_asset.model.dart
index 9a4ba1ebeb..57b5f03c16 100644
--- a/mobile/lib/domain/models/asset/remote_asset.model.dart
+++ b/mobile/lib/domain/models/asset/remote_asset.model.dart
@@ -41,8 +41,6 @@ class RemoteAsset extends BaseAsset {
@override
String get heroTag => '${localId ?? checksum}_$id';
- bool get hasLocal => localId != null;
-
@override
String toString() {
return '''Asset {
@@ -85,4 +83,38 @@ class RemoteAsset extends BaseAsset {
thumbHash.hashCode ^
localDateTime.hashCode ^
visibility.hashCode;
+
+ RemoteAsset copyWith({
+ String? id,
+ String? localId,
+ String? name,
+ String? ownerId,
+ String? checksum,
+ AssetType? type,
+ DateTime? createdAt,
+ DateTime? updatedAt,
+ int? width,
+ int? height,
+ int? durationInSeconds,
+ bool? isFavorite,
+ String? thumbHash,
+ AssetVisibility? visibility,
+ }) {
+ return RemoteAsset(
+ id: id ?? this.id,
+ localId: localId ?? this.localId,
+ name: name ?? this.name,
+ ownerId: ownerId ?? this.ownerId,
+ checksum: checksum ?? this.checksum,
+ type: type ?? this.type,
+ createdAt: createdAt ?? this.createdAt,
+ updatedAt: updatedAt ?? this.updatedAt,
+ width: width ?? this.width,
+ height: height ?? this.height,
+ durationInSeconds: durationInSeconds ?? this.durationInSeconds,
+ isFavorite: isFavorite ?? this.isFavorite,
+ thumbHash: thumbHash ?? this.thumbHash,
+ visibility: visibility ?? this.visibility,
+ );
+ }
}
diff --git a/mobile/lib/domain/models/memory.model.dart b/mobile/lib/domain/models/memory.model.dart
new file mode 100644
index 0000000000..ba2a43428f
--- /dev/null
+++ b/mobile/lib/domain/models/memory.model.dart
@@ -0,0 +1,166 @@
+// ignore_for_file: public_member_api_docs, sort_constructors_first
+import 'dart:convert';
+
+import 'package:collection/collection.dart';
+
+import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
+
+enum MemoryTypeEnum {
+ // do not change this order!
+ onThisDay,
+}
+
+class MemoryData {
+ final int year;
+
+ const MemoryData({
+ required this.year,
+ });
+
+ MemoryData copyWith({
+ int? year,
+ }) {
+ return MemoryData(
+ year: year ?? this.year,
+ );
+ }
+
+ Map toMap() {
+ return {
+ 'year': year,
+ };
+ }
+
+ factory MemoryData.fromMap(Map map) {
+ return MemoryData(
+ year: map['year'] as int,
+ );
+ }
+
+ String toJson() => json.encode(toMap());
+
+ factory MemoryData.fromJson(String source) =>
+ MemoryData.fromMap(json.decode(source) as Map);
+
+ @override
+ String toString() => 'MemoryData(year: $year)';
+
+ @override
+ bool operator ==(covariant MemoryData other) {
+ if (identical(this, other)) return true;
+
+ return other.year == year;
+ }
+
+ @override
+ int get hashCode => year.hashCode;
+}
+
+// Model for a memory stored in the server
+class DriftMemory {
+ final String id;
+ final DateTime createdAt;
+ final DateTime updatedAt;
+ final DateTime? deletedAt;
+ final String ownerId;
+
+ // enum
+ final MemoryTypeEnum type;
+ final MemoryData data;
+ final bool isSaved;
+ final DateTime memoryAt;
+ final DateTime? seenAt;
+ final DateTime? showAt;
+ final DateTime? hideAt;
+ final List assets;
+
+ const DriftMemory({
+ required this.id,
+ required this.createdAt,
+ required this.updatedAt,
+ this.deletedAt,
+ required this.ownerId,
+ required this.type,
+ required this.data,
+ required this.isSaved,
+ required this.memoryAt,
+ this.seenAt,
+ this.showAt,
+ this.hideAt,
+ required this.assets,
+ });
+
+ DriftMemory copyWith({
+ String? id,
+ DateTime? createdAt,
+ DateTime? updatedAt,
+ DateTime? deletedAt,
+ String? ownerId,
+ MemoryTypeEnum? type,
+ MemoryData? data,
+ bool? isSaved,
+ DateTime? memoryAt,
+ DateTime? seenAt,
+ DateTime? showAt,
+ DateTime? hideAt,
+ List? assets,
+ }) {
+ return DriftMemory(
+ id: id ?? this.id,
+ createdAt: createdAt ?? this.createdAt,
+ updatedAt: updatedAt ?? this.updatedAt,
+ deletedAt: deletedAt ?? this.deletedAt,
+ ownerId: ownerId ?? this.ownerId,
+ type: type ?? this.type,
+ data: data ?? this.data,
+ isSaved: isSaved ?? this.isSaved,
+ memoryAt: memoryAt ?? this.memoryAt,
+ seenAt: seenAt ?? this.seenAt,
+ showAt: showAt ?? this.showAt,
+ hideAt: hideAt ?? this.hideAt,
+ assets: assets ?? this.assets,
+ );
+ }
+
+ @override
+ String toString() {
+ return 'Memory(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt, ownerId: $ownerId, type: $type, data: $data, isSaved: $isSaved, memoryAt: $memoryAt, seenAt: $seenAt, showAt: $showAt, hideAt: $hideAt, assets: $assets)';
+ }
+
+ @override
+ bool operator ==(covariant DriftMemory other) {
+ if (identical(this, other)) return true;
+ final listEquals = const DeepCollectionEquality().equals;
+
+ return other.id == id &&
+ other.createdAt == createdAt &&
+ other.updatedAt == updatedAt &&
+ other.deletedAt == deletedAt &&
+ other.ownerId == ownerId &&
+ other.type == type &&
+ other.data == data &&
+ other.isSaved == isSaved &&
+ other.memoryAt == memoryAt &&
+ other.seenAt == seenAt &&
+ other.showAt == showAt &&
+ other.hideAt == hideAt &&
+ listEquals(other.assets, assets);
+ }
+
+ @override
+ int get hashCode {
+ return id.hashCode ^
+ createdAt.hashCode ^
+ updatedAt.hashCode ^
+ deletedAt.hashCode ^
+ ownerId.hashCode ^
+ type.hashCode ^
+ data.hashCode ^
+ isSaved.hashCode ^
+ memoryAt.hashCode ^
+ seenAt.hashCode ^
+ showAt.hashCode ^
+ hideAt.hashCode ^
+ assets.hashCode;
+ }
+}
diff --git a/mobile/lib/domain/models/setting.model.dart b/mobile/lib/domain/models/setting.model.dart
index fe341dc028..a256ee3589 100644
--- a/mobile/lib/domain/models/setting.model.dart
+++ b/mobile/lib/domain/models/setting.model.dart
@@ -6,6 +6,7 @@ enum Setting {
showStorageIndicator(StoreKey.storageIndicator, true),
loadOriginal(StoreKey.loadOriginal, false),
preferRemoteImage(StoreKey.preferRemoteImage, false),
+ advancedTroubleshooting(StoreKey.advancedTroubleshooting, false),
;
const Setting(this.storeKey, this.defaultValue);
diff --git a/mobile/lib/domain/models/stack.model.dart b/mobile/lib/domain/models/stack.model.dart
new file mode 100644
index 0000000000..5404eb8f42
--- /dev/null
+++ b/mobile/lib/domain/models/stack.model.dart
@@ -0,0 +1,84 @@
+import 'dart:convert';
+
+// Model for a stack stored in the server
+class Stack {
+ final String id;
+ final DateTime createdAt;
+ final DateTime updatedAt;
+ final String ownerId;
+ final String primaryAssetId;
+
+ const Stack({
+ required this.id,
+ required this.createdAt,
+ required this.updatedAt,
+ required this.ownerId,
+ required this.primaryAssetId,
+ });
+
+ Stack copyWith({
+ String? id,
+ DateTime? createdAt,
+ DateTime? updatedAt,
+ String? ownerId,
+ String? primaryAssetId,
+ }) {
+ return Stack(
+ id: id ?? this.id,
+ createdAt: createdAt ?? this.createdAt,
+ updatedAt: updatedAt ?? this.updatedAt,
+ ownerId: ownerId ?? this.ownerId,
+ primaryAssetId: primaryAssetId ?? this.primaryAssetId,
+ );
+ }
+
+ Map toMap() {
+ return {
+ 'id': id,
+ 'createdAt': createdAt.millisecondsSinceEpoch,
+ 'updatedAt': updatedAt.millisecondsSinceEpoch,
+ 'ownerId': ownerId,
+ 'primaryAssetId': primaryAssetId,
+ };
+ }
+
+ factory Stack.fromMap(Map map) {
+ return Stack(
+ id: map['id'] as String,
+ createdAt: DateTime.fromMillisecondsSinceEpoch(map['createdAt'] as int),
+ updatedAt: DateTime.fromMillisecondsSinceEpoch(map['updatedAt'] as int),
+ ownerId: map['ownerId'] as String,
+ primaryAssetId: map['primaryAssetId'] as String,
+ );
+ }
+
+ String toJson() => json.encode(toMap());
+
+ factory Stack.fromJson(String source) =>
+ Stack.fromMap(json.decode(source) as Map);
+
+ @override
+ String toString() {
+ return 'Stack(id: $id, createdAt: $createdAt, updatedAt: $updatedAt, ownerId: $ownerId, primaryAssetId: $primaryAssetId)';
+ }
+
+ @override
+ bool operator ==(covariant Stack other) {
+ if (identical(this, other)) return true;
+
+ return other.id == id &&
+ other.createdAt == createdAt &&
+ other.updatedAt == updatedAt &&
+ other.ownerId == ownerId &&
+ other.primaryAssetId == primaryAssetId;
+ }
+
+ @override
+ int get hashCode {
+ return id.hashCode ^
+ createdAt.hashCode ^
+ updatedAt.hashCode ^
+ ownerId.hashCode ^
+ primaryAssetId.hashCode;
+ }
+}
diff --git a/mobile/lib/domain/services/asset.service.dart b/mobile/lib/domain/services/asset.service.dart
index ee39220554..c4a0766601 100644
--- a/mobile/lib/domain/services/asset.service.dart
+++ b/mobile/lib/domain/services/asset.service.dart
@@ -1,13 +1,24 @@
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/exif.model.dart';
+import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart';
class AssetService {
final RemoteAssetRepository _remoteAssetRepository;
+ final DriftLocalAssetRepository _localAssetRepository;
const AssetService({
required RemoteAssetRepository remoteAssetRepository,
- }) : _remoteAssetRepository = remoteAssetRepository;
+ required DriftLocalAssetRepository localAssetRepository,
+ }) : _remoteAssetRepository = remoteAssetRepository,
+ _localAssetRepository = localAssetRepository;
+
+ Stream watchAsset(BaseAsset asset) {
+ final id = asset is LocalAsset ? asset.id : (asset as RemoteAsset).id;
+ return asset is LocalAsset
+ ? _localAssetRepository.watchAsset(id)
+ : _remoteAssetRepository.watchAsset(id);
+ }
Future getExif(BaseAsset asset) async {
if (asset is LocalAsset || asset is! RemoteAsset) {
diff --git a/mobile/lib/domain/services/memory.service.dart b/mobile/lib/domain/services/memory.service.dart
new file mode 100644
index 0000000000..c94b8a9f0a
--- /dev/null
+++ b/mobile/lib/domain/services/memory.service.dart
@@ -0,0 +1,15 @@
+import 'package:immich_mobile/domain/models/memory.model.dart';
+import 'package:immich_mobile/infrastructure/repositories/memory.repository.dart';
+import 'package:logging/logging.dart';
+
+class DriftMemoryService {
+ final log = Logger("DriftMemoryService");
+
+ final DriftMemoryRepository _repository;
+
+ DriftMemoryService(this._repository);
+
+ Future> getMemoryLane(String ownerId) {
+ return _repository.getAll(ownerId);
+ }
+}
diff --git a/mobile/lib/domain/services/sync_stream.service.dart b/mobile/lib/domain/services/sync_stream.service.dart
index 2160018df5..ee0ec6c44f 100644
--- a/mobile/lib/domain/services/sync_stream.service.dart
+++ b/mobile/lib/domain/services/sync_stream.service.dart
@@ -146,6 +146,33 @@ class SyncStreamService {
// to acknowledge that the client has processed all the backfill events
case SyncEntityType.syncAckV1:
return;
+ case SyncEntityType.memoryV1:
+ return _syncStreamRepository.updateMemoriesV1(data.cast());
+ case SyncEntityType.memoryDeleteV1:
+ return _syncStreamRepository.deleteMemoriesV1(data.cast());
+ case SyncEntityType.memoryToAssetV1:
+ return _syncStreamRepository.updateMemoryAssetsV1(data.cast());
+ case SyncEntityType.memoryToAssetDeleteV1:
+ return _syncStreamRepository.deleteMemoryAssetsV1(data.cast());
+ case SyncEntityType.stackV1:
+ return _syncStreamRepository.updateStacksV1(data.cast());
+ case SyncEntityType.stackDeleteV1:
+ return _syncStreamRepository.deleteStacksV1(data.cast());
+ case SyncEntityType.partnerStackV1:
+ return _syncStreamRepository.updateStacksV1(
+ data.cast(),
+ debugLabel: 'partner',
+ );
+ case SyncEntityType.partnerStackBackfillV1:
+ return _syncStreamRepository.updateStacksV1(
+ data.cast(),
+ debugLabel: 'partner backfill',
+ );
+ case SyncEntityType.partnerStackDeleteV1:
+ return _syncStreamRepository.deleteStacksV1(
+ data.cast(),
+ debugLabel: 'partner',
+ );
default:
_logger.warning("Unknown sync data type: $type");
}
diff --git a/mobile/lib/domain/services/timeline.service.dart b/mobile/lib/domain/services/timeline.service.dart
index 54a9a3a142..2e56e6e10c 100644
--- a/mobile/lib/domain/services/timeline.service.dart
+++ b/mobile/lib/domain/services/timeline.service.dart
@@ -7,6 +7,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/setting.model.dart';
import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/domain/services/setting.service.dart';
+import 'package:immich_mobile/domain/utils/event_stream.dart';
import 'package:immich_mobile/infrastructure/repositories/timeline.repository.dart';
import 'package:immich_mobile/utils/async_mutex.dart';
@@ -52,6 +53,29 @@ class TimelineFactory {
bucketSource: () =>
_timelineRepository.watchRemoteBucket(albumId, groupBy: groupBy),
);
+
+ TimelineService trash(String userId) => TimelineService(
+ assetSource: (offset, count) => _timelineRepository
+ .getTrashBucketAssets(userId, offset: offset, count: count),
+ bucketSource: () =>
+ _timelineRepository.watchTrashBucket(userId, groupBy: groupBy),
+ );
+
+ TimelineService archive(String userId) => TimelineService(
+ assetSource: (offset, count) => _timelineRepository
+ .getArchiveBucketAssets(userId, offset: offset, count: count),
+ bucketSource: () =>
+ _timelineRepository.watchArchiveBucket(userId, groupBy: groupBy),
+ );
+
+ TimelineService lockedFolder(String userId) => TimelineService(
+ assetSource: (offset, count) => _timelineRepository
+ .getLockedFolderBucketAssets(userId, offset: offset, count: count),
+ bucketSource: () => _timelineRepository.watchLockedFolderBucket(
+ userId,
+ groupBy: groupBy,
+ ),
+ );
}
class TimelineService {
@@ -68,7 +92,7 @@ class TimelineService {
_bucketSubscription = _bucketSource().listen((buckets) {
_totalAssets =
buckets.fold(0, (acc, bucket) => acc + bucket.assetCount);
- unawaited(reloadBucket());
+ unawaited(_reloadBucket());
});
}
@@ -79,8 +103,9 @@ class TimelineService {
Stream> Function() get watchBuckets => _bucketSource;
- Future reloadBucket() => _mutex.run(() async {
+ Future _reloadBucket() => _mutex.run(() async {
_buffer = await _assetSource(_bufferOffset, _buffer.length);
+ EventStream.shared.emit(const TimelineReloadEvent());
});
Future> loadAssets(int index, int count) =>
diff --git a/mobile/lib/domain/utils/event_stream.dart b/mobile/lib/domain/utils/event_stream.dart
new file mode 100644
index 0000000000..65ee17e12b
--- /dev/null
+++ b/mobile/lib/domain/utils/event_stream.dart
@@ -0,0 +1,52 @@
+import 'dart:async';
+
+sealed class Event {
+ const Event();
+}
+
+class TimelineReloadEvent extends Event {
+ const TimelineReloadEvent();
+}
+
+class ViewerOpenBottomSheetEvent extends Event {
+ const ViewerOpenBottomSheetEvent();
+}
+
+class EventStream {
+ EventStream._();
+
+ static final EventStream shared = EventStream._();
+
+ final StreamController _controller =
+ StreamController.broadcast();
+
+ void emit(Event event) {
+ _controller.add(event);
+ }
+
+ Stream where() {
+ if (T == Event) {
+ return _controller.stream as Stream;
+ }
+ return _controller.stream.where((event) => event is T).cast();
+ }
+
+ StreamSubscription listen(
+ void Function(T event)? onData, {
+ Function? onError,
+ void Function()? onDone,
+ bool? cancelOnError,
+ }) {
+ return where().listen(
+ onData,
+ onError: onError,
+ onDone: onDone,
+ cancelOnError: cancelOnError,
+ );
+ }
+
+ /// Closes the stream controller
+ void dispose() {
+ _controller.close();
+ }
+}
diff --git a/mobile/lib/infrastructure/entities/local_asset.entity.dart b/mobile/lib/infrastructure/entities/local_asset.entity.dart
index 39c3822b04..62f91ae458 100644
--- a/mobile/lib/infrastructure/entities/local_asset.entity.dart
+++ b/mobile/lib/infrastructure/entities/local_asset.entity.dart
@@ -28,5 +28,8 @@ extension LocalAssetEntityDataDomainEx on LocalAssetEntityData {
updatedAt: updatedAt,
durationInSeconds: durationInSeconds,
isFavorite: isFavorite,
+ height: height,
+ width: width,
+ remoteId: null,
);
}
diff --git a/mobile/lib/infrastructure/entities/memory.entity.dart b/mobile/lib/infrastructure/entities/memory.entity.dart
new file mode 100644
index 0000000000..0e19802103
--- /dev/null
+++ b/mobile/lib/infrastructure/entities/memory.entity.dart
@@ -0,0 +1,36 @@
+import 'package:drift/drift.dart';
+import 'package:immich_mobile/domain/models/memory.model.dart';
+import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
+import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
+
+class MemoryEntity extends Table with DriftDefaultsMixin {
+ const MemoryEntity();
+
+ TextColumn get id => text()();
+
+ DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
+
+ DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)();
+
+ DateTimeColumn get deletedAt => dateTime().nullable()();
+
+ TextColumn get ownerId =>
+ text().references(UserEntity, #id, onDelete: KeyAction.cascade)();
+
+ IntColumn get type => intEnum()();
+
+ TextColumn get data => text()();
+
+ BoolColumn get isSaved => boolean().withDefault(const Constant(false))();
+
+ DateTimeColumn get memoryAt => dateTime()();
+
+ DateTimeColumn get seenAt => dateTime().nullable()();
+
+ DateTimeColumn get showAt => dateTime().nullable()();
+
+ DateTimeColumn get hideAt => dateTime().nullable()();
+
+ @override
+ Set get primaryKey => {id};
+}
diff --git a/mobile/lib/infrastructure/entities/memory.entity.drift.dart b/mobile/lib/infrastructure/entities/memory.entity.drift.dart
new file mode 100644
index 0000000000..cb88651ba4
--- /dev/null
+++ b/mobile/lib/infrastructure/entities/memory.entity.drift.dart
@@ -0,0 +1,970 @@
+// dart format width=80
+// ignore_for_file: type=lint
+import 'package:drift/drift.dart' as i0;
+import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart'
+ as i1;
+import 'package:immich_mobile/domain/models/memory.model.dart' as i2;
+import 'package:immich_mobile/infrastructure/entities/memory.entity.dart' as i3;
+import 'package:drift/src/runtime/query_builder/query_builder.dart' as i4;
+import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart'
+ as i5;
+import 'package:drift/internal/modular.dart' as i6;
+
+typedef $$MemoryEntityTableCreateCompanionBuilder = i1.MemoryEntityCompanion
+ Function({
+ required String id,
+ i0.Value createdAt,
+ i0.Value updatedAt,
+ i0.Value deletedAt,
+ required String ownerId,
+ required i2.MemoryTypeEnum type,
+ required String data,
+ i0.Value isSaved,
+ required DateTime memoryAt,
+ i0.Value seenAt,
+ i0.Value showAt,
+ i0.Value hideAt,
+});
+typedef $$MemoryEntityTableUpdateCompanionBuilder = i1.MemoryEntityCompanion
+ Function({
+ i0.Value id,
+ i0.Value createdAt,
+ i0.Value updatedAt,
+ i0.Value deletedAt,
+ i0.Value ownerId,
+ i0.Value type,
+ i0.Value data,
+ i0.Value isSaved,
+ i0.Value memoryAt,
+ i0.Value seenAt,
+ i0.Value showAt,
+ i0.Value hideAt,
+});
+
+final class $$MemoryEntityTableReferences extends i0.BaseReferences<
+ i0.GeneratedDatabase, i1.$MemoryEntityTable, i1.MemoryEntityData> {
+ $$MemoryEntityTableReferences(super.$_db, super.$_table, super.$_typedResult);
+
+ static i5.$UserEntityTable _ownerIdTable(i0.GeneratedDatabase db) =>
+ i6.ReadDatabaseContainer(db)
+ .resultSet('user_entity')
+ .createAlias(i0.$_aliasNameGenerator(
+ i6.ReadDatabaseContainer(db)
+ .resultSet('memory_entity')
+ .ownerId,
+ i6.ReadDatabaseContainer(db)
+ .resultSet('user_entity')
+ .id));
+
+ i5.$$UserEntityTableProcessedTableManager get ownerId {
+ final $_column = $_itemColumn('owner_id')!;
+
+ final manager = i5
+ .$$UserEntityTableTableManager(
+ $_db,
+ i6.ReadDatabaseContainer($_db)
+ .resultSet('user_entity'))
+ .filter((f) => f.id.sqlEquals($_column));
+ final item = $_typedResult.readTableOrNull(_ownerIdTable($_db));
+ if (item == null) return manager;
+ return i0.ProcessedTableManager(
+ manager.$state.copyWith(prefetchedData: [item]));
+ }
+}
+
+class $$MemoryEntityTableFilterComposer
+ extends i0.Composer {
+ $$MemoryEntityTableFilterComposer({
+ required super.$db,
+ required super.$table,
+ super.joinBuilder,
+ super.$addJoinBuilderToRootComposer,
+ super.$removeJoinBuilderFromRootComposer,
+ });
+ i0.ColumnFilters get id => $composableBuilder(
+ column: $table.id, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get createdAt => $composableBuilder(
+ column: $table.createdAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get updatedAt => $composableBuilder(
+ column: $table.updatedAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get deletedAt => $composableBuilder(
+ column: $table.deletedAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnWithTypeConverterFilters
+ get type => $composableBuilder(
+ column: $table.type,
+ builder: (column) => i0.ColumnWithTypeConverterFilters(column));
+
+ i0.ColumnFilters get data => $composableBuilder(
+ column: $table.data, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get isSaved => $composableBuilder(
+ column: $table.isSaved, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get memoryAt => $composableBuilder(
+ column: $table.memoryAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get seenAt => $composableBuilder(
+ column: $table.seenAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get showAt => $composableBuilder(
+ column: $table.showAt, builder: (column) => i0.ColumnFilters(column));
+
+ i0.ColumnFilters get hideAt => $composableBuilder(
+ column: $table.hideAt, builder: (column) => i0.ColumnFilters(column));
+
+ i5.$$UserEntityTableFilterComposer get ownerId {
+ final i5.$$UserEntityTableFilterComposer composer = $composerBuilder(
+ composer: this,
+ getCurrentColumn: (t) => t.ownerId,
+ referencedTable: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ getReferencedColumn: (t) => t.id,
+ builder: (joinBuilder,
+ {$addJoinBuilderToRootComposer,
+ $removeJoinBuilderFromRootComposer}) =>
+ i5.$$UserEntityTableFilterComposer(
+ $db: $db,
+ $table: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+ joinBuilder: joinBuilder,
+ $removeJoinBuilderFromRootComposer:
+ $removeJoinBuilderFromRootComposer,
+ ));
+ return composer;
+ }
+}
+
+class $$MemoryEntityTableOrderingComposer
+ extends i0.Composer {
+ $$MemoryEntityTableOrderingComposer({
+ required super.$db,
+ required super.$table,
+ super.joinBuilder,
+ super.$addJoinBuilderToRootComposer,
+ super.$removeJoinBuilderFromRootComposer,
+ });
+ i0.ColumnOrderings get id => $composableBuilder(
+ column: $table.id, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get createdAt => $composableBuilder(
+ column: $table.createdAt,
+ builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get updatedAt => $composableBuilder(
+ column: $table.updatedAt,
+ builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get deletedAt => $composableBuilder(
+ column: $table.deletedAt,
+ builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get type => $composableBuilder(
+ column: $table.type, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get data => $composableBuilder(
+ column: $table.data, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get isSaved => $composableBuilder(
+ column: $table.isSaved, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get memoryAt => $composableBuilder(
+ column: $table.memoryAt, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get seenAt => $composableBuilder(
+ column: $table.seenAt, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get showAt => $composableBuilder(
+ column: $table.showAt, builder: (column) => i0.ColumnOrderings(column));
+
+ i0.ColumnOrderings get hideAt => $composableBuilder(
+ column: $table.hideAt, builder: (column) => i0.ColumnOrderings(column));
+
+ i5.$$UserEntityTableOrderingComposer get ownerId {
+ final i5.$$UserEntityTableOrderingComposer composer = $composerBuilder(
+ composer: this,
+ getCurrentColumn: (t) => t.ownerId,
+ referencedTable: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ getReferencedColumn: (t) => t.id,
+ builder: (joinBuilder,
+ {$addJoinBuilderToRootComposer,
+ $removeJoinBuilderFromRootComposer}) =>
+ i5.$$UserEntityTableOrderingComposer(
+ $db: $db,
+ $table: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+ joinBuilder: joinBuilder,
+ $removeJoinBuilderFromRootComposer:
+ $removeJoinBuilderFromRootComposer,
+ ));
+ return composer;
+ }
+}
+
+class $$MemoryEntityTableAnnotationComposer
+ extends i0.Composer {
+ $$MemoryEntityTableAnnotationComposer({
+ required super.$db,
+ required super.$table,
+ super.joinBuilder,
+ super.$addJoinBuilderToRootComposer,
+ super.$removeJoinBuilderFromRootComposer,
+ });
+ i0.GeneratedColumn get id =>
+ $composableBuilder(column: $table.id, builder: (column) => column);
+
+ i0.GeneratedColumn get createdAt =>
+ $composableBuilder(column: $table.createdAt, builder: (column) => column);
+
+ i0.GeneratedColumn get updatedAt =>
+ $composableBuilder(column: $table.updatedAt, builder: (column) => column);
+
+ i0.GeneratedColumn get deletedAt =>
+ $composableBuilder(column: $table.deletedAt, builder: (column) => column);
+
+ i0.GeneratedColumnWithTypeConverter get type =>
+ $composableBuilder(column: $table.type, builder: (column) => column);
+
+ i0.GeneratedColumn get data =>
+ $composableBuilder(column: $table.data, builder: (column) => column);
+
+ i0.GeneratedColumn get isSaved =>
+ $composableBuilder(column: $table.isSaved, builder: (column) => column);
+
+ i0.GeneratedColumn get memoryAt =>
+ $composableBuilder(column: $table.memoryAt, builder: (column) => column);
+
+ i0.GeneratedColumn get seenAt =>
+ $composableBuilder(column: $table.seenAt, builder: (column) => column);
+
+ i0.GeneratedColumn get showAt =>
+ $composableBuilder(column: $table.showAt, builder: (column) => column);
+
+ i0.GeneratedColumn get hideAt =>
+ $composableBuilder(column: $table.hideAt, builder: (column) => column);
+
+ i5.$$UserEntityTableAnnotationComposer get ownerId {
+ final i5.$$UserEntityTableAnnotationComposer composer = $composerBuilder(
+ composer: this,
+ getCurrentColumn: (t) => t.ownerId,
+ referencedTable: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ getReferencedColumn: (t) => t.id,
+ builder: (joinBuilder,
+ {$addJoinBuilderToRootComposer,
+ $removeJoinBuilderFromRootComposer}) =>
+ i5.$$UserEntityTableAnnotationComposer(
+ $db: $db,
+ $table: i6.ReadDatabaseContainer($db)
+ .resultSet('user_entity'),
+ $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+ joinBuilder: joinBuilder,
+ $removeJoinBuilderFromRootComposer:
+ $removeJoinBuilderFromRootComposer,
+ ));
+ return composer;
+ }
+}
+
+class $$MemoryEntityTableTableManager extends i0.RootTableManager<
+ i0.GeneratedDatabase,
+ i1.$MemoryEntityTable,
+ i1.MemoryEntityData,
+ i1.$$MemoryEntityTableFilterComposer,
+ i1.$$MemoryEntityTableOrderingComposer,
+ i1.$$MemoryEntityTableAnnotationComposer,
+ $$MemoryEntityTableCreateCompanionBuilder,
+ $$MemoryEntityTableUpdateCompanionBuilder,
+ (i1.MemoryEntityData, i1.$$MemoryEntityTableReferences),
+ i1.MemoryEntityData,
+ i0.PrefetchHooks Function({bool ownerId})> {
+ $$MemoryEntityTableTableManager(
+ i0.GeneratedDatabase db, i1.$MemoryEntityTable table)
+ : super(i0.TableManagerState(
+ db: db,
+ table: table,
+ createFilteringComposer: () =>
+ i1.$$MemoryEntityTableFilterComposer($db: db, $table: table),
+ createOrderingComposer: () =>
+ i1.$$MemoryEntityTableOrderingComposer($db: db, $table: table),
+ createComputedFieldComposer: () =>
+ i1.$$MemoryEntityTableAnnotationComposer($db: db, $table: table),
+ updateCompanionCallback: ({
+ i0.Value id = const i0.Value.absent(),
+ i0.Value createdAt = const i0.Value.absent(),
+ i0.Value updatedAt = const i0.Value.absent(),
+ i0.Value deletedAt = const i0.Value.absent(),
+ i0.Value ownerId = const i0.Value.absent(),
+ i0.Value type = const i0.Value.absent(),
+ i0.Value data = const i0.Value.absent(),
+ i0.Value isSaved = const i0.Value.absent(),
+ i0.Value memoryAt = const i0.Value.absent(),
+ i0.Value seenAt = const i0.Value.absent(),
+ i0.Value showAt = const i0.Value.absent(),
+ i0.Value hideAt = const i0.Value.absent(),
+ }) =>
+ i1.MemoryEntityCompanion(
+ id: id,
+ createdAt: createdAt,
+ updatedAt: updatedAt,
+ deletedAt: deletedAt,
+ ownerId: ownerId,
+ type: type,
+ data: data,
+ isSaved: isSaved,
+ memoryAt: memoryAt,
+ seenAt: seenAt,
+ showAt: showAt,
+ hideAt: hideAt,
+ ),
+ createCompanionCallback: ({
+ required String id,
+ i0.Value createdAt = const i0.Value.absent(),
+ i0.Value updatedAt = const i0.Value.absent(),
+ i0.Value deletedAt = const i0.Value.absent(),
+ required String ownerId,
+ required i2.MemoryTypeEnum type,
+ required String data,
+ i0.Value isSaved = const i0.Value.absent(),
+ required DateTime memoryAt,
+ i0.Value seenAt = const i0.Value.absent(),
+ i0.Value showAt = const i0.Value.absent(),
+ i0.Value hideAt = const i0.Value.absent(),
+ }) =>
+ i1.MemoryEntityCompanion.insert(
+ id: id,
+ createdAt: createdAt,
+ updatedAt: updatedAt,
+ deletedAt: deletedAt,
+ ownerId: ownerId,
+ type: type,
+ data: data,
+ isSaved: isSaved,
+ memoryAt: memoryAt,
+ seenAt: seenAt,
+ showAt: showAt,
+ hideAt: hideAt,
+ ),
+ withReferenceMapper: (p0) => p0
+ .map((e) => (
+ e.readTable(table),
+ i1.$$MemoryEntityTableReferences(db, table, e)
+ ))
+ .toList(),
+ prefetchHooksCallback: ({ownerId = false}) {
+ return i0.PrefetchHooks(
+ db: db,
+ explicitlyWatchedTables: [],
+ addJoins: <
+ T extends i0.TableManagerState<
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic,
+ dynamic>>(state) {
+ if (ownerId) {
+ state = state.withJoin(
+ currentTable: table,
+ currentColumn: table.ownerId,
+ referencedTable:
+ i1.$$MemoryEntityTableReferences._ownerIdTable(db),
+ referencedColumn:
+ i1.$$MemoryEntityTableReferences._ownerIdTable(db).id,
+ ) as T;
+ }
+
+ return state;
+ },
+ getPrefetchedDataCallback: (items) async {
+ return [];
+ },
+ );
+ },
+ ));
+}
+
+typedef $$MemoryEntityTableProcessedTableManager = i0.ProcessedTableManager<
+ i0.GeneratedDatabase,
+ i1.$MemoryEntityTable,
+ i1.MemoryEntityData,
+ i1.$$MemoryEntityTableFilterComposer,
+ i1.$$MemoryEntityTableOrderingComposer,
+ i1.$$MemoryEntityTableAnnotationComposer,
+ $$MemoryEntityTableCreateCompanionBuilder,
+ $$MemoryEntityTableUpdateCompanionBuilder,
+ (i1.MemoryEntityData, i1.$$MemoryEntityTableReferences),
+ i1.MemoryEntityData,
+ i0.PrefetchHooks Function({bool ownerId})>;
+
+class $MemoryEntityTable extends i3.MemoryEntity
+ with i0.TableInfo<$MemoryEntityTable, i1.MemoryEntityData> {
+ @override
+ final i0.GeneratedDatabase attachedDatabase;
+ final String? _alias;
+ $MemoryEntityTable(this.attachedDatabase, [this._alias]);
+ static const i0.VerificationMeta _idMeta = const i0.VerificationMeta('id');
+ @override
+ late final i0.GeneratedColumn id = i0.GeneratedColumn(
+ 'id', aliasedName, false,
+ type: i0.DriftSqlType.string, requiredDuringInsert: true);
+ static const i0.VerificationMeta _createdAtMeta =
+ const i0.VerificationMeta('createdAt');
+ @override
+ late final i0.GeneratedColumn createdAt =
+ i0.GeneratedColumn('created_at', aliasedName, false,
+ type: i0.DriftSqlType.dateTime,
+ requiredDuringInsert: false,
+ defaultValue: i4.currentDateAndTime);
+ static const i0.VerificationMeta _updatedAtMeta =
+ const i0.VerificationMeta('updatedAt');
+ @override
+ late final i0.GeneratedColumn updatedAt =
+ i0.GeneratedColumn('updated_at', aliasedName, false,
+ type: i0.DriftSqlType.dateTime,
+ requiredDuringInsert: false,
+ defaultValue: i4.currentDateAndTime);
+ static const i0.VerificationMeta _deletedAtMeta =
+ const i0.VerificationMeta('deletedAt');
+ @override
+ late final i0.GeneratedColumn deletedAt =
+ i0.GeneratedColumn('deleted_at', aliasedName, true,
+ type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
+ static const i0.VerificationMeta _ownerIdMeta =
+ const i0.VerificationMeta('ownerId');
+ @override
+ late final i0.GeneratedColumn ownerId = i0.GeneratedColumn(
+ 'owner_id', aliasedName, false,
+ type: i0.DriftSqlType.string,
+ requiredDuringInsert: true,
+ defaultConstraints: i0.GeneratedColumn.constraintIsAlways(
+ 'REFERENCES user_entity (id) ON DELETE CASCADE'));
+ @override
+ late final i0.GeneratedColumnWithTypeConverter type =
+ i0.GeneratedColumn('type', aliasedName, false,
+ type: i0.DriftSqlType.int, requiredDuringInsert: true)
+ .withConverter(
+ i1.$MemoryEntityTable.$convertertype);
+ static const i0.VerificationMeta _dataMeta =
+ const i0.VerificationMeta('data');
+ @override
+ late final i0.GeneratedColumn data = i0.GeneratedColumn(
+ 'data', aliasedName, false,
+ type: i0.DriftSqlType.string, requiredDuringInsert: true);
+ static const i0.VerificationMeta _isSavedMeta =
+ const i0.VerificationMeta('isSaved');
+ @override
+ late final i0.GeneratedColumn isSaved = i0.GeneratedColumn(
+ 'is_saved', aliasedName, false,
+ type: i0.DriftSqlType.bool,
+ requiredDuringInsert: false,
+ defaultConstraints:
+ i0.GeneratedColumn.constraintIsAlways('CHECK ("is_saved" IN (0, 1))'),
+ defaultValue: const i4.Constant(false));
+ static const i0.VerificationMeta _memoryAtMeta =
+ const i0.VerificationMeta('memoryAt');
+ @override
+ late final i0.GeneratedColumn memoryAt =
+ i0.GeneratedColumn('memory_at', aliasedName, false,
+ type: i0.DriftSqlType.dateTime, requiredDuringInsert: true);
+ static const i0.VerificationMeta _seenAtMeta =
+ const i0.VerificationMeta('seenAt');
+ @override
+ late final i0.GeneratedColumn seenAt = i0.GeneratedColumn(
+ 'seen_at', aliasedName, true,
+ type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
+ static const i0.VerificationMeta _showAtMeta =
+ const i0.VerificationMeta('showAt');
+ @override
+ late final i0.GeneratedColumn showAt = i0.GeneratedColumn(
+ 'show_at', aliasedName, true,
+ type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
+ static const i0.VerificationMeta _hideAtMeta =
+ const i0.VerificationMeta('hideAt');
+ @override
+ late final i0.GeneratedColumn hideAt = i0.GeneratedColumn(
+ 'hide_at', aliasedName, true,
+ type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
+ @override
+ List get $columns => [
+ id,
+ createdAt,
+ updatedAt,
+ deletedAt,
+ ownerId,
+ type,
+ data,
+ isSaved,
+ memoryAt,
+ seenAt,
+ showAt,
+ hideAt
+ ];
+ @override
+ String get aliasedName => _alias ?? actualTableName;
+ @override
+ String get actualTableName => $name;
+ static const String $name = 'memory_entity';
+ @override
+ i0.VerificationContext validateIntegrity(
+ i0.Insertable instance,
+ {bool isInserting = false}) {
+ final context = i0.VerificationContext();
+ final data = instance.toColumns(true);
+ if (data.containsKey('id')) {
+ context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta));
+ } else if (isInserting) {
+ context.missing(_idMeta);
+ }
+ if (data.containsKey('created_at')) {
+ context.handle(_createdAtMeta,
+ createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta));
+ }
+ if (data.containsKey('updated_at')) {
+ context.handle(_updatedAtMeta,
+ updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta));
+ }
+ if (data.containsKey('deleted_at')) {
+ context.handle(_deletedAtMeta,
+ deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta));
+ }
+ if (data.containsKey('owner_id')) {
+ context.handle(_ownerIdMeta,
+ ownerId.isAcceptableOrUnknown(data['owner_id']!, _ownerIdMeta));
+ } else if (isInserting) {
+ context.missing(_ownerIdMeta);
+ }
+ if (data.containsKey('data')) {
+ context.handle(
+ _dataMeta, this.data.isAcceptableOrUnknown(data['data']!, _dataMeta));
+ } else if (isInserting) {
+ context.missing(_dataMeta);
+ }
+ if (data.containsKey('is_saved')) {
+ context.handle(_isSavedMeta,
+ isSaved.isAcceptableOrUnknown(data['is_saved']!, _isSavedMeta));
+ }
+ if (data.containsKey('memory_at')) {
+ context.handle(_memoryAtMeta,
+ memoryAt.isAcceptableOrUnknown(data['memory_at']!, _memoryAtMeta));
+ } else if (isInserting) {
+ context.missing(_memoryAtMeta);
+ }
+ if (data.containsKey('seen_at')) {
+ context.handle(_seenAtMeta,
+ seenAt.isAcceptableOrUnknown(data['seen_at']!, _seenAtMeta));
+ }
+ if (data.containsKey('show_at')) {
+ context.handle(_showAtMeta,
+ showAt.isAcceptableOrUnknown(data['show_at']!, _showAtMeta));
+ }
+ if (data.containsKey('hide_at')) {
+ context.handle(_hideAtMeta,
+ hideAt.isAcceptableOrUnknown(data['hide_at']!, _hideAtMeta));
+ }
+ return context;
+ }
+
+ @override
+ Set get $primaryKey => {id};
+ @override
+ i1.MemoryEntityData map(Map data, {String? tablePrefix}) {
+ final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+ return i1.MemoryEntityData(
+ id: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.string, data['${effectivePrefix}id'])!,
+ createdAt: attachedDatabase.typeMapping.read(
+ i0.DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+ updatedAt: attachedDatabase.typeMapping.read(
+ i0.DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!,
+ deletedAt: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']),
+ ownerId: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.string, data['${effectivePrefix}owner_id'])!,
+ type: i1.$MemoryEntityTable.$convertertype.fromSql(attachedDatabase
+ .typeMapping
+ .read(i0.DriftSqlType.int, data['${effectivePrefix}type'])!),
+ data: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.string, data['${effectivePrefix}data'])!,
+ isSaved: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.bool, data['${effectivePrefix}is_saved'])!,
+ memoryAt: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.dateTime, data['${effectivePrefix}memory_at'])!,
+ seenAt: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.dateTime, data['${effectivePrefix}seen_at']),
+ showAt: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.dateTime, data['${effectivePrefix}show_at']),
+ hideAt: attachedDatabase.typeMapping
+ .read(i0.DriftSqlType.dateTime, data['${effectivePrefix}hide_at']),
+ );
+ }
+
+ @override
+ $MemoryEntityTable createAlias(String alias) {
+ return $MemoryEntityTable(attachedDatabase, alias);
+ }
+
+ static i0.JsonTypeConverter2 $convertertype =
+ const i0.EnumIndexConverter(i2.MemoryTypeEnum.values);
+ @override
+ bool get withoutRowId => true;
+ @override
+ bool get isStrict => true;
+}
+
+class MemoryEntityData extends i0.DataClass
+ implements i0.Insertable {
+ final String id;
+ final DateTime createdAt;
+ final DateTime updatedAt;
+ final DateTime? deletedAt;
+ final String ownerId;
+ final i2.MemoryTypeEnum type;
+ final String data;
+ final bool isSaved;
+ final DateTime memoryAt;
+ final DateTime? seenAt;
+ final DateTime? showAt;
+ final DateTime? hideAt;
+ const MemoryEntityData(
+ {required this.id,
+ required this.createdAt,
+ required this.updatedAt,
+ this.deletedAt,
+ required this.ownerId,
+ required this.type,
+ required this.data,
+ required this.isSaved,
+ required this.memoryAt,
+ this.seenAt,
+ this.showAt,
+ this.hideAt});
+ @override
+ Map toColumns(bool nullToAbsent) {
+ final map = {};
+ map['id'] = i0.Variable(id);
+ map['created_at'] = i0.Variable(createdAt);
+ map['updated_at'] = i0.Variable(updatedAt);
+ if (!nullToAbsent || deletedAt != null) {
+ map['deleted_at'] = i0.Variable(deletedAt);
+ }
+ map['owner_id'] = i0.Variable(ownerId);
+ {
+ map['type'] =
+ i0.Variable(i1.$MemoryEntityTable.$convertertype.toSql(type));
+ }
+ map['data'] = i0.Variable(data);
+ map['is_saved'] = i0.Variable(isSaved);
+ map['memory_at'] = i0.Variable(memoryAt);
+ if (!nullToAbsent || seenAt != null) {
+ map['seen_at'] = i0.Variable(seenAt);
+ }
+ if (!nullToAbsent || showAt != null) {
+ map['show_at'] = i0.Variable(showAt);
+ }
+ if (!nullToAbsent || hideAt != null) {
+ map['hide_at'] = i0.Variable(hideAt);
+ }
+ return map;
+ }
+
+ factory MemoryEntityData.fromJson(Map json,
+ {i0.ValueSerializer? serializer}) {
+ serializer ??= i0.driftRuntimeOptions.defaultSerializer;
+ return MemoryEntityData(
+ id: serializer.fromJson(json['id']),
+ createdAt: serializer.fromJson(json['createdAt']),
+ updatedAt: serializer.fromJson(json['updatedAt']),
+ deletedAt: serializer.fromJson(json['deletedAt']),
+ ownerId: serializer.fromJson(json['ownerId']),
+ type: i1.$MemoryEntityTable.$convertertype
+ .fromJson(serializer.fromJson(json['type'])),
+ data: serializer.fromJson(json['data']),
+ isSaved: serializer.fromJson(json['isSaved']),
+ memoryAt: serializer.fromJson(json['memoryAt']),
+ seenAt: serializer.fromJson(json['seenAt']),
+ showAt: serializer.fromJson(json['showAt']),
+ hideAt: serializer.fromJson(json['hideAt']),
+ );
+ }
+ @override
+ Map toJson({i0.ValueSerializer? serializer}) {
+ serializer ??= i0.driftRuntimeOptions.defaultSerializer;
+ return {
+ 'id': serializer.toJson(id),
+ 'createdAt': serializer.toJson(createdAt),
+ 'updatedAt': serializer.toJson(updatedAt),
+ 'deletedAt': serializer.toJson(deletedAt),
+ 'ownerId': serializer.toJson(ownerId),
+ 'type': serializer
+ .toJson(i1.$MemoryEntityTable.$convertertype.toJson(type)),
+ 'data': serializer.toJson(data),
+ 'isSaved': serializer.toJson(isSaved),
+ 'memoryAt': serializer.toJson(memoryAt),
+ 'seenAt': serializer.toJson(seenAt),
+ 'showAt': serializer.toJson(showAt),
+ 'hideAt': serializer.toJson(hideAt),
+ };
+ }
+
+ i1.MemoryEntityData copyWith(
+ {String? id,
+ DateTime? createdAt,
+ DateTime? updatedAt,
+ i0.Value deletedAt = const i0.Value.absent(),
+ String? ownerId,
+ i2.MemoryTypeEnum? type,
+ String? data,
+ bool? isSaved,
+ DateTime? memoryAt,
+ i0.Value seenAt = const i0.Value.absent(),
+ i0.Value showAt = const i0.Value.absent(),
+ i0.Value hideAt = const i0.Value.absent()}) =>
+ i1.MemoryEntityData(
+ id: id ?? this.id,
+ createdAt: createdAt ?? this.createdAt,
+ updatedAt: updatedAt ?? this.updatedAt,
+ deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt,
+ ownerId: ownerId ?? this.ownerId,
+ type: type ?? this.type,
+ data: data ?? this.data,
+ isSaved: isSaved ?? this.isSaved,
+ memoryAt: memoryAt ?? this.memoryAt,
+ seenAt: seenAt.present ? seenAt.value : this.seenAt,
+ showAt: showAt.present ? showAt.value : this.showAt,
+ hideAt: hideAt.present ? hideAt.value : this.hideAt,
+ );
+ MemoryEntityData copyWithCompanion(i1.MemoryEntityCompanion data) {
+ return MemoryEntityData(
+ id: data.id.present ? data.id.value : this.id,
+ createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+ updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt,
+ deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt,
+ ownerId: data.ownerId.present ? data.ownerId.value : this.ownerId,
+ type: data.type.present ? data.type.value : this.type,
+ data: data.data.present ? data.data.value : this.data,
+ isSaved: data.isSaved.present ? data.isSaved.value : this.isSaved,
+ memoryAt: data.memoryAt.present ? data.memoryAt.value : this.memoryAt,
+ seenAt: data.seenAt.present ? data.seenAt.value : this.seenAt,
+ showAt: data.showAt.present ? data.showAt.value : this.showAt,
+ hideAt: data.hideAt.present ? data.hideAt.value : this.hideAt,
+ );
+ }
+
+ @override
+ String toString() {
+ return (StringBuffer('MemoryEntityData(')
+ ..write('id: $id, ')
+ ..write('createdAt: $createdAt, ')
+ ..write('updatedAt: $updatedAt, ')
+ ..write('deletedAt: $deletedAt, ')
+ ..write('ownerId: $ownerId, ')
+ ..write('type: $type, ')
+ ..write('data: $data, ')
+ ..write('isSaved: $isSaved, ')
+ ..write('memoryAt: $memoryAt, ')
+ ..write('seenAt: $seenAt, ')
+ ..write('showAt: $showAt, ')
+ ..write('hideAt: $hideAt')
+ ..write(')'))
+ .toString();
+ }
+
+ @override
+ int get hashCode => Object.hash(id, createdAt, updatedAt, deletedAt, ownerId,
+ type, data, isSaved, memoryAt, seenAt, showAt, hideAt);
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ (other is i1.MemoryEntityData &&
+ other.id == this.id &&
+ other.createdAt == this.createdAt &&
+ other.updatedAt == this.updatedAt &&
+ other.deletedAt == this.deletedAt &&
+ other.ownerId == this.ownerId &&
+ other.type == this.type &&
+ other.data == this.data &&
+ other.isSaved == this.isSaved &&
+ other.memoryAt == this.memoryAt &&
+ other.seenAt == this.seenAt &&
+ other.showAt == this.showAt &&
+ other.hideAt == this.hideAt);
+}
+
+class MemoryEntityCompanion extends i0.UpdateCompanion {
+ final i0.Value id;
+ final i0.Value createdAt;
+ final i0.Value updatedAt;
+ final i0.Value deletedAt;
+ final i0.Value ownerId;
+ final i0.Value type;
+ final i0.Value data;
+ final i0.Value isSaved;
+ final i0.Value memoryAt;
+ final i0.Value seenAt;
+ final i0.Value showAt;
+ final i0.Value hideAt;
+ const MemoryEntityCompanion({
+ this.id = const i0.Value.absent(),
+ this.createdAt = const i0.Value.absent(),
+ this.updatedAt = const i0.Value.absent(),
+ this.deletedAt = const i0.Value.absent(),
+ this.ownerId = const i0.Value.absent(),
+ this.type = const i0.Value.absent(),
+ this.data = const i0.Value.absent(),
+ this.isSaved = const i0.Value.absent(),
+ this.memoryAt = const i0.Value.absent(),
+ this.seenAt = const i0.Value.absent(),
+ this.showAt = const i0.Value.absent(),
+ this.hideAt = const i0.Value.absent(),
+ });
+ MemoryEntityCompanion.insert({
+ required String id,
+ this.createdAt = const i0.Value.absent(),
+ this.updatedAt = const i0.Value.absent(),
+ this.deletedAt = const i0.Value.absent(),
+ required String ownerId,
+ required i2.MemoryTypeEnum type,
+ required String data,
+ this.isSaved = const i0.Value.absent(),
+ required DateTime memoryAt,
+ this.seenAt = const i0.Value.absent(),
+ this.showAt = const i0.Value.absent(),
+ this.hideAt = const i0.Value.absent(),
+ }) : id = i0.Value(id),
+ ownerId = i0.Value(ownerId),
+ type = i0.Value(type),
+ data = i0.Value(data),
+ memoryAt = i0.Value(memoryAt);
+ static i0.Insertable custom({
+ i0.Expression? id,
+ i0.Expression? createdAt,
+ i0.Expression? updatedAt,
+ i0.Expression? deletedAt,
+ i0.Expression? ownerId,
+ i0.Expression? type,
+ i0.Expression? data,
+ i0.Expression? isSaved,
+ i0.Expression? memoryAt,
+ i0.Expression? seenAt,
+ i0.Expression? showAt,
+ i0.Expression? hideAt,
+ }) {
+ return i0.RawValuesInsertable({
+ if (id != null) 'id': id,
+ if (createdAt != null) 'created_at': createdAt,
+ if (updatedAt != null) 'updated_at': updatedAt,
+ if (deletedAt != null) 'deleted_at': deletedAt,
+ if (ownerId != null) 'owner_id': ownerId,
+ if (type != null) 'type': type,
+ if (data != null) 'data': data,
+ if (isSaved != null) 'is_saved': isSaved,
+ if (memoryAt != null) 'memory_at': memoryAt,
+ if (seenAt != null) 'seen_at': seenAt,
+ if (showAt != null) 'show_at': showAt,
+ if (hideAt != null) 'hide_at': hideAt,
+ });
+ }
+
+ i1.MemoryEntityCompanion copyWith(
+ {i0.Value? id,
+ i0.Value? createdAt,
+ i0.Value? updatedAt,
+ i0.Value? deletedAt,
+ i0.Value? ownerId,
+ i0.Value? type,
+ i0.Value? data,
+ i0.Value? isSaved,
+ i0.Value? memoryAt,
+ i0.Value? seenAt,
+ i0.Value? showAt,
+ i0.Value? hideAt}) {
+ return i1.MemoryEntityCompanion(
+ id: id ?? this.id,
+ createdAt: createdAt ?? this.createdAt,
+ updatedAt: updatedAt ?? this.updatedAt,
+ deletedAt: deletedAt ?? this.deletedAt,
+ ownerId: ownerId ?? this.ownerId,
+ type: type ?? this.type,
+ data: data ?? this.data,
+ isSaved: isSaved ?? this.isSaved,
+ memoryAt: memoryAt ?? this.memoryAt,
+ seenAt: seenAt ?? this.seenAt,
+ showAt: showAt ?? this.showAt,
+ hideAt: hideAt ?? this.hideAt,
+ );
+ }
+
+ @override
+ Map toColumns(bool nullToAbsent) {
+ final map = {};
+ if (id.present) {
+ map['id'] = i0.Variable(id.value);
+ }
+ if (createdAt.present) {
+ map['created_at'] = i0.Variable(createdAt.value);
+ }
+ if (updatedAt.present) {
+ map['updated_at'] = i0.Variable(updatedAt.value);
+ }
+ if (deletedAt.present) {
+ map['deleted_at'] = i0.Variable(deletedAt.value);
+ }
+ if (ownerId.present) {
+ map['owner_id'] = i0.Variable(ownerId.value);
+ }
+ if (type.present) {
+ map['type'] = i0.Variable