import 'dart:collection'; import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:hl_lieferservice/dto/note_get_response.dart'; import 'package:hl_lieferservice/feature/delivery/detail/exceptions.dart'; import 'package:hl_lieferservice/services/erpframe.dart'; import 'package:docuframe/docuframe.dart' as df; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart' as http; import 'package:http_parser/http_parser.dart'; import '../../../../dto/basic_response.dart'; import '../../../../dto/note_add_response.dart'; import '../../../../dto/note_template_response.dart'; import '../../../../model/delivery.dart'; import '../../../../util.dart'; import '../../../authentication/exceptions.dart'; class NoteService extends ErpFrameService { NoteService({required super.config}); Future deleteNote(int noteId) async { try { var response = await http.post( urlBuilder("_web_deleteNote"), headers: getSessionOrThrow(), body: {"id": noteId.toString()}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); debugPrint("NOTE DELETE: ${response.body}"); BasicResponseDTO responseDto = BasicResponseDTO.fromJson(responseJson); if (responseDto.succeeded == true) { return; } else { throw responseDto.message; } } catch (e, st) { debugPrint("ERROR WHILE DELETING NOTE $noteId"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future editNote(Note newNote) async { try { var response = await http.post( urlBuilder("_web_editNote"), headers: getSessionOrThrow(), body: {"id": newNote.id.toString(), "note": newNote.content}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); BasicResponseDTO responseDto = BasicResponseDTO.fromJson(responseJson); if (responseDto.succeeded == true) { return; } else { throw responseDto.message; } } catch (e, st) { debugPrint("ERROR WHILE EDITING NOTE ${newNote.id}"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future> getNoteTemplates() async { try { var response = await http.post( urlBuilder("_web_getNoteTemplates"), headers: getSessionOrThrow(), body: {}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); NoteTemplateResponseDTO responseDto = NoteTemplateResponseDTO.fromJson( responseJson, ); if (responseDto.succeeded == true) { return responseDto.notes.map(NoteTemplate.fromDTO).toList(); } else { throw responseDto.message; } } catch (e, st) { debugPrint("ERROR WHILE GETTING NOTE TEMPLATES"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future> getNotes(String deliveryId) async { try { var response = await http.post( urlBuilder("_web_getNotes"), headers: getSessionOrThrow(), body: {"delivery_id": deliveryId}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); debugPrint(responseJson.toString()); NoteGetResponseDTO responseDto = NoteGetResponseDTO.fromJson( responseJson, ); if (responseDto.succeeded == true) { return responseDto.notes .map((noteDto) => Note.fromDto(noteDto)) .toList(); } else { throw responseDto.message; } } catch (e, st) { debugPrint("ERROR WHILE GETTING NOTES"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future addNote(String note, int deliveryId) async { try { var response = await http.post( urlBuilder("_web_addNote"), headers: getSessionOrThrow(), body: {"receipt_id": deliveryId.toString(), "note": note}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); debugPrint(responseJson.toString()); NoteAddResponseDTO responseDto = NoteAddResponseDTO.fromJson( responseJson, ); if (responseDto.succeeded == true) { return Note.fromDto(responseDto.note!); } else { debugPrint("ERROR: ${responseDto.message}"); throw responseDto.message; } } catch (e) { rethrow; } } Future uploadImage( String deliveryId, String filename, Uint8List bytes, String? mimeType, ) async { try { var config = getConfig(); var basePath = "${config.backendUrl}/v1/uploadFile"; var response = await http.get( Uri.parse(basePath), headers: getSessionOrThrow(), ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map jsonResponse = jsonDecode(response.body); debugPrint("GET UPLOADID : ${response.body}"); if (!jsonResponse.containsKey("data")) { debugPrint("No data structure in uploadFile request"); debugPrint("RAW RESPONSE: ${response.body}"); throw NoteImageAddException(); } Map data = jsonResponse["data"]; if (!data.containsKey("uploadId")) { debugPrint("No data.uploadId structure in uploadFile request"); debugPrint("RAW RESPONSE: ${response.body}"); throw NoteImageAddException(); } String uploadId = data["uploadId"]; http.MultipartRequest request = http.MultipartRequest("POST", Uri.parse("$basePath/$uploadId")); HashMap header = HashMap(); header["Content-Type"] = "multipart/form-data"; header.addAll(getSessionOrThrow()); request.headers.addAll(header); request.files.add(http.MultipartFile.fromBytes("file", bytes, filename: filename, contentType: MediaType.parse(mimeType ?? "application/octet-stream"))); http.Response fileUploadResponse = await http.Response.fromStream(await request.send()); Map fileUploadResponseJson = jsonDecode(fileUploadResponse.body); debugPrint("UPLOAD IMAGE RESPONSE: ${fileUploadResponse.body}"); if (fileUploadResponseJson["status"]["internalStatus"] != "0") { debugPrint("Failed to upload image"); debugPrint("RAW: ${fileUploadResponseJson.toString()}"); throw NoteImageAddException(); } var fileCommitResponse = await http.patch(Uri.parse("$basePath/$uploadId"), headers: getSessionOrThrow()); debugPrint("FILE COMMIT BODY: ${fileCommitResponse.body}"); var fileCommitResponseJson = jsonDecode(fileCommitResponse.body); return fileCommitResponseJson["data"]["~ObjectID"]; } catch (e, st) { debugPrint("An error occured:"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future>> downloadImages(List urls) async { try { return urls.map((url) async { return (await http.get( Uri.parse("${config.backendUrl}$url"), headers: getSessionOrThrow(), )).bodyBytes; }).toList(); } catch (e, st) { debugPrint("An error occured:"); debugPrint("$e"); debugPrint(st.toString()); rethrow; } } Future removeImage(String oid) async { try { var response = await http.post( urlBuilder("_web_removeImage"), headers: getSessionOrThrow(), body: {"oid": oid}, ); if (response.statusCode == HttpStatus.unauthorized) { throw UserUnauthorized(); } Map responseJson = jsonDecode(response.body); debugPrint(oid); debugPrint(responseJson.toString()); BasicResponseDTO responseDto = BasicResponseDTO.fromJson(responseJson); if (responseDto.succeeded == true) { return; } else { debugPrint("ERROR: ${responseDto.message}"); throw responseDto.message; } } on df.DocuFrameException catch (e, st) { debugPrint("${e.errorMessage}"); debugPrint(st.toString()); rethrow; } } }