uodate create/detail - no upload file

This commit is contained in:
Phuoc Nguyen
2025-11-28 16:38:46 +07:00
parent 9e7bda32f2
commit 5e3e1401c1
8 changed files with 834 additions and 342 deletions

View File

@@ -3,6 +3,7 @@
/// Handles remote API calls for design requests.
library;
import 'package:dio/dio.dart';
import 'package:worker/core/constants/api_constants.dart';
import 'package:worker/core/network/dio_client.dart';
import 'package:worker/features/showrooms/data/models/design_request_model.dart';
@@ -17,6 +18,24 @@ abstract class DesignRequestRemoteDataSource {
/// Fetch detail of a design request by name
Future<DesignRequestModel> getDesignRequestDetail(String name);
/// Create a new design request
Future<String> createDesignRequest({
required String subject,
required String area,
required String region,
required String desiredStyle,
String? estimatedBudget,
required String detailedRequirements,
required String dateline,
});
/// Upload file attachment for a design request
Future<void> uploadDesignRequestFile({
required String requestId,
required String filePath,
required String fileName,
});
}
/// Design Request Remote Data Source Implementation
@@ -93,4 +112,94 @@ class DesignRequestRemoteDataSourceImpl implements DesignRequestRemoteDataSource
throw Exception('Failed to get design request detail: $e');
}
}
/// Create a new design request
///
/// Calls: POST /api/method/building_material.building_material.api.design_request.create
/// Body: { "subject": "...", "area": "...", "region": "...", ... }
/// Returns: Created request ID (name)
@override
Future<String> createDesignRequest({
required String subject,
required String area,
required String region,
required String desiredStyle,
String? estimatedBudget,
required String detailedRequirements,
required String dateline,
}) async {
try {
final response = await _dioClient.post<Map<String, dynamic>>(
'${ApiConstants.frappeApiMethod}${ApiConstants.createDesignRequest}',
data: {
'subject': subject,
'area': area,
'region': region,
'desired_style': desiredStyle,
if (estimatedBudget != null) 'estimated_budget': estimatedBudget,
'detailed_requirements': detailedRequirements,
'dateline': dateline,
},
);
final data = response.data;
if (data == null) {
throw Exception('No data received from createDesignRequest API');
}
// API returns: { "message": { "success": true, "data": { "name": "ISS-2025-00006" } } }
final message = data['message'] as Map<String, dynamic>?;
if (message == null) {
throw Exception('No message field in createDesignRequest response');
}
final success = message['success'] as bool? ?? false;
if (!success) {
throw Exception('Failed to create design request');
}
final requestData = message['data'] as Map<String, dynamic>?;
if (requestData == null) {
throw Exception('No data field in createDesignRequest response');
}
final name = requestData['name'] as String?;
if (name == null || name.isEmpty) {
throw Exception('No name returned from createDesignRequest');
}
return name;
} catch (e) {
throw Exception('Failed to create design request: $e');
}
}
/// Upload file attachment for a design request
///
/// Calls: POST /api/method/upload_file
/// Form-data: { file, is_private, folder, doctype, docname, optimize }
@override
Future<void> uploadDesignRequestFile({
required String requestId,
required String filePath,
required String fileName,
}) async {
try {
final formData = FormData.fromMap({
'file': await MultipartFile.fromFile(filePath, filename: fileName),
'is_private': '0',
'folder': 'Home/Attachments',
'doctype': 'Issue',
'docname': requestId,
'optimize': 'true',
});
await _dioClient.post<Map<String, dynamic>>(
'${ApiConstants.frappeApiMethod}${ApiConstants.uploadFile}',
data: formData,
);
} catch (e) {
throw Exception('Failed to upload file: $e');
}
}
}

View File

@@ -38,4 +38,46 @@ class DesignRequestRepositoryImpl implements DesignRequestRepository {
rethrow;
}
}
@override
Future<String> createDesignRequest({
required String subject,
required String area,
required String region,
required String desiredStyle,
String? estimatedBudget,
required String detailedRequirements,
required String dateline,
}) async {
try {
return await _remoteDataSource.createDesignRequest(
subject: subject,
area: area,
region: region,
desiredStyle: desiredStyle,
estimatedBudget: estimatedBudget,
detailedRequirements: detailedRequirements,
dateline: dateline,
);
} catch (e) {
rethrow;
}
}
@override
Future<void> uploadDesignRequestFile({
required String requestId,
required String filePath,
required String fileName,
}) async {
try {
await _remoteDataSource.uploadDesignRequestFile(
requestId: requestId,
filePath: filePath,
fileName: fileName,
);
} catch (e) {
rethrow;
}
}
}