Files
eatvio_app/lib/features/diary/services/diary_service.dart

151 lines
7.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:eatvio_app/features/diary/models/consultant_comment_model.dart';
import 'package:eatvio_app/features/diary/models/consultant_review_model.dart';
import 'package:eatvio_app/features/diary/models/create_day_model.dart';
import 'package:eatvio_app/features/diary/models/diary_day_model.dart';
import 'package:eatvio_app/features/diary/models/finish_diary_day_model.dart';
import 'package:eatvio_app/features/diary/models/nutrition_model.dart';
import 'package:eatvio_app/features/glossary/models/glossary_model.dart';
import 'package:retrofit/retrofit.dart';
part 'diary_service.g.dart';
@RestApi()
abstract class DiaryService {
factory DiaryService(Dio dio, {String baseUrl}) = _DiaryService;
@GET('/api/diary/index/{date}')
Future<List<DiaryDayModel>> getDiaryIndexByDate({@Path('date') required String date});
@GET('/api/diary/{diary}/show')
Future<DiaryDayWrapperModel> getDiaryDay({@Path('diary') required int diary});
@GET('/api/diary/{diary}/dailyNutritionData')
Future<NutritionDataModel> getNutrition({@Path('diary') required int diary});
@POST('/api/diary/{diary}/meals/{type_no}/photo/upload')
@MultiPart()
Future<void> uploadPhotoOfMeal({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Part(name: 'photo') required File photo});
@DELETE('/api/diary/{diary}/meals/{type_no}/photo/{user_attachment}/delete')
Future<void> deletePhotoOfMeal({
@Path('diary') required int diaryId,
@Path('type_no') required int typeNo,
@Path('user_attachment') required int userAttachment,
});
@POST('/api/diary/{diary}/meals/{type_no}/portion/create')
Future<void> addProductToMeal({
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Part(name: 'product_name') required String productName,
@Part(name: 'portion') required String portion,
@Part(name: 'quantity') required int quantity,
@Part(name: 'product_nutritional_value_id') int? productNutritionalValueId,
});
@PUT('/api/diary/{diary}/meals/{type_no}/portions/{portionModel}/update')
Future<void> updateProductInMeal({
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Path('portionModel') required int portionModel,
@Body() required Map<String, dynamic> productInMeal,
});
@POST('/api/diary/{diary}/meals/{type_no}/{portionModel}/mark_eaten')
Future<void> markEaten({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Path('portionModel') required int portionModel});
@POST('/api/diary/{diary}/meals/{type_no}/{portionModel}/unmark_eaten')
Future<void> unmarkEaten({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Path('portionModel') required int portionModel});
@POST('/api/diary/{diary}/meals/{type_no}/portions/{portionModel}/restore')
Future<void> restore({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Path('portionModel') required int portionModel});
@DELETE('/api/diary/{diary}/meals/{type_no}/portions/{portionModel}/delete')
Future<void> deleteProductFromMeal({
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Path('portionModel') required int portionModel,
});
@POST('/api/diary/{diary}/finishDay')
Future<void> finishDiaryDay({@Path('diary') required int diary, @Body(nullToAbsent: true) required FinishDiaryDayModel finishDiaryDayModel});
@POST('/api/diary/{diary}/meals/{type_no}/satiety/fill')
Future<void> fillSatiety({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Field() required int satiety});
@POST('/api/diary/{diary}/meals/{type_no}/mood/fill')
Future<void> fillMood({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Field() required int mood});
@POST('/api/diary/{diary}/meals/{type_no}/time/fill')
Future<void> fillTime({@Path('diary') required int diary, @Path('type_no') required int typeNo, @Field() required String time});
@POST('/api/diary/{diary}/wakeUp/fill')
Future<void> fillWakeup({@Path('diary') required int diary, @Field() required String wakeUp});
@POST('/api/diary/{diary}/retire/fill')
Future<void> fillRetire({@Path('diary') required int diary, @Field() required String retire});
@POST('/api/diary/product_nutritional_values/sendToModeration')
Future<GlossaryModerationModel> sendProductToModeration({@Body() required Map<String, dynamic> data});
@POST('/api/diary/{id}/consultant/comment')
Future<void> commentUserDay({@Path('id') required int id, @Body() required ConsultantCommentModel body});
@GET('/api/chosen_plans/{planId}/{diaryId}/comments/show')
Future<ConsultantReviewModel> getDiaryComments({@Path() required int planId, @Path() required int diaryId});
@POST('/api/diary/{diaryId}/consultant/comment/view')
Future<void> viewCommentOfDiaryDayByConsultant({@Path() required int diaryId});
@GET('/api/glossaries/index')
Future<GlossaryPaginationModel> getGlossariesIndex({@Queries() Map<String, dynamic>? filters});
// ─── V2 эндпоинты с Idempotency-Key ────────────────────────────────────────
/// Создать день дневника (идемпотентно).
/// [idempotencyKey] — UUID v4, используется сервером для дедупликации.
@POST('/api/v2/diary/create/day')
Future<void> createDay({
@Header('Idempotency-Key') required String idempotencyKey,
@Body() required CreateDayModel body,
});
/// Получить день дневника по дате (ISO 8601 с timezone).
@GET('/api/v2/diary/index/{day}')
Future<DiaryDayModel> getDiaryDayV2({@Path('day') required String day});
/// Добавить порцию с поддержкой идемпотентности.
@POST('/api/diary/{diary}/meals/{type_no}/portion/create')
Future<void> addProductToMealIdempotent({
@Header('Idempotency-Key') required String idempotencyKey,
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Part(name: 'product_name') required String productName,
@Part(name: 'portion') required String portion,
@Part(name: 'quantity') required int quantity,
@Part(name: 'product_nutritional_value_id') int? productNutritionalValueId,
});
/// Удалить порцию с поддержкой идемпотентности.
@DELETE('/api/diary/{diary}/meals/{type_no}/portions/{portionModel}/delete')
Future<void> deleteProductFromMealIdempotent({
@Header('Idempotency-Key') required String idempotencyKey,
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Path('portionModel') required int portionModel,
});
/// Загрузить фото с идемпотентностью.
@POST('/api/diary/{diary}/meals/{type_no}/photo/upload')
@MultiPart()
Future<void> uploadPhotoIdempotent({
@Header('Idempotency-Key') required String idempotencyKey,
@Path('diary') required int diary,
@Path('type_no') required int typeNo,
@Part(name: 'photo') required File photo,
});
}