import 'dart:convert'; import 'dart:typed_data'; import 'package:http/http.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/infrastructure/repositories/api.repository.dart'; import 'package:immich_mobile/infrastructure/utils/user.converter.dart'; import 'package:openapi/api.dart'; class UserApiRepository extends ApiRepository { final UsersApi _api; const UserApiRepository(this._api); Future getMyUser() async { final (adminDto, preferenceDto) = await (_api.getMyUser(), _api.getMyPreferences()).wait; if (adminDto == null) return null; return UserConverter.fromAdminDto(adminDto, preferenceDto); } Future createProfileImage({required String name, required Uint8List data}) async { // Workaround: the autogenerated OpenAPI client forces `Content-Type: multipart/form-data` // without a boundary, which can break multer parsing server-side. // We bypass `UsersApi.createProfileImage()` and send the multipart request directly, // while still reusing the configured basePath + auth headers + http client. final apiClient = _api.apiClient; final headers = {}; await apiClient.authentication?.applyToParams([], headers); headers.addAll(apiClient.defaultHeaderMap); headers.remove('Content-Type'); headers.remove('content-type'); final filename = name.isNotEmpty ? name : 'profile-picture.png'; final uri = Uri.parse('${apiClient.basePath}/users/profile-image'); final request = MultipartRequest('POST', uri) ..headers.addAll(headers) ..files.add(MultipartFile.fromBytes('file', data, filename: filename)); final streamed = await apiClient.client.send(request); final response = await Response.fromStream(streamed); if (response.statusCode >= 400) { throw ApiException(response.statusCode, response.body); } final body = jsonDecode(response.body) as Map; return body['profileImagePath'] as String; } Future> getAll() async { final dto = await checkNull(_api.searchUsers()); return dto.map(UserConverter.fromSimpleUserDto).toList(); } }