Skip to content
Draft
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
1 change: 1 addition & 0 deletions lib/constants/enum/diaper_type.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum DiaperType { pee, poop, mixed }
1 change: 1 addition & 0 deletions lib/constants/enum/record_type.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum RecordType { breast, pumping, formula, sleep, diaper, supplement, water }
1 change: 1 addition & 0 deletions lib/constants/enum/sleep_type.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
enum SleepType { nap, night }
12 changes: 12 additions & 0 deletions lib/core/config/dependencies.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,12 @@ import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:yuktoe/core/config/app_env.dart';
import 'package:yuktoe/data/repositories/auth_repository/auth_repository.dart';
import 'package:yuktoe/data/repositories/auth_repository/auth_repository_impl.dart';
import 'package:yuktoe/data/repositories/record_repository/record_repository.dart';
import 'package:yuktoe/data/repositories/record_repository/record_repository_impl.dart';
import 'package:yuktoe/data/services/auth_service/auth_service.dart';
import 'package:yuktoe/data/services/auth_service/supabase_auth_service.dart';
import 'package:yuktoe/data/services/record_service/record_service.dart';
import 'package:yuktoe/data/services/record_service/supabase_record_service.dart';

List<SingleChildWidget> buildDependencies() {
return [
Expand All @@ -19,5 +23,13 @@ List<SingleChildWidget> buildDependencies() {
Provider<AuthRepository>(
create: (context) => AuthRepositoryImpl(context.read<AuthService>()),
),
Provider<RecordService>(
create: (context) =>
SupabaseRecordService(client: context.read<SupabaseClient>()),
),
Provider<RecordRepository>(
create: (context) =>
RecordRepositoryImpl(context.read<RecordService>()),
),
];
}
18 changes: 18 additions & 0 deletions lib/data/repositories/record_repository/record_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:yuktoe/core/result.dart';
import 'package:yuktoe/domain/models/record/care_record.dart';
import 'package:yuktoe/domain/models/record/record_detail_data.dart';
import 'package:yuktoe/domain/models/record/record_memo.dart';

abstract interface class RecordRepository {
Future<Result<CareRecord>> getRecord(String recordId);
Future<Result<void>> updateRecord(
String recordId, {
DateTime? recordedAt,
RecordDetailData? detail,
});
Future<Result<void>> deleteRecord(String recordId);
Future<Result<List<RecordMemo>>> getMemos(String recordId);
Future<Result<RecordMemo>> addMemo(String recordId, String content);
Future<Result<void>> updateMemo(String memoId, String content);
Future<Result<void>> deleteMemo(String memoId);
}
137 changes: 137 additions & 0 deletions lib/data/repositories/record_repository/record_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
import 'package:yuktoe/constants/enum/diaper_type.dart';
import 'package:yuktoe/constants/enum/sleep_type.dart';
import 'package:yuktoe/core/result.dart';
import 'package:yuktoe/data/repositories/record_repository/record_repository.dart';
import 'package:yuktoe/data/services/record_service/record_service.dart';
import 'package:yuktoe/domain/models/record/care_record.dart';
import 'package:yuktoe/domain/models/record/record_detail_data.dart';
import 'package:yuktoe/domain/models/record/record_memo.dart';

class RecordRepositoryImpl implements RecordRepository {
final RecordService _recordService;

RecordRepositoryImpl(this._recordService);

@override
Future<Result<CareRecord>> getRecord(String recordId) async {
final result = await _recordService.getRecord(recordId);
switch (result) {
case Ok<CareRecord>():
return Result.ok(result.value);
case Error<CareRecord>():
return Result.error(result.error);
}
}

@override
Future<Result<void>> updateRecord(
String recordId, {
DateTime? recordedAt,
RecordDetailData? detail,
}) async {
final data = <String, dynamic>{};

if (recordedAt != null) {
data['recorded_at'] = recordedAt.toIso8601String();
}

if (detail != null) {
data['detail'] = _serializeDetail(detail);
}

if (data.isEmpty) {
return Result.ok(null);
}

final result = await _recordService.updateRecord(recordId, data);
switch (result) {
case Ok<void>():
return Result.ok(null);
case Error<void>():
return Result.error(result.error);
}
}

@override
Future<Result<void>> deleteRecord(String recordId) async {
final result = await _recordService.deleteRecord(recordId);
switch (result) {
case Ok<void>():
return Result.ok(null);
case Error<void>():
return Result.error(result.error);
}
}

@override
Future<Result<List<RecordMemo>>> getMemos(String recordId) async {
final result = await _recordService.getMemos(recordId);
switch (result) {
case Ok<List<RecordMemo>>():
return Result.ok(result.value);
case Error<List<RecordMemo>>():
return Result.error(result.error);
}
}

@override
Future<Result<RecordMemo>> addMemo(String recordId, String content) async {
final result = await _recordService.createMemo(recordId, content);
switch (result) {
case Ok<RecordMemo>():
return Result.ok(result.value);
case Error<RecordMemo>():
return Result.error(result.error);
}
}

@override
Future<Result<void>> updateMemo(String memoId, String content) async {
final result = await _recordService.updateMemo(memoId, content);
switch (result) {
case Ok<void>():
return Result.ok(null);
case Error<void>():
return Result.error(result.error);
}
}

@override
Future<Result<void>> deleteMemo(String memoId) async {
final result = await _recordService.deleteMemo(memoId);
switch (result) {
case Ok<void>():
return Result.ok(null);
case Error<void>():
return Result.error(result.error);
}
}

Map<String, dynamic> _serializeDetail(RecordDetailData detail) {
return switch (detail) {
BreastDetail() => {
'left_minutes': detail.leftMinutes,
'right_minutes': detail.rightMinutes,
},
PumpingDetail() => {
'amount_ml': detail.amountMl,
},
FormulaDetail() => {
'amount_ml': detail.amountMl,
},
SleepDetail() => {
'sleep_type': detail.sleepType.name,
'end_time': detail.endTime?.toIso8601String(),
},
DiaperDetail() => {
'diaper_type': detail.diaperType.name,
},
SupplementDetail() => {
'name': detail.name,
},
WaterDetail() => {
'amount_ml': detail.amountMl,
},
};
}
}
16 changes: 16 additions & 0 deletions lib/data/services/record_service/record_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:yuktoe/core/result.dart';
import 'package:yuktoe/domain/models/record/care_record.dart';
import 'package:yuktoe/domain/models/record/record_memo.dart';

abstract interface class RecordService {
Future<Result<CareRecord>> getRecord(String recordId);
Future<Result<void>> updateRecord(
String recordId,
Map<String, dynamic> data,
);
Future<Result<void>> deleteRecord(String recordId);
Future<Result<List<RecordMemo>>> getMemos(String recordId);
Future<Result<RecordMemo>> createMemo(String recordId, String content);
Future<Result<void>> updateMemo(String memoId, String content);
Future<Result<void>> deleteMemo(String memoId);
}
Loading