Skip to content

Commit 8f290e0

Browse files
committed
Merge remote-tracking branch 'origin/main' into feature/flutter-coverage-gate
# Conflicts: # test/data/repositories/preparation_repository_impl_test.dart # test/presentation/my_page/preparation_spare_time_edit/preparation_spare_time_edit_screen_test.dart
2 parents 21bb9c3 + a523044 commit 8f290e0

38 files changed

Lines changed: 1821 additions & 256 deletions

File tree

lib/core/constants/endpoint.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ class Endpoint {
5959

6060
static String get updateDefaultPreparation => _defaultPreparation;
6161

62+
static const _preparationTemplates = '/preparation-templates';
63+
64+
static String get preparationTemplates => _preparationTemplates;
65+
66+
static String preparationTemplateById(String templateId) =>
67+
'$_preparationTemplates/$templateId';
68+
6269
static const _updateSpareTime = '/users/me/spare-time';
6370
static String get updateSpareTime => _updateSpareTime;
6471

lib/core/dio/api_error_message.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ class ApiErrorMessage {
2020
return message.trim();
2121
}
2222

23+
final codeMessage = _messageFromCode(data['code']);
24+
if (codeMessage != null) {
25+
return codeMessage;
26+
}
27+
28+
final error = data['error'];
29+
if (error is Map<String, dynamic>) {
30+
final nestedCodeMessage = _messageFromCode(error['code']);
31+
if (nestedCodeMessage != null) {
32+
return nestedCodeMessage;
33+
}
34+
}
35+
2336
final errors = data['data'];
2437
if (errors is Map<String, dynamic>) {
2538
final errorList = errors['errors'];
@@ -36,4 +49,23 @@ class ApiErrorMessage {
3649

3750
return null;
3851
}
52+
53+
static String? _messageFromCode(Object? code) {
54+
if (code is! String) {
55+
return null;
56+
}
57+
return switch (code) {
58+
'PREPARATION_TEMPLATE_NOT_FOUND' => 'Preparation template not found.',
59+
'PREPARATION_TEMPLATE_NAME_DUPLICATE' =>
60+
'A preparation template with this name already exists.',
61+
'PREPARATION_TEMPLATE_LIMIT_EXCEEDED' =>
62+
'You can create up to 20 active preparation templates.',
63+
'PREPARATION_TEMPLATE_DELETED' =>
64+
'This preparation template has been deleted.',
65+
'PREPARATION_STEP_ID_CONFLICT' =>
66+
'A preparation step ID is already used by another preparation.',
67+
'INVALID_INPUT' => 'Invalid input.',
68+
_ => null,
69+
};
70+
}
3971
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:injectable/injectable.dart';
3+
import 'package:on_time_front/core/constants/endpoint.dart';
4+
import 'package:on_time_front/data/models/preparation_template_model.dart';
5+
import 'package:on_time_front/domain/entities/preparation_entity.dart';
6+
import 'package:on_time_front/domain/entities/preparation_template_entity.dart';
7+
8+
abstract interface class PreparationTemplateRemoteDataSource {
9+
Future<List<PreparationTemplateEntity>> getPreparationTemplates();
10+
11+
Future<PreparationTemplateEntity> getPreparationTemplate(String templateId);
12+
13+
Future<void> createPreparationTemplate({
14+
required String templateId,
15+
required String templateName,
16+
required PreparationEntity preparation,
17+
});
18+
19+
Future<void> updatePreparationTemplate({
20+
required String templateId,
21+
required String templateName,
22+
required PreparationEntity preparation,
23+
});
24+
25+
Future<void> deletePreparationTemplate(String templateId);
26+
}
27+
28+
@Injectable(as: PreparationTemplateRemoteDataSource)
29+
class PreparationTemplateRemoteDataSourceImpl
30+
implements PreparationTemplateRemoteDataSource {
31+
final Dio dio;
32+
33+
PreparationTemplateRemoteDataSourceImpl(this.dio);
34+
35+
@override
36+
Future<List<PreparationTemplateEntity>> getPreparationTemplates() async {
37+
final result = await dio.get(Endpoint.preparationTemplates);
38+
if (result.statusCode == 200) {
39+
return (result.data['data'] as List<dynamic>)
40+
.map(
41+
(item) => PreparationTemplateModel.fromJson(
42+
item as Map<String, dynamic>,
43+
).toEntity(),
44+
)
45+
.toList();
46+
}
47+
throw Exception('Error getting preparation templates');
48+
}
49+
50+
@override
51+
Future<PreparationTemplateEntity> getPreparationTemplate(
52+
String templateId,
53+
) async {
54+
final result = await dio.get(Endpoint.preparationTemplateById(templateId));
55+
if (result.statusCode == 200) {
56+
return PreparationTemplateModel.fromJson(
57+
result.data['data'] as Map<String, dynamic>,
58+
).toEntity();
59+
}
60+
throw Exception('Error getting preparation template');
61+
}
62+
63+
@override
64+
Future<void> createPreparationTemplate({
65+
required String templateId,
66+
required String templateName,
67+
required PreparationEntity preparation,
68+
}) async {
69+
final request = UpsertPreparationTemplateRequestModel.fromValues(
70+
templateId: templateId,
71+
templateName: templateName,
72+
preparation: preparation,
73+
);
74+
final result = await dio.post(
75+
Endpoint.preparationTemplates,
76+
data: request.toJson(),
77+
);
78+
if (result.statusCode != 200) {
79+
throw Exception('Error creating preparation template');
80+
}
81+
}
82+
83+
@override
84+
Future<void> updatePreparationTemplate({
85+
required String templateId,
86+
required String templateName,
87+
required PreparationEntity preparation,
88+
}) async {
89+
final request = UpsertPreparationTemplateRequestModel.fromValues(
90+
templateId: templateId,
91+
templateName: templateName,
92+
preparation: preparation,
93+
);
94+
final result = await dio.put(
95+
Endpoint.preparationTemplateById(templateId),
96+
data: request.toJson(),
97+
);
98+
if (result.statusCode != 200) {
99+
throw Exception('Error updating preparation template');
100+
}
101+
}
102+
103+
@override
104+
Future<void> deletePreparationTemplate(String templateId) async {
105+
final result = await dio.delete(
106+
Endpoint.preparationTemplateById(templateId),
107+
);
108+
if (result.statusCode != 200) {
109+
throw Exception('Error deleting preparation template');
110+
}
111+
}
112+
}

lib/data/data_sources/schedule_remote_data_source.dart

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@ abstract interface class ScheduleRemoteDataSource {
1212
Future<void> createSchedule(ScheduleEntity schedule);
1313

1414
Future<List<ScheduleEntity>> getSchedulesByDate(
15-
DateTime startDate, DateTime? endDate);
15+
DateTime startDate,
16+
DateTime? endDate,
17+
);
1618

1719
Future<ScheduleEntity> getScheduleById(String id);
1820

19-
Future<void> updateSchedule(ScheduleEntity schedule);
21+
Future<void> updateSchedule(
22+
ScheduleEntity schedule, {
23+
bool includePreparationSource = false,
24+
});
2025

2126
Future<void> deleteSchedule(ScheduleEntity schedule);
2227

@@ -33,8 +38,10 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
3338
try {
3439
CreateScheduleRequestModel createScheduleModel =
3540
CreateScheduleRequestModel.fromEntity(schedule);
36-
final result = await dio.post(Endpoint.createSchedule,
37-
data: createScheduleModel.toJson());
41+
final result = await dio.post(
42+
Endpoint.createSchedule,
43+
data: createScheduleModel.toJson(),
44+
);
3845
if (result.statusCode == 200) {
3946
return;
4047
} else {
@@ -46,12 +53,20 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
4653
}
4754

4855
@override
49-
Future<void> updateSchedule(ScheduleEntity schedule) async {
56+
Future<void> updateSchedule(
57+
ScheduleEntity schedule, {
58+
bool includePreparationSource = false,
59+
}) async {
5060
try {
5161
UpdateScheduleRequestModel updateScheduleModel =
52-
UpdateScheduleRequestModel.fromEntity(schedule);
53-
final result = await dio.put(Endpoint.updateSchedule(schedule.id),
54-
data: updateScheduleModel.toJson());
62+
UpdateScheduleRequestModel.fromEntity(
63+
schedule,
64+
includePreparationSource: includePreparationSource,
65+
);
66+
final result = await dio.put(
67+
Endpoint.updateSchedule(schedule.id),
68+
data: updateScheduleModel.toJson(),
69+
);
5570
if (result.statusCode == 200) {
5671
return;
5772
} else {
@@ -81,10 +96,7 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
8196
try {
8297
final result = await dio.put(
8398
Endpoint.finishSchedule(scheduleId),
84-
data: {
85-
'scheduleId': scheduleId,
86-
'latenessTime': latenessTime,
87-
},
99+
data: {'scheduleId': scheduleId, 'latenessTime': latenessTime},
88100
);
89101
if (result.statusCode == 200) {
90102
return;
@@ -114,17 +126,22 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
114126

115127
@override
116128
Future<List<ScheduleEntity>> getSchedulesByDate(
117-
DateTime startDate, DateTime? endDate) async {
129+
DateTime startDate,
130+
DateTime? endDate,
131+
) async {
118132
try {
119-
final result =
120-
await dio.get(Endpoint.getSchedulesByDate, queryParameters: {
121-
'startDate': startDate.toIso8601String(),
122-
'endDate': endDate?.toIso8601String() ?? '',
123-
});
133+
final result = await dio.get(
134+
Endpoint.getSchedulesByDate,
135+
queryParameters: {
136+
'startDate': startDate.toIso8601String(),
137+
'endDate': endDate?.toIso8601String() ?? '',
138+
},
139+
);
124140
if (result.statusCode == 200) {
125141
final List<ScheduleEntity> schedules = result.data["data"]
126142
.map<ScheduleEntity>(
127-
(e) => GetScheduleResponseModel.fromJson(e).toEntity())
143+
(e) => GetScheduleResponseModel.fromJson(e).toEntity(),
144+
)
128145
.toList();
129146
return schedules;
130147
} else {

0 commit comments

Comments
 (0)