Compare commits

..

69 Commits

Author SHA1 Message Date
Zack
a4b8b0f826 bump yucca dependency 2026-07-22 18:33:34 +01:00
izzy
54e91036b4 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-07-22 17:59:13 +01:00
izzy
bdcf05bd1d chore: bump dependency 2026-07-22 17:56:27 +01:00
izzy
19f4fb7344 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-07-22 11:06:18 +01:00
izzy
5ab95df4c0 Merge main 2026-07-22 10:48:14 +01:00
izzy
0d4bbf6f38 chore: bump sdk package 2026-06-26 19:24:39 +01:00
izzy
93e2f26872 refactor: move configuration up to module definition 2026-06-26 18:48:55 +01:00
izzy
bbd11c1ccd Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-26 13:23:48 +01:00
izzy
dd6eb99c54 revert: onError change in main 2026-06-26 13:20:13 +01:00
izzy
d8e0f8df98 refactor: collapse canActivate into one path 2026-06-26 13:18:52 +01:00
izzy
9775b49ff0 chore: update yucca sdk 2026-06-26 13:08:33 +01:00
izzy
cbce7378ef refactor: drop /dist from imports 2026-06-25 12:28:09 +01:00
izzy
b86721acd9 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-25 10:51:22 +01:00
izzy
b803a7d676 chore: format 2026-06-22 14:53:49 +01:00
izzy
9df490c477 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-22 14:47:05 +01:00
izzy
3c2e58dc32 test: missing onboarding step 2026-06-22 14:08:43 +01:00
izzy
eecc6d814b chore: lint & test fixes 2026-06-22 13:50:28 +01:00
izzy
a371994f09 fix: invert dev mode check 2026-06-22 13:20:28 +01:00
izzy
9beeaee13b chore: format, lint 2026-06-22 12:36:13 +01:00
izzy
1afc8887ce chore: generate mise lock 2026-06-22 12:30:50 +01:00
izzy
6c85e1334b chore: mise lock & open-api 2026-06-22 12:24:51 +01:00
izzy
2abd21547e Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-22 12:08:54 +01:00
izzy
8b15280c0d chore: remove dead code 2026-06-22 12:03:53 +01:00
izzy
a1bdb6dc6d chore: remove test buttons & mode 2026-06-22 11:59:43 +01:00
izzy
6b601de99e chore: remove unused repositories on service 2026-06-22 11:54:37 +01:00
izzy
3ff5bc3918 chore: align with main 2026-06-22 11:52:41 +01:00
izzy
e3dd39412f chore: remove prod api override 2026-06-19 13:17:05 +01:00
izzy
d18e09de30 feat: magic link to enable backups 2026-06-19 13:06:57 +01:00
izzy
5ded6f89b7 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-17 15:19:40 +01:00
izzy
bd781bdca8 chore: bump library to 0.3.1 2026-06-17 15:13:01 +01:00
izzy
71207ec7dc chore: use configured media location
refactor: move detect location to common util
2026-06-17 11:09:10 +01:00
izzy
88048548f6 docs: label TODO[YUCCA] comments 2026-06-17 11:00:14 +01:00
izzy
21f6b0a407 Merge remote-tracking branch 'origin/main' into feat/yucca-integration
Signed-off-by: izzy <me@insrt.uk>
2026-06-16 13:26:04 +01:00
izzy
68dd701f20 refactor: merge YuccaAdminGuard into AuthGuard
Signed-off-by: izzy <me@insrt.uk>
2026-06-16 13:13:23 +01:00
izzy
c44882f8c1 chore: bump restic to 0.19.0
Signed-off-by: izzy <me@insrt.uk>
2026-06-16 13:08:32 +01:00
izzy
42e10c6ea9 chore: install restic through mise
Signed-off-by: izzy <me@insrt.uk>
2026-06-09 14:43:49 +02:00
izzy
bd01b5931b chore: remove open-api/typescript-sdk 2026-06-01 14:34:14 +01:00
izzy
8de96382be chore: clarify comment 2026-06-01 12:47:46 +01:00
izzy
2b0f253015 chore: clean up comments 2026-06-01 12:17:31 +01:00
izzy
0da6aba203 chore: use peer deps 2026-06-01 11:22:05 +01:00
izzy
a5a0a0b687 Merge branch 'fix/devcontainer-buildcache' into feat/yucca-integration 2026-06-01 10:27:19 +01:00
izzy
490c8e2321 fix(devcontainer): update build cache volume 2026-06-01 10:23:29 +01:00
izzy
30d1fb73d0 chore: strip devcontainer changes 2026-06-01 10:09:23 +01:00
izzy
cf6cbfdcd6 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-06-01 10:04:33 +01:00
izzy
676831f052 chore: drop registry 2026-06-01 09:53:30 +01:00
izzy
3a53b5f807 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-05-20 11:45:22 +01:00
izzy
0cec4f3bd8 Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-05-18 16:53:16 +01:00
izzy
a41aa623da chore: oapi 2026-05-18 16:32:30 +01:00
izzy
cb87a39b3a Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-05-18 16:32:16 +01:00
izzy
820653d59e chore: bump packages 2026-05-18 15:28:06 +01:00
izzy
64adfa6cc3 feat: auto select latest db backup
Signed-off-by: izzy <me@insrt.uk>
2026-05-18 12:44:01 +01:00
izzy
3465ed5c6b refactor: new package name
Signed-off-by: izzy <me@insrt.uk>
2026-05-18 12:01:50 +01:00
izzy
9d17e51e54 fix: point to real component 2026-05-08 14:27:42 +01:00
izzy
8d5f447d45 chore: change registry 2026-05-08 14:21:47 +01:00
izzy
6dd9eaff73 chore: remove subm 2026-05-08 14:10:21 +01:00
izzy
b54fe0bb3b Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-05-08 14:00:20 +01:00
izzy
173a6afda8 chore: wip 2026-05-08 13:51:52 +01:00
izzy
998d82643c chore: new UI 2026-05-08 12:30:04 +01:00
izzy
f3ce407e9c chore: bump dependency 2026-04-22 14:07:52 +01:00
izzy
4b4308650c chore: bump deps. 2026-04-20 12:41:52 +01:00
izzy
425abe510a Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-04-20 10:55:40 +01:00
izzy
4ded06dbb7 test: web e2e tests 2026-04-20 10:46:48 +01:00
izzy
5f5d3ea0ba Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-04-16 14:41:49 +01:00
izzy
fa828dddc9 chore: bump packages
Signed-off-by: izzy <me@insrt.uk>
2026-04-16 14:40:40 +01:00
izzy
21d0821ed2 chore: bump version 2026-04-16 12:19:04 +01:00
izzy
75025bb6be Merge remote-tracking branch 'origin/main' into feat/yucca-integration 2026-04-16 12:04:38 +01:00
izzy
dd1712656d chore: bump package depends 2026-04-16 11:58:20 +01:00
izzy
33605efd0e chore: use persistent config storage 2026-04-16 11:19:31 +01:00
izzy
77f9e87bd3 feat: yucca integration 2026-04-15 15:17:19 +01:00
181 changed files with 14168 additions and 3469 deletions

View File

@@ -0,0 +1,9 @@
{
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"version": "2.17.0",
"resolved": "ghcr.io/devcontainers/features/docker-in-docker@sha256:25b9f05705ffba7dbe503230ac76081419306f8c8bc88e0ce78c4ecd99a0c78c",
"integrity": "sha256:25b9f05705ffba7dbe503230ac76081419306f8c8bc88e0ce78c4ecd99a0c78c"
}
}
}

View File

@@ -127,15 +127,6 @@ jobs:
with:
packages: ''
- name: Install Rust and protoc for cargokit
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
"$HOME/.cargo/bin/rustup" target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
sudo apt-get update
sudo apt-get install -y protobuf-compiler
echo "PROTOC=$(command -v protoc)" >> "$GITHUB_ENV"
- name: Get Packages
working-directory: ./mobile
run: flutter pub get
@@ -235,11 +226,6 @@ jobs:
github_token: ${{ steps.token.outputs.token }}
working_directory: ./mobile
- name: Install protoc
run: |
brew install protobuf
echo "PROTOC=$(brew --prefix)/bin/protoc" >> "$GITHUB_ENV"
- name: Install Flutter dependencies
working-directory: ./mobile
run: flutter pub get

View File

@@ -409,7 +409,7 @@ To decrease Redis logs, you can add the following line to the `redis:` section o
You can change the user in the container by setting the `user` argument in `docker-compose.yml` for each service.
[Example docker-compose.rootless.yml file](https://github.com/immich-app/immich/blob/main/docker/docker-compose.rootless.yml)
[Example docker-compose.yml file](https://github.com/immich-app/immich/blob/main/docker/docker-compose.rootless.yml)
You may need to add mount points or docker volumes for the following internal container paths:

View File

@@ -1,23 +1,19 @@
# Casting support
# Chromecast support
Immich supports both the FCast and Google Cast protocols, meaning photos and videos in Immich can be cast to devices such as a Chromecast, Nest Hub, or an FCast receiver. This feature is considered experimental and has several important limitations listed below. This feature is supported by the web client, as well as the mobile app via FCast.
Immich supports the Google's Cast protocol so that photos and videos can be cast to devices such as a Chromecast and a Nest Hub. This feature is considered experimental and has several important limitations listed below. Currently, this feature is only supported by the web client, support on Android and iOS is planned for the future.
## Mobile FCast support
## Enable Google Cast Support
The mobile app also supports FCast for casting media to both FCast receivers and Google Cast devices such as a Google TV or Nest Hub. Devices are automatically discovered over your local network.
Google Cast support is disabled by default. The web UI uses Google-provided scripts and must retrieve them from Google servers when the page loads. This is a privacy concern for some and is thus opt-in.
## Enable web support
Casting from the web client is currently only possible via Google Cast, so enabling web support means enabling Google Cast. Google Cast support is disabled by default, since it requires the web UI to load Google-provided scripts from Google's servers when the page loads. This is a privacy concern for some and is thus opt-in.
You can enable Google Cast support through `Account Settings > Features > Cast > Google Cast`.
You can enable Google Cast support through `Account Settings > Features > Cast > Google Cast`
<img src={require('./img/gcast-enable.webp').default} width="70%" title='Enable Google Cast Support' />
## Limitations
To use Google Cast with Immich, there are a few prerequisites:
To use casting with Immich, there are a few prerequisites:
1. Your instance must be accessed via an HTTPS connection in order for the casting menu to show.
2. Your instance must be publicly accessible via HTTPS and a DNS record for the server must be accessible via Google's DNS servers (`8.8.8.8` and `8.8.4.4`).
3. Videos must be in a format that is compatible with Google Cast. For more info, check out [Google's documentation](https://developers.google.com/cast/docs/media).
2. Your instance must be publicly accessible via HTTPS and a DNS record for the server must be accessible via Google's DNS servers (`8.8.8.8` and `8.8.4.4`)
3. Videos must be in a format that is compatible with Google Cast. For more info, check out [Google's documentation](https://developers.google.com/cast/docs/media)

View File

@@ -26,6 +26,7 @@
"devDependencies": {
"@eslint/js": "^10.0.0",
"@faker-js/faker": "^10.1.0",
"@futo-org/backups-orchestrator-ui": "0.12.0",
"@immich/cli": "workspace:*",
"@immich/e2e-auth-server": "workspace:*",
"@immich/sdk": "workspace:*",
@@ -36,6 +37,7 @@
"@types/pg": "^8.15.1",
"@types/pngjs": "^6.0.4",
"@types/supertest": "^7.0.0",
"@typescript/native": "npm:typescript@^7.0.2",
"dotenv": "^17.2.3",
"eslint": "^10.0.0",
"eslint-config-prettier": "^10.1.8",
@@ -51,7 +53,6 @@
"sharp": "^0.34.5",
"socket.io-client": "^4.7.4",
"supertest": "^7.0.0",
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2",
"typescript-eslint": "^8.28.0",
"utimes": "^5.2.1",

View File

@@ -0,0 +1,385 @@
import * as sdk from '@futo-org/backups-orchestrator-ui/sdk';
import { LoginResponseDto, StorageFolder } from '@immich/sdk';
import { io, Socket } from 'socket.io-client';
import { createUserDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, baseUrl, utils } from 'src/utils';
import request from 'supertest';
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
describe('/yucca', () => {
let admin: LoginResponseDto;
let nonAdmin: LoginResponseDto;
let requestOpts: any;
let filename: string;
let socket: Socket;
let libraryId: string;
beforeAll(async () => {
sdk.defaults.baseUrl = baseUrl;
await utils.resetDatabase();
admin = await utils.adminSetup();
nonAdmin = await utils.userSetup(admin.accessToken, createUserDto.user1);
requestOpts = { headers: asBearerAuth(admin.accessToken) };
await utils.resetBackups(admin.accessToken);
await sdk.resetOrchestrator(requestOpts);
socket = io(baseUrl, {
path: '/api/yucca/socket.io',
transports: ['websocket'],
extraHeaders: asBearerAuth(admin.accessToken),
});
socket.onAny(console.info);
});
afterAll(async () => {
socket.close();
// "resetDatabase" does not reinit the module config, trigger an update / clean up
if (libraryId) {
await utils.deleteLibrary(admin.accessToken, libraryId);
}
});
const waitForMessage = (type: string) => {
return new Promise((resolve) => {
const listener = (msg: string) => {
const payload = JSON.parse(msg);
if (payload.type !== type) {
return;
}
resolve(payload);
socket.offAny(listener);
};
socket.onAny(listener);
});
};
describe('Orchestration Module', async () => {
it('works', async () => {
await expect(sdk.onboardingStatus(requestOpts)).resolves.toEqual(
expect.objectContaining({
hasOnboardedKey: false,
hasBackend: false,
hasBackup: false,
hasSchedule: false,
hasSkippedExtraConfig: false,
}),
);
});
it('is inaccessible without admin', async () => {
await expect(sdk.onboardingStatus({ headers: asBearerAuth(nonAdmin.accessToken) })).rejects.toEqual(
expect.objectContaining({ data: errorDto.forbidden }),
);
});
it('is inaccessible without logging in', async () => {
await expect(sdk.onboardingStatus()).rejects.toEqual(expect.objectContaining({ data: errorDto.unauthorized }));
});
});
describe.sequential('Local Backup', async () => {
beforeAll(async () => {
await sdk.importRecoveryKey(
{
recoveryKey: '0'.repeat(64),
},
requestOpts,
);
});
it.sequential('configures a local backend', async () => {
await utils.mkFolder('/local-backend');
await sdk.createLocalBackend(
{
path: '/local-backend',
},
requestOpts,
);
});
it.sequential('configures Immich backup', async () => {
const event = waitForMessage('IntegrationUpdate');
await sdk.configureImmichIntegration(
{
name: 'Immich',
worm: false,
cron: '0 3 * * *',
backupConfiguration: true,
dataFolders: [StorageFolder.Backups, StorageFolder.Upload],
libraries: 'all',
},
requestOpts,
);
await event;
await expect(sdk.getIntegrations(requestOpts)).resolves.toEqual(
expect.objectContaining({
immichIntegration: expect.objectContaining({
configuration: {
backupConfiguration: true,
dataFolders: ['backups', 'upload'],
libraries: 'all',
},
}),
immichState: {
dataFolders: expect.arrayContaining(Object.values(StorageFolder)),
dataPath: '/data',
libraries: [],
},
}),
);
});
it.sequential('updates configuration', async () => {
await utils.mkFolder('/test');
({ id: libraryId } = await utils.createLibrary(admin.accessToken, {
ownerId: admin.userId,
name: 'My Library',
importPaths: ['/test'],
}));
await expect(sdk.getIntegrations(requestOpts)).resolves.toEqual(
expect.objectContaining({
immichIntegration: expect.any(Object),
immichState: expect.objectContaining({
libraries: expect.arrayContaining([
expect.objectContaining({
name: 'My Library',
importPaths: ['/test'],
}),
]),
}),
}),
);
});
it.sequential('creates a snapshot', async () => {
const event = waitForMessage('TaskEnd');
const {
repositories: [{ id }],
} = await sdk.getRepositories(requestOpts);
filename = await utils.createBackup(admin.accessToken);
await sdk.createBackup(id, requestOpts);
await event;
const {
snapshots: [{ id: snapshotId }],
} = await sdk.getSnapshots(id, requestOpts);
await expect(sdk.getSnapshotListing(id, snapshotId, {}, requestOpts)).resolves.toMatchInlineSnapshot(`
{
"items": [
{
"isDirectory": true,
"path": "/data",
},
{
"isDirectory": true,
"path": "/test",
},
],
"parent": "/",
"path": "/",
}
`);
await expect(sdk.getSnapshotListing(id, snapshotId, { path: '/data' }, requestOpts)).resolves
.toMatchInlineSnapshot(`
{
"items": [
{
"isDirectory": true,
"path": "/data/backups",
},
{
"isDirectory": true,
"path": "/data/upload",
},
{
"isDirectory": true,
"path": "/data/yucca",
},
],
"parent": "/",
"path": "/data",
}
`);
await expect(sdk.getSnapshotListing(id, snapshotId, { path: '/data/backups' }, requestOpts)).resolves.toEqual(
expect.objectContaining({
items: [
{
isDirectory: false,
path: '/data/backups/.immich',
},
{
isDirectory: false,
path: expect.stringContaining('/data/backups/immich-db-backup-'),
},
],
parent: '/data',
path: '/data/backups',
}),
);
});
});
describe.sequential('Restore Local Backup', async () => {
let cookie: string;
beforeAll(async () => {
await sdk.resetOrchestrator(requestOpts);
await utils.resetDatabase();
socket.disconnect();
await utils.disconnectDatabase();
});
afterAll(async () => {
await utils.connectDatabase();
});
it.sequential(
'restores backup',
async () => {
const { status, headers } = await request(app).post('/admin/database-backups/start-restore').send();
expect(status).toBe(201);
cookie = headers['set-cookie'][0].split(';')[0];
await expect
.poll(
async () => {
const { status, body } = await request(app).get('/server/config');
expect(status).toBe(200);
return body.maintenanceMode;
},
{
interval: 500,
timeout: 10_000,
},
)
.toBeTruthy();
const maintenanceRequestOpts = {
headers: {
cookie,
},
};
await expect(sdk.getSchedules(maintenanceRequestOpts)).resolves.toEqual({ schedules: [] });
await sdk.importRecoveryKey(
{
recoveryKey: '0'.repeat(64),
},
maintenanceRequestOpts,
);
const {
backend: { id: backendId },
} = await sdk.createLocalBackend(
{
path: '/local-backend',
},
maintenanceRequestOpts,
);
const {
repositories: [
{
id: repositoryId,
snapshots: [{ id: snapshotId }],
},
],
} = await sdk.inspectRepositories({}, maintenanceRequestOpts);
socket = io(baseUrl, {
path: '/api/yucca/socket.io',
transports: ['websocket'],
extraHeaders: {
cookie,
},
});
const event = waitForMessage('TaskEnd');
await sdk.restoreFromPoint(
repositoryId,
snapshotId,
backendId,
{
yuccaConfig: '/data/yucca',
include: ['/data'],
},
maintenanceRequestOpts,
);
await event;
socket.disconnect();
const { status: restoreStatus } = await request(app).post('/admin/maintenance').set('Cookie', cookie).send({
action: 'restore_database',
restoreBackupFilename: filename,
});
expect(restoreStatus).toBe(201);
await expect
.poll(
async () => {
const { status, body } = await request(app).get('/server/config');
expect(status).toBe(200);
return body.maintenanceMode;
},
{
interval: 500,
timeout: 10_000,
},
)
.toBeTruthy();
const { status: status2, body } = await request(app).get('/admin/maintenance/status');
expect(status2).toBe(200);
expect(body).toEqual(
expect.objectContaining({
active: true,
action: 'restore_database',
}),
);
await expect
.poll(
async () => {
const { status, body } = await request(app).get('/server/config');
expect(status).toBe(200);
return body.maintenanceMode;
},
{
interval: 500,
timeout: 60_000,
},
)
.toBeFalsy();
await expect(sdk.getSchedules(requestOpts)).resolves.toEqual({
schedules: expect.arrayContaining([expect.objectContaining({ id: expect.any(String) })]),
});
},
60_000,
);
});
});

View File

@@ -95,6 +95,7 @@ test.describe('Database Backups', () => {
await page.waitForURL('/maintenance**');
}
await page.getByRole('button', { name: 'Database Backup' }).click();
await page.getByRole('button', { name: 'Next' }).click();
await page.getByRole('button', { name: 'Restore', exact: true }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Restore' }).click();

View File

@@ -0,0 +1,148 @@
import {
LoginResponseDto,
confirmRecoveryKey,
enableTelemetry,
importRecoveryKey,
resetOrchestrator,
} from '@immich/sdk';
import { expect, test } from '@playwright/test';
import { io, type Socket } from 'socket.io-client';
import { asBearerAuth, baseUrl, utils } from 'src/utils';
test.describe.configure({ mode: 'serial' });
test.describe('Yucca Backups', () => {
let admin: LoginResponseDto;
let socket: Socket;
const waitForTaskEnd = () =>
new Promise<void>((resolve) => {
const listener = (msg: string) => {
try {
const payload = JSON.parse(msg);
if (payload.type === 'TaskEnd') {
socket.offAny(listener);
resolve();
}
} catch {
// no-op
}
};
socket.onAny(listener);
});
test.beforeAll(async () => {
utils.initSdk();
await utils.resetDatabase();
admin = await utils.adminSetup();
const headers = asBearerAuth(admin.accessToken);
await resetOrchestrator({ headers });
await importRecoveryKey({ importRecoveryKeyRequest: { recoveryKey: '0'.repeat(64) } }, { headers });
await confirmRecoveryKey({ headers });
await enableTelemetry({ headers });
await utils.mkFolder('/local-backend');
socket = io(baseUrl, {
path: '/api/yucca/socket.io',
transports: ['websocket'],
extraHeaders: headers,
forceNew: true,
});
await new Promise<void>((resolve) => socket.on('connect', () => resolve()));
});
test.afterAll(async () => {
socket?.close();
});
test('onboarding configures a local backend', async ({ context, page }) => {
test.setTimeout(30_000);
await utils.setAuthCookies(context, admin.accessToken);
await page.goto('/backups');
const dialog = page.getByRole('dialog');
await expect(dialog.filter({ hasText: 'Backup options' })).toBeVisible();
await dialog.getByText('Local Folder').click();
await expect(dialog.filter({ hasText: 'Create local backend' })).toBeVisible();
await dialog.getByLabel('Path').fill('/local-backend');
await dialog.getByRole('button', { name: 'Save' }).click();
await expect(dialog.filter({ hasText: 'Configure Your Immich Backup' })).toBeVisible();
await dialog.getByRole('button', { name: 'Save' }).click();
await expect(dialog).toHaveCount(0);
await expect(page.getByRole('link', { name: 'Repositories' })).toBeVisible();
});
test('manually triggers a backup and waits for completion', async ({ context, page }) => {
test.setTimeout(60_000);
await utils.setAuthCookies(context, admin.accessToken);
await page.goto('/backups/repositories');
const backupNow = page.getByRole('button', { name: 'Backup Now' });
await expect(backupNow).toBeVisible();
const taskEnd = waitForTaskEnd();
await backupNow.click();
await expect(page.getByRole('dialog').filter({ hasText: 'Log Output' })).toBeVisible();
await taskEnd;
});
test('resets immich and restores from the local yucca backup', async ({ context, page }) => {
test.setTimeout(120_000);
await utils.setAuthCookies(context, admin.accessToken);
await utils.resetBackups(admin.accessToken);
await utils.createBackup(admin.accessToken);
await resetOrchestrator({ headers: asBearerAuth(admin.accessToken) });
await utils.resetDatabase();
await page.goto('/');
await page.getByRole('button', { name: 'Restore from backup' }).click();
try {
await page.waitForURL('/maintenance**');
} catch {
await page.goto('/maintenance');
await page.waitForURL('/maintenance**');
}
await page.getByRole('button', { name: 'FUTO Backups' }).click();
const dialog = page.getByRole('dialog');
await expect(dialog.filter({ hasText: 'Import recovery key' })).toBeVisible();
await dialog.getByLabel('Recovery Key').fill('0'.repeat(64));
await dialog.getByRole('button', { name: 'Save' }).click();
await expect(dialog.filter({ hasText: 'Where would you like to restore from?' })).toBeVisible();
await dialog.getByText('Local Folder').click();
await expect(dialog.filter({ hasText: 'Create local backend' })).toBeVisible();
await dialog.getByLabel('Path').fill('/local-backend');
await dialog.getByRole('button', { name: 'Save' }).click();
await expect(dialog.filter({ hasText: 'Select Restore Point' })).toBeVisible();
await dialog.getByRole('button', { name: 'Select' }).first().click();
await expect(dialog.filter({ hasText: /Restore from/ })).toBeVisible();
await dialog.getByRole('button', { name: 'Restore' }).first().click();
await expect(dialog.filter({ hasText: 'Confirm restore from snapshot' })).toBeVisible();
await dialog.getByRole('button', { name: 'Restore' }).click();
await expect(dialog.filter({ hasText: 'Restoring' })).toBeVisible();
await expect(dialog.filter({ hasText: 'Restoring' })).toBeHidden({ timeout: 60_000 });
await page.getByRole('button', { name: 'Next' }).click();
await page.getByRole('button', { name: 'Restore', exact: true }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Restore' }).click();
await page.waitForURL('/maintenance?**');
await page.waitForURL('/photos', { timeout: 90_000 });
});
});

View File

@@ -111,6 +111,7 @@ describe('/server', () => {
configFile: false,
duplicateDetection: false,
facialRecognition: false,
backups: false,
map: true,
reverseGeocoding: true,
importFaces: false,

View File

@@ -121,6 +121,7 @@ export const setupBaseMockApiRoutes = async (context: BrowserContext, adminUserI
smartSearch: false,
facialRecognition: false,
duplicateDetection: false,
backups: false,
map: true,
reverseGeocoding: true,
importFaces: false,

View File

@@ -31,6 +31,7 @@ import {
createUserAdmin,
deleteAssets,
deleteDatabaseBackup,
deleteLibrary,
getAssetInfo,
getConfig,
getConfigDefaults,
@@ -462,6 +463,8 @@ export const utils = {
updateLibrary: (accessToken: string, id: string, dto: UpdateLibraryDto) =>
updateLibrary({ id, updateLibraryDto: dto }, { headers: asBearerAuth(accessToken) }),
deleteLibrary: (accessToken: string, id: string) => deleteLibrary({ id }, { headers: asBearerAuth(accessToken) }),
createPartner: (accessToken: string, id: string) =>
createPartner({ partnerCreateDto: { sharedWithId: id } }, { headers: asBearerAuth(accessToken) }),

View File

@@ -1341,6 +1341,7 @@
"maintenance_end": "End maintenance mode",
"maintenance_logged_in_as": "Currently logged in as {user}",
"maintenance_restore_from_backup": "Restore From Backup",
"maintenance_restore_latest_backup_description": "We'll restore your database from the most recent backup. You can also pick a different one.",
"maintenance_restore_library": "Restore Your Library",
"maintenance_restore_library_confirm": "If this looks correct, continue to restoring a backup!",
"maintenance_restore_library_description": "Restoring Database",
@@ -1353,6 +1354,10 @@
"maintenance_restore_library_hint_regenerate_later": "You can regenerate these later in settings",
"maintenance_restore_library_hint_storage_template_missing_files": "Using storage template? You may be missing files",
"maintenance_restore_library_loading": "Loading integrity checks and heuristics…",
"maintenance_restore_loading_backups": "Loading backups…",
"maintenance_restore_no_backups": "There are no database backups.",
"maintenance_restore_select_another": "Select another backup",
"maintenance_restore_upload_backup": "Upload a backup",
"maintenance_task_backup": "Creating a backup of the existing database…",
"maintenance_task_migrations": "Running database migrations…",
"maintenance_task_restore": "Restoring the chosen backup…",
@@ -1524,7 +1529,6 @@
"not_available": "N/A",
"not_in_any_album": "Not in any album",
"not_selected": "Not selected",
"not_set": "Not set",
"notes": "Notes",
"nothing_here_yet": "Nothing here yet",
"notification_backup_reliability": "Enable notifications to improve background backup reliability",

View File

@@ -140,10 +140,13 @@ url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets
version = "7.1.3-6"
backend = "github:jellyfin/jellyfin-ffmpeg"
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.windows-x64"]
checksum = "sha256:7b7168149689610296f3a187c717056ce0786cc125a31caf28056737e9ba1cc1"
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_win64-clang-gpl.zip"
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/409036094"
[tools."github:jellyfin/jellyfin-ffmpeg".options]
asset_pattern = "jellyfin-ffmpeg_*_portable_macarm64-gpl.tar.xz"
[tools."github:jellyfin/jellyfin-ffmpeg"."platforms.macos-arm64"]
checksum = "sha256:e024d5e78d5414e75f0181036cd21373fafb9270c72894dfd7dbda2572439820"
url = "https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v7.1.3-6/jellyfin-ffmpeg_7.1.3-6_portable_macarm64-gpl.tar.xz"
url_api = "https://api.github.com/repos/jellyfin/jellyfin-ffmpeg/releases/assets/408995838"
[[tools."github:webassembly/binaryen"]]
version = "version_124"
@@ -326,6 +329,38 @@ url = "https://github.com/pnpm/pnpm/releases/download/v11.13.1/pnpm-win32-x64.zi
url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/478563981"
provenance = "github-attestations"
[[tools.restic]]
version = "0.19.0"
backend = "aqua:restic/restic"
[tools.restic."platforms.linux-arm64"]
checksum = "sha256:e522ce6bf748d753fee8093e8ec59359972cf5b6bc65fc7c7cf38ae952351d91"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_linux_arm64.bz2"
[tools.restic."platforms.linux-arm64-musl"]
checksum = "sha256:e522ce6bf748d753fee8093e8ec59359972cf5b6bc65fc7c7cf38ae952351d91"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_linux_arm64.bz2"
[tools.restic."platforms.linux-x64"]
checksum = "sha256:13176fe6d89d4357947a2cd107218ab2873a5f9d8e1ac2d4cd1c8e07e6839c21"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_linux_amd64.bz2"
[tools.restic."platforms.linux-x64-musl"]
checksum = "sha256:13176fe6d89d4357947a2cd107218ab2873a5f9d8e1ac2d4cd1c8e07e6839c21"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_linux_amd64.bz2"
[tools.restic."platforms.macos-arm64"]
checksum = "sha256:1475397bf759ef4be16a77b19dec650bdbfec00d2cacd82005553411cdd37997"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_darwin_arm64.bz2"
[tools.restic."platforms.macos-x64"]
checksum = "sha256:c9d9a71234bc0955fdba6da93cc9375f8793ec1e1cbce77a91014d536a969148"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_darwin_amd64.bz2"
[tools.restic."platforms.windows-x64"]
checksum = "sha256:6fa4219a70b1b5d1c429bb106a7f97f3d2a5aab74494db2e490b625edc486d8f"
url = "https://github.com/restic/restic/releases/download/v0.19.0/restic_0.19.0_windows_amd64.zip"
[[tools.terragrunt]]
version = "1.1.1"
backend = "aqua:gruntwork-io/terragrunt"

View File

@@ -23,6 +23,7 @@ opentofu = "1.12.4"
"github:extism/cli" = "1.6.3"
"github:webassembly/binaryen" = "version_124"
"github:extism/js-pdk" = "1.6.0"
restic = "0.19.0"
java = "21.0.2"
[tools."github:jellyfin/jellyfin-ffmpeg"]

View File

@@ -27,30 +27,12 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe
flutter_ios_podfile_setup
def ensure_fcast_sender_sdk_podspec
plugin_ios_dir = File.expand_path(File.join('.symlinks', 'plugins', 'fcast_sender_sdk', 'ios'), __dir__)
original_podspec = File.join(plugin_ios_dir, 'fcast_sender_sdk_flutter_plugin.podspec')
expected_podspec = File.join(plugin_ios_dir, 'fcast_sender_sdk.podspec')
return unless File.exist?(original_podspec)
contents = File.read(original_podspec)
fixed_contents = contents
.sub("s.name = 'fcast_sender_sdk_flutter_plugin'", "s.name = 'fcast_sender_sdk'")
.gsub('libfcast_sender_sdk_flutter_plugin.a', 'libfcast_sender_sdk.a')
return if File.exist?(expected_podspec) && File.read(expected_podspec) == fixed_contents
File.write(expected_podspec, fixed_contents)
end
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
ensure_fcast_sender_sdk_podspec
# share_handler addition start
target 'ShareExtension' do
inherit! :search_paths
@@ -67,7 +49,7 @@ post_install do |installer|
end
end
end
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)

View File

@@ -1,9 +1,10 @@
PODS:
- bonsoir_darwin (0.0.1):
- Flutter
- FlutterMacOS
- cupertino_http (0.0.1):
- Flutter
- FlutterMacOS
- fcast_sender_sdk (0.0.1):
- Flutter
- Flutter (1.0.0)
- flutter_local_notifications (0.0.1):
- Flutter
@@ -23,8 +24,8 @@ PODS:
- share_handler_ios_models (0.0.9)
DEPENDENCIES:
- bonsoir_darwin (from `.symlinks/plugins/bonsoir_darwin/darwin`)
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
- fcast_sender_sdk (from `.symlinks/plugins/fcast_sender_sdk/ios`)
- Flutter (from `Flutter`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
@@ -34,10 +35,10 @@ DEPENDENCIES:
- share_handler_ios_models (from `.symlinks/plugins/share_handler_ios/ios/Models`)
EXTERNAL SOURCES:
bonsoir_darwin:
:path: ".symlinks/plugins/bonsoir_darwin/darwin"
cupertino_http:
:path: ".symlinks/plugins/cupertino_http/darwin"
fcast_sender_sdk:
:path: ".symlinks/plugins/fcast_sender_sdk/ios"
Flutter:
:path: Flutter
flutter_local_notifications:
@@ -54,8 +55,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/share_handler_ios/ios/Models"
SPEC CHECKSUMS:
bonsoir_darwin: 29c7ccf356646118844721f36e1de4b61f6cbd0e
cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c
fcast_sender_sdk: 8bf227a5cbcedaea2e580a633ff0f706f1e90328
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
@@ -64,6 +65,6 @@ SPEC CHECKSUMS:
share_handler_ios: e2244e990f826b2c8eaa291ac3831569438ba0fb
share_handler_ios_models: fc638c9b4330dc7f082586c92aee9dfa0b87b871
PODFILE CHECKSUM: 44895462563291c3e4328a856c6482a25165b507
PODFILE CHECKSUM: 3c43a700a4bffb4120bf696cad263aefd4bb3c8c
COCOAPODS: 1.17.0
COCOAPODS: 1.16.2

View File

@@ -32,8 +32,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/maplibre/maplibre-gl-native-distribution.git",
"state" : {
"revision" : "84a79bc375a301169390ac110c868f06c857b83f",
"version" : "6.27.0"
"revision" : "60d9bb85c94ce6e7fc4406cd32529fd12bdb7809",
"version" : "6.14.0"
}
},
{

View File

@@ -127,7 +127,6 @@
<array>
<string>_googlecast._tcp</string>
<string>_CC1AD845._googlecast._tcp</string>
<string>_fcast._tcp</string>
</array>
<key>NSCameraUsageDescription</key>
<string>We need to access the camera to let you take beautiful video using this app</string>

View File

@@ -9,6 +9,8 @@ enum SortOrder {
enum TextSearchType { context, filename, description, ocr }
enum AssetVisibilityEnum { timeline, hidden, archive, locked }
enum ActionSource { timeline, viewer }
enum ShareAssetType { original, preview }

View File

@@ -6,7 +6,6 @@ const Map<String, Locale> locales = {
// Additional locales
'Arabic (ar)': Locale('ar'),
'Basque (eu)': Locale('eu'),
'Belarusian (be)': Locale('be'),
'Bosnian (bl)': Locale('bn'),
'Brazilian Portuguese (pt_BR)': Locale('pt', 'BR'),
'Bulgarian (bg)': Locale('bg'),

View File

@@ -153,8 +153,6 @@ class AppConfig {
.timelineStorageIndicator => timeline.storageIndicator,
.mapShowFavoriteOnly => map.favoritesOnly,
.mapRelativeDate => map.relativeDays,
.mapCustomFrom => map.customFrom,
.mapCustomTo => map.customTo,
.mapIncludeArchived => map.includeArchived,
.mapThemeMode => map.themeMode,
.mapWithPartners => map.withPartners,
@@ -209,8 +207,6 @@ class AppConfig {
.timelineStorageIndicator => copyWith(timeline: timeline.copyWith(storageIndicator: value as bool)),
.mapShowFavoriteOnly => copyWith(map: map.copyWith(favoritesOnly: value as bool)),
.mapRelativeDate => copyWith(map: map.copyWith(relativeDays: value as int)),
.mapCustomFrom => copyWith(map: map.copyWith(customFrom: .fromNullable(value as DateTime?))),
.mapCustomTo => copyWith(map: map.copyWith(customTo: .fromNullable(value as DateTime?))),
.mapIncludeArchived => copyWith(map: map.copyWith(includeArchived: value as bool)),
.mapThemeMode => copyWith(map: map.copyWith(themeMode: value as ThemeMode)),
.mapWithPartners => copyWith(map: map.copyWith(withPartners: value as bool)),

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:immich_mobile/utils/option.dart';
class MapConfig {
final int relativeDays;
@@ -7,17 +6,13 @@ class MapConfig {
final bool includeArchived;
final ThemeMode themeMode;
final bool withPartners;
final DateTime? customFrom;
final DateTime? customTo;
const MapConfig({
this.relativeDays = 0,
this.favoritesOnly = false,
this.includeArchived = false,
this.themeMode = .system,
this.themeMode = ThemeMode.system,
this.withPartners = false,
this.customFrom,
this.customTo,
});
MapConfig copyWith({
@@ -26,16 +21,12 @@ class MapConfig {
bool? includeArchived,
ThemeMode? themeMode,
bool? withPartners,
Option<DateTime>? customFrom,
Option<DateTime>? customTo,
}) => MapConfig(
relativeDays: relativeDays ?? this.relativeDays,
favoritesOnly: favoritesOnly ?? this.favoritesOnly,
includeArchived: includeArchived ?? this.includeArchived,
themeMode: themeMode ?? this.themeMode,
withPartners: withPartners ?? this.withPartners,
customFrom: customFrom.patch(this.customFrom),
customTo: customTo.patch(this.customTo),
);
@override
@@ -46,15 +37,12 @@ class MapConfig {
other.favoritesOnly == favoritesOnly &&
other.includeArchived == includeArchived &&
other.themeMode == themeMode &&
other.withPartners == withPartners &&
other.customFrom == customFrom &&
other.customTo == customTo);
other.withPartners == withPartners);
@override
int get hashCode =>
Object.hash(relativeDays, favoritesOnly, includeArchived, themeMode, withPartners, customFrom, customTo);
int get hashCode => Object.hash(relativeDays, favoritesOnly, includeArchived, themeMode, withPartners);
@override
String toString() =>
'MapConfig(relativeDays: $relativeDays, favoritesOnly: $favoritesOnly, includeArchived: $includeArchived, themeMode: $themeMode, withPartners: $withPartners, customFrom: $customFrom, customTo: $customTo)';
'MapConfig(relativeDays: $relativeDays, favoritesOnly: $favoritesOnly, includeArchived: $includeArchived, themeMode: $themeMode, withPartners: $withPartners)';
}

View File

@@ -55,8 +55,6 @@ enum SettingsKey<T> {
// Map
mapShowFavoriteOnly<bool>(),
mapRelativeDate<int>(),
mapCustomFrom<DateTime?>(),
mapCustomTo<DateTime?>(),
mapIncludeArchived<bool>(),
mapThemeMode<ThemeMode>(codec: EnumCodec(ThemeMode.values)),
mapWithPartners<bool>(),

View File

@@ -1,15 +0,0 @@
import 'package:immich_mobile/utils/option.dart';
class TimeRange {
final DateTime? from;
final DateTime? to;
const TimeRange({this.from, this.to});
TimeRange copyWith({Option<DateTime>? from, Option<DateTime>? to}) {
return TimeRange(from: from.patch(this.from), to: to.patch(this.to));
}
TimeRange clearFrom() => TimeRange(to: to);
TimeRange clearTo() => TimeRange(from: from);
}

View File

@@ -6,10 +6,7 @@ import 'package:background_downloader/background_downloader.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/constants.dart';
import 'package:immich_mobile/domain/services/hash.service.dart';
import 'package:immich_mobile/domain/services/local_sync.service.dart';
import 'package:immich_mobile/domain/services/log.service.dart';
import 'package:immich_mobile/domain/services/sync_stream.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
@@ -17,16 +14,11 @@ import 'package:immich_mobile/infrastructure/repositories/logger_db.repository.d
import 'package:immich_mobile/infrastructure/repositories/settings.repository.dart';
import 'package:immich_mobile/platform/background_worker_api.g.dart';
import 'package:immich_mobile/platform/background_worker_lock_api.g.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/infrastructure/sync.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart' show nativeSyncApiProvider;
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/repositories/asset_media.repository.dart';
import 'package:immich_mobile/repositories/permission.repository.dart';
import 'package:immich_mobile/services/auth.service.dart';
import 'package:immich_mobile/services/foreground_upload.service.dart';
import 'package:immich_mobile/services/localization.service.dart';
@@ -66,43 +58,12 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
final BackgroundWorkerBgHostApi _backgroundHostApi;
final _cancellationToken = Completer<void>();
final Logger _logger = Logger('BackgroundWorkerBgService');
late LocalSyncService _localSyncService;
late SyncStreamService _remoteSyncService;
late HashService _hashService;
bool _isCleanedUp = false;
BackgroundWorkerBgService({required this._drift, required this._driftLogger})
: _backgroundHostApi = BackgroundWorkerBgHostApi() {
final ref = ProviderContainer(overrides: [driftProvider.overrideWith(driftOverride(_drift))]);
_ref = ref;
_localSyncService = LocalSyncService(
localAlbumRepository: ref.read(localAlbumRepository),
localAssetRepository: ref.read(localAssetRepository),
nativeSyncApi: ref.read(nativeSyncApiProvider),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
assetMediaRepository: ref.read(assetMediaRepositoryProvider),
permissionRepository: ref.read(permissionRepositoryProvider),
cancellation: _cancellationToken,
);
_remoteSyncService = SyncStreamService(
syncApiRepository: ref.read(syncApiRepositoryProvider),
syncStreamRepository: ref.read(syncStreamRepositoryProvider),
localAssetRepository: ref.read(localAssetRepository),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
assetMediaRepository: ref.read(assetMediaRepositoryProvider),
permissionRepository: ref.read(permissionRepositoryProvider),
syncMigrationRepository: ref.read(syncMigrationRepositoryProvider),
api: ref.read(apiServiceProvider),
cancellation: _cancellationToken,
);
_hashService = HashService(
localAlbumRepository: ref.read(localAlbumRepository),
localAssetRepository: ref.read(localAssetRepository),
nativeSyncApi: ref.read(nativeSyncApiProvider),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
cancellation: _cancellationToken,
);
_ref = ProviderContainer(overrides: [driftProvider.overrideWith(driftOverride(_drift))]);
BackgroundWorkerFlutterApi.setUp(this);
}
@@ -158,6 +119,11 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
try {
final budget = maxSeconds != null ? Duration(seconds: maxSeconds - 1) : null;
final sync = _ref?.read(backgroundSyncProvider);
if (sync == null) {
return;
}
// Only for Background Processing tasks
if (maxSeconds == null) {
await _optimizeDB();
@@ -169,23 +135,9 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
// hash and handle_backup read drift state and tolerate stale reads
// (server-side dedup catches the rare race). The single budget caps the
// whole batch; no phase needs its own timeout.
final all = Future.wait<dynamic>([
_localSyncService.sync(),
_remoteSyncService.sync(),
_hashService.hashAssets(),
_handleBackup(),
]);
final all = Future.wait<dynamic>([sync.syncLocal(), sync.syncRemote(), sync.hashAssets(), _handleBackup()]);
if (budget != null) {
await all.timeout(
budget,
onTimeout: () {
if (!_cancellationToken.isCompleted) {
_logger.warning("iOS background upload timed out after ${budget.inSeconds}s, cancelling tasks");
_cancellationToken.complete();
}
return <dynamic>[];
},
);
await all.timeout(budget, onTimeout: () => <dynamic>[]);
} else {
await all;
}
@@ -269,6 +221,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
try {
_isCleanedUp = true;
final backgroundSyncManager = _ref?.read(backgroundSyncProvider);
final nativeSyncApi = _ref?.read(nativeSyncApiProvider);
_logger.info("Cleaning up background worker");
@@ -277,7 +230,10 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
}
// Workers share one sqlite connection, so DB teardown must wait until every worker has stopped using it.
await Future.wait([if (nativeSyncApi != null) nativeSyncApi.cancelHashing()]);
await Future.wait([
if (backgroundSyncManager != null) backgroundSyncManager.cancel(),
if (nativeSyncApi != null) nativeSyncApi.cancelHashing(),
]);
await workerManagerPatch.dispose().catchError((_) async {});
await Future.wait([LogService.I.dispose(), Store.dispose()]);
await _drift.close();
@@ -323,18 +279,18 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
}
Future<bool> _syncAssets({Duration? hashTimeout}) async {
await _localSyncService.sync();
await _ref?.read(backgroundSyncProvider).syncLocal();
if (_isCleanedUp) {
return false;
}
final isSuccess = await _remoteSyncService.sync();
final isSuccess = await _ref?.read(backgroundSyncProvider).syncRemote() ?? false;
if (_isCleanedUp) {
return isSuccess;
}
var hashFuture = _hashService.hashAssets();
if (hashTimeout != null) {
var hashFuture = _ref?.read(backgroundSyncProvider).hashAssets();
if (hashTimeout != null && hashFuture != null) {
hashFuture = hashFuture.timeout(
hashTimeout,
onTimeout: () {

View File

@@ -27,18 +27,7 @@ class DriftMapRepository extends DriftDatabaseRepository {
condition = condition & _db.remoteAssetEntity.isFavorite.equals(true);
}
final timeRange = options.timeRange;
final hasCustomRange = timeRange.from != null || timeRange.to != null;
if (hasCustomRange) {
if (timeRange.from != null) {
condition = condition & _db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(timeRange.from!);
}
if (timeRange.to != null) {
condition = condition & _db.remoteAssetEntity.createdAt.isSmallerOrEqualValue(timeRange.to!);
}
} else if (options.relativeDays > 0) {
if (options.relativeDays != 0) {
final cutoffDate = DateTime.now().toUtc().subtract(Duration(days: options.relativeDays));
condition = condition & _db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(cutoffDate);
}

View File

@@ -10,7 +10,6 @@ import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart';
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/stack.entity.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/utils/option.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
class RemoteAssetRepository extends DriftDatabaseRepository {
@@ -293,20 +292,4 @@ class RemoteAssetRepository extends DriftDatabaseRepository {
..orderBy([(row) => OrderingTerm.asc(row.sequence)]);
return query.map((row) => row.toDto()!).get();
}
Future<void> update(
List<String> remoteIds, {
Option<bool> isFavorite = const .none(),
Option<AssetVisibility> visibility = const .none(),
}) {
final companion = RemoteAssetEntityCompanion(
visibility: visibility.toDriftValue(),
isFavorite: isFavorite.toDriftValue(),
);
return _db.batch((batch) {
for (final remoteId in remoteIds) {
batch.update(_db.remoteAssetEntity, companion, where: (e) => e.id.equals(remoteId));
}
});
}
}

View File

@@ -4,7 +4,6 @@ import 'package:drift/drift.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/time_range.model.dart';
import 'package:immich_mobile/domain/models/timeline.model.dart';
import 'package:immich_mobile/domain/services/timeline.service.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
@@ -21,7 +20,6 @@ class TimelineMapOptions {
final bool includeArchived;
final bool withPartners;
final int relativeDays;
final TimeRange timeRange;
const TimelineMapOptions({
required this.bounds,
@@ -29,7 +27,6 @@ class TimelineMapOptions {
this.includeArchived = false,
this.withPartners = false,
this.relativeDays = 0,
this.timeRange = const TimeRange(),
});
}
@@ -555,21 +552,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
query.where(_db.remoteAssetEntity.isFavorite.equals(true));
}
final timeRange = options.timeRange;
final hasCustomRange = timeRange.from != null || timeRange.to != null;
if (hasCustomRange) {
if (timeRange.from != null) {
query.where(_db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(timeRange.from!));
}
if (timeRange.to != null) {
query.where(_db.remoteAssetEntity.createdAt.isSmallerOrEqualValue(timeRange.to!));
}
} else if (options.relativeDays > 0) {
if (options.relativeDays != 0) {
final cutoffDate = DateTime.now().toUtc().subtract(Duration(days: options.relativeDays));
query.where(_db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(cutoffDate));
}
@@ -610,21 +594,8 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
query.where(_db.remoteAssetEntity.isFavorite.equals(true));
}
final timeRange = options.timeRange;
final hasCustomRange = timeRange.from != null || timeRange.to != null;
if (hasCustomRange) {
if (timeRange.from != null) {
query.where(_db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(timeRange.from!));
}
if (timeRange.to != null) {
query.where(_db.remoteAssetEntity.createdAt.isSmallerOrEqualValue(timeRange.to!));
}
} else if (options.relativeDays > 0) {
if (options.relativeDays != 0) {
final cutoffDate = DateTime.now().toUtc().subtract(Duration(days: options.relativeDays));
query.where(_db.remoteAssetEntity.createdAt.isBiggerOrEqualValue(cutoffDate));
}

View File

@@ -1,6 +1,6 @@
import 'dart:convert';
enum CastDestinationType { googleCast, fCast }
enum CastDestinationType { googleCast }
enum CastState { idle, playing, paused, buffering }

View File

@@ -1,13 +1,11 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/events.model.dart';
import 'package:immich_mobile/domain/models/time_range.model.dart';
import 'package:immich_mobile/domain/utils/event_stream.dart';
import 'package:immich_mobile/infrastructure/repositories/timeline.repository.dart';
import 'package:immich_mobile/providers/infrastructure/map.provider.dart';
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
import 'package:immich_mobile/providers/map/map_state.provider.dart';
import 'package:immich_mobile/utils/option.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
class MapState {
@@ -17,7 +15,6 @@ class MapState {
final bool includeArchived;
final bool withPartners;
final int relativeDays;
final TimeRange timeRange;
const MapState({
this.themeMode = ThemeMode.system,
@@ -26,7 +23,6 @@ class MapState {
this.includeArchived = false,
this.withPartners = false,
this.relativeDays = 0,
this.timeRange = const TimeRange(),
});
@override
@@ -44,7 +40,6 @@ class MapState {
bool? includeArchived,
bool? withPartners,
int? relativeDays,
TimeRange? timeRange,
}) {
return MapState(
bounds: bounds ?? this.bounds,
@@ -53,7 +48,6 @@ class MapState {
includeArchived: includeArchived ?? this.includeArchived,
withPartners: withPartners ?? this.withPartners,
relativeDays: relativeDays ?? this.relativeDays,
timeRange: timeRange ?? this.timeRange,
);
}
@@ -63,7 +57,6 @@ class MapState {
includeArchived: includeArchived,
withPartners: withPartners,
relativeDays: relativeDays,
timeRange: timeRange,
);
}
@@ -110,24 +103,6 @@ class MapStateNotifier extends Notifier<MapState> {
EventStream.shared.emit(const MapMarkerReloadEvent());
}
void setCustomTimeRange(TimeRange range) {
ref.read(settingsProvider).write(.mapCustomFrom, range.from);
ref.read(settingsProvider).write(.mapCustomTo, range.to);
state = state.copyWith(timeRange: range);
EventStream.shared.emit(const MapMarkerReloadEvent());
}
Option<DateTime> parseDateOption(String s) {
try {
if (s.trim().isEmpty) {
return const Option.none();
}
return Option.some(DateTime.parse(s));
} catch (_) {
return const Option.none();
}
}
@override
MapState build() {
final mapConfig = ref.read(appConfigProvider.select((config) => config.map));
@@ -138,7 +113,6 @@ class MapStateNotifier extends Notifier<MapState> {
withPartners: mapConfig.withPartners,
relativeDays: mapConfig.relativeDays,
bounds: LatLngBounds(northeast: const LatLng(0, 0), southwest: const LatLng(0, 0)),
timeRange: TimeRange(from: mapConfig.customFrom, to: mapConfig.customTo),
);
}
}

View File

@@ -1,39 +1,21 @@
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/time_range.model.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/widgets/map/map.state.dart';
import 'package:immich_mobile/widgets/map/map_settings/map_custom_time_range.dart';
import 'package:immich_mobile/widgets/map/map_settings/map_settings_list_tile.dart';
import 'package:immich_mobile/widgets/map/map_settings/map_settings_time_dropdown.dart';
import 'package:immich_mobile/widgets/map/map_settings/map_theme_picker.dart';
class DriftMapSettingsSheet extends ConsumerStatefulWidget {
class DriftMapSettingsSheet extends HookConsumerWidget {
const DriftMapSettingsSheet({super.key});
@override
ConsumerState<DriftMapSettingsSheet> createState() => _DriftMapSettingsSheetState();
}
class _DriftMapSettingsSheetState extends ConsumerState<DriftMapSettingsSheet> {
late bool useCustomRange;
@override
void initState() {
super.initState();
final mapState = ref.read(mapStateProvider);
final timeRange = mapState.timeRange;
useCustomRange = timeRange.from != null || timeRange.to != null;
}
@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
final mapState = ref.watch(mapStateProvider);
return DraggableScrollableSheet(
expand: false,
initialChildSize: useCustomRange ? 0.7 : 0.6,
initialChildSize: 0.6,
builder: (ctx, scrollController) => SingleChildScrollView(
controller: scrollController,
child: Card(
@@ -65,41 +47,10 @@ class _DriftMapSettingsSheetState extends ConsumerState<DriftMapSettingsSheet> {
selected: mapState.withPartners,
onChanged: (withPartners) => ref.read(mapStateProvider.notifier).switchWithPartners(withPartners),
),
if (useCustomRange) ...[
MapTimeRange(
timeRange: mapState.timeRange,
onChanged: (range) {
ref.read(mapStateProvider.notifier).setCustomTimeRange(range);
},
),
Align(
alignment: Alignment.centerLeft,
child: TextButton(
onPressed: () => setState(() {
useCustomRange = false;
ref.read(mapStateProvider.notifier).setRelativeTime(0);
ref.read(mapStateProvider.notifier).setCustomTimeRange(const TimeRange());
}),
child: Text(context.t.remove_custom_date_range),
),
),
] else ...[
MapTimeDropDown(
relativeTime: mapState.relativeDays,
onTimeChange: (time) => ref.read(mapStateProvider.notifier).setRelativeTime(time),
),
Align(
alignment: Alignment.centerLeft,
child: TextButton(
onPressed: () => setState(() {
useCustomRange = true;
ref.read(mapStateProvider.notifier).setRelativeTime(0);
ref.read(mapStateProvider.notifier).setCustomTimeRange(const TimeRange());
}),
child: Text(context.t.use_custom_date_range),
),
),
],
MapTimeDropDown(
relativeTime: mapState.relativeDays,
onTimeChange: (time) => ref.read(mapStateProvider.notifier).setRelativeTime(time),
),
const SizedBox(height: 20),
],
),

View File

@@ -65,7 +65,6 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonBirthdayEdi
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16.0)),
child: ScrollDatePicker(
viewType: datePickerColumnOrder(DateFormat.yMd(context.locale.toLanguageTag()).pattern),
options: DatePickerOptions(
backgroundColor: context.colorScheme.surfaceContainerHigh,
itemExtent: 50,
@@ -119,18 +118,3 @@ class _DriftPersonNameEditFormState extends ConsumerState<DriftPersonBirthdayEdi
);
}
}
List<DatePickerViewType>? datePickerColumnOrder(String? pattern) {
if (pattern == null) {
return null;
}
final positions = {
DatePickerViewType.year: pattern.indexOf('y'),
DatePickerViewType.month: pattern.indexOf('M'),
DatePickerViewType.day: pattern.indexOf('d'),
};
if (positions.values.any((position) => position < 0)) {
return null;
}
return positions.keys.toList()..sort((a, b) => positions[a]!.compareTo(positions[b]!));
}

View File

@@ -1,17 +1,19 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
import 'package:immich_mobile/services/cast.service.dart';
import 'package:immich_mobile/services/gcast.service.dart';
final castProvider = StateNotifierProvider<CastNotifier, CastManagerState>(
(ref) => CastNotifier(ref.watch(castServiceProvider)),
(ref) => CastNotifier(ref.watch(gCastServiceProvider)),
);
class CastNotifier extends StateNotifier<CastManagerState> {
// more cast providers can be added here (ie Fcast)
final CastService _castService;
final GCastService _gCastService;
CastNotifier(this._castService)
List<(String, CastDestinationType, dynamic)> discovered = List.empty();
CastNotifier(this._gCastService)
: super(
const CastManagerState(
isCasting: false,
@@ -21,11 +23,11 @@ class CastNotifier extends StateNotifier<CastManagerState> {
castState: CastState.idle,
),
) {
_castService.onConnectionState = _onConnectionState;
_castService.onCurrentTime = _onCurrentTime;
_castService.onDuration = _onDuration;
_castService.onReceiverName = _onReceiverName;
_castService.onCastState = _onCastState;
_gCastService.onConnectionState = _onConnectionState;
_gCastService.onCurrentTime = _onCurrentTime;
_gCastService.onDuration = _onDuration;
_gCastService.onReceiverName = _onReceiverName;
_gCastService.onCastState = _onCastState;
}
void _onConnectionState(bool isCasting) {
@@ -49,15 +51,23 @@ class CastNotifier extends StateNotifier<CastManagerState> {
}
void loadMedia(RemoteAsset asset, bool reload) {
_castService.loadMedia(asset, reload);
_gCastService.loadMedia(asset, reload);
}
Future<void> connect(dynamic device) async {
await _castService.connect(device);
Future<void> connect(CastDestinationType type, dynamic device) async {
switch (type) {
case CastDestinationType.googleCast:
await _gCastService.connect(device);
break;
}
}
Future<List<(String, CastDestinationType, dynamic)>> getDevices() {
return _castService.getDevices();
Future<List<(String, CastDestinationType, dynamic)>> getDevices() async {
if (discovered.isEmpty) {
discovered = await _gCastService.getDevices();
}
return discovered;
}
void toggle() {
@@ -71,22 +81,22 @@ class CastNotifier extends StateNotifier<CastManagerState> {
}
void play() {
_castService.play();
_gCastService.play();
}
void pause() {
_castService.pause();
_gCastService.pause();
}
void seekTo(Duration position) {
_castService.seekTo(position);
_gCastService.seekTo(position);
}
void stop() {
_castService.stop();
_gCastService.stop();
}
Future<void> disconnect() async {
await _castService.disconnect();
await _gCastService.disconnect();
}
}

View File

@@ -1,4 +0,0 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/repositories/toast.repository.dart';
final toastRepositoryProvider = Provider<ToastRepository>((ref) => const .new());

View File

@@ -1,14 +1,12 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:http/http.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/domain/models/asset_edit.model.dart' hide AssetEditAction;
import 'package:immich_mobile/domain/models/stack.model.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/repositories/api.repository.dart';
import 'package:immich_mobile/utils/option.dart';
import 'package:maplibre_gl/maplibre_gl.dart';
import 'package:openapi/api.dart' as api show AssetVisibility;
import 'package:openapi/api.dart' hide AssetVisibility;
import 'package:openapi/api.dart';
final assetApiRepositoryProvider = Provider(
(ref) => AssetApiRepository(
@@ -43,7 +41,7 @@ class AssetApiRepository extends ApiRepository {
return response?.count ?? 0;
}
Future<void> updateVisibility(List<String> ids, AssetVisibility visibility) async {
Future<void> updateVisibility(List<String> ids, AssetVisibilityEnum visibility) async {
return _api.updateAssets(AssetBulkUpdateDto(ids: ids, visibility: Optional.present(_mapVisibility(visibility))));
}
@@ -79,11 +77,11 @@ class AssetApiRepository extends ApiRepository {
return _api.downloadAssetWithHttpInfo(id, edited: edited);
}
api.AssetVisibility _mapVisibility(AssetVisibility visibility) => switch (visibility) {
AssetVisibility.timeline => api.AssetVisibility.timeline,
AssetVisibility.hidden => api.AssetVisibility.hidden,
AssetVisibility.locked => api.AssetVisibility.locked,
AssetVisibility.archive => api.AssetVisibility.archive,
_mapVisibility(AssetVisibilityEnum visibility) => switch (visibility) {
AssetVisibilityEnum.timeline => AssetVisibility.timeline,
AssetVisibilityEnum.hidden => AssetVisibility.hidden,
AssetVisibilityEnum.locked => AssetVisibility.locked,
AssetVisibilityEnum.archive => AssetVisibility.archive,
};
Future<String?> getAssetMIMEType(String assetId) async {
@@ -108,20 +106,6 @@ class AssetApiRepository extends ApiRepository {
Future<void> removeEdits(String assetId) async {
return _api.removeAssetEdits(assetId);
}
Future<void> update(
List<String> remoteIds, {
Option<bool> isFavorite = const .none(),
Option<AssetVisibility> visibility = const .none(),
}) {
return _api.updateAssets(
AssetBulkUpdateDto(
ids: remoteIds,
isFavorite: isFavorite.toOptional(),
visibility: visibility.map(_mapVisibility).toOptional(),
),
);
}
}
extension on StackResponseDto {

View File

@@ -1,99 +0,0 @@
import 'dart:async';
import 'package:fcast_sender_sdk/fcast_sender_sdk.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
final castRepositoryProvider = Provider((_) => CastRepository());
class CastRepository {
CastContext? _castContext;
CastingDevice? _device;
void Function(DeviceConnectionState)? onConnectionState;
void Function(DeviceEvent)? onDeviceEvent;
final Map<(String, ProtocolType), (DeviceInfo, int?)> _discoveredDevices = {};
int _currentDeviceGeneration = 0;
Future<void>? _initialized;
Future<void> connect(DeviceInfo deviceInfo) async {
await _ensureInitialized();
_device?.disconnect();
final device = _castContext!.createDeviceFromInfo(info: deviceInfo);
_device = device;
final thisDeviceGeneration = ++_currentDeviceGeneration;
device.connect(
eventHandler: DeviceEventHandler(
onEvent: (event) {
if (thisDeviceGeneration != _currentDeviceGeneration) {
return;
}
if (event is DeviceEvent_ConnectionStateChanged) {
onConnectionState?.call(event.newState);
}
onDeviceEvent?.call(event);
},
),
reconnectIntervalMillis: 1000,
);
}
Future<void> disconnect() async {
final device = _device;
if (device == null) {
return;
}
_device = null;
_currentDeviceGeneration++;
if (device.isReady()) {
device.stopPlayback();
await Future.delayed(const Duration(milliseconds: 500));
}
device.disconnect();
onConnectionState?.call(const DeviceConnectionState.disconnected());
}
void loadMedia(LoadRequest request) => _device?.load(request: request);
void play() => _device?.resumePlayback();
void pause() => _device?.pausePlayback();
void stop() => _device?.stopPlayback();
void seekTo(Duration position) => _device?.seek(timeSeconds: position.inMilliseconds / 1000);
Future<List<(DeviceInfo, int?)>> listDestinations() async {
final isFirstScan = _initialized == null;
await _ensureInitialized();
if (isFirstScan) {
await Future.delayed(const Duration(seconds: 3));
}
return _discoveredDevices.values.toList(growable: false);
}
Future<void> _ensureInitialized() => _initialized ??= _initialize();
Future<void> _initialize() async {
await FCastSenderSdkLib.init();
_castContext = CastContext();
final discoverer = DeviceDiscoverer();
discoverer.eventStreamController.stream.listen((event) {
switch (event) {
case DiscoveryEventDeviceAdded(:final deviceInfo, :final gcastCaps) ||
DiscoveryEventDeviceUpdated(:final deviceInfo, :final gcastCaps):
_discoveredDevices[(deviceInfo.name, deviceInfo.protocol)] = (deviceInfo, gcastCaps);
case DiscoveryEventDeviceRemoved():
_discoveredDevices.removeWhere((key, _) => key.$1 == event.name);
}
});
await discoverer.init();
}
}

View File

@@ -0,0 +1,68 @@
import 'package:cast/device.dart';
import 'package:cast/session.dart';
import 'package:cast/session_manager.dart';
import 'package:cast/discovery_service.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
final gCastRepositoryProvider = Provider((_) {
return GCastRepository();
});
class GCastRepository {
CastSession? _castSession;
void Function(CastSessionState)? onCastStatus;
void Function(Map<String, dynamic>)? onCastMessage;
Map<String, dynamic>? _receiverStatus;
GCastRepository();
Future<void> connect(CastDevice device) async {
_castSession = await CastSessionManager().startSession(device);
_castSession?.stateStream.listen((state) {
onCastStatus?.call(state);
});
_castSession?.messageStream.listen((message) {
onCastMessage?.call(message);
if (message['type'] == 'RECEIVER_STATUS') {
_receiverStatus = message;
}
});
// open the default receiver
sendMessage(CastSession.kNamespaceReceiver, {'type': 'LAUNCH', 'appId': 'CC1AD845'});
}
Future<void> disconnect() async {
final sessionID = getSessionId();
sendMessage(CastSession.kNamespaceReceiver, {'type': "STOP", "sessionId": sessionID});
// wait 500ms to ensure the stop command is processed
await Future.delayed(const Duration(milliseconds: 500));
await _castSession?.close();
}
String? getSessionId() {
if (_receiverStatus == null) {
return null;
}
return _receiverStatus!['status']['applications'][0]['sessionId'];
}
void sendMessage(String namespace, Map<String, dynamic> message) {
if (_castSession == null) {
throw Exception("Cast session is not established");
}
_castSession!.sendMessage(namespace, message);
}
Future<List<CastDevice>> listDestinations() async {
return await CastDiscoveryService().search(timeout: const Duration(seconds: 3));
}
}

View File

@@ -1,26 +0,0 @@
import 'dart:async';
import 'package:immich_ui/immich_ui.dart';
class ToastOption {
final Duration? timeout;
final FutureOr<void> Function()? onUndo;
const ToastOption({this.timeout, this.onUndo});
}
class ToastRepository {
const ToastRepository();
FutureOr<void> success(String message, {ToastOption? toast}) {
snackbar.success(message, duration: toast?.timeout);
}
FutureOr<void> info(String message, {ToastOption? toast}) {
snackbar.info(message, duration: toast?.timeout);
}
FutureOr<void> error(String message, {ToastOption? toast}) {
snackbar.error(message, duration: toast?.timeout);
}
}

View File

@@ -79,17 +79,17 @@ class ActionService {
}
Future<void> archive(List<String> remoteIds) async {
await _assetApiRepository.updateVisibility(remoteIds, .archive);
await _assetApiRepository.updateVisibility(remoteIds, AssetVisibilityEnum.archive);
await _remoteAssetRepository.updateVisibility(remoteIds, AssetVisibility.archive);
}
Future<void> unArchive(List<String> remoteIds) async {
await _assetApiRepository.updateVisibility(remoteIds, .timeline);
await _assetApiRepository.updateVisibility(remoteIds, AssetVisibilityEnum.timeline);
await _remoteAssetRepository.updateVisibility(remoteIds, AssetVisibility.timeline);
}
Future<void> moveToLockFolder(List<String> remoteIds, List<String> localIds) async {
await _assetApiRepository.updateVisibility(remoteIds, .locked);
await _assetApiRepository.updateVisibility(remoteIds, AssetVisibilityEnum.locked);
await _remoteAssetRepository.updateVisibility(remoteIds, AssetVisibility.locked);
// Ask user if they want to delete local copies
@@ -99,7 +99,7 @@ class ActionService {
}
Future<void> removeFromLockFolder(List<String> remoteIds) async {
await _assetApiRepository.updateVisibility(remoteIds, .timeline);
await _assetApiRepository.updateVisibility(remoteIds, AssetVisibilityEnum.timeline);
await _remoteAssetRepository.updateVisibility(remoteIds, AssetVisibility.timeline);
}

View File

@@ -96,12 +96,12 @@ class ApiService {
/// port - optional (default: based on schema)
/// path - optional
Future<String> resolveEndpoint(String serverUrl) async {
String url = normalizeServerUrl(serverUrl);
String url = sanitizeUrl(serverUrl);
// Check for /.well-known/immich
final wellKnownEndpoint = await _getWellKnownEndpoint(url);
if (wellKnownEndpoint.isNotEmpty) {
url = normalizeServerUrl(wellKnownEndpoint);
url = sanitizeUrl(wellKnownEndpoint);
}
if (!await _isEndpointAvailable(url)) {

View File

@@ -1,205 +0,0 @@
import 'package:fcast_sender_sdk/fcast_sender_sdk.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
import 'package:immich_mobile/models/sessions/session_create_response.model.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart';
import 'package:immich_mobile/repositories/cast.repository.dart';
import 'package:immich_mobile/repositories/sessions_api.repository.dart';
import 'package:immich_mobile/utils/image_url_builder.dart';
// ignore: import_rule_openapi, we are only using the AssetMediaSize enum
import 'package:openapi/api.dart';
final castServiceProvider = Provider(
(ref) => CastService(
ref.watch(castRepositoryProvider),
ref.watch(sessionsAPIRepositoryProvider),
ref.watch(assetApiRepositoryProvider),
),
);
class CastService {
final CastRepository _castRepository;
final SessionsAPIRepository _sessionsApiService;
final AssetApiRepository _assetApiRepository;
SessionCreateResponse? sessionKey;
String? currentAssetId;
bool isConnected = false;
void Function(bool)? onConnectionState;
void Function(Duration)? onCurrentTime;
void Function(Duration)? onDuration;
void Function(String)? onReceiverName;
void Function(CastState)? onCastState;
CastService(this._castRepository, this._sessionsApiService, this._assetApiRepository) {
_castRepository.onConnectionState = _onCastStatusCallback;
_castRepository.onDeviceEvent = _onDeviceEventCallback;
}
void _onCastStatusCallback(DeviceConnectionState state) {
if (state is DeviceConnectionState_Connected) {
onConnectionState?.call(true);
isConnected = true;
} else if (state is DeviceConnectionState_Disconnected) {
onConnectionState?.call(false);
isConnected = false;
onReceiverName?.call("");
currentAssetId = null;
}
}
void _onDeviceEventCallback(DeviceEvent event) {
switch (event) {
case DeviceEvent_PlaybackStateChanged():
_handlePlaybackState(event.newPlaybackState);
break;
case DeviceEvent_TimeChanged():
onCurrentTime?.call(Duration(milliseconds: (event.newTime * 1000).toInt()));
break;
case DeviceEvent_DurationChanged():
onDuration?.call(Duration(milliseconds: (event.newDuration * 1000).toInt()));
break;
default:
break;
}
}
void _handlePlaybackState(PlaybackState state) {
switch (state) {
case PlaybackState.playing:
onCastState?.call(CastState.playing);
break;
case PlaybackState.paused:
onCastState?.call(CastState.paused);
break;
case PlaybackState.buffering:
onCastState?.call(CastState.buffering);
break;
case PlaybackState.idle:
onCastState?.call(CastState.idle);
break;
}
}
Future<void> connect(dynamic device) async {
await _castRepository.connect(device);
onReceiverName?.call(device.name);
}
Future<void> disconnect() async {
onReceiverName?.call("");
currentAssetId = null;
await _castRepository.disconnect();
}
bool isSessionValid() {
// check if we already have a session token
// we should always have a expiration date
if (sessionKey == null || sessionKey?.expiresAt == null) {
return false;
}
final tokenExpiration = DateTime.parse(sessionKey!.expiresAt!);
// we want to make sure we have at least 10 seconds remaining in the session
// this is to account for network latency and other delays when sending the request
final bufferedExpiration = tokenExpiration.subtract(const Duration(seconds: 10));
return bufferedExpiration.isAfter(DateTime.now());
}
void loadMedia(RemoteAsset asset, bool reload) async {
if (!isConnected) {
return;
} else if (asset.id == currentAssetId && !reload) {
return;
}
// create a session key
if (!isSessionValid()) {
sessionKey = await _sessionsApiService.createSession(
"Cast",
"Cast",
duration: const Duration(minutes: 15).inSeconds,
);
}
final unauthenticatedUrl = asset.isVideo
? getPlaybackUrlForRemoteId(asset.id)
: getThumbnailUrlForRemoteId(asset.id, type: AssetMediaSize.fullsize);
final authenticatedURL = "$unauthenticatedUrl&sessionKey=${sessionKey?.token}";
// get image mime type
final mimeType = await _assetApiRepository.getAssetMIMEType(asset.id);
if (mimeType == null) {
return;
}
final request = asset.isVideo
? LoadRequest.video(contentType: mimeType, url: authenticatedURL, resumePosition: 0.0)
: LoadRequest.image(contentType: mimeType, url: authenticatedURL);
_castRepository.loadMedia(request);
currentAssetId = asset.id;
}
void play() {
_castRepository.play();
}
void pause() {
_castRepository.pause();
}
void seekTo(Duration position) {
_castRepository.seekTo(position);
}
void stop() {
_castRepository.stop();
currentAssetId = null;
}
// 0x01 is display capability bitmask
bool isDisplay(int ca) => (ca & 0x01) != 0;
Future<List<(String, CastDestinationType, dynamic)>> getDevices() async {
final dests = await _castRepository.listDestinations();
final fCastNames = dests
.where((dest) => dest.$1.protocol == ProtocolType.fCast)
.map((dest) => dest.$1.name)
.toSet();
return dests
.where((dest) {
final (device, gcastCaps) = dest;
if (device.protocol == ProtocolType.fCast) {
return true;
}
return isDisplay(gcastCaps ?? 0) && !fCastNames.contains(device.name);
})
.map((dest) {
final device = dest.$1;
final type = device.protocol == ProtocolType.fCast
? CastDestinationType.fCast
: CastDestinationType.googleCast;
return (device.name, type, device as dynamic);
})
.toList(growable: false);
}
}

View File

@@ -0,0 +1,250 @@
import 'dart:async';
import 'package:cast/session.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
import 'package:immich_mobile/models/sessions/session_create_response.model.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart';
import 'package:immich_mobile/repositories/gcast.repository.dart';
import 'package:immich_mobile/repositories/sessions_api.repository.dart';
import 'package:immich_mobile/utils/image_url_builder.dart';
// ignore: import_rule_openapi, we are only using the AssetMediaSize enum
import 'package:openapi/api.dart';
final gCastServiceProvider = Provider(
(ref) => GCastService(
ref.watch(gCastRepositoryProvider),
ref.watch(sessionsAPIRepositoryProvider),
ref.watch(assetApiRepositoryProvider),
),
);
class GCastService {
final GCastRepository _gCastRepository;
final SessionsAPIRepository _sessionsApiService;
final AssetApiRepository _assetApiRepository;
SessionCreateResponse? sessionKey;
String? currentAssetId;
bool isConnected = false;
int? _sessionId;
Timer? _mediaStatusPollingTimer;
void Function(bool)? onConnectionState;
void Function(Duration)? onCurrentTime;
void Function(Duration)? onDuration;
void Function(String)? onReceiverName;
void Function(CastState)? onCastState;
GCastService(this._gCastRepository, this._sessionsApiService, this._assetApiRepository) {
_gCastRepository.onCastStatus = _onCastStatusCallback;
_gCastRepository.onCastMessage = _onCastMessageCallback;
}
void _onCastStatusCallback(CastSessionState state) {
if (state == CastSessionState.connected) {
onConnectionState?.call(true);
isConnected = true;
} else if (state == CastSessionState.closed) {
onConnectionState?.call(false);
isConnected = false;
onReceiverName?.call("");
currentAssetId = null;
}
}
void _onCastMessageCallback(Map<String, dynamic> message) {
switch (message['type']) {
case "MEDIA_STATUS":
_handleMediaStatus(message);
break;
}
}
void _handleMediaStatus(Map<String, dynamic> message) {
final statusList = (message['status'] as List).whereType<Map<String, dynamic>>().toList();
if (statusList.isEmpty) {
return;
}
final status = statusList[0];
switch (status['playerState']) {
case "PLAYING":
onCastState?.call(CastState.playing);
break;
case "PAUSED":
onCastState?.call(CastState.paused);
break;
case "BUFFERING":
onCastState?.call(CastState.buffering);
break;
case "IDLE":
onCastState?.call(CastState.idle);
// stop polling for media status if the video finished playing
if (status["idleReason"] == "FINISHED") {
_mediaStatusPollingTimer?.cancel();
}
break;
}
if (status["media"] != null && status["media"]["duration"] != null) {
final duration = Duration(milliseconds: (status["media"]["duration"] * 1000 ?? 0).toInt());
onDuration?.call(duration);
}
if (status["mediaSessionId"] != null) {
_sessionId = status["mediaSessionId"];
}
if (status["currentTime"] != null) {
final currentTime = Duration(milliseconds: (status["currentTime"] * 1000 ?? 0).toInt());
onCurrentTime?.call(currentTime);
}
}
Future<void> connect(dynamic device) async {
await _gCastRepository.connect(device);
onReceiverName?.call(device.extras["fn"] ?? "Google Cast");
}
CastDestinationType getType() {
return CastDestinationType.googleCast;
}
Future<bool> initialize() async {
// there is nothing blocking us from using Google Cast that we can check for
return true;
}
Future<void> disconnect() async {
onReceiverName?.call("");
currentAssetId = null;
await _gCastRepository.disconnect();
}
bool isSessionValid() {
// check if we already have a session token
// we should always have a expiration date
if (sessionKey == null || sessionKey?.expiresAt == null) {
return false;
}
final tokenExpiration = DateTime.parse(sessionKey!.expiresAt!);
// we want to make sure we have at least 10 seconds remaining in the session
// this is to account for network latency and other delays when sending the request
final bufferedExpiration = tokenExpiration.subtract(const Duration(seconds: 10));
return bufferedExpiration.isAfter(DateTime.now());
}
void loadMedia(RemoteAsset asset, bool reload) async {
if (!isConnected) {
return;
} else if (asset.id == currentAssetId && !reload) {
return;
}
// create a session key
if (!isSessionValid()) {
sessionKey = await _sessionsApiService.createSession(
"Cast",
"Google Cast",
duration: const Duration(minutes: 15).inSeconds,
);
}
final unauthenticatedUrl = asset.isVideo
? getPlaybackUrlForRemoteId(asset.id)
: getThumbnailUrlForRemoteId(asset.id, type: AssetMediaSize.fullsize);
final authenticatedURL = "$unauthenticatedUrl&sessionKey=${sessionKey?.token}";
// get image mime type
final mimeType = await _assetApiRepository.getAssetMIMEType(asset.id);
if (mimeType == null) {
return;
}
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {
"type": "LOAD",
"media": {
"contentId": authenticatedURL,
"streamType": "BUFFERED",
"contentType": mimeType,
"contentUrl": authenticatedURL,
},
"autoplay": true,
});
currentAssetId = asset.id;
// we need to poll for media status since the cast device does not
// send a message when the media is loaded for whatever reason
// only do this on videos
_mediaStatusPollingTimer?.cancel();
if (asset.isVideo) {
_mediaStatusPollingTimer = Timer.periodic(const Duration(milliseconds: 500), (timer) {
if (isConnected) {
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {
"type": "GET_STATUS",
"mediaSessionId": _sessionId,
});
} else {
timer.cancel();
}
});
}
}
void play() {
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {"type": "PLAY", "mediaSessionId": _sessionId});
}
void pause() {
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {"type": "PAUSE", "mediaSessionId": _sessionId});
}
void seekTo(Duration position) {
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {
"type": "SEEK",
"mediaSessionId": _sessionId,
"currentTime": position.inSeconds,
});
}
void stop() {
_gCastRepository.sendMessage(CastSession.kNamespaceMedia, {"type": "STOP", "mediaSessionId": _sessionId});
_mediaStatusPollingTimer?.cancel();
currentAssetId = null;
}
// 0x01 is display capability bitmask
bool isDisplay(int ca) => (ca & 0x01) != 0;
Future<List<(String, CastDestinationType, dynamic)>> getDevices() async {
final dests = await _gCastRepository.listDestinations();
return dests
.map((device) => (device.extras["fn"] ?? "Google Cast", CastDestinationType.googleCast, device))
.where((device) {
final caString = device.$3.extras["ca"];
final caNumber = int.tryParse(caString ?? "0") ?? 0;
return isDisplay(caNumber);
})
.toList(growable: false);
}
}

View File

@@ -1,4 +1,3 @@
import 'package:drift/drift.dart';
import 'package:openapi/api.dart' show Optional;
sealed class Option<T> {
@@ -22,27 +21,11 @@ sealed class Option<T> {
None() => null,
};
Option<U> map<U>(U Function(T value) f) => switch (this) {
Some(:final value) => Some(f(value)),
None() => None<U>(),
};
U fold<U>(U Function(T value) onSome, U Function() onNone) => switch (this) {
Some(:final value) => onSome(value),
None() => onNone(),
};
Option<U> flatMap<U>(Option<U> Function(T value) f) => switch (this) {
Some(:final value) => f(value),
None() => const Option.none(),
};
void ifPresent(void Function(T value) f) {
if (this case Some(:final value)) {
f(value);
}
}
@override
String toString() => switch (this) {
Some(:final value) => 'Some($value)',
@@ -82,10 +65,3 @@ extension OptionToOptional<T> on Option<T> {
Some(:final value) => Optional.present(value),
};
}
extension OptionToDriftValue<T> on Option<T> {
Value<T> toDriftValue() => switch (this) {
Some(:final value) => Value(value),
None() => const Value.absent(),
};
}

View File

@@ -2,31 +2,12 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:punycode/punycode.dart';
/// Normalizes a server URL, guaranteeing that it has a schema and no trailing slashes
String normalizeServerUrl(String url) {
final trimmedUrl = url.trim();
String sanitizeUrl(String url) {
// Add schema if none is set
final urlWithSchema = trimmedUrl.contains('://') ? trimmedUrl : "https://$trimmedUrl";
final urlWithSchema = url.trimLeft().startsWith(RegExp(r"https?://")) ? url : "https://$url";
// Remove trailing slash(es)
return urlWithSchema.replaceFirst(RegExp(r"/+$"), "");
}
/// Validates a user-entered server URL
bool _validateServerUrl(String url) {
final parsedUrl = Uri.tryParse(url);
return parsedUrl != null && parsedUrl.scheme.startsWith(RegExp(r'^https?$')) && parsedUrl.host.isNotEmpty;
}
/// Normalizes and validates that a server URL is supported
bool normalizeAndValidateServerUrl(String? url) {
if (url == null || url.isEmpty) {
return true;
}
final normalizedUrl = normalizeServerUrl(url);
return _validateServerUrl(normalizedUrl);
return urlWithSchema.trimRight().replaceFirst(RegExp(r"/+$"), "");
}
String? getServerUrl() {

View File

@@ -69,7 +69,7 @@ class CastDialog extends ConsumerWidget {
child: Text(item, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16)).tr(),
);
} else {
final (deviceName, _, deviceObj) = item as (String, CastDestinationType, dynamic);
final (deviceName, type, deviceObj) = item as (String, CastDestinationType, dynamic);
return ListTile(
title: Text(
@@ -77,7 +77,7 @@ class CastDialog extends ConsumerWidget {
style: TextStyle(color: isCurrentDevice(deviceName) ? context.colorScheme.primary : null),
),
leading: Icon(
isCurrentDevice(deviceName) ? Icons.cast_connected : Icons.cast,
type == CastDestinationType.googleCast ? Icons.cast : Icons.cast_connected,
color: isCurrentDevice(deviceName) ? context.colorScheme.primary : null,
),
trailing: isCurrentDevice(deviceName)
@@ -95,7 +95,7 @@ class CastDialog extends ConsumerWidget {
}
if (!isCurrentDevice(deviceName)) {
unawaited(ref.read(castProvider.notifier).connect(deviceObj));
unawaited(ref.read(castProvider.notifier).connect(type, deviceObj));
}
},
);

View File

@@ -43,7 +43,18 @@ class LoginForm extends HookConsumerWidget {
final log = Logger('LoginForm');
String? _validateUrl(String? url) => normalizeAndValidateServerUrl(url) ? null : 'login_form_err_invalid_url'.tr();
String? _validateUrl(String? url) {
if (url == null || url.isEmpty) {
return null;
}
final parsedUrl = Uri.tryParse(url);
if (parsedUrl == null || !parsedUrl.isAbsolute || !parsedUrl.scheme.startsWith("http") || parsedUrl.host.isEmpty) {
return 'login_form_err_invalid_url'.tr();
}
return null;
}
String? _validateEmail(String? email) {
if (email == null || email == '') {
@@ -90,7 +101,7 @@ class LoginForm extends HookConsumerWidget {
/// Fetch the server login credential and enables oAuth login if necessary
/// Returns true if successful, false otherwise
Future<void> getServerAuthSettings() async {
final sanitizeServerUrl = normalizeServerUrl(serverEndpointController.text);
final sanitizeServerUrl = sanitizeUrl(serverEndpointController.text);
final serverUrl = punycodeEncodeUrl(sanitizeServerUrl);
// Guard empty URL
@@ -293,7 +304,7 @@ class LoginForm extends HookConsumerWidget {
try {
oAuthServerUrl = await oAuthService.getOAuthServerUrl(
normalizeServerUrl(serverEndpointController.text),
sanitizeUrl(serverEndpointController.text),
state,
codeChallenge,
);
@@ -425,7 +436,7 @@ class LoginForm extends HookConsumerWidget {
Padding(
padding: const EdgeInsets.only(bottom: ImmichSpacing.md),
child: Text(
normalizeServerUrl(serverEndpointController.text),
sanitizeUrl(serverEndpointController.text),
style: context.textTheme.displaySmall,
textAlign: TextAlign.center,
),

View File

@@ -1,73 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:immich_mobile/domain/models/time_range.model.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/utils/option.dart';
class MapTimeRange extends StatelessWidget {
const MapTimeRange({super.key, required this.timeRange, required this.onChanged});
final TimeRange timeRange;
final Function(TimeRange) onChanged;
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text(context.t.date_after),
subtitle: Text(
timeRange.from != null
? DateFormat.yMMMd(context.locale.toLanguageTag()).add_jm().format(timeRange.from!)
: context.t.not_set,
),
trailing: timeRange.from != null
? IconButton(icon: const Icon(Icons.close), onPressed: () => onChanged(timeRange.clearFrom()))
: null,
onTap: () async {
final initial = timeRange.from ?? DateTime.now();
final currentTo = timeRange.to;
final picked = await showDatePicker(
context: context,
initialDate: currentTo != null && initial.isAfter(currentTo) ? currentTo : initial,
firstDate: DateTime(1970),
lastDate: currentTo ?? DateTime.now(),
);
if (picked != null) {
onChanged(timeRange.copyWith(from: Option.some(picked)));
}
},
),
ListTile(
title: Text(context.t.date_before),
subtitle: Text(
timeRange.to != null
? DateFormat.yMMMd(context.locale.toLanguageTag()).add_jm().format(timeRange.to!)
: context.t.not_set,
),
trailing: timeRange.to != null
? IconButton(icon: const Icon(Icons.close), onPressed: () => onChanged(timeRange.clearTo()))
: null,
onTap: () async {
final initial = timeRange.to ?? DateTime.now();
final currentFrom = timeRange.from;
final picked = await showDatePicker(
context: context,
initialDate: currentFrom != null && initial.isBefore(currentFrom) ? currentFrom : initial,
firstDate: currentFrom ?? DateTime(1970),
lastDate: DateTime.now(),
);
if (picked != null) {
onChanged(timeRange.copyWith(to: Option.some(picked)));
}
},
),
],
);
}
}

105
mobile/openapi/README.md generated
View File

@@ -3,13 +3,13 @@ Immich API
This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 3.0.3
- Generator version: 7.24.0
- API version: 3.0.0-rc.2
- Generator version: 7.22.0
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
Dart 2.17 or later
Dart 2.12 or later
## Installation & Usage
@@ -122,6 +122,7 @@ Class | Method | HTTP request | Description
*AssetsApi* | [**updateBulkAssetMetadata**](doc//AssetsApi.md#updatebulkassetmetadata) | **PUT** /assets/metadata | Upsert asset metadata
*AssetsApi* | [**uploadAsset**](doc//AssetsApi.md#uploadasset) | **POST** /assets | Upload asset
*AssetsApi* | [**viewAsset**](doc//AssetsApi.md#viewasset) | **GET** /assets/{id}/thumbnail | View asset thumbnail
*AuthApi* | [**oidcDeviceFlow**](doc//AuthApi.md#oidcdeviceflow) | **GET** /yucca/auth/oidc/device |
*AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password | Change password
*AuthenticationApi* | [**changePinCode**](doc//AuthenticationApi.md#changepincode) | **PUT** /auth/pin-code | Change pin code
*AuthenticationApi* | [**finishOAuth**](doc//AuthenticationApi.md#finishoauth) | **POST** /oauth/callback | Finish OAuth
@@ -140,6 +141,8 @@ Class | Method | HTTP request | Description
*AuthenticationApi* | [**unlockAuthSession**](doc//AuthenticationApi.md#unlockauthsession) | **POST** /auth/session/unlock | Unlock auth session
*AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | Validate access token
*AuthenticationAdminApi* | [**unlinkAllOAuthAccountsAdmin**](doc//AuthenticationAdminApi.md#unlinkalloauthaccountsadmin) | **POST** /admin/auth/unlink-all | Unlink all OAuth accounts
*BackendApi* | [**createLocalBackend**](doc//BackendApi.md#createlocalbackend) | **POST** /yucca/backend/local |
*BackendApi* | [**getBackends**](doc//BackendApi.md#getbackends) | **GET** /yucca/backend |
*DatabaseBackupsAdminApi* | [**deleteDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup) | **DELETE** /admin/database-backups | Delete database backup
*DatabaseBackupsAdminApi* | [**downloadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#downloaddatabasebackup) | **GET** /admin/database-backups/{filename} | Download database backup
*DatabaseBackupsAdminApi* | [**listDatabaseBackups**](doc//DatabaseBackupsAdminApi.md#listdatabasebackups) | **GET** /admin/database-backups | List database backups
@@ -162,6 +165,7 @@ Class | Method | HTTP request | Description
*DeprecatedApi* | [**updateUserAdmin**](doc//DeprecatedApi.md#updateuseradmin) | **PUT** /admin/users/{id} | Update a user
*DeprecatedApi* | [**updateUserPreferencesAdmin**](doc//DeprecatedApi.md#updateuserpreferencesadmin) | **PUT** /admin/users/{id}/preferences | Update user preferences
*DeprecatedApi* | [**updateWorkflow**](doc//DeprecatedApi.md#updateworkflow) | **PUT** /workflows/{id} | Update a workflow
*DevelopmentApi* | [**resetOrchestrator**](doc//DevelopmentApi.md#resetorchestrator) | **POST** /yucca/debug/reset |
*DownloadApi* | [**downloadArchive**](doc//DownloadApi.md#downloadarchive) | **POST** /download/archive | Download asset archive
*DownloadApi* | [**getDownloadInfo**](doc//DownloadApi.md#getdownloadinfo) | **POST** /download/info | Retrieve download information
*DuplicatesApi* | [**deleteDuplicate**](doc//DuplicatesApi.md#deleteduplicate) | **DELETE** /duplicates/{id} | Dismiss a duplicate group
@@ -172,6 +176,9 @@ Class | Method | HTTP request | Description
*FacesApi* | [**deleteFace**](doc//FacesApi.md#deleteface) | **DELETE** /faces/{id} | Delete a face
*FacesApi* | [**getFaces**](doc//FacesApi.md#getfaces) | **GET** /faces | Retrieve faces for asset
*FacesApi* | [**reassignFacesById**](doc//FacesApi.md#reassignfacesbyid) | **PUT** /faces/{id} | Re-assign a face to another person
*FilesystemApi* | [**getFileListing**](doc//FilesystemApi.md#getfilelisting) | **GET** /yucca/fs |
*IntegrationsApi* | [**configureImmichIntegration**](doc//IntegrationsApi.md#configureimmichintegration) | **POST** /yucca/integrations/immich |
*IntegrationsApi* | [**getIntegrations**](doc//IntegrationsApi.md#getintegrations) | **GET** /yucca/integrations |
*JobsApi* | [**createJob**](doc//JobsApi.md#createjob) | **POST** /jobs | Create a manual job
*JobsApi* | [**getQueuesLegacy**](doc//JobsApi.md#getqueueslegacy) | **GET** /jobs | Retrieve queue counts and status
*JobsApi* | [**runQueueCommandLegacy**](doc//JobsApi.md#runqueuecommandlegacy) | **PUT** /jobs/{name} | Run jobs
@@ -211,6 +218,13 @@ Class | Method | HTTP request | Description
*NotificationsAdminApi* | [**createNotification**](doc//NotificationsAdminApi.md#createnotification) | **POST** /admin/notifications | Create a notification
*NotificationsAdminApi* | [**getNotificationTemplateAdmin**](doc//NotificationsAdminApi.md#getnotificationtemplateadmin) | **POST** /admin/notifications/templates/{name} | Render email template
*NotificationsAdminApi* | [**sendTestEmailAdmin**](doc//NotificationsAdminApi.md#sendtestemailadmin) | **POST** /admin/notifications/test-email | Send test email
*OnboardingApi* | [**confirmRecoveryKey**](doc//OnboardingApi.md#confirmrecoverykey) | **POST** /yucca/onboarding/recovery-key |
*OnboardingApi* | [**currentRecoveryKey**](doc//OnboardingApi.md#currentrecoverykey) | **GET** /yucca/onboarding/recovery-key |
*OnboardingApi* | [**enableTelemetry**](doc//OnboardingApi.md#enabletelemetry) | **POST** /yucca/onboarding/telemetry |
*OnboardingApi* | [**importRecoveryKey**](doc//OnboardingApi.md#importrecoverykey) | **PUT** /yucca/onboarding/recovery-key |
*OnboardingApi* | [**onboardingStatus**](doc//OnboardingApi.md#onboardingstatus) | **GET** /yucca/onboarding |
*OnboardingApi* | [**reportError**](doc//OnboardingApi.md#reporterror) | **POST** /yucca/onboarding/report-error |
*OnboardingApi* | [**skipOnboardingExtraConfig**](doc//OnboardingApi.md#skiponboardingextraconfig) | **POST** /yucca/onboarding/skip |
*PartnersApi* | [**createPartner**](doc//PartnersApi.md#createpartner) | **POST** /partners | Create a partner
*PartnersApi* | [**createPartnerDeprecated**](doc//PartnersApi.md#createpartnerdeprecated) | **POST** /partners/{id} | Create a partner
*PartnersApi* | [**getPartners**](doc//PartnersApi.md#getpartners) | **GET** /partners | Retrieve partners
@@ -236,6 +250,30 @@ Class | Method | HTTP request | Description
*QueuesApi* | [**getQueueJobs**](doc//QueuesApi.md#getqueuejobs) | **GET** /queues/{name}/jobs | Retrieve queue jobs
*QueuesApi* | [**getQueues**](doc//QueuesApi.md#getqueues) | **GET** /queues | List all queues
*QueuesApi* | [**updateQueue**](doc//QueuesApi.md#updatequeue) | **PUT** /queues/{name} | Update a queue
*RepositoryApi* | [**checkImportRepository**](doc//RepositoryApi.md#checkimportrepository) | **GET** /yucca/repository/{id}/import |
*RepositoryApi* | [**createBackup**](doc//RepositoryApi.md#createbackup) | **POST** /yucca/repository/{id} |
*RepositoryApi* | [**createRepository**](doc//RepositoryApi.md#createrepository) | **POST** /yucca/repository |
*RepositoryApi* | [**deleteRepository**](doc//RepositoryApi.md#deleterepository) | **DELETE** /yucca/repository/{id} |
*RepositoryApi* | [**forgetSnapshot**](doc//RepositoryApi.md#forgetsnapshot) | **DELETE** /yucca/repository/{id}/snapshots/{snapshot} |
*RepositoryApi* | [**getRepositories**](doc//RepositoryApi.md#getrepositories) | **GET** /yucca/repository |
*RepositoryApi* | [**getRunHistory**](doc//RepositoryApi.md#getrunhistory) | **GET** /yucca/repository/{id}/runs |
*RepositoryApi* | [**getSnapshotListing**](doc//RepositoryApi.md#getsnapshotlisting) | **GET** /yucca/repository/{id}/snapshots/{snapshot}/listing |
*RepositoryApi* | [**getSnapshots**](doc//RepositoryApi.md#getsnapshots) | **GET** /yucca/repository/{id}/snapshots |
*RepositoryApi* | [**importRepository**](doc//RepositoryApi.md#importrepository) | **POST** /yucca/repository/{id}/import |
*RepositoryApi* | [**inspectRepositories**](doc//RepositoryApi.md#inspectrepositories) | **GET** /yucca/repository/inspect |
*RepositoryApi* | [**pruneRepository**](doc//RepositoryApi.md#prunerepository) | **POST** /yucca/repository/{id}/snapshots/prune |
*RepositoryApi* | [**reconfigureRepositoryPrimaryBackend**](doc//RepositoryApi.md#reconfigurerepositoryprimarybackend) | **PUT** /yucca/repository/{id}/backend |
*RepositoryApi* | [**restoreFromPoint**](doc//RepositoryApi.md#restorefrompoint) | **POST** /yucca/repository/{id}/snapshots/{snapshot}/restore-from-point |
*RepositoryApi* | [**restoreSnapshot**](doc//RepositoryApi.md#restoresnapshot) | **POST** /yucca/repository/{id}/snapshots/{snapshot} |
*RepositoryApi* | [**updateRepository**](doc//RepositoryApi.md#updaterepository) | **PATCH** /yucca/repository/{id} |
*RunHistoryApi* | [**getRun**](doc//RunHistoryApi.md#getrun) | **GET** /yucca/logs/{id} |
*RunHistoryApi* | [**logStreamSse**](doc//RunHistoryApi.md#logstreamsse) | **GET** /yucca/logs/{id}/stream |
*RunningTasksApi* | [**cancelTask**](doc//RunningTasksApi.md#canceltask) | **POST** /yucca/tasks/{parentId}/cancel |
*RunningTasksApi* | [**getRunningTasks**](doc//RunningTasksApi.md#getrunningtasks) | **GET** /yucca/tasks |
*ScheduleApi* | [**createSchedule**](doc//ScheduleApi.md#createschedule) | **POST** /yucca/schedule |
*ScheduleApi* | [**getSchedules**](doc//ScheduleApi.md#getschedules) | **GET** /yucca/schedule |
*ScheduleApi* | [**removeSchedule**](doc//ScheduleApi.md#removeschedule) | **DELETE** /yucca/schedule/{id} |
*ScheduleApi* | [**updateSchedule**](doc//ScheduleApi.md#updateschedule) | **PATCH** /yucca/schedule/{id} |
*SearchApi* | [**getAssetsByCity**](doc//SearchApi.md#getassetsbycity) | **GET** /search/cities | Retrieve assets by city
*SearchApi* | [**getExploreData**](doc//SearchApi.md#getexploredata) | **GET** /search/explore | Retrieve explore data
*SearchApi* | [**getSearchSuggestions**](doc//SearchApi.md#getsearchsuggestions) | **GET** /search/suggestions | Retrieve search suggestions
@@ -348,6 +386,7 @@ Class | Method | HTTP request | Description
## Documentation For Models
- [ActiveScheduleItemDto](doc//ActiveScheduleItemDto.md)
- [ActivityCreateDto](doc//ActivityCreateDto.md)
- [ActivityResponseDto](doc//ActivityResponseDto.md)
- [ActivityStatisticsResponseDto](doc//ActivityStatisticsResponseDto.md)
@@ -414,6 +453,11 @@ Class | Method | HTTP request | Description
- [AudioCodec](doc//AudioCodec.md)
- [AuthStatusResponseDto](doc//AuthStatusResponseDto.md)
- [AvatarUpdate](doc//AvatarUpdate.md)
- [BackendDto](doc//BackendDto.md)
- [BackendResponseDto](doc//BackendResponseDto.md)
- [BackendType](doc//BackendType.md)
- [BackendsResponseDto](doc//BackendsResponseDto.md)
- [BootstrapStatus](doc//BootstrapStatus.md)
- [BulkIdErrorReason](doc//BulkIdErrorReason.md)
- [BulkIdResponseDto](doc//BulkIdResponseDto.md)
- [BulkIdsDto](doc//BulkIdsDto.md)
@@ -426,15 +470,20 @@ Class | Method | HTTP request | Description
- [CastUpdate](doc//CastUpdate.md)
- [ChangePasswordDto](doc//ChangePasswordDto.md)
- [Colorspace](doc//Colorspace.md)
- [ConfigureImmichIntegrationRequestDto](doc//ConfigureImmichIntegrationRequestDto.md)
- [ConfigureImmichIntegrationRequestDtoLibraries](doc//ConfigureImmichIntegrationRequestDtoLibraries.md)
- [ContributorCountResponseDto](doc//ContributorCountResponseDto.md)
- [CreateAlbumDto](doc//CreateAlbumDto.md)
- [CreateLibraryDto](doc//CreateLibraryDto.md)
- [CreateLocalBackendRequestDto](doc//CreateLocalBackendRequestDto.md)
- [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md)
- [CropParameters](doc//CropParameters.md)
- [CurrentRecoveryKeyResponse](doc//CurrentRecoveryKeyResponse.md)
- [DatabaseBackupConfig](doc//DatabaseBackupConfig.md)
- [DatabaseBackupDeleteDto](doc//DatabaseBackupDeleteDto.md)
- [DatabaseBackupDto](doc//DatabaseBackupDto.md)
- [DatabaseBackupListResponseDto](doc//DatabaseBackupListResponseDto.md)
- [DeviceFlowResponseDto](doc//DeviceFlowResponseDto.md)
- [DownloadArchiveDto](doc//DownloadArchiveDto.md)
- [DownloadArchiveInfo](doc//DownloadArchiveInfo.md)
- [DownloadInfoDto](doc//DownloadInfoDto.md)
@@ -450,10 +499,18 @@ Class | Method | HTTP request | Description
- [ExifResponseDto](doc//ExifResponseDto.md)
- [FaceDto](doc//FaceDto.md)
- [FacialRecognitionConfig](doc//FacialRecognitionConfig.md)
- [FilesystemListingItemDto](doc//FilesystemListingItemDto.md)
- [FilesystemListingResponseDto](doc//FilesystemListingResponseDto.md)
- [FoldersResponse](doc//FoldersResponse.md)
- [FoldersUpdate](doc//FoldersUpdate.md)
- [HlsVideoResolution](doc//HlsVideoResolution.md)
- [ImageFormat](doc//ImageFormat.md)
- [ImmichIntegrationConfigurationDto](doc//ImmichIntegrationConfigurationDto.md)
- [ImmichIntegrationDto](doc//ImmichIntegrationDto.md)
- [ImmichLibraryDto](doc//ImmichLibraryDto.md)
- [ImmichStateDto](doc//ImmichStateDto.md)
- [ImportRecoveryKeyRequest](doc//ImportRecoveryKeyRequest.md)
- [InspectedLocalRepositoryDto](doc//InspectedLocalRepositoryDto.md)
- [IntegrationsResponseDto](doc//IntegrationsResponseDto.md)
- [IntegrityReport](doc//IntegrityReport.md)
- [IntegrityReportResponseDto](doc//IntegrityReportResponseDto.md)
- [IntegrityReportResponseDtoItemsInner](doc//IntegrityReportResponseDtoItemsInner.md)
@@ -464,7 +521,10 @@ Class | Method | HTTP request | Description
- [LibraryResponseDto](doc//LibraryResponseDto.md)
- [LibraryStatsResponseDto](doc//LibraryStatsResponseDto.md)
- [LicenseKeyDto](doc//LicenseKeyDto.md)
- [ListSnapshotsResponseDto](doc//ListSnapshotsResponseDto.md)
- [LocalRepositoryDto](doc//LocalRepositoryDto.md)
- [LogLevel](doc//LogLevel.md)
- [LogResponseDto](doc//LogResponseDto.md)
- [LoginCredentialDto](doc//LoginCredentialDto.md)
- [LoginResponseDto](doc//LoginResponseDto.md)
- [LogoutResponseDto](doc//LogoutResponseDto.md)
@@ -505,6 +565,7 @@ Class | Method | HTTP request | Description
- [OnThisDayDto](doc//OnThisDayDto.md)
- [OnboardingDto](doc//OnboardingDto.md)
- [OnboardingResponseDto](doc//OnboardingResponseDto.md)
- [OnboardingStatusResponseDto](doc//OnboardingStatusResponseDto.md)
- [PartnerCreateDto](doc//PartnerCreateDto.md)
- [PartnerDirection](doc//PartnerDirection.md)
- [PartnerResponseDto](doc//PartnerResponseDto.md)
@@ -546,13 +607,40 @@ Class | Method | HTTP request | Description
- [RatingsUpdate](doc//RatingsUpdate.md)
- [ReactionLevel](doc//ReactionLevel.md)
- [ReactionType](doc//ReactionType.md)
- [RecentlyAddedResponse](doc//RecentlyAddedResponse.md)
- [RecentlyAddedUpdate](doc//RecentlyAddedUpdate.md)
- [ReleaseChannel](doc//ReleaseChannel.md)
- [ReleaseEventV1](doc//ReleaseEventV1.md)
- [ReleaseType](doc//ReleaseType.md)
- [RepositoryBackendDto](doc//RepositoryBackendDto.md)
- [RepositoryBackendsDto](doc//RepositoryBackendsDto.md)
- [RepositoryCheckImportResponseDto](doc//RepositoryCheckImportResponseDto.md)
- [RepositoryConfigurationDto](doc//RepositoryConfigurationDto.md)
- [RepositoryCreateRequestDto](doc//RepositoryCreateRequestDto.md)
- [RepositoryCreateResponseDto](doc//RepositoryCreateResponseDto.md)
- [RepositoryInspectResponseDto](doc//RepositoryInspectResponseDto.md)
- [RepositoryListResponseDto](doc//RepositoryListResponseDto.md)
- [RepositoryMeterDto](doc//RepositoryMeterDto.md)
- [RepositoryMetricsDto](doc//RepositoryMetricsDto.md)
- [RepositoryPrimaryBackendReconfigureRequestDto](doc//RepositoryPrimaryBackendReconfigureRequestDto.md)
- [RepositorySnapshotRestoreFromPointRequestDto](doc//RepositorySnapshotRestoreFromPointRequestDto.md)
- [RepositorySnapshotRestoreRequestDto](doc//RepositorySnapshotRestoreRequestDto.md)
- [RepositoryUpdateRequestDto](doc//RepositoryUpdateRequestDto.md)
- [RepositoryUpdateResponseDto](doc//RepositoryUpdateResponseDto.md)
- [RetentionPolicyDto](doc//RetentionPolicyDto.md)
- [ReverseGeocodingStateResponseDto](doc//ReverseGeocodingStateResponseDto.md)
- [RotateParameters](doc//RotateParameters.md)
- [RunDto](doc//RunDto.md)
- [RunHistoryResponseDto](doc//RunHistoryResponseDto.md)
- [RunResponseDto](doc//RunResponseDto.md)
- [RunStatus](doc//RunStatus.md)
- [RunType](doc//RunType.md)
- [RunningTaskDto](doc//RunningTaskDto.md)
- [RunningTaskListResponse](doc//RunningTaskListResponse.md)
- [ScheduleCreateRequestDto](doc//ScheduleCreateRequestDto.md)
- [ScheduleCreateResponseDto](doc//ScheduleCreateResponseDto.md)
- [ScheduleDto](doc//ScheduleDto.md)
- [ScheduleListResponseDto](doc//ScheduleListResponseDto.md)
- [ScheduleUpdateRequestDto](doc//ScheduleUpdateRequestDto.md)
- [ScheduleUpdateResponseDto](doc//ScheduleUpdateResponseDto.md)
- [SearchAlbumResponseDto](doc//SearchAlbumResponseDto.md)
- [SearchAssetResponseDto](doc//SearchAssetResponseDto.md)
- [SearchExploreItem](doc//SearchExploreItem.md)
@@ -587,6 +675,8 @@ Class | Method | HTTP request | Description
- [SharedLinksUpdate](doc//SharedLinksUpdate.md)
- [SignUpDto](doc//SignUpDto.md)
- [SmartSearchDto](doc//SmartSearchDto.md)
- [SnapshotDto](doc//SnapshotDto.md)
- [SnapshotSummaryDto](doc//SnapshotSummaryDto.md)
- [SourceType](doc//SourceType.md)
- [StackCreateDto](doc//StackCreateDto.md)
- [StackResponseDto](doc//StackResponseDto.md)
@@ -677,6 +767,9 @@ Class | Method | HTTP request | Description
- [TagUpsertDto](doc//TagUpsertDto.md)
- [TagsResponse](doc//TagsResponse.md)
- [TagsUpdate](doc//TagsUpdate.md)
- [TaskStatus](doc//TaskStatus.md)
- [TaskType](doc//TaskType.md)
- [TelemetryLevel](doc//TelemetryLevel.md)
- [TemplateDto](doc//TemplateDto.md)
- [TemplateResponseDto](doc//TemplateResponseDto.md)
- [TestEmailResponseDto](doc//TestEmailResponseDto.md)

View File

@@ -35,13 +35,18 @@ part 'api/api_keys_api.dart';
part 'api/activities_api.dart';
part 'api/albums_api.dart';
part 'api/assets_api.dart';
part 'api/auth_api.dart';
part 'api/authentication_api.dart';
part 'api/authentication_admin_api.dart';
part 'api/backend_api.dart';
part 'api/database_backups_admin_api.dart';
part 'api/deprecated_api.dart';
part 'api/development_api.dart';
part 'api/download_api.dart';
part 'api/duplicates_api.dart';
part 'api/faces_api.dart';
part 'api/filesystem_api.dart';
part 'api/integrations_api.dart';
part 'api/jobs_api.dart';
part 'api/libraries_api.dart';
part 'api/maintenance_admin_api.dart';
@@ -49,10 +54,15 @@ part 'api/map_api.dart';
part 'api/memories_api.dart';
part 'api/notifications_api.dart';
part 'api/notifications_admin_api.dart';
part 'api/onboarding_api.dart';
part 'api/partners_api.dart';
part 'api/people_api.dart';
part 'api/plugins_api.dart';
part 'api/queues_api.dart';
part 'api/repository_api.dart';
part 'api/run_history_api.dart';
part 'api/running_tasks_api.dart';
part 'api/schedule_api.dart';
part 'api/search_api.dart';
part 'api/server_api.dart';
part 'api/sessions_api.dart';
@@ -69,6 +79,7 @@ part 'api/users_admin_api.dart';
part 'api/views_api.dart';
part 'api/workflows_api.dart';
part 'model/active_schedule_item_dto.dart';
part 'model/activity_create_dto.dart';
part 'model/activity_response_dto.dart';
part 'model/activity_statistics_response_dto.dart';
@@ -135,6 +146,11 @@ part 'model/asset_visibility.dart';
part 'model/audio_codec.dart';
part 'model/auth_status_response_dto.dart';
part 'model/avatar_update.dart';
part 'model/backend_dto.dart';
part 'model/backend_response_dto.dart';
part 'model/backend_type.dart';
part 'model/backends_response_dto.dart';
part 'model/bootstrap_status.dart';
part 'model/bulk_id_error_reason.dart';
part 'model/bulk_id_response_dto.dart';
part 'model/bulk_ids_dto.dart';
@@ -147,15 +163,20 @@ part 'model/cast_response.dart';
part 'model/cast_update.dart';
part 'model/change_password_dto.dart';
part 'model/colorspace.dart';
part 'model/configure_immich_integration_request_dto.dart';
part 'model/configure_immich_integration_request_dto_libraries.dart';
part 'model/contributor_count_response_dto.dart';
part 'model/create_album_dto.dart';
part 'model/create_library_dto.dart';
part 'model/create_local_backend_request_dto.dart';
part 'model/create_profile_image_response_dto.dart';
part 'model/crop_parameters.dart';
part 'model/current_recovery_key_response.dart';
part 'model/database_backup_config.dart';
part 'model/database_backup_delete_dto.dart';
part 'model/database_backup_dto.dart';
part 'model/database_backup_list_response_dto.dart';
part 'model/device_flow_response_dto.dart';
part 'model/download_archive_dto.dart';
part 'model/download_archive_info.dart';
part 'model/download_info_dto.dart';
@@ -171,10 +192,18 @@ part 'model/email_notifications_update.dart';
part 'model/exif_response_dto.dart';
part 'model/face_dto.dart';
part 'model/facial_recognition_config.dart';
part 'model/filesystem_listing_item_dto.dart';
part 'model/filesystem_listing_response_dto.dart';
part 'model/folders_response.dart';
part 'model/folders_update.dart';
part 'model/hls_video_resolution.dart';
part 'model/image_format.dart';
part 'model/immich_integration_configuration_dto.dart';
part 'model/immich_integration_dto.dart';
part 'model/immich_library_dto.dart';
part 'model/immich_state_dto.dart';
part 'model/import_recovery_key_request.dart';
part 'model/inspected_local_repository_dto.dart';
part 'model/integrations_response_dto.dart';
part 'model/integrity_report.dart';
part 'model/integrity_report_response_dto.dart';
part 'model/integrity_report_response_dto_items_inner.dart';
@@ -185,7 +214,10 @@ part 'model/job_settings_dto.dart';
part 'model/library_response_dto.dart';
part 'model/library_stats_response_dto.dart';
part 'model/license_key_dto.dart';
part 'model/list_snapshots_response_dto.dart';
part 'model/local_repository_dto.dart';
part 'model/log_level.dart';
part 'model/log_response_dto.dart';
part 'model/login_credential_dto.dart';
part 'model/login_response_dto.dart';
part 'model/logout_response_dto.dart';
@@ -226,6 +258,7 @@ part 'model/ocr_config.dart';
part 'model/on_this_day_dto.dart';
part 'model/onboarding_dto.dart';
part 'model/onboarding_response_dto.dart';
part 'model/onboarding_status_response_dto.dart';
part 'model/partner_create_dto.dart';
part 'model/partner_direction.dart';
part 'model/partner_response_dto.dart';
@@ -267,13 +300,40 @@ part 'model/ratings_response.dart';
part 'model/ratings_update.dart';
part 'model/reaction_level.dart';
part 'model/reaction_type.dart';
part 'model/recently_added_response.dart';
part 'model/recently_added_update.dart';
part 'model/release_channel.dart';
part 'model/release_event_v1.dart';
part 'model/release_type.dart';
part 'model/repository_backend_dto.dart';
part 'model/repository_backends_dto.dart';
part 'model/repository_check_import_response_dto.dart';
part 'model/repository_configuration_dto.dart';
part 'model/repository_create_request_dto.dart';
part 'model/repository_create_response_dto.dart';
part 'model/repository_inspect_response_dto.dart';
part 'model/repository_list_response_dto.dart';
part 'model/repository_meter_dto.dart';
part 'model/repository_metrics_dto.dart';
part 'model/repository_primary_backend_reconfigure_request_dto.dart';
part 'model/repository_snapshot_restore_from_point_request_dto.dart';
part 'model/repository_snapshot_restore_request_dto.dart';
part 'model/repository_update_request_dto.dart';
part 'model/repository_update_response_dto.dart';
part 'model/retention_policy_dto.dart';
part 'model/reverse_geocoding_state_response_dto.dart';
part 'model/rotate_parameters.dart';
part 'model/run_dto.dart';
part 'model/run_history_response_dto.dart';
part 'model/run_response_dto.dart';
part 'model/run_status.dart';
part 'model/run_type.dart';
part 'model/running_task_dto.dart';
part 'model/running_task_list_response.dart';
part 'model/schedule_create_request_dto.dart';
part 'model/schedule_create_response_dto.dart';
part 'model/schedule_dto.dart';
part 'model/schedule_list_response_dto.dart';
part 'model/schedule_update_request_dto.dart';
part 'model/schedule_update_response_dto.dart';
part 'model/search_album_response_dto.dart';
part 'model/search_asset_response_dto.dart';
part 'model/search_explore_item.dart';
@@ -308,6 +368,8 @@ part 'model/shared_links_response.dart';
part 'model/shared_links_update.dart';
part 'model/sign_up_dto.dart';
part 'model/smart_search_dto.dart';
part 'model/snapshot_dto.dart';
part 'model/snapshot_summary_dto.dart';
part 'model/source_type.dart';
part 'model/stack_create_dto.dart';
part 'model/stack_response_dto.dart';
@@ -398,6 +460,9 @@ part 'model/tag_update_dto.dart';
part 'model/tag_upsert_dto.dart';
part 'model/tags_response.dart';
part 'model/tags_update.dart';
part 'model/task_status.dart';
part 'model/task_type.dart';
part 'model/telemetry_level.dart';
part 'model/template_dto.dart';
part 'model/template_response_dto.dart';
part 'model/test_email_response_dto.dart';

60
mobile/openapi/lib/api/auth_api.dart generated Normal file
View File

@@ -0,0 +1,60 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class AuthApi {
AuthApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'GET /yucca/auth/oidc/device' operation and returns the [Response].
Future<Response> oidcDeviceFlowWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/auth/oidc/device';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<DeviceFlowResponseDto?> oidcDeviceFlow({ Future<void>? abortTrigger, }) async {
final response = await oidcDeviceFlowWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'DeviceFlowResponseDto',) as DeviceFlowResponseDto;
}
return null;
}
}

108
mobile/openapi/lib/api/backend_api.dart generated Normal file
View File

@@ -0,0 +1,108 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BackendApi {
BackendApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/backend/local' operation and returns the [Response].
/// Parameters:
///
/// * [CreateLocalBackendRequestDto] createLocalBackendRequestDto (required):
Future<Response> createLocalBackendWithHttpInfo(CreateLocalBackendRequestDto createLocalBackendRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/backend/local';
// ignore: prefer_final_locals
Object? postBody = createLocalBackendRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [CreateLocalBackendRequestDto] createLocalBackendRequestDto (required):
Future<BackendResponseDto?> createLocalBackend(CreateLocalBackendRequestDto createLocalBackendRequestDto, { Future<void>? abortTrigger, }) async {
final response = await createLocalBackendWithHttpInfo(createLocalBackendRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'BackendResponseDto',) as BackendResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/backend' operation and returns the [Response].
Future<Response> getBackendsWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/backend';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<BackendsResponseDto?> getBackends({ Future<void>? abortTrigger, }) async {
final response = await getBackendsWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'BackendsResponseDto',) as BackendsResponseDto;
}
return null;
}
}

View File

@@ -0,0 +1,52 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class DevelopmentApi {
DevelopmentApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/debug/reset' operation and returns the [Response].
Future<Response> resetOrchestratorWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/debug/reset';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<void> resetOrchestrator({ Future<void>? abortTrigger, }) async {
final response = await resetOrchestratorWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
}

View File

@@ -0,0 +1,70 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class FilesystemApi {
FilesystemApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'GET /yucca/fs' operation and returns the [Response].
/// Parameters:
///
/// * [String] path:
Future<Response> getFileListingWithHttpInfo({ String? path, Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/fs';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (path != null) {
queryParams.addAll(_queryParams('', 'path', path));
}
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] path:
Future<FilesystemListingResponseDto?> getFileListing({ String? path, Future<void>? abortTrigger, }) async {
final response = await getFileListingWithHttpInfo(path: path, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'FilesystemListingResponseDto',) as FilesystemListingResponseDto;
}
return null;
}
}

View File

@@ -0,0 +1,100 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class IntegrationsApi {
IntegrationsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/integrations/immich' operation and returns the [Response].
/// Parameters:
///
/// * [ConfigureImmichIntegrationRequestDto] configureImmichIntegrationRequestDto (required):
Future<Response> configureImmichIntegrationWithHttpInfo(ConfigureImmichIntegrationRequestDto configureImmichIntegrationRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/integrations/immich';
// ignore: prefer_final_locals
Object? postBody = configureImmichIntegrationRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [ConfigureImmichIntegrationRequestDto] configureImmichIntegrationRequestDto (required):
Future<void> configureImmichIntegration(ConfigureImmichIntegrationRequestDto configureImmichIntegrationRequestDto, { Future<void>? abortTrigger, }) async {
final response = await configureImmichIntegrationWithHttpInfo(configureImmichIntegrationRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'GET /yucca/integrations' operation and returns the [Response].
Future<Response> getIntegrationsWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/integrations';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<IntegrationsResponseDto?> getIntegrations({ Future<void>? abortTrigger, }) async {
final response = await getIntegrationsWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'IntegrationsResponseDto',) as IntegrationsResponseDto;
}
return null;
}
}

278
mobile/openapi/lib/api/onboarding_api.dart generated Normal file
View File

@@ -0,0 +1,278 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class OnboardingApi {
OnboardingApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/onboarding/recovery-key' operation and returns the [Response].
Future<Response> confirmRecoveryKeyWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/recovery-key';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<void> confirmRecoveryKey({ Future<void>? abortTrigger, }) async {
final response = await confirmRecoveryKeyWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'GET /yucca/onboarding/recovery-key' operation and returns the [Response].
Future<Response> currentRecoveryKeyWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/recovery-key';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<CurrentRecoveryKeyResponse?> currentRecoveryKey({ Future<void>? abortTrigger, }) async {
final response = await currentRecoveryKeyWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'CurrentRecoveryKeyResponse',) as CurrentRecoveryKeyResponse;
}
return null;
}
/// Performs an HTTP 'POST /yucca/onboarding/telemetry' operation and returns the [Response].
Future<Response> enableTelemetryWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/telemetry';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<void> enableTelemetry({ Future<void>? abortTrigger, }) async {
final response = await enableTelemetryWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'PUT /yucca/onboarding/recovery-key' operation and returns the [Response].
/// Parameters:
///
/// * [ImportRecoveryKeyRequest] importRecoveryKeyRequest (required):
Future<Response> importRecoveryKeyWithHttpInfo(ImportRecoveryKeyRequest importRecoveryKeyRequest, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/recovery-key';
// ignore: prefer_final_locals
Object? postBody = importRecoveryKeyRequest;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'PUT',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [ImportRecoveryKeyRequest] importRecoveryKeyRequest (required):
Future<void> importRecoveryKey(ImportRecoveryKeyRequest importRecoveryKeyRequest, { Future<void>? abortTrigger, }) async {
final response = await importRecoveryKeyWithHttpInfo(importRecoveryKeyRequest, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'GET /yucca/onboarding' operation and returns the [Response].
Future<Response> onboardingStatusWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<OnboardingStatusResponseDto?> onboardingStatus({ Future<void>? abortTrigger, }) async {
final response = await onboardingStatusWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'OnboardingStatusResponseDto',) as OnboardingStatusResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/onboarding/report-error' operation and returns the [Response].
Future<Response> reportErrorWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/report-error';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<void> reportError({ Future<void>? abortTrigger, }) async {
final response = await reportErrorWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'POST /yucca/onboarding/skip' operation and returns the [Response].
Future<Response> skipOnboardingExtraConfigWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/onboarding/skip';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<void> skipOnboardingExtraConfig({ Future<void>? abortTrigger, }) async {
final response = await skipOnboardingExtraConfigWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
}

867
mobile/openapi/lib/api/repository_api.dart generated Normal file
View File

@@ -0,0 +1,867 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryApi {
RepositoryApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'GET /yucca/repository/{id}/import' operation and returns the [Response].
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
Future<Response> checkImportRepositoryWithHttpInfo(String backend, String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/import'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
queryParams.addAll(_queryParams('', 'backend', backend));
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
Future<RepositoryCheckImportResponseDto?> checkImportRepository(String backend, String id, { Future<void>? abortTrigger, }) async {
final response = await checkImportRepositoryWithHttpInfo(backend, id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryCheckImportResponseDto',) as RepositoryCheckImportResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> createBackupWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<LogResponseDto?> createBackup(String id, { Future<void>? abortTrigger, }) async {
final response = await createBackupWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LogResponseDto',) as LogResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository' operation and returns the [Response].
/// Parameters:
///
/// * [RepositoryCreateRequestDto] repositoryCreateRequestDto (required):
///
/// * [String] backend:
Future<Response> createRepositoryWithHttpInfo(RepositoryCreateRequestDto repositoryCreateRequestDto, { String? backend, Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository';
// ignore: prefer_final_locals
Object? postBody = repositoryCreateRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (backend != null) {
queryParams.addAll(_queryParams('', 'backend', backend));
}
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [RepositoryCreateRequestDto] repositoryCreateRequestDto (required):
///
/// * [String] backend:
Future<RepositoryCreateResponseDto?> createRepository(RepositoryCreateRequestDto repositoryCreateRequestDto, { String? backend, Future<void>? abortTrigger, }) async {
final response = await createRepositoryWithHttpInfo(repositoryCreateRequestDto, backend: backend, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryCreateResponseDto',) as RepositoryCreateResponseDto;
}
return null;
}
/// Performs an HTTP 'DELETE /yucca/repository/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> deleteRepositoryWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'DELETE',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<void> deleteRepository(String id, { Future<void>? abortTrigger, }) async {
final response = await deleteRepositoryWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'DELETE /yucca/repository/{id}/snapshots/{snapshot}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
Future<Response> forgetSnapshotWithHttpInfo(String id, String snapshot, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots/{snapshot}'
.replaceAll('{id}', id)
.replaceAll('{snapshot}', snapshot);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'DELETE',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
Future<ListSnapshotsResponseDto?> forgetSnapshot(String id, String snapshot, { Future<void>? abortTrigger, }) async {
final response = await forgetSnapshotWithHttpInfo(id, snapshot, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ListSnapshotsResponseDto',) as ListSnapshotsResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/repository' operation and returns the [Response].
Future<Response> getRepositoriesWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<RepositoryListResponseDto?> getRepositories({ Future<void>? abortTrigger, }) async {
final response = await getRepositoriesWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryListResponseDto',) as RepositoryListResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/repository/{id}/runs' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> getRunHistoryWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/runs'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<RunHistoryResponseDto?> getRunHistory(String id, { Future<void>? abortTrigger, }) async {
final response = await getRunHistoryWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RunHistoryResponseDto',) as RunHistoryResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/repository/{id}/snapshots/{snapshot}/listing' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [String] path:
Future<Response> getSnapshotListingWithHttpInfo(String id, String snapshot, { String? path, Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots/{snapshot}/listing'
.replaceAll('{id}', id)
.replaceAll('{snapshot}', snapshot);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (path != null) {
queryParams.addAll(_queryParams('', 'path', path));
}
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [String] path:
Future<FilesystemListingResponseDto?> getSnapshotListing(String id, String snapshot, { String? path, Future<void>? abortTrigger, }) async {
final response = await getSnapshotListingWithHttpInfo(id, snapshot, path: path, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'FilesystemListingResponseDto',) as FilesystemListingResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/repository/{id}/snapshots' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> getSnapshotsWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<ListSnapshotsResponseDto?> getSnapshots(String id, { Future<void>? abortTrigger, }) async {
final response = await getSnapshotsWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ListSnapshotsResponseDto',) as ListSnapshotsResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository/{id}/import' operation and returns the [Response].
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
Future<Response> importRepositoryWithHttpInfo(String backend, String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/import'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
queryParams.addAll(_queryParams('', 'backend', backend));
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
Future<RepositoryCreateResponseDto?> importRepository(String backend, String id, { Future<void>? abortTrigger, }) async {
final response = await importRepositoryWithHttpInfo(backend, id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryCreateResponseDto',) as RepositoryCreateResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/repository/inspect' operation and returns the [Response].
/// Parameters:
///
/// * [String] backend:
Future<Response> inspectRepositoriesWithHttpInfo({ String? backend, Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/inspect';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (backend != null) {
queryParams.addAll(_queryParams('', 'backend', backend));
}
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] backend:
Future<RepositoryInspectResponseDto?> inspectRepositories({ String? backend, Future<void>? abortTrigger, }) async {
final response = await inspectRepositoriesWithHttpInfo(backend: backend, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryInspectResponseDto',) as RepositoryInspectResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository/{id}/snapshots/prune' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> pruneRepositoryWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots/prune'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<LogResponseDto?> pruneRepository(String id, { Future<void>? abortTrigger, }) async {
final response = await pruneRepositoryWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LogResponseDto',) as LogResponseDto;
}
return null;
}
/// Performs an HTTP 'PUT /yucca/repository/{id}/backend' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [RepositoryPrimaryBackendReconfigureRequestDto] repositoryPrimaryBackendReconfigureRequestDto (required):
Future<Response> reconfigureRepositoryPrimaryBackendWithHttpInfo(String id, RepositoryPrimaryBackendReconfigureRequestDto repositoryPrimaryBackendReconfigureRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/backend'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody = repositoryPrimaryBackendReconfigureRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'PUT',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [RepositoryPrimaryBackendReconfigureRequestDto] repositoryPrimaryBackendReconfigureRequestDto (required):
Future<RepositoryCreateResponseDto?> reconfigureRepositoryPrimaryBackend(String id, RepositoryPrimaryBackendReconfigureRequestDto repositoryPrimaryBackendReconfigureRequestDto, { Future<void>? abortTrigger, }) async {
final response = await reconfigureRepositoryPrimaryBackendWithHttpInfo(id, repositoryPrimaryBackendReconfigureRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryCreateResponseDto',) as RepositoryCreateResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository/{id}/snapshots/{snapshot}/restore-from-point' operation and returns the [Response].
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [RepositorySnapshotRestoreFromPointRequestDto] repositorySnapshotRestoreFromPointRequestDto (required):
Future<Response> restoreFromPointWithHttpInfo(String backend, String id, String snapshot, RepositorySnapshotRestoreFromPointRequestDto repositorySnapshotRestoreFromPointRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots/{snapshot}/restore-from-point'
.replaceAll('{id}', id)
.replaceAll('{snapshot}', snapshot);
// ignore: prefer_final_locals
Object? postBody = repositorySnapshotRestoreFromPointRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
queryParams.addAll(_queryParams('', 'backend', backend));
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] backend (required):
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [RepositorySnapshotRestoreFromPointRequestDto] repositorySnapshotRestoreFromPointRequestDto (required):
Future<LogResponseDto?> restoreFromPoint(String backend, String id, String snapshot, RepositorySnapshotRestoreFromPointRequestDto repositorySnapshotRestoreFromPointRequestDto, { Future<void>? abortTrigger, }) async {
final response = await restoreFromPointWithHttpInfo(backend, id, snapshot, repositorySnapshotRestoreFromPointRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LogResponseDto',) as LogResponseDto;
}
return null;
}
/// Performs an HTTP 'POST /yucca/repository/{id}/snapshots/{snapshot}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [RepositorySnapshotRestoreRequestDto] repositorySnapshotRestoreRequestDto (required):
Future<Response> restoreSnapshotWithHttpInfo(String id, String snapshot, RepositorySnapshotRestoreRequestDto repositorySnapshotRestoreRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}/snapshots/{snapshot}'
.replaceAll('{id}', id)
.replaceAll('{snapshot}', snapshot);
// ignore: prefer_final_locals
Object? postBody = repositorySnapshotRestoreRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [String] snapshot (required):
///
/// * [RepositorySnapshotRestoreRequestDto] repositorySnapshotRestoreRequestDto (required):
Future<LogResponseDto?> restoreSnapshot(String id, String snapshot, RepositorySnapshotRestoreRequestDto repositorySnapshotRestoreRequestDto, { Future<void>? abortTrigger, }) async {
final response = await restoreSnapshotWithHttpInfo(id, snapshot, repositorySnapshotRestoreRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'LogResponseDto',) as LogResponseDto;
}
return null;
}
/// Performs an HTTP 'PATCH /yucca/repository/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [RepositoryUpdateRequestDto] repositoryUpdateRequestDto (required):
///
/// * [String] backend:
Future<Response> updateRepositoryWithHttpInfo(String id, RepositoryUpdateRequestDto repositoryUpdateRequestDto, { String? backend, Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/repository/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody = repositoryUpdateRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (backend != null) {
queryParams.addAll(_queryParams('', 'backend', backend));
}
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'PATCH',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [RepositoryUpdateRequestDto] repositoryUpdateRequestDto (required):
///
/// * [String] backend:
Future<RepositoryUpdateResponseDto?> updateRepository(String id, RepositoryUpdateRequestDto repositoryUpdateRequestDto, { String? backend, Future<void>? abortTrigger, }) async {
final response = await updateRepositoryWithHttpInfo(id, repositoryUpdateRequestDto, backend: backend, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RepositoryUpdateResponseDto',) as RepositoryUpdateResponseDto;
}
return null;
}
}

View File

@@ -0,0 +1,108 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RunHistoryApi {
RunHistoryApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'GET /yucca/logs/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> getRunWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/logs/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<RunResponseDto?> getRun(String id, { Future<void>? abortTrigger, }) async {
final response = await getRunWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RunResponseDto',) as RunResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/logs/{id}/stream' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> logStreamSseWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/logs/{id}/stream'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<void> logStreamSse(String id, { Future<void>? abortTrigger, }) async {
final response = await logStreamSseWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
}

View File

@@ -0,0 +1,101 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RunningTasksApi {
RunningTasksApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/tasks/{parentId}/cancel' operation and returns the [Response].
/// Parameters:
///
/// * [String] parentId (required):
Future<Response> cancelTaskWithHttpInfo(String parentId, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/tasks/{parentId}/cancel'
.replaceAll('{parentId}', parentId);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] parentId (required):
Future<void> cancelTask(String parentId, { Future<void>? abortTrigger, }) async {
final response = await cancelTaskWithHttpInfo(parentId, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'GET /yucca/tasks' operation and returns the [Response].
Future<Response> getRunningTasksWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/tasks';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<RunningTaskListResponse?> getRunningTasks({ Future<void>? abortTrigger, }) async {
final response = await getRunningTasksWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'RunningTaskListResponse',) as RunningTaskListResponse;
}
return null;
}
}

202
mobile/openapi/lib/api/schedule_api.dart generated Normal file
View File

@@ -0,0 +1,202 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ScheduleApi {
ScheduleApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
final ApiClient apiClient;
/// Performs an HTTP 'POST /yucca/schedule' operation and returns the [Response].
/// Parameters:
///
/// * [ScheduleCreateRequestDto] scheduleCreateRequestDto (required):
Future<Response> createScheduleWithHttpInfo(ScheduleCreateRequestDto scheduleCreateRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/schedule';
// ignore: prefer_final_locals
Object? postBody = scheduleCreateRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'POST',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [ScheduleCreateRequestDto] scheduleCreateRequestDto (required):
Future<ScheduleCreateResponseDto?> createSchedule(ScheduleCreateRequestDto scheduleCreateRequestDto, { Future<void>? abortTrigger, }) async {
final response = await createScheduleWithHttpInfo(scheduleCreateRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ScheduleCreateResponseDto',) as ScheduleCreateResponseDto;
}
return null;
}
/// Performs an HTTP 'GET /yucca/schedule' operation and returns the [Response].
Future<Response> getSchedulesWithHttpInfo({ Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/schedule';
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'GET',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
Future<ScheduleListResponseDto?> getSchedules({ Future<void>? abortTrigger, }) async {
final response = await getSchedulesWithHttpInfo(abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ScheduleListResponseDto',) as ScheduleListResponseDto;
}
return null;
}
/// Performs an HTTP 'DELETE /yucca/schedule/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
Future<Response> removeScheduleWithHttpInfo(String id, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/schedule/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>[];
return apiClient.invokeAPI(
apiPath,
'DELETE',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
Future<void> removeSchedule(String id, { Future<void>? abortTrigger, }) async {
final response = await removeScheduleWithHttpInfo(id, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Performs an HTTP 'PATCH /yucca/schedule/{id}' operation and returns the [Response].
/// Parameters:
///
/// * [String] id (required):
///
/// * [ScheduleUpdateRequestDto] scheduleUpdateRequestDto (required):
Future<Response> updateScheduleWithHttpInfo(String id, ScheduleUpdateRequestDto scheduleUpdateRequestDto, { Future<void>? abortTrigger, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/yucca/schedule/{id}'
.replaceAll('{id}', id);
// ignore: prefer_final_locals
Object? postBody = scheduleUpdateRequestDto;
final queryParams = <QueryParam>[];
final headerParams = <String, String>{};
final formParams = <String, String>{};
const contentTypes = <String>['application/json'];
return apiClient.invokeAPI(
apiPath,
'PATCH',
queryParams,
postBody,
headerParams,
formParams,
contentTypes.isEmpty ? null : contentTypes.first,
abortTrigger: abortTrigger,
);
}
/// Parameters:
///
/// * [String] id (required):
///
/// * [ScheduleUpdateRequestDto] scheduleUpdateRequestDto (required):
Future<ScheduleUpdateResponseDto?> updateSchedule(String id, ScheduleUpdateRequestDto scheduleUpdateRequestDto, { Future<void>? abortTrigger, }) async {
final response = await updateScheduleWithHttpInfo(id, scheduleUpdateRequestDto, abortTrigger: abortTrigger,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
// When a remote server returns no body with a status of 204, we shall not decode it.
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'ScheduleUpdateResponseDto',) as ScheduleUpdateResponseDto;
}
return null;
}
}

View File

@@ -97,9 +97,9 @@ class ApiClient {
if (nullableHeaderParams != null) {
request.headers.addAll(nullableHeaderParams);
}
if (msgBody is String && msgBody.isNotEmpty) {
if (msgBody is String) {
request.body = msgBody;
} else if (msgBody is List<int> && msgBody.isNotEmpty) {
} else if (msgBody is List<int>) {
request.bodyBytes = msgBody;
} else if (msgBody is Map<String, String>) {
request.bodyFields = msgBody;
@@ -183,6 +183,8 @@ class ApiClient {
return valueString == 'true' || valueString == '1';
case 'DateTime':
return value is DateTime ? value : DateTime.tryParse(value);
case 'ActiveScheduleItemDto':
return ActiveScheduleItemDto.fromJson(value);
case 'ActivityCreateDto':
return ActivityCreateDto.fromJson(value);
case 'ActivityResponseDto':
@@ -315,6 +317,16 @@ class ApiClient {
return AuthStatusResponseDto.fromJson(value);
case 'AvatarUpdate':
return AvatarUpdate.fromJson(value);
case 'BackendDto':
return BackendDto.fromJson(value);
case 'BackendResponseDto':
return BackendResponseDto.fromJson(value);
case 'BackendType':
return BackendTypeTypeTransformer().decode(value);
case 'BackendsResponseDto':
return BackendsResponseDto.fromJson(value);
case 'BootstrapStatus':
return BootstrapStatusTypeTransformer().decode(value);
case 'BulkIdErrorReason':
return BulkIdErrorReasonTypeTransformer().decode(value);
case 'BulkIdResponseDto':
@@ -339,16 +351,24 @@ class ApiClient {
return ChangePasswordDto.fromJson(value);
case 'Colorspace':
return ColorspaceTypeTransformer().decode(value);
case 'ConfigureImmichIntegrationRequestDto':
return ConfigureImmichIntegrationRequestDto.fromJson(value);
case 'ConfigureImmichIntegrationRequestDtoLibraries':
return ConfigureImmichIntegrationRequestDtoLibraries.fromJson(value);
case 'ContributorCountResponseDto':
return ContributorCountResponseDto.fromJson(value);
case 'CreateAlbumDto':
return CreateAlbumDto.fromJson(value);
case 'CreateLibraryDto':
return CreateLibraryDto.fromJson(value);
case 'CreateLocalBackendRequestDto':
return CreateLocalBackendRequestDto.fromJson(value);
case 'CreateProfileImageResponseDto':
return CreateProfileImageResponseDto.fromJson(value);
case 'CropParameters':
return CropParameters.fromJson(value);
case 'CurrentRecoveryKeyResponse':
return CurrentRecoveryKeyResponse.fromJson(value);
case 'DatabaseBackupConfig':
return DatabaseBackupConfig.fromJson(value);
case 'DatabaseBackupDeleteDto':
@@ -357,6 +377,8 @@ class ApiClient {
return DatabaseBackupDto.fromJson(value);
case 'DatabaseBackupListResponseDto':
return DatabaseBackupListResponseDto.fromJson(value);
case 'DeviceFlowResponseDto':
return DeviceFlowResponseDto.fromJson(value);
case 'DownloadArchiveDto':
return DownloadArchiveDto.fromJson(value);
case 'DownloadArchiveInfo':
@@ -387,14 +409,30 @@ class ApiClient {
return FaceDto.fromJson(value);
case 'FacialRecognitionConfig':
return FacialRecognitionConfig.fromJson(value);
case 'FilesystemListingItemDto':
return FilesystemListingItemDto.fromJson(value);
case 'FilesystemListingResponseDto':
return FilesystemListingResponseDto.fromJson(value);
case 'FoldersResponse':
return FoldersResponse.fromJson(value);
case 'FoldersUpdate':
return FoldersUpdate.fromJson(value);
case 'HlsVideoResolution':
return HlsVideoResolutionTypeTransformer().decode(value);
case 'ImageFormat':
return ImageFormatTypeTransformer().decode(value);
case 'ImmichIntegrationConfigurationDto':
return ImmichIntegrationConfigurationDto.fromJson(value);
case 'ImmichIntegrationDto':
return ImmichIntegrationDto.fromJson(value);
case 'ImmichLibraryDto':
return ImmichLibraryDto.fromJson(value);
case 'ImmichStateDto':
return ImmichStateDto.fromJson(value);
case 'ImportRecoveryKeyRequest':
return ImportRecoveryKeyRequest.fromJson(value);
case 'InspectedLocalRepositoryDto':
return InspectedLocalRepositoryDto.fromJson(value);
case 'IntegrationsResponseDto':
return IntegrationsResponseDto.fromJson(value);
case 'IntegrityReport':
return IntegrityReportTypeTransformer().decode(value);
case 'IntegrityReportResponseDto':
@@ -415,8 +453,14 @@ class ApiClient {
return LibraryStatsResponseDto.fromJson(value);
case 'LicenseKeyDto':
return LicenseKeyDto.fromJson(value);
case 'ListSnapshotsResponseDto':
return ListSnapshotsResponseDto.fromJson(value);
case 'LocalRepositoryDto':
return LocalRepositoryDto.fromJson(value);
case 'LogLevel':
return LogLevelTypeTransformer().decode(value);
case 'LogResponseDto':
return LogResponseDto.fromJson(value);
case 'LoginCredentialDto':
return LoginCredentialDto.fromJson(value);
case 'LoginResponseDto':
@@ -497,6 +541,8 @@ class ApiClient {
return OnboardingDto.fromJson(value);
case 'OnboardingResponseDto':
return OnboardingResponseDto.fromJson(value);
case 'OnboardingStatusResponseDto':
return OnboardingStatusResponseDto.fromJson(value);
case 'PartnerCreateDto':
return PartnerCreateDto.fromJson(value);
case 'PartnerDirection':
@@ -579,20 +625,74 @@ class ApiClient {
return ReactionLevelTypeTransformer().decode(value);
case 'ReactionType':
return ReactionTypeTypeTransformer().decode(value);
case 'RecentlyAddedResponse':
return RecentlyAddedResponse.fromJson(value);
case 'RecentlyAddedUpdate':
return RecentlyAddedUpdate.fromJson(value);
case 'ReleaseChannel':
return ReleaseChannelTypeTransformer().decode(value);
case 'ReleaseEventV1':
return ReleaseEventV1.fromJson(value);
case 'ReleaseType':
return ReleaseTypeTypeTransformer().decode(value);
case 'RepositoryBackendDto':
return RepositoryBackendDto.fromJson(value);
case 'RepositoryBackendsDto':
return RepositoryBackendsDto.fromJson(value);
case 'RepositoryCheckImportResponseDto':
return RepositoryCheckImportResponseDto.fromJson(value);
case 'RepositoryConfigurationDto':
return RepositoryConfigurationDto.fromJson(value);
case 'RepositoryCreateRequestDto':
return RepositoryCreateRequestDto.fromJson(value);
case 'RepositoryCreateResponseDto':
return RepositoryCreateResponseDto.fromJson(value);
case 'RepositoryInspectResponseDto':
return RepositoryInspectResponseDto.fromJson(value);
case 'RepositoryListResponseDto':
return RepositoryListResponseDto.fromJson(value);
case 'RepositoryMeterDto':
return RepositoryMeterDto.fromJson(value);
case 'RepositoryMetricsDto':
return RepositoryMetricsDto.fromJson(value);
case 'RepositoryPrimaryBackendReconfigureRequestDto':
return RepositoryPrimaryBackendReconfigureRequestDto.fromJson(value);
case 'RepositorySnapshotRestoreFromPointRequestDto':
return RepositorySnapshotRestoreFromPointRequestDto.fromJson(value);
case 'RepositorySnapshotRestoreRequestDto':
return RepositorySnapshotRestoreRequestDto.fromJson(value);
case 'RepositoryUpdateRequestDto':
return RepositoryUpdateRequestDto.fromJson(value);
case 'RepositoryUpdateResponseDto':
return RepositoryUpdateResponseDto.fromJson(value);
case 'RetentionPolicyDto':
return RetentionPolicyDto.fromJson(value);
case 'ReverseGeocodingStateResponseDto':
return ReverseGeocodingStateResponseDto.fromJson(value);
case 'RotateParameters':
return RotateParameters.fromJson(value);
case 'RunDto':
return RunDto.fromJson(value);
case 'RunHistoryResponseDto':
return RunHistoryResponseDto.fromJson(value);
case 'RunResponseDto':
return RunResponseDto.fromJson(value);
case 'RunStatus':
return RunStatusTypeTransformer().decode(value);
case 'RunType':
return RunTypeTypeTransformer().decode(value);
case 'RunningTaskDto':
return RunningTaskDto.fromJson(value);
case 'RunningTaskListResponse':
return RunningTaskListResponse.fromJson(value);
case 'ScheduleCreateRequestDto':
return ScheduleCreateRequestDto.fromJson(value);
case 'ScheduleCreateResponseDto':
return ScheduleCreateResponseDto.fromJson(value);
case 'ScheduleDto':
return ScheduleDto.fromJson(value);
case 'ScheduleListResponseDto':
return ScheduleListResponseDto.fromJson(value);
case 'ScheduleUpdateRequestDto':
return ScheduleUpdateRequestDto.fromJson(value);
case 'ScheduleUpdateResponseDto':
return ScheduleUpdateResponseDto.fromJson(value);
case 'SearchAlbumResponseDto':
return SearchAlbumResponseDto.fromJson(value);
case 'SearchAssetResponseDto':
@@ -661,6 +761,10 @@ class ApiClient {
return SignUpDto.fromJson(value);
case 'SmartSearchDto':
return SmartSearchDto.fromJson(value);
case 'SnapshotDto':
return SnapshotDto.fromJson(value);
case 'SnapshotSummaryDto':
return SnapshotSummaryDto.fromJson(value);
case 'SourceType':
return SourceTypeTypeTransformer().decode(value);
case 'StackCreateDto':
@@ -841,6 +945,12 @@ class ApiClient {
return TagsResponse.fromJson(value);
case 'TagsUpdate':
return TagsUpdate.fromJson(value);
case 'TaskStatus':
return TaskStatusTypeTransformer().decode(value);
case 'TaskType':
return TaskTypeTypeTransformer().decode(value);
case 'TelemetryLevel':
return TelemetryLevelTypeTransformer().decode(value);
case 'TemplateDto':
return TemplateDto.fromJson(value);
case 'TemplateResponseDto':

View File

@@ -94,6 +94,12 @@ String parameterToString(dynamic value) {
if (value is AudioCodec) {
return AudioCodecTypeTransformer().encode(value).toString();
}
if (value is BackendType) {
return BackendTypeTypeTransformer().encode(value).toString();
}
if (value is BootstrapStatus) {
return BootstrapStatusTypeTransformer().encode(value).toString();
}
if (value is BulkIdErrorReason) {
return BulkIdErrorReasonTypeTransformer().encode(value).toString();
}
@@ -106,9 +112,6 @@ String parameterToString(dynamic value) {
if (value is Colorspace) {
return ColorspaceTypeTransformer().encode(value).toString();
}
if (value is HlsVideoResolution) {
return HlsVideoResolutionTypeTransformer().encode(value).toString();
}
if (value is ImageFormat) {
return ImageFormatTypeTransformer().encode(value).toString();
}
@@ -172,6 +175,12 @@ String parameterToString(dynamic value) {
if (value is ReleaseType) {
return ReleaseTypeTypeTransformer().encode(value).toString();
}
if (value is RunStatus) {
return RunStatusTypeTransformer().encode(value).toString();
}
if (value is RunType) {
return RunTypeTypeTransformer().encode(value).toString();
}
if (value is SearchSuggestionType) {
return SearchSuggestionTypeTypeTransformer().encode(value).toString();
}
@@ -190,6 +199,15 @@ String parameterToString(dynamic value) {
if (value is SyncRequestType) {
return SyncRequestTypeTypeTransformer().encode(value).toString();
}
if (value is TaskStatus) {
return TaskStatusTypeTransformer().encode(value).toString();
}
if (value is TaskType) {
return TaskTypeTypeTransformer().encode(value).toString();
}
if (value is TelemetryLevel) {
return TelemetryLevelTypeTransformer().encode(value).toString();
}
if (value is ToneMapping) {
return ToneMappingTypeTransformer().encode(value).toString();
}

View File

@@ -0,0 +1,107 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ActiveScheduleItemDto {
/// Returns a new [ActiveScheduleItemDto] instance.
ActiveScheduleItemDto({
required this.repositoryId,
required this.status,
});
String repositoryId;
TaskStatus status;
@override
bool operator ==(Object other) => identical(this, other) || other is ActiveScheduleItemDto &&
other.repositoryId == repositoryId &&
other.status == status;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(repositoryId.hashCode) +
(status.hashCode);
@override
String toString() => 'ActiveScheduleItemDto[repositoryId=$repositoryId, status=$status]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'repositoryId'] = this.repositoryId;
json[r'status'] = this.status;
return json;
}
/// Returns a new [ActiveScheduleItemDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ActiveScheduleItemDto? fromJson(dynamic value) {
upgradeDto(value, "ActiveScheduleItemDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ActiveScheduleItemDto(
repositoryId: mapValueOfType<String>(json, r'repositoryId')!,
status: TaskStatus.fromJson(json[r'status'])!,
);
}
return null;
}
static List<ActiveScheduleItemDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ActiveScheduleItemDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ActiveScheduleItemDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ActiveScheduleItemDto> mapFromJson(dynamic json) {
final map = <String, ActiveScheduleItemDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ActiveScheduleItemDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ActiveScheduleItemDto-objects as value to a dart map
static Map<String, List<ActiveScheduleItemDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ActiveScheduleItemDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ActiveScheduleItemDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'repositoryId',
'status',
};
}

139
mobile/openapi/lib/model/backend_dto.dart generated Normal file
View File

@@ -0,0 +1,139 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BackendDto {
/// Returns a new [BackendDto] instance.
BackendDto({
required this.description,
this.error = const Optional.absent(),
required this.id,
required this.isOnline,
required this.type,
});
String description;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> error;
String id;
bool isOnline;
BackendType type;
@override
bool operator ==(Object other) => identical(this, other) || other is BackendDto &&
other.description == description &&
other.error == error &&
other.id == id &&
other.isOnline == isOnline &&
other.type == type;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(description.hashCode) +
(error == null ? 0 : error!.hashCode) +
(id.hashCode) +
(isOnline.hashCode) +
(type.hashCode);
@override
String toString() => 'BackendDto[description=$description, error=$error, id=$id, isOnline=$isOnline, type=$type]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'description'] = this.description;
if (this.error.isPresent) {
final value = this.error.value;
json[r'error'] = value;
}
json[r'id'] = this.id;
json[r'isOnline'] = this.isOnline;
json[r'type'] = this.type;
return json;
}
/// Returns a new [BackendDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static BackendDto? fromJson(dynamic value) {
upgradeDto(value, "BackendDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return BackendDto(
description: mapValueOfType<String>(json, r'description')!,
error: json.containsKey(r'error') ? Optional.present(mapValueOfType<String>(json, r'error')) : const Optional.absent(),
id: mapValueOfType<String>(json, r'id')!,
isOnline: mapValueOfType<bool>(json, r'isOnline')!,
type: BackendType.fromJson(json[r'type'])!,
);
}
return null;
}
static List<BackendDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <BackendDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = BackendDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, BackendDto> mapFromJson(dynamic json) {
final map = <String, BackendDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = BackendDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of BackendDto-objects as value to a dart map
static Map<String, List<BackendDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<BackendDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = BackendDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'description',
'id',
'isOnline',
'type',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BackendResponseDto {
/// Returns a new [BackendResponseDto] instance.
BackendResponseDto({
required this.backend,
});
BackendDto backend;
@override
bool operator ==(Object other) => identical(this, other) || other is BackendResponseDto &&
other.backend == backend;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backend.hashCode);
@override
String toString() => 'BackendResponseDto[backend=$backend]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'backend'] = this.backend;
return json;
}
/// Returns a new [BackendResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static BackendResponseDto? fromJson(dynamic value) {
upgradeDto(value, "BackendResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return BackendResponseDto(
backend: BackendDto.fromJson(json[r'backend'])!,
);
}
return null;
}
static List<BackendResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <BackendResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = BackendResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, BackendResponseDto> mapFromJson(dynamic json) {
final map = <String, BackendResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = BackendResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of BackendResponseDto-objects as value to a dart map
static Map<String, List<BackendResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<BackendResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = BackendResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'backend',
};
}

View File

@@ -0,0 +1,88 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BackendType {
/// Instantiate a new enum with the provided [value].
const BackendType._(this.value);
/// The underlying value of this enum member.
final String value;
@override
String toString() => value;
String toJson() => value;
static const yucca = BackendType._(r'yucca');
static const local = BackendType._(r'local');
static const s3 = BackendType._(r's3');
/// List of all possible values in this [enum][BackendType].
static const values = <BackendType>[
yucca,
local,
s3,
];
static BackendType? fromJson(dynamic value) => BackendTypeTypeTransformer().decode(value);
static List<BackendType> listFromJson(dynamic json, {bool growable = false,}) {
final result = <BackendType>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = BackendType.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
}
/// Transformation class that can [encode] an instance of [BackendType] to String,
/// and [decode] dynamic data back to [BackendType].
class BackendTypeTypeTransformer {
factory BackendTypeTypeTransformer() => _instance ??= const BackendTypeTypeTransformer._();
const BackendTypeTypeTransformer._();
String encode(BackendType data) => data.value;
/// Decodes a [dynamic value][data] to a BackendType.
///
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
///
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
/// and users are still using an old app with the old code.
BackendType? decode(dynamic data, {bool allowNull = true}) {
if (data != null) {
switch (data) {
case r'yucca': return BackendType.yucca;
case r'local': return BackendType.local;
case r's3': return BackendType.s3;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');
}
}
}
return null;
}
/// Singleton [BackendTypeTypeTransformer] instance.
static BackendTypeTypeTransformer? _instance;
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BackendsResponseDto {
/// Returns a new [BackendsResponseDto] instance.
BackendsResponseDto({
this.backends = const [],
});
List<BackendDto> backends;
@override
bool operator ==(Object other) => identical(this, other) || other is BackendsResponseDto &&
_deepEquality.equals(other.backends, backends);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backends.hashCode);
@override
String toString() => 'BackendsResponseDto[backends=$backends]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'backends'] = this.backends;
return json;
}
/// Returns a new [BackendsResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static BackendsResponseDto? fromJson(dynamic value) {
upgradeDto(value, "BackendsResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return BackendsResponseDto(
backends: BackendDto.listFromJson(json[r'backends']),
);
}
return null;
}
static List<BackendsResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <BackendsResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = BackendsResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, BackendsResponseDto> mapFromJson(dynamic json) {
final map = <String, BackendsResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = BackendsResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of BackendsResponseDto-objects as value to a dart map
static Map<String, List<BackendsResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<BackendsResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = BackendsResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'backends',
};
}

View File

@@ -0,0 +1,88 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class BootstrapStatus {
/// Instantiate a new enum with the provided [value].
const BootstrapStatus._(this.value);
/// The underlying value of this enum member.
final String value;
@override
String toString() => value;
String toJson() => value;
static const notReady = BootstrapStatus._(r'not-ready');
static const ready = BootstrapStatus._(r'ready');
static const error = BootstrapStatus._(r'error');
/// List of all possible values in this [enum][BootstrapStatus].
static const values = <BootstrapStatus>[
notReady,
ready,
error,
];
static BootstrapStatus? fromJson(dynamic value) => BootstrapStatusTypeTransformer().decode(value);
static List<BootstrapStatus> listFromJson(dynamic json, {bool growable = false,}) {
final result = <BootstrapStatus>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = BootstrapStatus.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
}
/// Transformation class that can [encode] an instance of [BootstrapStatus] to String,
/// and [decode] dynamic data back to [BootstrapStatus].
class BootstrapStatusTypeTransformer {
factory BootstrapStatusTypeTransformer() => _instance ??= const BootstrapStatusTypeTransformer._();
const BootstrapStatusTypeTransformer._();
String encode(BootstrapStatus data) => data.value;
/// Decodes a [dynamic value][data] to a BootstrapStatus.
///
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
///
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
/// and users are still using an old app with the old code.
BootstrapStatus? decode(dynamic data, {bool allowNull = true}) {
if (data != null) {
switch (data) {
case r'not-ready': return BootstrapStatus.notReady;
case r'ready': return BootstrapStatus.ready;
case r'error': return BootstrapStatus.error;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');
}
}
}
return null;
}
/// Singleton [BootstrapStatusTypeTransformer] instance.
static BootstrapStatusTypeTransformer? _instance;
}

View File

@@ -0,0 +1,151 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ConfigureImmichIntegrationRequestDto {
/// Returns a new [ConfigureImmichIntegrationRequestDto] instance.
ConfigureImmichIntegrationRequestDto({
required this.backupConfiguration,
required this.cron,
this.dataFolders = const [],
required this.libraries,
required this.name,
this.retentionPolicy = const Optional.absent(),
required this.worm,
});
bool backupConfiguration;
String cron;
List<String> dataFolders;
ConfigureImmichIntegrationRequestDtoLibraries libraries;
String name;
Optional<RetentionPolicyDto?> retentionPolicy;
bool worm;
@override
bool operator ==(Object other) => identical(this, other) || other is ConfigureImmichIntegrationRequestDto &&
other.backupConfiguration == backupConfiguration &&
other.cron == cron &&
_deepEquality.equals(other.dataFolders, dataFolders) &&
other.libraries == libraries &&
other.name == name &&
other.retentionPolicy == retentionPolicy &&
other.worm == worm;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backupConfiguration.hashCode) +
(cron.hashCode) +
(dataFolders.hashCode) +
(libraries.hashCode) +
(name.hashCode) +
(retentionPolicy == null ? 0 : retentionPolicy!.hashCode) +
(worm.hashCode);
@override
String toString() => 'ConfigureImmichIntegrationRequestDto[backupConfiguration=$backupConfiguration, cron=$cron, dataFolders=$dataFolders, libraries=$libraries, name=$name, retentionPolicy=$retentionPolicy, worm=$worm]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'backupConfiguration'] = this.backupConfiguration;
json[r'cron'] = this.cron;
json[r'dataFolders'] = this.dataFolders;
json[r'libraries'] = this.libraries;
json[r'name'] = this.name;
if (this.retentionPolicy.isPresent) {
final value = this.retentionPolicy.value;
json[r'retentionPolicy'] = value;
}
json[r'worm'] = this.worm;
return json;
}
/// Returns a new [ConfigureImmichIntegrationRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ConfigureImmichIntegrationRequestDto? fromJson(dynamic value) {
upgradeDto(value, "ConfigureImmichIntegrationRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ConfigureImmichIntegrationRequestDto(
backupConfiguration: mapValueOfType<bool>(json, r'backupConfiguration')!,
cron: mapValueOfType<String>(json, r'cron')!,
dataFolders: json[r'dataFolders'] is Iterable
? (json[r'dataFolders'] as Iterable).cast<String>().toList(growable: false)
: const [],
libraries: ConfigureImmichIntegrationRequestDtoLibraries.fromJson(json[r'libraries'])!,
name: mapValueOfType<String>(json, r'name')!,
retentionPolicy: json.containsKey(r'retentionPolicy') ? Optional.present(RetentionPolicyDto.fromJson(json[r'retentionPolicy'])) : const Optional.absent(),
worm: mapValueOfType<bool>(json, r'worm')!,
);
}
return null;
}
static List<ConfigureImmichIntegrationRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ConfigureImmichIntegrationRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ConfigureImmichIntegrationRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ConfigureImmichIntegrationRequestDto> mapFromJson(dynamic json) {
final map = <String, ConfigureImmichIntegrationRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ConfigureImmichIntegrationRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ConfigureImmichIntegrationRequestDto-objects as value to a dart map
static Map<String, List<ConfigureImmichIntegrationRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ConfigureImmichIntegrationRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ConfigureImmichIntegrationRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'backupConfiguration',
'cron',
'dataFolders',
'libraries',
'name',
'worm',
};
}

View File

@@ -0,0 +1,91 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ConfigureImmichIntegrationRequestDtoLibraries {
/// Returns a new [ConfigureImmichIntegrationRequestDtoLibraries] instance.
ConfigureImmichIntegrationRequestDtoLibraries({
});
@override
bool operator ==(Object other) => identical(this, other) || other is ConfigureImmichIntegrationRequestDtoLibraries &&
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
@override
String toString() => 'ConfigureImmichIntegrationRequestDtoLibraries[]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
return json;
}
/// Returns a new [ConfigureImmichIntegrationRequestDtoLibraries] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ConfigureImmichIntegrationRequestDtoLibraries? fromJson(dynamic value) {
upgradeDto(value, "ConfigureImmichIntegrationRequestDtoLibraries");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ConfigureImmichIntegrationRequestDtoLibraries(
);
}
return null;
}
static List<ConfigureImmichIntegrationRequestDtoLibraries> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ConfigureImmichIntegrationRequestDtoLibraries>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ConfigureImmichIntegrationRequestDtoLibraries.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ConfigureImmichIntegrationRequestDtoLibraries> mapFromJson(dynamic json) {
final map = <String, ConfigureImmichIntegrationRequestDtoLibraries>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ConfigureImmichIntegrationRequestDtoLibraries.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ConfigureImmichIntegrationRequestDtoLibraries-objects as value to a dart map
static Map<String, List<ConfigureImmichIntegrationRequestDtoLibraries>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ConfigureImmichIntegrationRequestDtoLibraries>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ConfigureImmichIntegrationRequestDtoLibraries.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class CreateLocalBackendRequestDto {
/// Returns a new [CreateLocalBackendRequestDto] instance.
CreateLocalBackendRequestDto({
required this.path,
});
String path;
@override
bool operator ==(Object other) => identical(this, other) || other is CreateLocalBackendRequestDto &&
other.path == path;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(path.hashCode);
@override
String toString() => 'CreateLocalBackendRequestDto[path=$path]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'path'] = this.path;
return json;
}
/// Returns a new [CreateLocalBackendRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static CreateLocalBackendRequestDto? fromJson(dynamic value) {
upgradeDto(value, "CreateLocalBackendRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return CreateLocalBackendRequestDto(
path: mapValueOfType<String>(json, r'path')!,
);
}
return null;
}
static List<CreateLocalBackendRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <CreateLocalBackendRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = CreateLocalBackendRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, CreateLocalBackendRequestDto> mapFromJson(dynamic json) {
final map = <String, CreateLocalBackendRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = CreateLocalBackendRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of CreateLocalBackendRequestDto-objects as value to a dart map
static Map<String, List<CreateLocalBackendRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<CreateLocalBackendRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = CreateLocalBackendRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'path',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class CurrentRecoveryKeyResponse {
/// Returns a new [CurrentRecoveryKeyResponse] instance.
CurrentRecoveryKeyResponse({
required this.recoveryKey,
});
String recoveryKey;
@override
bool operator ==(Object other) => identical(this, other) || other is CurrentRecoveryKeyResponse &&
other.recoveryKey == recoveryKey;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(recoveryKey.hashCode);
@override
String toString() => 'CurrentRecoveryKeyResponse[recoveryKey=$recoveryKey]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'recoveryKey'] = this.recoveryKey;
return json;
}
/// Returns a new [CurrentRecoveryKeyResponse] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static CurrentRecoveryKeyResponse? fromJson(dynamic value) {
upgradeDto(value, "CurrentRecoveryKeyResponse");
if (value is Map) {
final json = value.cast<String, dynamic>();
return CurrentRecoveryKeyResponse(
recoveryKey: mapValueOfType<String>(json, r'recoveryKey')!,
);
}
return null;
}
static List<CurrentRecoveryKeyResponse> listFromJson(dynamic json, {bool growable = false,}) {
final result = <CurrentRecoveryKeyResponse>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = CurrentRecoveryKeyResponse.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, CurrentRecoveryKeyResponse> mapFromJson(dynamic json) {
final map = <String, CurrentRecoveryKeyResponse>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = CurrentRecoveryKeyResponse.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of CurrentRecoveryKeyResponse-objects as value to a dart map
static Map<String, List<CurrentRecoveryKeyResponse>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<CurrentRecoveryKeyResponse>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = CurrentRecoveryKeyResponse.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'recoveryKey',
};
}

View File

@@ -0,0 +1,107 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class DeviceFlowResponseDto {
/// Returns a new [DeviceFlowResponseDto] instance.
DeviceFlowResponseDto({
required this.userCode,
required this.verificationUri,
});
String userCode;
String verificationUri;
@override
bool operator ==(Object other) => identical(this, other) || other is DeviceFlowResponseDto &&
other.userCode == userCode &&
other.verificationUri == verificationUri;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(userCode.hashCode) +
(verificationUri.hashCode);
@override
String toString() => 'DeviceFlowResponseDto[userCode=$userCode, verificationUri=$verificationUri]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'userCode'] = this.userCode;
json[r'verificationUri'] = this.verificationUri;
return json;
}
/// Returns a new [DeviceFlowResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static DeviceFlowResponseDto? fromJson(dynamic value) {
upgradeDto(value, "DeviceFlowResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return DeviceFlowResponseDto(
userCode: mapValueOfType<String>(json, r'userCode')!,
verificationUri: mapValueOfType<String>(json, r'verificationUri')!,
);
}
return null;
}
static List<DeviceFlowResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <DeviceFlowResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = DeviceFlowResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, DeviceFlowResponseDto> mapFromJson(dynamic json) {
final map = <String, DeviceFlowResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = DeviceFlowResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of DeviceFlowResponseDto-objects as value to a dart map
static Map<String, List<DeviceFlowResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<DeviceFlowResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = DeviceFlowResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'userCode',
'verificationUri',
};
}

View File

@@ -0,0 +1,107 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class FilesystemListingItemDto {
/// Returns a new [FilesystemListingItemDto] instance.
FilesystemListingItemDto({
required this.isDirectory,
required this.path,
});
bool isDirectory;
String path;
@override
bool operator ==(Object other) => identical(this, other) || other is FilesystemListingItemDto &&
other.isDirectory == isDirectory &&
other.path == path;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(isDirectory.hashCode) +
(path.hashCode);
@override
String toString() => 'FilesystemListingItemDto[isDirectory=$isDirectory, path=$path]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'isDirectory'] = this.isDirectory;
json[r'path'] = this.path;
return json;
}
/// Returns a new [FilesystemListingItemDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static FilesystemListingItemDto? fromJson(dynamic value) {
upgradeDto(value, "FilesystemListingItemDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return FilesystemListingItemDto(
isDirectory: mapValueOfType<bool>(json, r'isDirectory')!,
path: mapValueOfType<String>(json, r'path')!,
);
}
return null;
}
static List<FilesystemListingItemDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <FilesystemListingItemDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = FilesystemListingItemDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, FilesystemListingItemDto> mapFromJson(dynamic json) {
final map = <String, FilesystemListingItemDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = FilesystemListingItemDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of FilesystemListingItemDto-objects as value to a dart map
static Map<String, List<FilesystemListingItemDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<FilesystemListingItemDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = FilesystemListingItemDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'isDirectory',
'path',
};
}

View File

@@ -0,0 +1,115 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class FilesystemListingResponseDto {
/// Returns a new [FilesystemListingResponseDto] instance.
FilesystemListingResponseDto({
this.items = const [],
required this.parent,
required this.path,
});
List<FilesystemListingItemDto> items;
String parent;
String path;
@override
bool operator ==(Object other) => identical(this, other) || other is FilesystemListingResponseDto &&
_deepEquality.equals(other.items, items) &&
other.parent == parent &&
other.path == path;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(items.hashCode) +
(parent.hashCode) +
(path.hashCode);
@override
String toString() => 'FilesystemListingResponseDto[items=$items, parent=$parent, path=$path]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'items'] = this.items;
json[r'parent'] = this.parent;
json[r'path'] = this.path;
return json;
}
/// Returns a new [FilesystemListingResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static FilesystemListingResponseDto? fromJson(dynamic value) {
upgradeDto(value, "FilesystemListingResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return FilesystemListingResponseDto(
items: FilesystemListingItemDto.listFromJson(json[r'items']),
parent: mapValueOfType<String>(json, r'parent')!,
path: mapValueOfType<String>(json, r'path')!,
);
}
return null;
}
static List<FilesystemListingResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <FilesystemListingResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = FilesystemListingResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, FilesystemListingResponseDto> mapFromJson(dynamic json) {
final map = <String, FilesystemListingResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = FilesystemListingResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of FilesystemListingResponseDto-objects as value to a dart map
static Map<String, List<FilesystemListingResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<FilesystemListingResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = FilesystemListingResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'items',
'parent',
'path',
};
}

View File

@@ -0,0 +1,117 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ImmichIntegrationConfigurationDto {
/// Returns a new [ImmichIntegrationConfigurationDto] instance.
ImmichIntegrationConfigurationDto({
required this.backupConfiguration,
this.dataFolders = const [],
required this.libraries,
});
bool backupConfiguration;
List<String> dataFolders;
ConfigureImmichIntegrationRequestDtoLibraries libraries;
@override
bool operator ==(Object other) => identical(this, other) || other is ImmichIntegrationConfigurationDto &&
other.backupConfiguration == backupConfiguration &&
_deepEquality.equals(other.dataFolders, dataFolders) &&
other.libraries == libraries;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backupConfiguration.hashCode) +
(dataFolders.hashCode) +
(libraries.hashCode);
@override
String toString() => 'ImmichIntegrationConfigurationDto[backupConfiguration=$backupConfiguration, dataFolders=$dataFolders, libraries=$libraries]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'backupConfiguration'] = this.backupConfiguration;
json[r'dataFolders'] = this.dataFolders;
json[r'libraries'] = this.libraries;
return json;
}
/// Returns a new [ImmichIntegrationConfigurationDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ImmichIntegrationConfigurationDto? fromJson(dynamic value) {
upgradeDto(value, "ImmichIntegrationConfigurationDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ImmichIntegrationConfigurationDto(
backupConfiguration: mapValueOfType<bool>(json, r'backupConfiguration')!,
dataFolders: json[r'dataFolders'] is Iterable
? (json[r'dataFolders'] as Iterable).cast<String>().toList(growable: false)
: const [],
libraries: ConfigureImmichIntegrationRequestDtoLibraries.fromJson(json[r'libraries'])!,
);
}
return null;
}
static List<ImmichIntegrationConfigurationDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ImmichIntegrationConfigurationDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ImmichIntegrationConfigurationDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ImmichIntegrationConfigurationDto> mapFromJson(dynamic json) {
final map = <String, ImmichIntegrationConfigurationDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ImmichIntegrationConfigurationDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ImmichIntegrationConfigurationDto-objects as value to a dart map
static Map<String, List<ImmichIntegrationConfigurationDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ImmichIntegrationConfigurationDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ImmichIntegrationConfigurationDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'backupConfiguration',
'dataFolders',
'libraries',
};
}

View File

@@ -0,0 +1,115 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ImmichIntegrationDto {
/// Returns a new [ImmichIntegrationDto] instance.
ImmichIntegrationDto({
required this.configuration,
required this.id,
required this.scheduleId,
});
ImmichIntegrationConfigurationDto configuration;
String id;
String scheduleId;
@override
bool operator ==(Object other) => identical(this, other) || other is ImmichIntegrationDto &&
other.configuration == configuration &&
other.id == id &&
other.scheduleId == scheduleId;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(configuration.hashCode) +
(id.hashCode) +
(scheduleId.hashCode);
@override
String toString() => 'ImmichIntegrationDto[configuration=$configuration, id=$id, scheduleId=$scheduleId]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'configuration'] = this.configuration;
json[r'id'] = this.id;
json[r'scheduleId'] = this.scheduleId;
return json;
}
/// Returns a new [ImmichIntegrationDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ImmichIntegrationDto? fromJson(dynamic value) {
upgradeDto(value, "ImmichIntegrationDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ImmichIntegrationDto(
configuration: ImmichIntegrationConfigurationDto.fromJson(json[r'configuration'])!,
id: mapValueOfType<String>(json, r'id')!,
scheduleId: mapValueOfType<String>(json, r'scheduleId')!,
);
}
return null;
}
static List<ImmichIntegrationDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ImmichIntegrationDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ImmichIntegrationDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ImmichIntegrationDto> mapFromJson(dynamic json) {
final map = <String, ImmichIntegrationDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ImmichIntegrationDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ImmichIntegrationDto-objects as value to a dart map
static Map<String, List<ImmichIntegrationDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ImmichIntegrationDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ImmichIntegrationDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'configuration',
'id',
'scheduleId',
};
}

View File

@@ -0,0 +1,127 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ImmichLibraryDto {
/// Returns a new [ImmichLibraryDto] instance.
ImmichLibraryDto({
this.exclusionPatterns = const [],
required this.id,
this.importPaths = const [],
required this.name,
});
List<String> exclusionPatterns;
String id;
List<String> importPaths;
String name;
@override
bool operator ==(Object other) => identical(this, other) || other is ImmichLibraryDto &&
_deepEquality.equals(other.exclusionPatterns, exclusionPatterns) &&
other.id == id &&
_deepEquality.equals(other.importPaths, importPaths) &&
other.name == name;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(exclusionPatterns.hashCode) +
(id.hashCode) +
(importPaths.hashCode) +
(name.hashCode);
@override
String toString() => 'ImmichLibraryDto[exclusionPatterns=$exclusionPatterns, id=$id, importPaths=$importPaths, name=$name]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'exclusionPatterns'] = this.exclusionPatterns;
json[r'id'] = this.id;
json[r'importPaths'] = this.importPaths;
json[r'name'] = this.name;
return json;
}
/// Returns a new [ImmichLibraryDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ImmichLibraryDto? fromJson(dynamic value) {
upgradeDto(value, "ImmichLibraryDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ImmichLibraryDto(
exclusionPatterns: json[r'exclusionPatterns'] is Iterable
? (json[r'exclusionPatterns'] as Iterable).cast<String>().toList(growable: false)
: const [],
id: mapValueOfType<String>(json, r'id')!,
importPaths: json[r'importPaths'] is Iterable
? (json[r'importPaths'] as Iterable).cast<String>().toList(growable: false)
: const [],
name: mapValueOfType<String>(json, r'name')!,
);
}
return null;
}
static List<ImmichLibraryDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ImmichLibraryDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ImmichLibraryDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ImmichLibraryDto> mapFromJson(dynamic json) {
final map = <String, ImmichLibraryDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ImmichLibraryDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ImmichLibraryDto-objects as value to a dart map
static Map<String, List<ImmichLibraryDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ImmichLibraryDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ImmichLibraryDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'exclusionPatterns',
'id',
'importPaths',
'name',
};
}

View File

@@ -0,0 +1,117 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ImmichStateDto {
/// Returns a new [ImmichStateDto] instance.
ImmichStateDto({
this.dataFolders = const [],
required this.dataPath,
this.libraries = const [],
});
List<String> dataFolders;
String dataPath;
List<ImmichLibraryDto> libraries;
@override
bool operator ==(Object other) => identical(this, other) || other is ImmichStateDto &&
_deepEquality.equals(other.dataFolders, dataFolders) &&
other.dataPath == dataPath &&
_deepEquality.equals(other.libraries, libraries);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(dataFolders.hashCode) +
(dataPath.hashCode) +
(libraries.hashCode);
@override
String toString() => 'ImmichStateDto[dataFolders=$dataFolders, dataPath=$dataPath, libraries=$libraries]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'dataFolders'] = this.dataFolders;
json[r'dataPath'] = this.dataPath;
json[r'libraries'] = this.libraries;
return json;
}
/// Returns a new [ImmichStateDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ImmichStateDto? fromJson(dynamic value) {
upgradeDto(value, "ImmichStateDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ImmichStateDto(
dataFolders: json[r'dataFolders'] is Iterable
? (json[r'dataFolders'] as Iterable).cast<String>().toList(growable: false)
: const [],
dataPath: mapValueOfType<String>(json, r'dataPath')!,
libraries: ImmichLibraryDto.listFromJson(json[r'libraries']),
);
}
return null;
}
static List<ImmichStateDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ImmichStateDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ImmichStateDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ImmichStateDto> mapFromJson(dynamic json) {
final map = <String, ImmichStateDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ImmichStateDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ImmichStateDto-objects as value to a dart map
static Map<String, List<ImmichStateDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ImmichStateDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ImmichStateDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'dataFolders',
'dataPath',
'libraries',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ImportRecoveryKeyRequest {
/// Returns a new [ImportRecoveryKeyRequest] instance.
ImportRecoveryKeyRequest({
required this.recoveryKey,
});
String recoveryKey;
@override
bool operator ==(Object other) => identical(this, other) || other is ImportRecoveryKeyRequest &&
other.recoveryKey == recoveryKey;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(recoveryKey.hashCode);
@override
String toString() => 'ImportRecoveryKeyRequest[recoveryKey=$recoveryKey]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'recoveryKey'] = this.recoveryKey;
return json;
}
/// Returns a new [ImportRecoveryKeyRequest] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ImportRecoveryKeyRequest? fromJson(dynamic value) {
upgradeDto(value, "ImportRecoveryKeyRequest");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ImportRecoveryKeyRequest(
recoveryKey: mapValueOfType<String>(json, r'recoveryKey')!,
);
}
return null;
}
static List<ImportRecoveryKeyRequest> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ImportRecoveryKeyRequest>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ImportRecoveryKeyRequest.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ImportRecoveryKeyRequest> mapFromJson(dynamic json) {
final map = <String, ImportRecoveryKeyRequest>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ImportRecoveryKeyRequest.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ImportRecoveryKeyRequest-objects as value to a dart map
static Map<String, List<ImportRecoveryKeyRequest>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ImportRecoveryKeyRequest>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ImportRecoveryKeyRequest.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'recoveryKey',
};
}

View File

@@ -0,0 +1,179 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class InspectedLocalRepositoryDto {
/// Returns a new [InspectedLocalRepositoryDto] instance.
InspectedLocalRepositoryDto({
this.backends = const Optional.absent(),
this.configuration = const Optional.absent(),
required this.id,
this.meter = const Optional.absent(),
required this.metrics,
required this.name,
this.snapshots = const [],
required this.worm,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryBackendsDto?> backends;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryConfigurationDto?> configuration;
String id;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryMeterDto?> meter;
RepositoryMetricsDto metrics;
String name;
List<SnapshotDto> snapshots;
bool worm;
@override
bool operator ==(Object other) => identical(this, other) || other is InspectedLocalRepositoryDto &&
other.backends == backends &&
other.configuration == configuration &&
other.id == id &&
other.meter == meter &&
other.metrics == metrics &&
other.name == name &&
_deepEquality.equals(other.snapshots, snapshots) &&
other.worm == worm;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backends == null ? 0 : backends!.hashCode) +
(configuration == null ? 0 : configuration!.hashCode) +
(id.hashCode) +
(meter == null ? 0 : meter!.hashCode) +
(metrics.hashCode) +
(name.hashCode) +
(snapshots.hashCode) +
(worm.hashCode);
@override
String toString() => 'InspectedLocalRepositoryDto[backends=$backends, configuration=$configuration, id=$id, meter=$meter, metrics=$metrics, name=$name, snapshots=$snapshots, worm=$worm]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.backends.isPresent) {
final value = this.backends.value;
json[r'backends'] = value;
}
if (this.configuration.isPresent) {
final value = this.configuration.value;
json[r'configuration'] = value;
}
json[r'id'] = this.id;
if (this.meter.isPresent) {
final value = this.meter.value;
json[r'meter'] = value;
}
json[r'metrics'] = this.metrics;
json[r'name'] = this.name;
json[r'snapshots'] = this.snapshots;
json[r'worm'] = this.worm;
return json;
}
/// Returns a new [InspectedLocalRepositoryDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static InspectedLocalRepositoryDto? fromJson(dynamic value) {
upgradeDto(value, "InspectedLocalRepositoryDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return InspectedLocalRepositoryDto(
backends: json.containsKey(r'backends') ? Optional.present(RepositoryBackendsDto.fromJson(json[r'backends'])) : const Optional.absent(),
configuration: json.containsKey(r'configuration') ? Optional.present(RepositoryConfigurationDto.fromJson(json[r'configuration'])) : const Optional.absent(),
id: mapValueOfType<String>(json, r'id')!,
meter: json.containsKey(r'meter') ? Optional.present(RepositoryMeterDto.fromJson(json[r'meter'])) : const Optional.absent(),
metrics: RepositoryMetricsDto.fromJson(json[r'metrics'])!,
name: mapValueOfType<String>(json, r'name')!,
snapshots: SnapshotDto.listFromJson(json[r'snapshots']),
worm: mapValueOfType<bool>(json, r'worm')!,
);
}
return null;
}
static List<InspectedLocalRepositoryDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <InspectedLocalRepositoryDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = InspectedLocalRepositoryDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, InspectedLocalRepositoryDto> mapFromJson(dynamic json) {
final map = <String, InspectedLocalRepositoryDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = InspectedLocalRepositoryDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of InspectedLocalRepositoryDto-objects as value to a dart map
static Map<String, List<InspectedLocalRepositoryDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<InspectedLocalRepositoryDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = InspectedLocalRepositoryDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'id',
'metrics',
'name',
'snapshots',
'worm',
};
}

View File

@@ -0,0 +1,123 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class IntegrationsResponseDto {
/// Returns a new [IntegrationsResponseDto] instance.
IntegrationsResponseDto({
this.immichIntegration = const Optional.absent(),
this.immichState = const Optional.absent(),
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<ImmichIntegrationDto?> immichIntegration;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<ImmichStateDto?> immichState;
@override
bool operator ==(Object other) => identical(this, other) || other is IntegrationsResponseDto &&
other.immichIntegration == immichIntegration &&
other.immichState == immichState;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(immichIntegration == null ? 0 : immichIntegration!.hashCode) +
(immichState == null ? 0 : immichState!.hashCode);
@override
String toString() => 'IntegrationsResponseDto[immichIntegration=$immichIntegration, immichState=$immichState]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.immichIntegration.isPresent) {
final value = this.immichIntegration.value;
json[r'immichIntegration'] = value;
}
if (this.immichState.isPresent) {
final value = this.immichState.value;
json[r'immichState'] = value;
}
return json;
}
/// Returns a new [IntegrationsResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static IntegrationsResponseDto? fromJson(dynamic value) {
upgradeDto(value, "IntegrationsResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return IntegrationsResponseDto(
immichIntegration: json.containsKey(r'immichIntegration') ? Optional.present(ImmichIntegrationDto.fromJson(json[r'immichIntegration'])) : const Optional.absent(),
immichState: json.containsKey(r'immichState') ? Optional.present(ImmichStateDto.fromJson(json[r'immichState'])) : const Optional.absent(),
);
}
return null;
}
static List<IntegrationsResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <IntegrationsResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = IntegrationsResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, IntegrationsResponseDto> mapFromJson(dynamic json) {
final map = <String, IntegrationsResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = IntegrationsResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of IntegrationsResponseDto-objects as value to a dart map
static Map<String, List<IntegrationsResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<IntegrationsResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = IntegrationsResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class ListSnapshotsResponseDto {
/// Returns a new [ListSnapshotsResponseDto] instance.
ListSnapshotsResponseDto({
this.snapshots = const [],
});
List<SnapshotDto> snapshots;
@override
bool operator ==(Object other) => identical(this, other) || other is ListSnapshotsResponseDto &&
_deepEquality.equals(other.snapshots, snapshots);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(snapshots.hashCode);
@override
String toString() => 'ListSnapshotsResponseDto[snapshots=$snapshots]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'snapshots'] = this.snapshots;
return json;
}
/// Returns a new [ListSnapshotsResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static ListSnapshotsResponseDto? fromJson(dynamic value) {
upgradeDto(value, "ListSnapshotsResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return ListSnapshotsResponseDto(
snapshots: SnapshotDto.listFromJson(json[r'snapshots']),
);
}
return null;
}
static List<ListSnapshotsResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <ListSnapshotsResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = ListSnapshotsResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, ListSnapshotsResponseDto> mapFromJson(dynamic json) {
final map = <String, ListSnapshotsResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = ListSnapshotsResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of ListSnapshotsResponseDto-objects as value to a dart map
static Map<String, List<ListSnapshotsResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<ListSnapshotsResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = ListSnapshotsResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'snapshots',
};
}

View File

@@ -0,0 +1,171 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class LocalRepositoryDto {
/// Returns a new [LocalRepositoryDto] instance.
LocalRepositoryDto({
this.backends = const Optional.absent(),
this.configuration = const Optional.absent(),
required this.id,
this.meter = const Optional.absent(),
required this.metrics,
required this.name,
required this.worm,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryBackendsDto?> backends;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryConfigurationDto?> configuration;
String id;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<RepositoryMeterDto?> meter;
RepositoryMetricsDto metrics;
String name;
bool worm;
@override
bool operator ==(Object other) => identical(this, other) || other is LocalRepositoryDto &&
other.backends == backends &&
other.configuration == configuration &&
other.id == id &&
other.meter == meter &&
other.metrics == metrics &&
other.name == name &&
other.worm == worm;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backends == null ? 0 : backends!.hashCode) +
(configuration == null ? 0 : configuration!.hashCode) +
(id.hashCode) +
(meter == null ? 0 : meter!.hashCode) +
(metrics.hashCode) +
(name.hashCode) +
(worm.hashCode);
@override
String toString() => 'LocalRepositoryDto[backends=$backends, configuration=$configuration, id=$id, meter=$meter, metrics=$metrics, name=$name, worm=$worm]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.backends.isPresent) {
final value = this.backends.value;
json[r'backends'] = value;
}
if (this.configuration.isPresent) {
final value = this.configuration.value;
json[r'configuration'] = value;
}
json[r'id'] = this.id;
if (this.meter.isPresent) {
final value = this.meter.value;
json[r'meter'] = value;
}
json[r'metrics'] = this.metrics;
json[r'name'] = this.name;
json[r'worm'] = this.worm;
return json;
}
/// Returns a new [LocalRepositoryDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static LocalRepositoryDto? fromJson(dynamic value) {
upgradeDto(value, "LocalRepositoryDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return LocalRepositoryDto(
backends: json.containsKey(r'backends') ? Optional.present(RepositoryBackendsDto.fromJson(json[r'backends'])) : const Optional.absent(),
configuration: json.containsKey(r'configuration') ? Optional.present(RepositoryConfigurationDto.fromJson(json[r'configuration'])) : const Optional.absent(),
id: mapValueOfType<String>(json, r'id')!,
meter: json.containsKey(r'meter') ? Optional.present(RepositoryMeterDto.fromJson(json[r'meter'])) : const Optional.absent(),
metrics: RepositoryMetricsDto.fromJson(json[r'metrics'])!,
name: mapValueOfType<String>(json, r'name')!,
worm: mapValueOfType<bool>(json, r'worm')!,
);
}
return null;
}
static List<LocalRepositoryDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <LocalRepositoryDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = LocalRepositoryDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, LocalRepositoryDto> mapFromJson(dynamic json) {
final map = <String, LocalRepositoryDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = LocalRepositoryDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of LocalRepositoryDto-objects as value to a dart map
static Map<String, List<LocalRepositoryDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<LocalRepositoryDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = LocalRepositoryDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'id',
'metrics',
'name',
'worm',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class LogResponseDto {
/// Returns a new [LogResponseDto] instance.
LogResponseDto({
required this.logId,
});
String logId;
@override
bool operator ==(Object other) => identical(this, other) || other is LogResponseDto &&
other.logId == logId;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(logId.hashCode);
@override
String toString() => 'LogResponseDto[logId=$logId]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'logId'] = this.logId;
return json;
}
/// Returns a new [LogResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static LogResponseDto? fromJson(dynamic value) {
upgradeDto(value, "LogResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return LogResponseDto(
logId: mapValueOfType<String>(json, r'logId')!,
);
}
return null;
}
static List<LogResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <LogResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = LogResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, LogResponseDto> mapFromJson(dynamic json) {
final map = <String, LogResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = LogResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of LogResponseDto-objects as value to a dart map
static Map<String, List<LogResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<LogResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = LogResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'logId',
};
}

View File

@@ -0,0 +1,163 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class OnboardingStatusResponseDto {
/// Returns a new [OnboardingStatusResponseDto] instance.
OnboardingStatusResponseDto({
this.error = const Optional.absent(),
required this.hasBackend,
required this.hasBackup,
required this.hasOnboardedKey,
required this.hasSchedule,
required this.hasSkippedExtraConfig,
required this.hasTelemetry,
required this.status,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> error;
bool hasBackend;
bool hasBackup;
bool hasOnboardedKey;
bool hasSchedule;
bool hasSkippedExtraConfig;
TelemetryLevel hasTelemetry;
BootstrapStatus status;
@override
bool operator ==(Object other) => identical(this, other) || other is OnboardingStatusResponseDto &&
other.error == error &&
other.hasBackend == hasBackend &&
other.hasBackup == hasBackup &&
other.hasOnboardedKey == hasOnboardedKey &&
other.hasSchedule == hasSchedule &&
other.hasSkippedExtraConfig == hasSkippedExtraConfig &&
other.hasTelemetry == hasTelemetry &&
other.status == status;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(error == null ? 0 : error!.hashCode) +
(hasBackend.hashCode) +
(hasBackup.hashCode) +
(hasOnboardedKey.hashCode) +
(hasSchedule.hashCode) +
(hasSkippedExtraConfig.hashCode) +
(hasTelemetry.hashCode) +
(status.hashCode);
@override
String toString() => 'OnboardingStatusResponseDto[error=$error, hasBackend=$hasBackend, hasBackup=$hasBackup, hasOnboardedKey=$hasOnboardedKey, hasSchedule=$hasSchedule, hasSkippedExtraConfig=$hasSkippedExtraConfig, hasTelemetry=$hasTelemetry, status=$status]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.error.isPresent) {
final value = this.error.value;
json[r'error'] = value;
}
json[r'hasBackend'] = this.hasBackend;
json[r'hasBackup'] = this.hasBackup;
json[r'hasOnboardedKey'] = this.hasOnboardedKey;
json[r'hasSchedule'] = this.hasSchedule;
json[r'hasSkippedExtraConfig'] = this.hasSkippedExtraConfig;
json[r'hasTelemetry'] = this.hasTelemetry;
json[r'status'] = this.status;
return json;
}
/// Returns a new [OnboardingStatusResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static OnboardingStatusResponseDto? fromJson(dynamic value) {
upgradeDto(value, "OnboardingStatusResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return OnboardingStatusResponseDto(
error: json.containsKey(r'error') ? Optional.present(mapValueOfType<String>(json, r'error')) : const Optional.absent(),
hasBackend: mapValueOfType<bool>(json, r'hasBackend')!,
hasBackup: mapValueOfType<bool>(json, r'hasBackup')!,
hasOnboardedKey: mapValueOfType<bool>(json, r'hasOnboardedKey')!,
hasSchedule: mapValueOfType<bool>(json, r'hasSchedule')!,
hasSkippedExtraConfig: mapValueOfType<bool>(json, r'hasSkippedExtraConfig')!,
hasTelemetry: TelemetryLevel.fromJson(json[r'hasTelemetry'])!,
status: BootstrapStatus.fromJson(json[r'status'])!,
);
}
return null;
}
static List<OnboardingStatusResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <OnboardingStatusResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = OnboardingStatusResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, OnboardingStatusResponseDto> mapFromJson(dynamic json) {
final map = <String, OnboardingStatusResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = OnboardingStatusResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of OnboardingStatusResponseDto-objects as value to a dart map
static Map<String, List<OnboardingStatusResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<OnboardingStatusResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = OnboardingStatusResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'hasBackend',
'hasBackup',
'hasOnboardedKey',
'hasSchedule',
'hasSkippedExtraConfig',
'hasTelemetry',
'status',
};
}

View File

@@ -0,0 +1,115 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryBackendDto {
/// Returns a new [RepositoryBackendDto] instance.
RepositoryBackendDto({
required this.id,
required this.online,
required this.type,
});
String id;
bool online;
BackendType type;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryBackendDto &&
other.id == id &&
other.online == online &&
other.type == type;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(id.hashCode) +
(online.hashCode) +
(type.hashCode);
@override
String toString() => 'RepositoryBackendDto[id=$id, online=$online, type=$type]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'id'] = this.id;
json[r'online'] = this.online;
json[r'type'] = this.type;
return json;
}
/// Returns a new [RepositoryBackendDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryBackendDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryBackendDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryBackendDto(
id: mapValueOfType<String>(json, r'id')!,
online: mapValueOfType<bool>(json, r'online')!,
type: BackendType.fromJson(json[r'type'])!,
);
}
return null;
}
static List<RepositoryBackendDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryBackendDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryBackendDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryBackendDto> mapFromJson(dynamic json) {
final map = <String, RepositoryBackendDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryBackendDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryBackendDto-objects as value to a dart map
static Map<String, List<RepositoryBackendDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryBackendDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryBackendDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'id',
'online',
'type',
};
}

View File

@@ -0,0 +1,107 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryBackendsDto {
/// Returns a new [RepositoryBackendsDto] instance.
RepositoryBackendsDto({
required this.primary,
this.secondary = const [],
});
RepositoryBackendDto primary;
List<RepositoryBackendDto> secondary;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryBackendsDto &&
other.primary == primary &&
_deepEquality.equals(other.secondary, secondary);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(primary.hashCode) +
(secondary.hashCode);
@override
String toString() => 'RepositoryBackendsDto[primary=$primary, secondary=$secondary]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'primary'] = this.primary;
json[r'secondary'] = this.secondary;
return json;
}
/// Returns a new [RepositoryBackendsDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryBackendsDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryBackendsDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryBackendsDto(
primary: RepositoryBackendDto.fromJson(json[r'primary'])!,
secondary: RepositoryBackendDto.listFromJson(json[r'secondary']),
);
}
return null;
}
static List<RepositoryBackendsDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryBackendsDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryBackendsDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryBackendsDto> mapFromJson(dynamic json) {
final map = <String, RepositoryBackendsDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryBackendsDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryBackendsDto-objects as value to a dart map
static Map<String, List<RepositoryBackendsDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryBackendsDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryBackendsDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'primary',
'secondary',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryCheckImportResponseDto {
/// Returns a new [RepositoryCheckImportResponseDto] instance.
RepositoryCheckImportResponseDto({
required this.readable,
});
bool readable;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryCheckImportResponseDto &&
other.readable == readable;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(readable.hashCode);
@override
String toString() => 'RepositoryCheckImportResponseDto[readable=$readable]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'readable'] = this.readable;
return json;
}
/// Returns a new [RepositoryCheckImportResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryCheckImportResponseDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryCheckImportResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryCheckImportResponseDto(
readable: mapValueOfType<bool>(json, r'readable')!,
);
}
return null;
}
static List<RepositoryCheckImportResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryCheckImportResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryCheckImportResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryCheckImportResponseDto> mapFromJson(dynamic json) {
final map = <String, RepositoryCheckImportResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryCheckImportResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryCheckImportResponseDto-objects as value to a dart map
static Map<String, List<RepositoryCheckImportResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryCheckImportResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryCheckImportResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'readable',
};
}

View File

@@ -0,0 +1,111 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryConfigurationDto {
/// Returns a new [RepositoryConfigurationDto] instance.
RepositoryConfigurationDto({
this.paths = const [],
this.retentionPolicy = const Optional.absent(),
});
List<String> paths;
Optional<RetentionPolicyDto?> retentionPolicy;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryConfigurationDto &&
_deepEquality.equals(other.paths, paths) &&
other.retentionPolicy == retentionPolicy;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(paths.hashCode) +
(retentionPolicy == null ? 0 : retentionPolicy!.hashCode);
@override
String toString() => 'RepositoryConfigurationDto[paths=$paths, retentionPolicy=$retentionPolicy]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'paths'] = this.paths;
if (this.retentionPolicy.isPresent) {
final value = this.retentionPolicy.value;
json[r'retentionPolicy'] = value;
}
return json;
}
/// Returns a new [RepositoryConfigurationDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryConfigurationDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryConfigurationDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryConfigurationDto(
paths: json[r'paths'] is Iterable
? (json[r'paths'] as Iterable).cast<String>().toList(growable: false)
: const [],
retentionPolicy: json.containsKey(r'retentionPolicy') ? Optional.present(RetentionPolicyDto.fromJson(json[r'retentionPolicy'])) : const Optional.absent(),
);
}
return null;
}
static List<RepositoryConfigurationDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryConfigurationDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryConfigurationDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryConfigurationDto> mapFromJson(dynamic json) {
final map = <String, RepositoryConfigurationDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryConfigurationDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryConfigurationDto-objects as value to a dart map
static Map<String, List<RepositoryConfigurationDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryConfigurationDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryConfigurationDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'paths',
};
}

View File

@@ -0,0 +1,119 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryCreateRequestDto {
/// Returns a new [RepositoryCreateRequestDto] instance.
RepositoryCreateRequestDto({
required this.name,
this.paths = const Optional.present(const []),
required this.worm,
});
String name;
Optional<List<String>?> paths;
bool worm;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryCreateRequestDto &&
other.name == name &&
_deepEquality.equals(other.paths, paths) &&
other.worm == worm;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(name.hashCode) +
(paths.hashCode) +
(worm.hashCode);
@override
String toString() => 'RepositoryCreateRequestDto[name=$name, paths=$paths, worm=$worm]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'name'] = this.name;
if (this.paths.isPresent) {
final value = this.paths.value;
json[r'paths'] = value;
}
json[r'worm'] = this.worm;
return json;
}
/// Returns a new [RepositoryCreateRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryCreateRequestDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryCreateRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryCreateRequestDto(
name: mapValueOfType<String>(json, r'name')!,
paths: json.containsKey(r'paths') ? Optional.present(json[r'paths'] is Iterable
? (json[r'paths'] as Iterable).cast<String>().toList(growable: false)
: const []) : const Optional.absent(),
worm: mapValueOfType<bool>(json, r'worm')!,
);
}
return null;
}
static List<RepositoryCreateRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryCreateRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryCreateRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryCreateRequestDto> mapFromJson(dynamic json) {
final map = <String, RepositoryCreateRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryCreateRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryCreateRequestDto-objects as value to a dart map
static Map<String, List<RepositoryCreateRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryCreateRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryCreateRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'name',
'worm',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryCreateResponseDto {
/// Returns a new [RepositoryCreateResponseDto] instance.
RepositoryCreateResponseDto({
required this.repository,
});
LocalRepositoryDto repository;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryCreateResponseDto &&
other.repository == repository;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(repository.hashCode);
@override
String toString() => 'RepositoryCreateResponseDto[repository=$repository]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'repository'] = this.repository;
return json;
}
/// Returns a new [RepositoryCreateResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryCreateResponseDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryCreateResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryCreateResponseDto(
repository: LocalRepositoryDto.fromJson(json[r'repository'])!,
);
}
return null;
}
static List<RepositoryCreateResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryCreateResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryCreateResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryCreateResponseDto> mapFromJson(dynamic json) {
final map = <String, RepositoryCreateResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryCreateResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryCreateResponseDto-objects as value to a dart map
static Map<String, List<RepositoryCreateResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryCreateResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryCreateResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'repository',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryInspectResponseDto {
/// Returns a new [RepositoryInspectResponseDto] instance.
RepositoryInspectResponseDto({
this.repositories = const [],
});
List<InspectedLocalRepositoryDto> repositories;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryInspectResponseDto &&
_deepEquality.equals(other.repositories, repositories);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(repositories.hashCode);
@override
String toString() => 'RepositoryInspectResponseDto[repositories=$repositories]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'repositories'] = this.repositories;
return json;
}
/// Returns a new [RepositoryInspectResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryInspectResponseDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryInspectResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryInspectResponseDto(
repositories: InspectedLocalRepositoryDto.listFromJson(json[r'repositories']),
);
}
return null;
}
static List<RepositoryInspectResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryInspectResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryInspectResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryInspectResponseDto> mapFromJson(dynamic json) {
final map = <String, RepositoryInspectResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryInspectResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryInspectResponseDto-objects as value to a dart map
static Map<String, List<RepositoryInspectResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryInspectResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryInspectResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'repositories',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryListResponseDto {
/// Returns a new [RepositoryListResponseDto] instance.
RepositoryListResponseDto({
this.repositories = const [],
});
List<LocalRepositoryDto> repositories;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryListResponseDto &&
_deepEquality.equals(other.repositories, repositories);
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(repositories.hashCode);
@override
String toString() => 'RepositoryListResponseDto[repositories=$repositories]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'repositories'] = this.repositories;
return json;
}
/// Returns a new [RepositoryListResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryListResponseDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryListResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryListResponseDto(
repositories: LocalRepositoryDto.listFromJson(json[r'repositories']),
);
}
return null;
}
static List<RepositoryListResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryListResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryListResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryListResponseDto> mapFromJson(dynamic json) {
final map = <String, RepositoryListResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryListResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryListResponseDto-objects as value to a dart map
static Map<String, List<RepositoryListResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryListResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryListResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'repositories',
};
}

View File

@@ -0,0 +1,123 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryMeterDto {
/// Returns a new [RepositoryMeterDto] instance.
RepositoryMeterDto({
this.lastUpdated = const Optional.absent(),
required this.objectCount,
required this.sizeBytes,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> lastUpdated;
num objectCount;
num sizeBytes;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryMeterDto &&
other.lastUpdated == lastUpdated &&
other.objectCount == objectCount &&
other.sizeBytes == sizeBytes;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(lastUpdated == null ? 0 : lastUpdated!.hashCode) +
(objectCount.hashCode) +
(sizeBytes.hashCode);
@override
String toString() => 'RepositoryMeterDto[lastUpdated=$lastUpdated, objectCount=$objectCount, sizeBytes=$sizeBytes]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.lastUpdated.isPresent) {
final value = this.lastUpdated.value;
json[r'lastUpdated'] = value;
}
json[r'objectCount'] = this.objectCount;
json[r'sizeBytes'] = this.sizeBytes;
return json;
}
/// Returns a new [RepositoryMeterDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryMeterDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryMeterDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryMeterDto(
lastUpdated: json.containsKey(r'lastUpdated') ? Optional.present(mapValueOfType<String>(json, r'lastUpdated')) : const Optional.absent(),
objectCount: num.parse('${json[r'objectCount']}'),
sizeBytes: num.parse('${json[r'sizeBytes']}'),
);
}
return null;
}
static List<RepositoryMeterDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryMeterDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryMeterDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryMeterDto> mapFromJson(dynamic json) {
final map = <String, RepositoryMeterDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryMeterDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryMeterDto-objects as value to a dart map
static Map<String, List<RepositoryMeterDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryMeterDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryMeterDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'objectCount',
'sizeBytes',
};
}

View File

@@ -0,0 +1,147 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryMetricsDto {
/// Returns a new [RepositoryMetricsDto] instance.
RepositoryMetricsDto({
this.lastBackup = const Optional.absent(),
this.lastBackupDuration = const Optional.absent(),
this.lastSuccessfulBackup = const Optional.absent(),
required this.sizeBytes,
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> lastBackup;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<num?> lastBackupDuration;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> lastSuccessfulBackup;
num sizeBytes;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryMetricsDto &&
other.lastBackup == lastBackup &&
other.lastBackupDuration == lastBackupDuration &&
other.lastSuccessfulBackup == lastSuccessfulBackup &&
other.sizeBytes == sizeBytes;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(lastBackup == null ? 0 : lastBackup!.hashCode) +
(lastBackupDuration == null ? 0 : lastBackupDuration!.hashCode) +
(lastSuccessfulBackup == null ? 0 : lastSuccessfulBackup!.hashCode) +
(sizeBytes.hashCode);
@override
String toString() => 'RepositoryMetricsDto[lastBackup=$lastBackup, lastBackupDuration=$lastBackupDuration, lastSuccessfulBackup=$lastSuccessfulBackup, sizeBytes=$sizeBytes]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.lastBackup.isPresent) {
final value = this.lastBackup.value;
json[r'lastBackup'] = value;
}
if (this.lastBackupDuration.isPresent) {
final value = this.lastBackupDuration.value;
json[r'lastBackupDuration'] = value;
}
if (this.lastSuccessfulBackup.isPresent) {
final value = this.lastSuccessfulBackup.value;
json[r'lastSuccessfulBackup'] = value;
}
json[r'sizeBytes'] = this.sizeBytes;
return json;
}
/// Returns a new [RepositoryMetricsDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryMetricsDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryMetricsDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryMetricsDto(
lastBackup: json.containsKey(r'lastBackup') ? Optional.present(mapValueOfType<String>(json, r'lastBackup')) : const Optional.absent(),
lastBackupDuration: json.containsKey(r'lastBackupDuration') ? Optional.present(json[r'lastBackupDuration'] == null ? null : num.parse('${json[r'lastBackupDuration']}')) : const Optional.absent(),
lastSuccessfulBackup: json.containsKey(r'lastSuccessfulBackup') ? Optional.present(mapValueOfType<String>(json, r'lastSuccessfulBackup')) : const Optional.absent(),
sizeBytes: num.parse('${json[r'sizeBytes']}'),
);
}
return null;
}
static List<RepositoryMetricsDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryMetricsDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryMetricsDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryMetricsDto> mapFromJson(dynamic json) {
final map = <String, RepositoryMetricsDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryMetricsDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryMetricsDto-objects as value to a dart map
static Map<String, List<RepositoryMetricsDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryMetricsDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryMetricsDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'sizeBytes',
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryPrimaryBackendReconfigureRequestDto {
/// Returns a new [RepositoryPrimaryBackendReconfigureRequestDto] instance.
RepositoryPrimaryBackendReconfigureRequestDto({
required this.backendId,
});
String backendId;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryPrimaryBackendReconfigureRequestDto &&
other.backendId == backendId;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(backendId.hashCode);
@override
String toString() => 'RepositoryPrimaryBackendReconfigureRequestDto[backendId=$backendId]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'backendId'] = this.backendId;
return json;
}
/// Returns a new [RepositoryPrimaryBackendReconfigureRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryPrimaryBackendReconfigureRequestDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryPrimaryBackendReconfigureRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryPrimaryBackendReconfigureRequestDto(
backendId: mapValueOfType<String>(json, r'backendId')!,
);
}
return null;
}
static List<RepositoryPrimaryBackendReconfigureRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryPrimaryBackendReconfigureRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryPrimaryBackendReconfigureRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryPrimaryBackendReconfigureRequestDto> mapFromJson(dynamic json) {
final map = <String, RepositoryPrimaryBackendReconfigureRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryPrimaryBackendReconfigureRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryPrimaryBackendReconfigureRequestDto-objects as value to a dart map
static Map<String, List<RepositoryPrimaryBackendReconfigureRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryPrimaryBackendReconfigureRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryPrimaryBackendReconfigureRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'backendId',
};
}

View File

@@ -0,0 +1,119 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositorySnapshotRestoreFromPointRequestDto {
/// Returns a new [RepositorySnapshotRestoreFromPointRequestDto] instance.
RepositorySnapshotRestoreFromPointRequestDto({
this.include = const Optional.present(const []),
this.yuccaConfig = const Optional.absent(),
});
Optional<List<String>?> include;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> yuccaConfig;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositorySnapshotRestoreFromPointRequestDto &&
_deepEquality.equals(other.include, include) &&
other.yuccaConfig == yuccaConfig;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(include.hashCode) +
(yuccaConfig == null ? 0 : yuccaConfig!.hashCode);
@override
String toString() => 'RepositorySnapshotRestoreFromPointRequestDto[include=$include, yuccaConfig=$yuccaConfig]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.include.isPresent) {
final value = this.include.value;
json[r'include'] = value;
}
if (this.yuccaConfig.isPresent) {
final value = this.yuccaConfig.value;
json[r'yuccaConfig'] = value;
}
return json;
}
/// Returns a new [RepositorySnapshotRestoreFromPointRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositorySnapshotRestoreFromPointRequestDto? fromJson(dynamic value) {
upgradeDto(value, "RepositorySnapshotRestoreFromPointRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositorySnapshotRestoreFromPointRequestDto(
include: json.containsKey(r'include') ? Optional.present(json[r'include'] is Iterable
? (json[r'include'] as Iterable).cast<String>().toList(growable: false)
: const []) : const Optional.absent(),
yuccaConfig: json.containsKey(r'yuccaConfig') ? Optional.present(mapValueOfType<String>(json, r'yuccaConfig')) : const Optional.absent(),
);
}
return null;
}
static List<RepositorySnapshotRestoreFromPointRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositorySnapshotRestoreFromPointRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositorySnapshotRestoreFromPointRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositorySnapshotRestoreFromPointRequestDto> mapFromJson(dynamic json) {
final map = <String, RepositorySnapshotRestoreFromPointRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositorySnapshotRestoreFromPointRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositorySnapshotRestoreFromPointRequestDto-objects as value to a dart map
static Map<String, List<RepositorySnapshotRestoreFromPointRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositorySnapshotRestoreFromPointRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositorySnapshotRestoreFromPointRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -0,0 +1,119 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositorySnapshotRestoreRequestDto {
/// Returns a new [RepositorySnapshotRestoreRequestDto] instance.
RepositorySnapshotRestoreRequestDto({
this.include = const Optional.present(const []),
this.target = const Optional.absent(),
});
Optional<List<String>?> include;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> target;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositorySnapshotRestoreRequestDto &&
_deepEquality.equals(other.include, include) &&
other.target == target;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(include.hashCode) +
(target == null ? 0 : target!.hashCode);
@override
String toString() => 'RepositorySnapshotRestoreRequestDto[include=$include, target=$target]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.include.isPresent) {
final value = this.include.value;
json[r'include'] = value;
}
if (this.target.isPresent) {
final value = this.target.value;
json[r'target'] = value;
}
return json;
}
/// Returns a new [RepositorySnapshotRestoreRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositorySnapshotRestoreRequestDto? fromJson(dynamic value) {
upgradeDto(value, "RepositorySnapshotRestoreRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositorySnapshotRestoreRequestDto(
include: json.containsKey(r'include') ? Optional.present(json[r'include'] is Iterable
? (json[r'include'] as Iterable).cast<String>().toList(growable: false)
: const []) : const Optional.absent(),
target: json.containsKey(r'target') ? Optional.present(mapValueOfType<String>(json, r'target')) : const Optional.absent(),
);
}
return null;
}
static List<RepositorySnapshotRestoreRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositorySnapshotRestoreRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositorySnapshotRestoreRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositorySnapshotRestoreRequestDto> mapFromJson(dynamic json) {
final map = <String, RepositorySnapshotRestoreRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositorySnapshotRestoreRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositorySnapshotRestoreRequestDto-objects as value to a dart map
static Map<String, List<RepositorySnapshotRestoreRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositorySnapshotRestoreRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositorySnapshotRestoreRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -0,0 +1,129 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryUpdateRequestDto {
/// Returns a new [RepositoryUpdateRequestDto] instance.
RepositoryUpdateRequestDto({
this.name = const Optional.absent(),
this.paths = const Optional.present(const []),
this.retentionPolicy = const Optional.absent(),
});
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
Optional<String?> name;
Optional<List<String>?> paths;
Optional<RetentionPolicyDto?> retentionPolicy;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryUpdateRequestDto &&
other.name == name &&
_deepEquality.equals(other.paths, paths) &&
other.retentionPolicy == retentionPolicy;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(name == null ? 0 : name!.hashCode) +
(paths.hashCode) +
(retentionPolicy == null ? 0 : retentionPolicy!.hashCode);
@override
String toString() => 'RepositoryUpdateRequestDto[name=$name, paths=$paths, retentionPolicy=$retentionPolicy]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (this.name.isPresent) {
final value = this.name.value;
json[r'name'] = value;
}
if (this.paths.isPresent) {
final value = this.paths.value;
json[r'paths'] = value;
}
if (this.retentionPolicy.isPresent) {
final value = this.retentionPolicy.value;
json[r'retentionPolicy'] = value;
}
return json;
}
/// Returns a new [RepositoryUpdateRequestDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryUpdateRequestDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryUpdateRequestDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryUpdateRequestDto(
name: json.containsKey(r'name') ? Optional.present(mapValueOfType<String>(json, r'name')) : const Optional.absent(),
paths: json.containsKey(r'paths') ? Optional.present(json[r'paths'] is Iterable
? (json[r'paths'] as Iterable).cast<String>().toList(growable: false)
: const []) : const Optional.absent(),
retentionPolicy: json.containsKey(r'retentionPolicy') ? Optional.present(RetentionPolicyDto.fromJson(json[r'retentionPolicy'])) : const Optional.absent(),
);
}
return null;
}
static List<RepositoryUpdateRequestDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryUpdateRequestDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryUpdateRequestDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryUpdateRequestDto> mapFromJson(dynamic json) {
final map = <String, RepositoryUpdateRequestDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryUpdateRequestDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryUpdateRequestDto-objects as value to a dart map
static Map<String, List<RepositoryUpdateRequestDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryUpdateRequestDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryUpdateRequestDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
};
}

View File

@@ -0,0 +1,99 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class RepositoryUpdateResponseDto {
/// Returns a new [RepositoryUpdateResponseDto] instance.
RepositoryUpdateResponseDto({
required this.repository,
});
LocalRepositoryDto repository;
@override
bool operator ==(Object other) => identical(this, other) || other is RepositoryUpdateResponseDto &&
other.repository == repository;
@override
int get hashCode =>
// ignore: unnecessary_parenthesis
(repository.hashCode);
@override
String toString() => 'RepositoryUpdateResponseDto[repository=$repository]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
json[r'repository'] = this.repository;
return json;
}
/// Returns a new [RepositoryUpdateResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static RepositoryUpdateResponseDto? fromJson(dynamic value) {
upgradeDto(value, "RepositoryUpdateResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return RepositoryUpdateResponseDto(
repository: LocalRepositoryDto.fromJson(json[r'repository'])!,
);
}
return null;
}
static List<RepositoryUpdateResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <RepositoryUpdateResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = RepositoryUpdateResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
static Map<String, RepositoryUpdateResponseDto> mapFromJson(dynamic json) {
final map = <String, RepositoryUpdateResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = RepositoryUpdateResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
}
}
return map;
}
// maps a json object with a list of RepositoryUpdateResponseDto-objects as value to a dart map
static Map<String, List<RepositoryUpdateResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<RepositoryUpdateResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = RepositoryUpdateResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;
}
/// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{
'repository',
};
}

Some files were not shown because too many files have changed in this diff Show More