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
41 changes: 16 additions & 25 deletions lib/data/data_sources/schedule_local_data_source.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import 'package:on_time_front/core/database/database.dart';
import 'package:on_time_front/data/mappers/domain_persistence_mappers.dart';
import 'package:on_time_front/domain/entities/schedule_entity.dart';
import 'package:on_time_front/data/tables/schedule_with_place_model.dart';

abstract interface class ScheduleLocalDataSource {
Future<void> createSchedule(ScheduleEntity scheduleEntity);
Future<void> createSchedule(ScheduleWithPlace schedule);

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

Future<ScheduleEntity> getScheduleById(String id);
Future<ScheduleWithPlace> getScheduleById(String id);

Future<void> updateSchedule(ScheduleEntity scheduleEntity);
Future<void> updateSchedule(Schedule schedule);

Future<void> deleteSchedule(ScheduleEntity scheduleEntity);
Future<void> deleteSchedule(Schedule schedule);
}

// Not registered with DI; schedule repository persistence is remote-only.
Expand All @@ -24,38 +23,30 @@ class ScheduleLocalDataSourceImpl implements ScheduleLocalDataSource {
ScheduleLocalDataSourceImpl({required this.appDatabase});

@override
Future<void> createSchedule(ScheduleEntity scheduleEntity) async {
await appDatabase.scheduleDao.createSchedule(
scheduleEntity.toScheduleWithPlaceRow(),
);
Future<void> createSchedule(ScheduleWithPlace schedule) async {
await appDatabase.scheduleDao.createSchedule(schedule);
}

@override
Future<void> deleteSchedule(ScheduleEntity schedulEntity) async {
await appDatabase.scheduleDao.deleteSchedule(schedulEntity.toScheduleRow());
Future<void> deleteSchedule(Schedule schedule) async {
await appDatabase.scheduleDao.deleteSchedule(schedule);
}

@override
Future<ScheduleEntity> getScheduleById(String id) async {
final scheduleWithPlaceModel = await appDatabase.scheduleDao
.getScheduleById(id);
return scheduleWithPlaceModel.toScheduleEntity();
Future<ScheduleWithPlace> getScheduleById(String id) async {
return appDatabase.scheduleDao.getScheduleById(id);
}

@override
Future<List<ScheduleEntity>> getSchedulesByDate(
Future<List<ScheduleWithPlace>> getSchedulesByDate(
DateTime startDate,
DateTime? endDate,
) async {
final scheduleWithPlaceModel = await appDatabase.scheduleDao
.getSchedulesByDate(startDate, endDate);
return scheduleWithPlaceModel.map((e) => e.toScheduleEntity()).toList();
return appDatabase.scheduleDao.getSchedulesByDate(startDate, endDate);
}

@override
Future<void> updateSchedule(ScheduleEntity scheduleEntity) async {
await appDatabase.scheduleDao.updateSchedule(
scheduleEntity.toScheduleRow(),
);
Future<void> updateSchedule(Schedule schedule) async {
await appDatabase.scheduleDao.updateSchedule(schedule);
}
}
51 changes: 18 additions & 33 deletions lib/data/data_sources/schedule_remote_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,19 @@ import 'package:on_time_front/data/models/create_schedule_request_model.dart';
import 'package:on_time_front/data/models/get_schedule_response_model.dart';
import 'package:on_time_front/data/models/update_schedule_request_model.dart';

import 'package:on_time_front/domain/entities/schedule_entity.dart';

abstract interface class ScheduleRemoteDataSource {
Future<void> createSchedule(ScheduleEntity schedule);
Future<void> createSchedule(CreateScheduleRequestModel schedule);

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

Future<ScheduleEntity> getScheduleById(String id);
Future<GetScheduleResponseModel> getScheduleById(String id);

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

Future<void> deleteSchedule(ScheduleEntity schedule);
Future<void> deleteSchedule(String scheduleId);

Future<void> startSchedule(String scheduleId);

Expand All @@ -36,13 +31,11 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
ScheduleRemoteDataSourceImpl(this.dio);

@override
Future<void> createSchedule(ScheduleEntity schedule) async {
Future<void> createSchedule(CreateScheduleRequestModel schedule) async {
try {
CreateScheduleRequestModel createScheduleModel =
CreateScheduleRequestModel.fromEntity(schedule);
final result = await dio.post(
Endpoint.createSchedule,
data: createScheduleModel.toJson(),
data: schedule.toJson(),
);
if (result.statusCode == 200) {
return;
Expand All @@ -55,19 +48,11 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
}

@override
Future<void> updateSchedule(
ScheduleEntity schedule, {
bool includePreparationSource = false,
}) async {
Future<void> updateSchedule(UpdateScheduleRequestModel schedule) async {
try {
UpdateScheduleRequestModel updateScheduleModel =
UpdateScheduleRequestModel.fromEntity(
schedule,
includePreparationSource: includePreparationSource,
);
final result = await dio.put(
Endpoint.updateSchedule(schedule.id),
data: updateScheduleModel.toJson(),
Endpoint.updateSchedule(schedule.scheduleId),
data: schedule.toJson(),
);
if (result.statusCode == 200) {
return;
Expand All @@ -80,9 +65,9 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
}

@override
Future<void> deleteSchedule(ScheduleEntity schedule) async {
Future<void> deleteSchedule(String scheduleId) async {
try {
final result = await dio.delete(Endpoint.deleteScheduleById(schedule.id));
final result = await dio.delete(Endpoint.deleteScheduleById(scheduleId));
if (result.statusCode == 200) {
return;
} else {
Expand Down Expand Up @@ -125,13 +110,13 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
}

@override
Future<ScheduleEntity> getScheduleById(String id) async {
Future<GetScheduleResponseModel> getScheduleById(String id) async {
try {
final result = await dio.get(Endpoint.getScheduleById(id));
if (result.statusCode == 200) {
final GetScheduleResponseModel schedule =
GetScheduleResponseModel.fromJson(result.data["data"]);
return schedule.toEntity();
return schedule;
} else {
throw Exception('Error getting schedules');
}
Expand All @@ -141,7 +126,7 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
}

@override
Future<List<ScheduleEntity>> getSchedulesByDate(
Future<List<GetScheduleResponseModel>> getSchedulesByDate(
DateTime startDate,
DateTime? endDate,
) async {
Expand All @@ -154,9 +139,9 @@ class ScheduleRemoteDataSourceImpl implements ScheduleRemoteDataSource {
},
);
if (result.statusCode == 200) {
final List<ScheduleEntity> schedules = result.data["data"]
.map<ScheduleEntity>(
(e) => GetScheduleResponseModel.fromJson(e).toEntity(),
final List<GetScheduleResponseModel> schedules = result.data["data"]
.map<GetScheduleResponseModel>(
(e) => GetScheduleResponseModel.fromJson(e),
)
.toList();
return schedules;
Expand Down
26 changes: 17 additions & 9 deletions lib/data/repositories/schedule_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import 'dart:async';
import 'package:collection/collection.dart';
import 'package:injectable/injectable.dart';
import 'package:on_time_front/data/data_sources/schedule_remote_data_source.dart';
import 'package:on_time_front/data/models/create_schedule_request_model.dart';
import 'package:on_time_front/data/models/update_schedule_request_model.dart';
import 'package:on_time_front/domain/entities/schedule_entity.dart';
import 'package:on_time_front/domain/repositories/schedule_repository.dart';
import 'package:on_time_front/domain/repositories/timed_preparation_repository.dart';
Expand Down Expand Up @@ -47,7 +49,9 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
@override
Future<void> createSchedule(ScheduleEntity schedule) async {
try {
await scheduleRemoteDataSource.createSchedule(schedule);
await scheduleRemoteDataSource.createSchedule(
CreateScheduleRequestModel.fromEntity(schedule),
);
_emitUpsertedSchedule(schedule);
} catch (e) {
rethrow;
Expand All @@ -57,7 +61,7 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
@override
Future<void> deleteSchedule(ScheduleEntity schedule) async {
try {
await scheduleRemoteDataSource.deleteSchedule(schedule);
await scheduleRemoteDataSource.deleteSchedule(schedule.id);
await _clearTimedPreparationSafe(schedule.id);
_emitScheduleSet(
Set.from(_scheduleStreamController.value)
Expand All @@ -81,7 +85,9 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
@override
Future<ScheduleEntity> getScheduleById(String id) async {
try {
final schedule = await scheduleRemoteDataSource.getScheduleById(id);
final schedule = (await scheduleRemoteDataSource.getScheduleById(
id,
)).toEntity();
if (_isEnded(schedule.doneStatus)) {
await _clearTimedPreparationSafe(schedule.id);
}
Expand All @@ -98,10 +104,10 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
DateTime? endDate,
) async {
try {
final schedules = await scheduleRemoteDataSource.getSchedulesByDate(
final schedules = (await scheduleRemoteDataSource.getSchedulesByDate(
startDate,
endDate,
);
)).map((schedule) => schedule.toEntity()).toList();
for (final schedule in schedules) {
if (_isEnded(schedule.doneStatus)) {
await _clearTimedPreparationSafe(schedule.id);
Expand All @@ -125,13 +131,15 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
}) async {
try {
await scheduleRemoteDataSource.updateSchedule(
schedule,
includePreparationSource: includePreparationSource,
UpdateScheduleRequestModel.fromEntity(
schedule,
includePreparationSource: includePreparationSource,
),
);
await _clearTimedPreparationSafe(schedule.id);
final refreshedSchedule = await scheduleRemoteDataSource.getScheduleById(
final refreshedSchedule = (await scheduleRemoteDataSource.getScheduleById(
schedule.id,
);
)).toEntity();
if (_isEnded(refreshedSchedule.doneStatus)) {
await _clearTimedPreparationSafe(refreshedSchedule.id);
}
Expand Down
37 changes: 37 additions & 0 deletions test/data/data_sources/schedule_data_source_contract_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'dart:io';

import 'package:flutter_test/flutter_test.dart';

void main() {
test(
'schedule remote data source contract does not expose domain entities',
() {
final violations = _scheduleEntityViolations(
'lib/data/data_sources/schedule_remote_data_source.dart',
);

expect(violations, isEmpty);
},
);

test(
'schedule local data source contract does not expose domain entities',
() {
final violations = _scheduleEntityViolations(
'lib/data/data_sources/schedule_local_data_source.dart',
);

expect(violations, isEmpty);
},
);
}

List<String> _scheduleEntityViolations(String path) {
final lines = File(path).readAsLinesSync();
return [
for (var index = 0; index < lines.length; index++)
if (lines[index].contains('domain/entities/schedule_entity.dart') ||
lines[index].contains('ScheduleEntity'))
'$path:${index + 1}: ${lines[index].trim()}',
];
}
Loading
Loading