diff --git a/i18n/en.json b/i18n/en.json
index 94f6920745..9a3c5aa955 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -25,6 +25,7 @@
"add_photos": "Add photos",
"add_tag": "Add tag",
"add_to": "Add to…",
+ "confirm_delete_name": "Are you sure you want to delete {name}?",
"add_to_album": "Add to album",
"add_to_album_bottom_sheet_added": "Added to {album}",
"add_to_album_bottom_sheet_already_exists": "Already in {album}",
@@ -33,8 +34,10 @@
"added_to_archive": "Added to archive",
"added_to_favorites": "Added to favorites",
"added_to_favorites_count": "Added {count, number} to favorites",
+ "empty_group_message": "This group is empty",
"admin": {
"add_exclusion_pattern_description": "Add exclusion patterns. Globbing using *, **, and ? is supported. To ignore all files in any directory named \"Raw\", use \"**/Raw/**\". To ignore all files ending in \".tif\", use \"**/*.tif\". To ignore an absolute path, use \"/path/to/ignore/**\".",
+ "group_details": "Group Details",
"admin_user": "Admin User",
"asset_offline_description": "This external library asset is no longer found on disk and has been moved to trash. If the file was moved within the library, check your timeline for the new corresponding asset. To restore this asset, please ensure that the file path below can be accessed by Immich and scan the library.",
"authentication_settings": "Authentication Settings",
@@ -363,6 +366,7 @@
"user_delete_immediately_checkbox": "Queue user and assets for immediate deletion",
"user_details": "User Details",
"user_management": "User Management",
+ "group_management": "Group Management",
"user_password_has_been_reset": "The user's password has been reset:",
"user_password_reset_description": "Please provide the temporary password to the user and inform them they will need to change the password at their next login.",
"user_restore_description": "{user}'s account will be restored.",
@@ -429,6 +433,8 @@
"album_viewer_appbar_share_leave": "Leave album",
"album_viewer_appbar_share_to": "Share To",
"album_viewer_page_share_add_users": "Add users",
+ "edit_users": "Edit users",
+ "add_users": "Add users",
"album_with_link_access": "Let anyone with the link see photos and people in this album.",
"albums": "Albums",
"albums_count": "{count, plural, one {{count, number} Album} other {{count, number} Albums}}",
@@ -469,6 +475,9 @@
"asset_action_delete_err_read_only": "Cannot delete read only asset(s), skipping",
"asset_action_share_err_offline": "Cannot fetch offline asset(s), skipping",
"asset_added_to_album": "Added to album",
+ "group": "Group",
+ "group_users": "Group users",
+ "other_users": "Other users",
"asset_adding_to_album": "Adding to album…",
"asset_description_updated": "Asset description has been updated",
"asset_filename_is_offline": "Asset {filename} is offline",
@@ -721,11 +730,14 @@
"create_new_person": "Create new person",
"create_new_person_hint": "Assign selected assets to a new person",
"create_new_user": "Create new user",
+ "create_new_group": "Create new group",
+ "groups": "Groups",
"create_shared_album_page_share_add_assets": "ADD ASSETS",
"create_shared_album_page_share_select_photos": "Select Photos",
"create_tag": "Create tag",
"create_tag_description": "Create a new tag. For nested tags, please enter the full path of the tag including forward slashes.",
"create_user": "Create user",
+ "create_group": "Create group",
"created": "Created",
"created_at": "Created",
"crop": "Crop",
@@ -781,6 +793,7 @@
"delete_tag": "Delete tag",
"delete_tag_confirmation_prompt": "Are you sure you want to delete {tagName} tag?",
"delete_user": "Delete user",
+ "delete_group": "Delete group",
"deleted_shared_link": "Deleted shared link",
"deletes_missing_assets": "Deletes assets missing from disk",
"description": "Description",
@@ -850,6 +863,7 @@
"edit_tag": "Edit tag",
"edit_title": "Edit Title",
"edit_user": "Edit user",
+ "edit_group": "Edit group",
"edited": "Edited",
"editor": "Editor",
"editor_close_without_save_prompt": "The changes will not be saved",
@@ -937,6 +951,7 @@
"unable_to_create_api_key": "Unable to create a new API Key",
"unable_to_create_library": "Unable to create library",
"unable_to_create_user": "Unable to create user",
+ "unable_to_create_group": "Unable to create group",
"unable_to_delete_album": "Unable to delete album",
"unable_to_delete_asset": "Unable to delete asset",
"unable_to_delete_assets": "Error deleting assets",
@@ -995,6 +1010,7 @@
"unable_to_update_settings": "Unable to update settings",
"unable_to_update_timeline_display_status": "Unable to update timeline display status",
"unable_to_update_user": "Unable to update user",
+ "unable_to_update_group": "Unable to update group",
"unable_to_upload_file": "Unable to upload file"
},
"exif": "Exif",
@@ -2031,6 +2047,7 @@
"view_qr_code": "View QR code",
"view_stack": "View Stack",
"view_user": "View User",
+ "view_group": "View Group",
"viewer_remove_from_stack": "Remove from Stack",
"viewer_stack_use_as_main_asset": "Use as Main Asset",
"viewer_unstack": "Un-Stack",
diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md
index 058524479c..5b4d56b716 100644
--- a/mobile/openapi/README.md
+++ b/mobile/openapi/README.md
@@ -83,14 +83,18 @@ Class | Method | HTTP request | Description
*ActivitiesApi* | [**getActivities**](doc//ActivitiesApi.md#getactivities) | **GET** /activities |
*ActivitiesApi* | [**getActivityStatistics**](doc//ActivitiesApi.md#getactivitystatistics) | **GET** /activities/statistics |
*AlbumsApi* | [**addAssetsToAlbum**](doc//AlbumsApi.md#addassetstoalbum) | **PUT** /albums/{id}/assets |
+*AlbumsApi* | [**addGroupsToAlbum**](doc//AlbumsApi.md#addgroupstoalbum) | **PUT** /albums/{id}/groups |
*AlbumsApi* | [**addUsersToAlbum**](doc//AlbumsApi.md#adduserstoalbum) | **PUT** /albums/{id}/users |
*AlbumsApi* | [**createAlbum**](doc//AlbumsApi.md#createalbum) | **POST** /albums |
*AlbumsApi* | [**deleteAlbum**](doc//AlbumsApi.md#deletealbum) | **DELETE** /albums/{id} |
*AlbumsApi* | [**getAlbumInfo**](doc//AlbumsApi.md#getalbuminfo) | **GET** /albums/{id} |
*AlbumsApi* | [**getAlbumStatistics**](doc//AlbumsApi.md#getalbumstatistics) | **GET** /albums/statistics |
*AlbumsApi* | [**getAllAlbums**](doc//AlbumsApi.md#getallalbums) | **GET** /albums |
+*AlbumsApi* | [**getGroupsForAlbum**](doc//AlbumsApi.md#getgroupsforalbum) | **GET** /albums/{id}/groups |
*AlbumsApi* | [**removeAssetFromAlbum**](doc//AlbumsApi.md#removeassetfromalbum) | **DELETE** /albums/{id}/assets |
+*AlbumsApi* | [**removeGroupsFromAlbum**](doc//AlbumsApi.md#removegroupsfromalbum) | **DELETE** /albums/{id}/groups |
*AlbumsApi* | [**removeUserFromAlbum**](doc//AlbumsApi.md#removeuserfromalbum) | **DELETE** /albums/{id}/user/{userId} |
+*AlbumsApi* | [**updateAlbumGroup**](doc//AlbumsApi.md#updatealbumgroup) | **PUT** /albums/{id}/groups/{groupId} |
*AlbumsApi* | [**updateAlbumInfo**](doc//AlbumsApi.md#updatealbuminfo) | **PATCH** /albums/{id} |
*AlbumsApi* | [**updateAlbumUser**](doc//AlbumsApi.md#updatealbumuser) | **PUT** /albums/{id}/user/{userId} |
*AssetsApi* | [**checkBulkUpload**](doc//AssetsApi.md#checkbulkupload) | **POST** /assets/bulk-upload-check | checkBulkUpload
@@ -129,6 +133,19 @@ Class | Method | HTTP request | Description
*FacesApi* | [**deleteFace**](doc//FacesApi.md#deleteface) | **DELETE** /faces/{id} |
*FacesApi* | [**getFaces**](doc//FacesApi.md#getfaces) | **GET** /faces |
*FacesApi* | [**reassignFacesById**](doc//FacesApi.md#reassignfacesbyid) | **PUT** /faces/{id} |
+*GroupsApi* | [**getMyGroup**](doc//GroupsApi.md#getmygroup) | **GET** /groups/{id} |
+*GroupsApi* | [**getMyGroupUsers**](doc//GroupsApi.md#getmygroupusers) | **GET** /groups/{id}/users |
+*GroupsApi* | [**leaveMyGroup**](doc//GroupsApi.md#leavemygroup) | **DELETE** /groups/{id} |
+*GroupsApi* | [**searchMyGroups**](doc//GroupsApi.md#searchmygroups) | **GET** /groups |
+*GroupsAdminApi* | [**addUsersToGroupAdmin**](doc//GroupsAdminApi.md#adduserstogroupadmin) | **PUT** /admin/groups/{id}/users |
+*GroupsAdminApi* | [**createGroupAdmin**](doc//GroupsAdminApi.md#creategroupadmin) | **POST** /admin/groups |
+*GroupsAdminApi* | [**deleteGroupAdmin**](doc//GroupsAdminApi.md#deletegroupadmin) | **DELETE** /admin/groups/{id} |
+*GroupsAdminApi* | [**getGroupAdmin**](doc//GroupsAdminApi.md#getgroupadmin) | **GET** /admin/groups/{id} |
+*GroupsAdminApi* | [**getUsersForGroupAdmin**](doc//GroupsAdminApi.md#getusersforgroupadmin) | **GET** /admin/groups/{id}/users |
+*GroupsAdminApi* | [**removeUserFromGroupAdmin**](doc//GroupsAdminApi.md#removeuserfromgroupadmin) | **DELETE** /admin/groups/{id}/user/{userId} |
+*GroupsAdminApi* | [**removeUsersFromGroupAdmin**](doc//GroupsAdminApi.md#removeusersfromgroupadmin) | **DELETE** /admin/groups/{id}/user |
+*GroupsAdminApi* | [**searchGroupsAdmin**](doc//GroupsAdminApi.md#searchgroupsadmin) | **GET** /admin/groups |
+*GroupsAdminApi* | [**updateGroupAdmin**](doc//GroupsAdminApi.md#updategroupadmin) | **PUT** /admin/groups/{id} |
*JobsApi* | [**createJob**](doc//JobsApi.md#createjob) | **POST** /jobs |
*JobsApi* | [**getAllJobsStatus**](doc//JobsApi.md#getalljobsstatus) | **GET** /jobs |
*JobsApi* | [**sendJobCommand**](doc//JobsApi.md#sendjobcommand) | **PUT** /jobs/{id} |
@@ -292,6 +309,12 @@ Class | Method | HTTP request | Description
- [ActivityStatisticsResponseDto](doc//ActivityStatisticsResponseDto.md)
- [AddUsersDto](doc//AddUsersDto.md)
- [AdminOnboardingUpdateDto](doc//AdminOnboardingUpdateDto.md)
+ - [AlbumGroupCreateAllDto](doc//AlbumGroupCreateAllDto.md)
+ - [AlbumGroupDeleteAllDto](doc//AlbumGroupDeleteAllDto.md)
+ - [AlbumGroupDto](doc//AlbumGroupDto.md)
+ - [AlbumGroupMetadata](doc//AlbumGroupMetadata.md)
+ - [AlbumGroupResponseDto](doc//AlbumGroupResponseDto.md)
+ - [AlbumGroupUpdateDto](doc//AlbumGroupUpdateDto.md)
- [AlbumResponseDto](doc//AlbumResponseDto.md)
- [AlbumStatisticsResponseDto](doc//AlbumStatisticsResponseDto.md)
- [AlbumUserAddDto](doc//AlbumUserAddDto.md)
@@ -360,6 +383,15 @@ Class | Method | HTTP request | Description
- [FacialRecognitionConfig](doc//FacialRecognitionConfig.md)
- [FoldersResponse](doc//FoldersResponse.md)
- [FoldersUpdate](doc//FoldersUpdate.md)
+ - [GroupAdminCreateDto](doc//GroupAdminCreateDto.md)
+ - [GroupAdminResponseDto](doc//GroupAdminResponseDto.md)
+ - [GroupAdminUpdateDto](doc//GroupAdminUpdateDto.md)
+ - [GroupResponseDto](doc//GroupResponseDto.md)
+ - [GroupUserCreateAllDto](doc//GroupUserCreateAllDto.md)
+ - [GroupUserDeleteAllDto](doc//GroupUserDeleteAllDto.md)
+ - [GroupUserDto](doc//GroupUserDto.md)
+ - [GroupUserMetadata](doc//GroupUserMetadata.md)
+ - [GroupUserResponseDto](doc//GroupUserResponseDto.md)
- [ImageFormat](doc//ImageFormat.md)
- [JobCommand](doc//JobCommand.md)
- [JobCommandDto](doc//JobCommandDto.md)
diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart
index 8c1fa1a80a..dd63aea9d9 100644
--- a/mobile/openapi/lib/api.dart
+++ b/mobile/openapi/lib/api.dart
@@ -39,6 +39,8 @@ part 'api/deprecated_api.dart';
part 'api/download_api.dart';
part 'api/duplicates_api.dart';
part 'api/faces_api.dart';
+part 'api/groups_api.dart';
+part 'api/groups_admin_api.dart';
part 'api/jobs_api.dart';
part 'api/libraries_api.dart';
part 'api/map_api.dart';
@@ -72,6 +74,12 @@ part 'model/activity_response_dto.dart';
part 'model/activity_statistics_response_dto.dart';
part 'model/add_users_dto.dart';
part 'model/admin_onboarding_update_dto.dart';
+part 'model/album_group_create_all_dto.dart';
+part 'model/album_group_delete_all_dto.dart';
+part 'model/album_group_dto.dart';
+part 'model/album_group_metadata.dart';
+part 'model/album_group_response_dto.dart';
+part 'model/album_group_update_dto.dart';
part 'model/album_response_dto.dart';
part 'model/album_statistics_response_dto.dart';
part 'model/album_user_add_dto.dart';
@@ -140,6 +148,15 @@ part 'model/face_dto.dart';
part 'model/facial_recognition_config.dart';
part 'model/folders_response.dart';
part 'model/folders_update.dart';
+part 'model/group_admin_create_dto.dart';
+part 'model/group_admin_response_dto.dart';
+part 'model/group_admin_update_dto.dart';
+part 'model/group_response_dto.dart';
+part 'model/group_user_create_all_dto.dart';
+part 'model/group_user_delete_all_dto.dart';
+part 'model/group_user_dto.dart';
+part 'model/group_user_metadata.dart';
+part 'model/group_user_response_dto.dart';
part 'model/image_format.dart';
part 'model/job_command.dart';
part 'model/job_command_dto.dart';
diff --git a/mobile/openapi/lib/api/albums_api.dart b/mobile/openapi/lib/api/albums_api.dart
index 10674b894f..b78982d506 100644
--- a/mobile/openapi/lib/api/albums_api.dart
+++ b/mobile/openapi/lib/api/albums_api.dart
@@ -91,6 +91,66 @@ class AlbumsApi {
return null;
}
+ /// This endpoint requires the `albumGroup.create` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupCreateAllDto] albumGroupCreateAllDto (required):
+ Future addGroupsToAlbumWithHttpInfo(String id, AlbumGroupCreateAllDto albumGroupCreateAllDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/albums/{id}/groups'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = albumGroupCreateAllDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'PUT',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `albumGroup.create` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupCreateAllDto] albumGroupCreateAllDto (required):
+ Future?> addGroupsToAlbum(String id, AlbumGroupCreateAllDto albumGroupCreateAllDto,) async {
+ final response = await addGroupsToAlbumWithHttpInfo(id, albumGroupCreateAllDto,);
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
/// This endpoint requires the `albumUser.create` permission.
///
/// Note: This method returns the HTTP [Response].
@@ -432,6 +492,62 @@ class AlbumsApi {
return null;
}
+ /// This endpoint requires the `albumGroup.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getGroupsForAlbumWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/albums/{id}/groups'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `albumGroup.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future?> getGroupsForAlbum(String id,) async {
+ final response = await getGroupsForAlbumWithHttpInfo(id,);
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
/// This endpoint requires the `albumAsset.delete` permission.
///
/// Note: This method returns the HTTP [Response].
@@ -492,6 +608,55 @@ class AlbumsApi {
return null;
}
+ /// This endpoint requires the `albumGroup.delete` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupDeleteAllDto] albumGroupDeleteAllDto (required):
+ Future removeGroupsFromAlbumWithHttpInfo(String id, AlbumGroupDeleteAllDto albumGroupDeleteAllDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/albums/{id}/groups'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = albumGroupDeleteAllDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'DELETE',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `albumGroup.delete` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupDeleteAllDto] albumGroupDeleteAllDto (required):
+ Future removeGroupsFromAlbum(String id, AlbumGroupDeleteAllDto albumGroupDeleteAllDto,) async {
+ final response = await removeGroupsFromAlbumWithHttpInfo(id, albumGroupDeleteAllDto,);
+ if (response.statusCode >= HttpStatus.badRequest) {
+ throw ApiException(response.statusCode, await _decodeBodyBytes(response));
+ }
+ }
+
/// This endpoint requires the `albumUser.delete` permission.
///
/// Note: This method returns the HTTP [Response].
@@ -542,6 +707,68 @@ class AlbumsApi {
}
}
+ /// This endpoint requires the `albumGroup.update` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] groupId (required):
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupUpdateDto] albumGroupUpdateDto (required):
+ Future updateAlbumGroupWithHttpInfo(String groupId, String id, AlbumGroupUpdateDto albumGroupUpdateDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/albums/{id}/groups/{groupId}'
+ .replaceAll('{groupId}', groupId)
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = albumGroupUpdateDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'PUT',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `albumGroup.update` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] groupId (required):
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [AlbumGroupUpdateDto] albumGroupUpdateDto (required):
+ Future updateAlbumGroup(String groupId, String id, AlbumGroupUpdateDto albumGroupUpdateDto,) async {
+ final response = await updateAlbumGroupWithHttpInfo(groupId, id, albumGroupUpdateDto,);
+ 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), 'AlbumGroupResponseDto',) as AlbumGroupResponseDto;
+
+ }
+ return null;
+ }
+
/// This endpoint requires the `album.update` permission.
///
/// Note: This method returns the HTTP [Response].
diff --git a/mobile/openapi/lib/api/groups_admin_api.dart b/mobile/openapi/lib/api/groups_admin_api.dart
new file mode 100644
index 0000000000..bbb995da84
--- /dev/null
+++ b/mobile/openapi/lib/api/groups_admin_api.dart
@@ -0,0 +1,506 @@
+//
+// 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 GroupsAdminApi {
+ GroupsAdminApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
+
+ final ApiClient apiClient;
+
+ /// This endpoint is an admin-only route, and requires the `adminGroupUser.create` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupUserCreateAllDto] groupUserCreateAllDto (required):
+ Future addUsersToGroupAdminWithHttpInfo(String id, GroupUserCreateAllDto groupUserCreateAllDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}/users'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = groupUserCreateAllDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'PUT',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroupUser.create` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupUserCreateAllDto] groupUserCreateAllDto (required):
+ Future?> addUsersToGroupAdmin(String id, GroupUserCreateAllDto groupUserCreateAllDto,) async {
+ final response = await addUsersToGroupAdminWithHttpInfo(id, groupUserCreateAllDto,);
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.create` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [GroupAdminCreateDto] groupAdminCreateDto (required):
+ Future createGroupAdminWithHttpInfo(GroupAdminCreateDto groupAdminCreateDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups';
+
+ // ignore: prefer_final_locals
+ Object? postBody = groupAdminCreateDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'POST',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.create` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [GroupAdminCreateDto] groupAdminCreateDto (required):
+ Future createGroupAdmin(GroupAdminCreateDto groupAdminCreateDto,) async {
+ final response = await createGroupAdminWithHttpInfo(groupAdminCreateDto,);
+ 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), 'GroupAdminResponseDto',) as GroupAdminResponseDto;
+
+ }
+ return null;
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.delete` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future deleteGroupAdminWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'DELETE',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.delete` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future deleteGroupAdmin(String id,) async {
+ final response = await deleteGroupAdminWithHttpInfo(id,);
+ if (response.statusCode >= HttpStatus.badRequest) {
+ throw ApiException(response.statusCode, await _decodeBodyBytes(response));
+ }
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getGroupAdminWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getGroupAdmin(String id,) async {
+ final response = await getGroupAdminWithHttpInfo(id,);
+ 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), 'GroupAdminResponseDto',) as GroupAdminResponseDto;
+
+ }
+ return null;
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroupUser.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getUsersForGroupAdminWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}/users'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroupUser.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future?> getUsersForGroupAdmin(String id,) async {
+ final response = await getUsersForGroupAdminWithHttpInfo(id,);
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
+ /// This endpoint requires the `adminGroupUser.delete` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [String] userId (required):
+ Future removeUserFromGroupAdminWithHttpInfo(String id, String userId,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}/user/{userId}'
+ .replaceAll('{id}', id)
+ .replaceAll('{userId}', userId);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'DELETE',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `adminGroupUser.delete` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [String] userId (required):
+ Future removeUserFromGroupAdmin(String id, String userId,) async {
+ final response = await removeUserFromGroupAdminWithHttpInfo(id, userId,);
+ if (response.statusCode >= HttpStatus.badRequest) {
+ throw ApiException(response.statusCode, await _decodeBodyBytes(response));
+ }
+ }
+
+ /// This endpoint requires the `adminGroupUser.delete` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupUserDeleteAllDto] groupUserDeleteAllDto (required):
+ Future removeUsersFromGroupAdminWithHttpInfo(String id, GroupUserDeleteAllDto groupUserDeleteAllDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}/user'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = groupUserDeleteAllDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'DELETE',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `adminGroupUser.delete` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupUserDeleteAllDto] groupUserDeleteAllDto (required):
+ Future removeUsersFromGroupAdmin(String id, GroupUserDeleteAllDto groupUserDeleteAllDto,) async {
+ final response = await removeUsersFromGroupAdminWithHttpInfo(id, groupUserDeleteAllDto,);
+ if (response.statusCode >= HttpStatus.badRequest) {
+ throw ApiException(response.statusCode, await _decodeBodyBytes(response));
+ }
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id:
+ ///
+ /// * [String] userId:
+ Future searchGroupsAdminWithHttpInfo({ String? id, String? userId, }) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups';
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ if (id != null) {
+ queryParams.addAll(_queryParams('', 'id', id));
+ }
+ if (userId != null) {
+ queryParams.addAll(_queryParams('', 'userId', userId));
+ }
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id:
+ ///
+ /// * [String] userId:
+ Future?> searchGroupsAdmin({ String? id, String? userId, }) async {
+ final response = await searchGroupsAdminWithHttpInfo( id: id, userId: userId, );
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.update` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupAdminUpdateDto] groupAdminUpdateDto (required):
+ Future updateGroupAdminWithHttpInfo(String id, GroupAdminUpdateDto groupAdminUpdateDto,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/admin/groups/{id}'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody = groupAdminUpdateDto;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = ['application/json'];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'PUT',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `adminGroup.update` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ ///
+ /// * [GroupAdminUpdateDto] groupAdminUpdateDto (required):
+ Future updateGroupAdmin(String id, GroupAdminUpdateDto groupAdminUpdateDto,) async {
+ final response = await updateGroupAdminWithHttpInfo(id, groupAdminUpdateDto,);
+ 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), 'GroupAdminResponseDto',) as GroupAdminResponseDto;
+
+ }
+ return null;
+ }
+}
diff --git a/mobile/openapi/lib/api/groups_api.dart b/mobile/openapi/lib/api/groups_api.dart
new file mode 100644
index 0000000000..8645fde6bf
--- /dev/null
+++ b/mobile/openapi/lib/api/groups_api.dart
@@ -0,0 +1,219 @@
+//
+// 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 GroupsApi {
+ GroupsApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
+
+ final ApiClient apiClient;
+
+ /// This endpoint requires the `group.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getMyGroupWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/groups/{id}'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `group.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getMyGroup(String id,) async {
+ final response = await getMyGroupWithHttpInfo(id,);
+ 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), 'GroupResponseDto',) as GroupResponseDto;
+
+ }
+ return null;
+ }
+
+ /// This endpoint is an admin-only route, and requires the `group.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future getMyGroupUsersWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/groups/{id}/users'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint is an admin-only route, and requires the `group.read` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future?> getMyGroupUsers(String id,) async {
+ final response = await getMyGroupUsersWithHttpInfo(id,);
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+
+ /// This endpoint requires the `group.delete` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future leaveMyGroupWithHttpInfo(String id,) async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/groups/{id}'
+ .replaceAll('{id}', id);
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'DELETE',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `group.delete` permission.
+ ///
+ /// Parameters:
+ ///
+ /// * [String] id (required):
+ Future leaveMyGroup(String id,) async {
+ final response = await leaveMyGroupWithHttpInfo(id,);
+ if (response.statusCode >= HttpStatus.badRequest) {
+ throw ApiException(response.statusCode, await _decodeBodyBytes(response));
+ }
+ }
+
+ /// This endpoint requires the `group.read` permission.
+ ///
+ /// Note: This method returns the HTTP [Response].
+ Future searchMyGroupsWithHttpInfo() async {
+ // ignore: prefer_const_declarations
+ final apiPath = r'/groups';
+
+ // ignore: prefer_final_locals
+ Object? postBody;
+
+ final queryParams = [];
+ final headerParams = {};
+ final formParams = {};
+
+ const contentTypes = [];
+
+
+ return apiClient.invokeAPI(
+ apiPath,
+ 'GET',
+ queryParams,
+ postBody,
+ headerParams,
+ formParams,
+ contentTypes.isEmpty ? null : contentTypes.first,
+ );
+ }
+
+ /// This endpoint requires the `group.read` permission.
+ Future?> searchMyGroups() async {
+ final response = await searchMyGroupsWithHttpInfo();
+ 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) {
+ final responseBody = await _decodeBodyBytes(response);
+ return (await apiClient.deserializeAsync(responseBody, 'List') as List)
+ .cast()
+ .toList(growable: false);
+
+ }
+ return null;
+ }
+}
diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart
index bd306cb216..c409ad08f6 100644
--- a/mobile/openapi/lib/api_client.dart
+++ b/mobile/openapi/lib/api_client.dart
@@ -200,6 +200,18 @@ class ApiClient {
return AddUsersDto.fromJson(value);
case 'AdminOnboardingUpdateDto':
return AdminOnboardingUpdateDto.fromJson(value);
+ case 'AlbumGroupCreateAllDto':
+ return AlbumGroupCreateAllDto.fromJson(value);
+ case 'AlbumGroupDeleteAllDto':
+ return AlbumGroupDeleteAllDto.fromJson(value);
+ case 'AlbumGroupDto':
+ return AlbumGroupDto.fromJson(value);
+ case 'AlbumGroupMetadata':
+ return AlbumGroupMetadata.fromJson(value);
+ case 'AlbumGroupResponseDto':
+ return AlbumGroupResponseDto.fromJson(value);
+ case 'AlbumGroupUpdateDto':
+ return AlbumGroupUpdateDto.fromJson(value);
case 'AlbumResponseDto':
return AlbumResponseDto.fromJson(value);
case 'AlbumStatisticsResponseDto':
@@ -336,6 +348,24 @@ class ApiClient {
return FoldersResponse.fromJson(value);
case 'FoldersUpdate':
return FoldersUpdate.fromJson(value);
+ case 'GroupAdminCreateDto':
+ return GroupAdminCreateDto.fromJson(value);
+ case 'GroupAdminResponseDto':
+ return GroupAdminResponseDto.fromJson(value);
+ case 'GroupAdminUpdateDto':
+ return GroupAdminUpdateDto.fromJson(value);
+ case 'GroupResponseDto':
+ return GroupResponseDto.fromJson(value);
+ case 'GroupUserCreateAllDto':
+ return GroupUserCreateAllDto.fromJson(value);
+ case 'GroupUserDeleteAllDto':
+ return GroupUserDeleteAllDto.fromJson(value);
+ case 'GroupUserDto':
+ return GroupUserDto.fromJson(value);
+ case 'GroupUserMetadata':
+ return GroupUserMetadata.fromJson(value);
+ case 'GroupUserResponseDto':
+ return GroupUserResponseDto.fromJson(value);
case 'ImageFormat':
return ImageFormatTypeTransformer().decode(value);
case 'JobCommand':
diff --git a/mobile/openapi/lib/model/album_group_create_all_dto.dart b/mobile/openapi/lib/model/album_group_create_all_dto.dart
new file mode 100644
index 0000000000..fa048ff8fe
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_create_all_dto.dart
@@ -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 AlbumGroupCreateAllDto {
+ /// Returns a new [AlbumGroupCreateAllDto] instance.
+ AlbumGroupCreateAllDto({
+ this.groups = const [],
+ });
+
+ List groups;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupCreateAllDto &&
+ _deepEquality.equals(other.groups, groups);
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (groups.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupCreateAllDto[groups=$groups]';
+
+ Map toJson() {
+ final json = {};
+ json[r'groups'] = this.groups;
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupCreateAllDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupCreateAllDto? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupCreateAllDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupCreateAllDto(
+ groups: AlbumGroupDto.listFromJson(json[r'groups']),
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupCreateAllDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupCreateAllDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupCreateAllDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupCreateAllDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'groups',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/album_group_delete_all_dto.dart b/mobile/openapi/lib/model/album_group_delete_all_dto.dart
new file mode 100644
index 0000000000..7e12bd59ce
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_delete_all_dto.dart
@@ -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 AlbumGroupDeleteAllDto {
+ /// Returns a new [AlbumGroupDeleteAllDto] instance.
+ AlbumGroupDeleteAllDto({
+ this.groupIds = const [],
+ });
+
+ List groupIds;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupDeleteAllDto &&
+ _deepEquality.equals(other.groupIds, groupIds);
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (groupIds.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupDeleteAllDto[groupIds=$groupIds]';
+
+ Map toJson() {
+ final json = {};
+ json[r'groupIds'] = this.groupIds;
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupDeleteAllDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupDeleteAllDto? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupDeleteAllDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupDeleteAllDto(
+ groupIds: json[r'groupIds'] is Iterable
+ ? (json[r'groupIds'] as Iterable).cast().toList(growable: false)
+ : const [],
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupDeleteAllDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupDeleteAllDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupDeleteAllDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupDeleteAllDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'groupIds',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/album_group_dto.dart b/mobile/openapi/lib/model/album_group_dto.dart
new file mode 100644
index 0000000000..a35d754d24
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_dto.dart
@@ -0,0 +1,116 @@
+//
+// 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 AlbumGroupDto {
+ /// Returns a new [AlbumGroupDto] instance.
+ AlbumGroupDto({
+ required this.groupId,
+ this.role,
+ });
+
+ String groupId;
+
+ ///
+ /// 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.
+ ///
+ AlbumUserRole? role;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupDto &&
+ other.groupId == groupId &&
+ other.role == role;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (groupId.hashCode) +
+ (role == null ? 0 : role!.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupDto[groupId=$groupId, role=$role]';
+
+ Map toJson() {
+ final json = {};
+ json[r'groupId'] = this.groupId;
+ if (this.role != null) {
+ json[r'role'] = this.role;
+ } else {
+ // json[r'role'] = null;
+ }
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupDto? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupDto(
+ groupId: mapValueOfType(json, r'groupId')!,
+ role: AlbumUserRole.fromJson(json[r'role']),
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'groupId',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/album_group_metadata.dart b/mobile/openapi/lib/model/album_group_metadata.dart
new file mode 100644
index 0000000000..98458ce256
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_metadata.dart
@@ -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 AlbumGroupMetadata {
+ /// Returns a new [AlbumGroupMetadata] instance.
+ AlbumGroupMetadata({
+ required this.createdAt,
+ required this.updatedAt,
+ });
+
+ DateTime createdAt;
+
+ DateTime updatedAt;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupMetadata &&
+ other.createdAt == createdAt &&
+ other.updatedAt == updatedAt;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (createdAt.hashCode) +
+ (updatedAt.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupMetadata[createdAt=$createdAt, updatedAt=$updatedAt]';
+
+ Map toJson() {
+ final json = {};
+ json[r'createdAt'] = this.createdAt.toUtc().toIso8601String();
+ json[r'updatedAt'] = this.updatedAt.toUtc().toIso8601String();
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupMetadata] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupMetadata? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupMetadata");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupMetadata(
+ createdAt: mapDateTime(json, r'createdAt', r'')!,
+ updatedAt: mapDateTime(json, r'updatedAt', r'')!,
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupMetadata.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupMetadata.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupMetadata-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupMetadata.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'createdAt',
+ 'updatedAt',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/album_group_response_dto.dart b/mobile/openapi/lib/model/album_group_response_dto.dart
new file mode 100644
index 0000000000..93f940fece
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_response_dto.dart
@@ -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 AlbumGroupResponseDto {
+ /// Returns a new [AlbumGroupResponseDto] instance.
+ AlbumGroupResponseDto({
+ required this.description,
+ required this.id,
+ required this.metadata,
+ required this.name,
+ });
+
+ String? description;
+
+ String id;
+
+ AlbumGroupMetadata metadata;
+
+ String name;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupResponseDto &&
+ other.description == description &&
+ other.id == id &&
+ other.metadata == metadata &&
+ other.name == name;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (description == null ? 0 : description!.hashCode) +
+ (id.hashCode) +
+ (metadata.hashCode) +
+ (name.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupResponseDto[description=$description, id=$id, metadata=$metadata, name=$name]';
+
+ Map toJson() {
+ final json = {};
+ if (this.description != null) {
+ json[r'description'] = this.description;
+ } else {
+ // json[r'description'] = null;
+ }
+ json[r'id'] = this.id;
+ json[r'metadata'] = this.metadata;
+ json[r'name'] = this.name;
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupResponseDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupResponseDto? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupResponseDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupResponseDto(
+ description: mapValueOfType(json, r'description'),
+ id: mapValueOfType(json, r'id')!,
+ metadata: AlbumGroupMetadata.fromJson(json[r'metadata'])!,
+ name: mapValueOfType(json, r'name')!,
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupResponseDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupResponseDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupResponseDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupResponseDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'description',
+ 'id',
+ 'metadata',
+ 'name',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/album_group_update_dto.dart b/mobile/openapi/lib/model/album_group_update_dto.dart
new file mode 100644
index 0000000000..863cfb47e2
--- /dev/null
+++ b/mobile/openapi/lib/model/album_group_update_dto.dart
@@ -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 AlbumGroupUpdateDto {
+ /// Returns a new [AlbumGroupUpdateDto] instance.
+ AlbumGroupUpdateDto({
+ required this.role,
+ });
+
+ AlbumUserRole role;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is AlbumGroupUpdateDto &&
+ other.role == role;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (role.hashCode);
+
+ @override
+ String toString() => 'AlbumGroupUpdateDto[role=$role]';
+
+ Map toJson() {
+ final json = {};
+ json[r'role'] = this.role;
+ return json;
+ }
+
+ /// Returns a new [AlbumGroupUpdateDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static AlbumGroupUpdateDto? fromJson(dynamic value) {
+ upgradeDto(value, "AlbumGroupUpdateDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return AlbumGroupUpdateDto(
+ role: AlbumUserRole.fromJson(json[r'role'])!,
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = AlbumGroupUpdateDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = AlbumGroupUpdateDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of AlbumGroupUpdateDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = AlbumGroupUpdateDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'role',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/create_album_dto.dart b/mobile/openapi/lib/model/create_album_dto.dart
index ff8c1df647..600bfc0227 100644
--- a/mobile/openapi/lib/model/create_album_dto.dart
+++ b/mobile/openapi/lib/model/create_album_dto.dart
@@ -17,6 +17,7 @@ class CreateAlbumDto {
this.albumUsers = const [],
this.assetIds = const [],
this.description,
+ this.groups = const [],
});
String albumName;
@@ -33,12 +34,15 @@ class CreateAlbumDto {
///
String? description;
+ List groups;
+
@override
bool operator ==(Object other) => identical(this, other) || other is CreateAlbumDto &&
other.albumName == albumName &&
_deepEquality.equals(other.albumUsers, albumUsers) &&
_deepEquality.equals(other.assetIds, assetIds) &&
- other.description == description;
+ other.description == description &&
+ _deepEquality.equals(other.groups, groups);
@override
int get hashCode =>
@@ -46,10 +50,11 @@ class CreateAlbumDto {
(albumName.hashCode) +
(albumUsers.hashCode) +
(assetIds.hashCode) +
- (description == null ? 0 : description!.hashCode);
+ (description == null ? 0 : description!.hashCode) +
+ (groups.hashCode);
@override
- String toString() => 'CreateAlbumDto[albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description]';
+ String toString() => 'CreateAlbumDto[albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description, groups=$groups]';
Map toJson() {
final json = {};
@@ -61,6 +66,7 @@ class CreateAlbumDto {
} else {
// json[r'description'] = null;
}
+ json[r'groups'] = this.groups;
return json;
}
@@ -79,6 +85,7 @@ class CreateAlbumDto {
? (json[r'assetIds'] as Iterable).cast().toList(growable: false)
: const [],
description: mapValueOfType(json, r'description'),
+ groups: AlbumGroupDto.listFromJson(json[r'groups']),
);
}
return null;
diff --git a/mobile/openapi/lib/model/group_admin_create_dto.dart b/mobile/openapi/lib/model/group_admin_create_dto.dart
new file mode 100644
index 0000000000..923e7d4320
--- /dev/null
+++ b/mobile/openapi/lib/model/group_admin_create_dto.dart
@@ -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 GroupAdminCreateDto {
+ /// Returns a new [GroupAdminCreateDto] instance.
+ GroupAdminCreateDto({
+ this.description,
+ required this.name,
+ this.users = const [],
+ });
+
+ String? description;
+
+ String name;
+
+ List users;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is GroupAdminCreateDto &&
+ other.description == description &&
+ other.name == name &&
+ _deepEquality.equals(other.users, users);
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (description == null ? 0 : description!.hashCode) +
+ (name.hashCode) +
+ (users.hashCode);
+
+ @override
+ String toString() => 'GroupAdminCreateDto[description=$description, name=$name, users=$users]';
+
+ Map toJson() {
+ final json = {};
+ if (this.description != null) {
+ json[r'description'] = this.description;
+ } else {
+ // json[r'description'] = null;
+ }
+ json[r'name'] = this.name;
+ json[r'users'] = this.users;
+ return json;
+ }
+
+ /// Returns a new [GroupAdminCreateDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static GroupAdminCreateDto? fromJson(dynamic value) {
+ upgradeDto(value, "GroupAdminCreateDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return GroupAdminCreateDto(
+ description: mapValueOfType(json, r'description'),
+ name: mapValueOfType(json, r'name')!,
+ users: GroupUserDto.listFromJson(json[r'users']),
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = GroupAdminCreateDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = GroupAdminCreateDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of GroupAdminCreateDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = GroupAdminCreateDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'name',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/group_admin_response_dto.dart b/mobile/openapi/lib/model/group_admin_response_dto.dart
new file mode 100644
index 0000000000..b908c27d06
--- /dev/null
+++ b/mobile/openapi/lib/model/group_admin_response_dto.dart
@@ -0,0 +1,135 @@
+//
+// 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 GroupAdminResponseDto {
+ /// Returns a new [GroupAdminResponseDto] instance.
+ GroupAdminResponseDto({
+ required this.createdAt,
+ required this.description,
+ required this.id,
+ required this.name,
+ required this.updatedAt,
+ });
+
+ DateTime createdAt;
+
+ String? description;
+
+ String id;
+
+ String name;
+
+ DateTime updatedAt;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is GroupAdminResponseDto &&
+ other.createdAt == createdAt &&
+ other.description == description &&
+ other.id == id &&
+ other.name == name &&
+ other.updatedAt == updatedAt;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (createdAt.hashCode) +
+ (description == null ? 0 : description!.hashCode) +
+ (id.hashCode) +
+ (name.hashCode) +
+ (updatedAt.hashCode);
+
+ @override
+ String toString() => 'GroupAdminResponseDto[createdAt=$createdAt, description=$description, id=$id, name=$name, updatedAt=$updatedAt]';
+
+ Map toJson() {
+ final json = {};
+ json[r'createdAt'] = this.createdAt.toUtc().toIso8601String();
+ if (this.description != null) {
+ json[r'description'] = this.description;
+ } else {
+ // json[r'description'] = null;
+ }
+ json[r'id'] = this.id;
+ json[r'name'] = this.name;
+ json[r'updatedAt'] = this.updatedAt.toUtc().toIso8601String();
+ return json;
+ }
+
+ /// Returns a new [GroupAdminResponseDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static GroupAdminResponseDto? fromJson(dynamic value) {
+ upgradeDto(value, "GroupAdminResponseDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return GroupAdminResponseDto(
+ createdAt: mapDateTime(json, r'createdAt', r'')!,
+ description: mapValueOfType(json, r'description'),
+ id: mapValueOfType(json, r'id')!,
+ name: mapValueOfType(json, r'name')!,
+ updatedAt: mapDateTime(json, r'updatedAt', r'')!,
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = GroupAdminResponseDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = GroupAdminResponseDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of GroupAdminResponseDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = GroupAdminResponseDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ 'createdAt',
+ 'description',
+ 'id',
+ 'name',
+ 'updatedAt',
+ };
+}
+
diff --git a/mobile/openapi/lib/model/group_admin_update_dto.dart b/mobile/openapi/lib/model/group_admin_update_dto.dart
new file mode 100644
index 0000000000..f2d848cbbe
--- /dev/null
+++ b/mobile/openapi/lib/model/group_admin_update_dto.dart
@@ -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 GroupAdminUpdateDto {
+ /// Returns a new [GroupAdminUpdateDto] instance.
+ GroupAdminUpdateDto({
+ this.description,
+ this.name,
+ });
+
+ 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.
+ ///
+ String? name;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is GroupAdminUpdateDto &&
+ other.description == description &&
+ other.name == name;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (description == null ? 0 : description!.hashCode) +
+ (name == null ? 0 : name!.hashCode);
+
+ @override
+ String toString() => 'GroupAdminUpdateDto[description=$description, name=$name]';
+
+ Map toJson() {
+ final json = {};
+ if (this.description != null) {
+ json[r'description'] = this.description;
+ } else {
+ // json[r'description'] = null;
+ }
+ if (this.name != null) {
+ json[r'name'] = this.name;
+ } else {
+ // json[r'name'] = null;
+ }
+ return json;
+ }
+
+ /// Returns a new [GroupAdminUpdateDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static GroupAdminUpdateDto? fromJson(dynamic value) {
+ upgradeDto(value, "GroupAdminUpdateDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return GroupAdminUpdateDto(
+ description: mapValueOfType(json, r'description'),
+ name: mapValueOfType(json, r'name'),
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = GroupAdminUpdateDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast(); // ignore: parameter_assignments
+ for (final entry in json.entries) {
+ final value = GroupAdminUpdateDto.fromJson(entry.value);
+ if (value != null) {
+ map[entry.key] = value;
+ }
+ }
+ }
+ return map;
+ }
+
+ // maps a json object with a list of GroupAdminUpdateDto-objects as value to a dart map
+ static Map> mapListFromJson(dynamic json, {bool growable = false,}) {
+ final map = >{};
+ if (json is Map && json.isNotEmpty) {
+ // ignore: parameter_assignments
+ json = json.cast();
+ for (final entry in json.entries) {
+ map[entry.key] = GroupAdminUpdateDto.listFromJson(entry.value, growable: growable,);
+ }
+ }
+ return map;
+ }
+
+ /// The list of required keys that must be present in a JSON.
+ static const requiredKeys = {
+ };
+}
+
diff --git a/mobile/openapi/lib/model/group_response_dto.dart b/mobile/openapi/lib/model/group_response_dto.dart
new file mode 100644
index 0000000000..db15ac40a0
--- /dev/null
+++ b/mobile/openapi/lib/model/group_response_dto.dart
@@ -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 GroupResponseDto {
+ /// Returns a new [GroupResponseDto] instance.
+ GroupResponseDto({
+ required this.description,
+ required this.id,
+ required this.name,
+ });
+
+ String? description;
+
+ String id;
+
+ String name;
+
+ @override
+ bool operator ==(Object other) => identical(this, other) || other is GroupResponseDto &&
+ other.description == description &&
+ other.id == id &&
+ other.name == name;
+
+ @override
+ int get hashCode =>
+ // ignore: unnecessary_parenthesis
+ (description == null ? 0 : description!.hashCode) +
+ (id.hashCode) +
+ (name.hashCode);
+
+ @override
+ String toString() => 'GroupResponseDto[description=$description, id=$id, name=$name]';
+
+ Map toJson() {
+ final json = {};
+ if (this.description != null) {
+ json[r'description'] = this.description;
+ } else {
+ // json[r'description'] = null;
+ }
+ json[r'id'] = this.id;
+ json[r'name'] = this.name;
+ return json;
+ }
+
+ /// Returns a new [GroupResponseDto] instance and imports its values from
+ /// [value] if it's a [Map], null otherwise.
+ // ignore: prefer_constructors_over_static_methods
+ static GroupResponseDto? fromJson(dynamic value) {
+ upgradeDto(value, "GroupResponseDto");
+ if (value is Map) {
+ final json = value.cast();
+
+ return GroupResponseDto(
+ description: mapValueOfType(json, r'description'),
+ id: mapValueOfType(json, r'id')!,
+ name: mapValueOfType(json, r'name')!,
+ );
+ }
+ return null;
+ }
+
+ static List listFromJson(dynamic json, {bool growable = false,}) {
+ final result = [];
+ if (json is List && json.isNotEmpty) {
+ for (final row in json) {
+ final value = GroupResponseDto.fromJson(row);
+ if (value != null) {
+ result.add(value);
+ }
+ }
+ }
+ return result.toList(growable: growable);
+ }
+
+ static Map mapFromJson(dynamic json) {
+ final map = {};
+ if (json is Map && json.isNotEmpty) {
+ json = json.cast