Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/core/constants/endpoint.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ class Endpoint {

static String get updateDefaultPreparation => _defaultPreparation;

static const _preparationTemplates = '/preparation-templates';

static String get preparationTemplates => _preparationTemplates;

static String preparationTemplateById(String templateId) =>
'$_preparationTemplates/$templateId';

static const _updateSpareTime = '/users/me/spare-time';
static String get updateSpareTime => _updateSpareTime;

Expand Down
32 changes: 32 additions & 0 deletions lib/core/dio/api_error_message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,19 @@ class ApiErrorMessage {
return message.trim();
}

final codeMessage = _messageFromCode(data['code']);
if (codeMessage != null) {
return codeMessage;
}

final error = data['error'];
if (error is Map<String, dynamic>) {
final nestedCodeMessage = _messageFromCode(error['code']);
if (nestedCodeMessage != null) {
return nestedCodeMessage;
}
}

final errors = data['data'];
if (errors is Map<String, dynamic>) {
final errorList = errors['errors'];
Expand All @@ -36,4 +49,23 @@ class ApiErrorMessage {

return null;
}

static String? _messageFromCode(Object? code) {
if (code is! String) {
return null;
}
return switch (code) {
'PREPARATION_TEMPLATE_NOT_FOUND' => 'Preparation template not found.',
'PREPARATION_TEMPLATE_NAME_DUPLICATE' =>
'A preparation template with this name already exists.',
'PREPARATION_TEMPLATE_LIMIT_EXCEEDED' =>
'You can create up to 20 active preparation templates.',
'PREPARATION_TEMPLATE_DELETED' =>
'This preparation template has been deleted.',
'PREPARATION_STEP_ID_CONFLICT' =>
'A preparation step ID is already used by another preparation.',
'INVALID_INPUT' => 'Invalid input.',
_ => null,
};
}
}
112 changes: 112 additions & 0 deletions lib/data/data_sources/preparation_template_remote_data_source.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
import 'package:on_time_front/core/constants/endpoint.dart';
import 'package:on_time_front/data/models/preparation_template_model.dart';
import 'package:on_time_front/domain/entities/preparation_entity.dart';
import 'package:on_time_front/domain/entities/preparation_template_entity.dart';

abstract interface class PreparationTemplateRemoteDataSource {
Future<List<PreparationTemplateEntity>> getPreparationTemplates();

Future<PreparationTemplateEntity> getPreparationTemplate(String templateId);

Future<void> createPreparationTemplate({
required String templateId,
required String templateName,
required PreparationEntity preparation,
});

Future<void> updatePreparationTemplate({
required String templateId,
required String templateName,
required PreparationEntity preparation,
});

Future<void> deletePreparationTemplate(String templateId);
}

@Injectable(as: PreparationTemplateRemoteDataSource)
class PreparationTemplateRemoteDataSourceImpl
implements PreparationTemplateRemoteDataSource {
final Dio dio;

PreparationTemplateRemoteDataSourceImpl(this.dio);

@override
Future<List<PreparationTemplateEntity>> getPreparationTemplates() async {
final result = await dio.get(Endpoint.preparationTemplates);
if (result.statusCode == 200) {
return (result.data['data'] as List<dynamic>)
.map(
(item) => PreparationTemplateModel.fromJson(
item as Map<String, dynamic>,
).toEntity(),
)
.toList();
}
throw Exception('Error getting preparation templates');
}

@override
Future<PreparationTemplateEntity> getPreparationTemplate(
String templateId,
) async {
final result = await dio.get(Endpoint.preparationTemplateById(templateId));
if (result.statusCode == 200) {
return PreparationTemplateModel.fromJson(
result.data['data'] as Map<String, dynamic>,
).toEntity();
}
throw Exception('Error getting preparation template');
}

@override
Future<void> createPreparationTemplate({
required String templateId,
required String templateName,
required PreparationEntity preparation,
}) async {
final request = UpsertPreparationTemplateRequestModel.fromValues(
templateId: templateId,
templateName: templateName,
preparation: preparation,
);
final result = await dio.post(
Endpoint.preparationTemplates,
data: request.toJson(),
);
if (result.statusCode != 200) {
throw Exception('Error creating preparation template');
}
}

@override
Future<void> updatePreparationTemplate({
required String templateId,
required String templateName,
required PreparationEntity preparation,
}) async {
final request = UpsertPreparationTemplateRequestModel.fromValues(
templateId: templateId,
templateName: templateName,
preparation: preparation,
);
final result = await dio.put(
Endpoint.preparationTemplateById(templateId),
data: request.toJson(),
);
if (result.statusCode != 200) {
throw Exception('Error updating preparation template');
}
}

@override
Future<void> deletePreparationTemplate(String templateId) async {
final result = await dio.delete(
Endpoint.preparationTemplateById(templateId),
);
if (result.statusCode != 200) {
throw Exception('Error deleting preparation template');
}
}
}
55 changes: 36 additions & 19 deletions lib/data/data_sources/schedule_remote_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@ abstract interface class ScheduleRemoteDataSource {
Future<void> createSchedule(ScheduleEntity schedule);

Future<List<ScheduleEntity>> getSchedulesByDate(
DateTime startDate, DateTime? endDate);
DateTime startDate,
DateTime? endDate,
);

Future<ScheduleEntity> getScheduleById(String id);

Future<void> updateSchedule(ScheduleEntity schedule);
Future<void> updateSchedule(
ScheduleEntity schedule, {
bool includePreparationSource = false,
});

Future<void> deleteSchedule(ScheduleEntity schedule);

Expand All @@ -33,8 +38,10 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
try {
CreateScheduleRequestModel createScheduleModel =
CreateScheduleRequestModel.fromEntity(schedule);
final result = await dio.post(Endpoint.createSchedule,
data: createScheduleModel.toJson());
final result = await dio.post(
Endpoint.createSchedule,
data: createScheduleModel.toJson(),
);
if (result.statusCode == 200) {
return;
} else {
Expand All @@ -46,12 +53,20 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
}

@override
Future<void> updateSchedule(ScheduleEntity schedule) async {
Future<void> updateSchedule(
ScheduleEntity schedule, {
bool includePreparationSource = false,
}) async {
try {
UpdateScheduleRequestModel updateScheduleModel =
UpdateScheduleRequestModel.fromEntity(schedule);
final result = await dio.put(Endpoint.updateSchedule(schedule.id),
data: updateScheduleModel.toJson());
UpdateScheduleRequestModel.fromEntity(
schedule,
includePreparationSource: includePreparationSource,
);
final result = await dio.put(
Endpoint.updateSchedule(schedule.id),
data: updateScheduleModel.toJson(),
);
if (result.statusCode == 200) {
return;
} else {
Expand Down Expand Up @@ -81,10 +96,7 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
try {
final result = await dio.put(
Endpoint.finishSchedule(scheduleId),
data: {
'scheduleId': scheduleId,
'latenessTime': latenessTime,
},
data: {'scheduleId': scheduleId, 'latenessTime': latenessTime},
);
if (result.statusCode == 200) {
return;
Expand Down Expand Up @@ -114,17 +126,22 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {

@override
Future<List<ScheduleEntity>> getSchedulesByDate(
DateTime startDate, DateTime? endDate) async {
DateTime startDate,
DateTime? endDate,
) async {
try {
final result =
await dio.get(Endpoint.getSchedulesByDate, queryParameters: {
'startDate': startDate.toIso8601String(),
'endDate': endDate?.toIso8601String() ?? '',
});
final result = await dio.get(
Endpoint.getSchedulesByDate,
queryParameters: {
'startDate': startDate.toIso8601String(),
'endDate': endDate?.toIso8601String() ?? '',
},
);
if (result.statusCode == 200) {
final List<ScheduleEntity> schedules = result.data["data"]
.map<ScheduleEntity>(
(e) => GetScheduleResponseModel.fromJson(e).toEntity())
(e) => GetScheduleResponseModel.fromJson(e).toEntity(),
)
.toList();
return schedules;
} else {
Expand Down
Loading
Loading