From 708bad61771b7944b7e7f2e86abce00cb7ec04f6 Mon Sep 17 00:00:00 2001 From: riteshkhadse Date: Fri, 8 Aug 2025 12:04:33 +0530 Subject: [PATCH] feat(api-service): add new method to upload files via sas token Signed-off-by: riteshkhadse --- lib/src/api_service_impl.dart | 78 +++++++++++++++++++++++++++++------ lib/src/base/api_service.dart | 10 +++++ 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/lib/src/api_service_impl.dart b/lib/src/api_service_impl.dart index 3a3547a..0ede074 100644 --- a/lib/src/api_service_impl.dart +++ b/lib/src/api_service_impl.dart @@ -11,20 +11,18 @@ import 'package:path/path.dart'; class ApiServiceImpl implements ApiService { ApiServiceImpl({required this.baseUrl, this.interceptors, this.apiOptions}) { - _dio = - Dio() - ..options.contentType = Headers.jsonContentType - ..options.connectTimeout = Duration(minutes: 1) - ..options.receiveTimeout = Duration(minutes: 1, seconds: 30); + _dio = Dio() + ..options.contentType = Headers.jsonContentType + ..options.connectTimeout = Duration(minutes: 1) + ..options.receiveTimeout = Duration(minutes: 1, seconds: 30); if (interceptors != null && interceptors!.isNotEmpty) { _dio!.interceptors.addAll(interceptors!); } - _dioFile = - Dio() - ..options.connectTimeout = Duration(minutes: 1) - ..options.receiveTimeout = Duration(minutes: 1, seconds: 30); + _dioFile = Dio() + ..options.connectTimeout = Duration(minutes: 1) + ..options.receiveTimeout = Duration(minutes: 1, seconds: 30); if (interceptors != null && interceptors!.isNotEmpty) { _dioFile!.interceptors.addAll(interceptors!); @@ -256,10 +254,9 @@ class ApiServiceImpl implements ApiService { headers['appSpecificHeaders'] = { "forceRefreshCache": options?.refreshCache ?? apiOptions?.refreshCache ?? false, - "expirationTime": - expireDuration != null - ? _now.add(expireDuration).toString() - : _midnightTime.toString(), + "expirationTime": expireDuration != null + ? _now.add(expireDuration).toString() + : _midnightTime.toString(), "expireDuration": options?.expireDuration ?? apiOptions?.expireDuration, "ignoreAutoRefresh": options?.ignoreAutoRefresh ?? apiOptions?.ignoreAutoRefresh ?? false, @@ -273,4 +270,59 @@ class ApiServiceImpl implements ApiService { Future requestTranformer(RequestOptions options) { return _dio!.transformer.transformRequest(options); } + + @override + Future> putFile({ + String? endpoint, + String? url, + String? keyName, + File? file, + ApiOptions? options, + ProgressCallback? onSendProgress, + Map? queryParameters, + }) async { + endpoint = + endpoint != null ? "$baseUrl$endpoint" : url ?? getFileUploadUrl(); + if (queryParameters != null) { + var queryUrl = ""; + for (final parameter in queryParameters.entries) { + queryUrl = + "${queryUrl.isEmpty ? '?' : '&'}${parameter.key}=${parameter.value}"; + } + endpoint = "$endpoint$queryUrl"; + } + + if (file == null) { + throw const MyException("Attached file is null"); + } + + final data = file.openRead(); + + final fileName = basename(file.path); + var mimeType = mime(fileName); + mimeType ??= 'application/octet-stream'; + final type = mimeType.split('/')[0]; + final subType = mimeType.split('/')[1]; + + final headerMap = { + 'x-ms-blob-type': 'BlockBlob', + 'Content-Type': '$type/$subType', + }; + + options ??= ApiOptions(); + options.headers ??= {}; + options.headers!.addAll(headerMap); + + return _dio!.put( + endpoint, + cancelToken: options.cancelToken, + data: data, + onSendProgress: onSendProgress, + options: Options( + headers: _formatHeaders(options), + receiveTimeout: options.receiveTimeout, + sendTimeout: options.sendTimeout, + ), + ); + } } diff --git a/lib/src/base/api_service.dart b/lib/src/base/api_service.dart index 123ec88..f7be722 100644 --- a/lib/src/base/api_service.dart +++ b/lib/src/base/api_service.dart @@ -46,6 +46,16 @@ abstract class ApiService { Map? dataParameters, }); + Future> putFile({ + String? endpoint, + String? url, + String? keyName, + File? file, + ApiOptions? options, + ProgressCallback? onSendProgress, + Map? queryParameters, +}); + void setBaseUrl(String baseUrl); String getBaseUrl();