Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…utter into 56-홈-돌봄급구-필터-로직-구현
  • Loading branch information
Yellowtoast committed Feb 5, 2024
2 parents 4da3b66 + b953407 commit 8a7bab6
Show file tree
Hide file tree
Showing 44 changed files with 473 additions and 365 deletions.
2 changes: 1 addition & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ android {
applicationId "co.yellowtoast.pets_next_door_flutter"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
Expand Down
18 changes: 17 additions & 1 deletion android/app/google-services.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,23 @@
},
"oauth_client": [
{
"client_id": "231574029969-5chgj3uaqlh2fg9pr9qpc0diuhdhbook.apps.googleusercontent.com",
"client_id": "231574029969-17e6o5jt8pkcjvbudocmqt1pj01804a2.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "co.yellowtoast.pets_next_door_flutter.dev",
"certificate_hash": "d8d5bd779560ccae8f343662db21ac302aa8cdad"
}
},
{
"client_id": "231574029969-9oaog3g1361tvs2mj0pj22n8ijgp4tr4.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "co.yellowtoast.pets_next_door_flutter.dev",
"certificate_hash": "1c575dfabec64a99466b5f1ddb60018e1c41fdf9"
}
},
{
"client_id": "231574029969-hjvfj85727ar4jpbt4iemi0i6nf545bj.apps.googleusercontent.com",
"client_type": 3
}
],
Expand Down
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
// START: FlutterFire Configuration
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.gms:google-services:4.3.14'
// END: FlutterFire Configuration
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
Expand Down
2 changes: 2 additions & 0 deletions lib/app/di/app_binding.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:pets_next_door_flutter/app/di/modules/auth_di.dart';
import 'package:pets_next_door_flutter/app/di/modules/media_di.dart';
import 'package:pets_next_door_flutter/app/di/modules/pet_di.dart';
import 'package:pets_next_door_flutter/app/di/modules/user_di.dart';

final class AppBinder {
Expand All @@ -16,6 +17,7 @@ final class AppBinder {
AuthDependencyInjection(),
UserDependencyInjection(),
MediaDependencyInjection(),
PetDependencyInjection(),
]) {
di.init();
}
Expand Down
36 changes: 36 additions & 0 deletions lib/app/di/modules/pet_di.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:get_it/get_it.dart';
import 'package:pets_next_door_flutter/app/di/feature_di_interface.dart';
import 'package:pets_next_door_flutter/features/pet/data/remote/pet_remote_data_source.dart';
import 'package:pets_next_door_flutter/features/pet/data/remote/pet_remote_data_source_impl.dart';
import 'package:pets_next_door_flutter/features/pet/pet.dart';
import 'package:pets_next_door_flutter/features/pet/repository/pet_repository.dart';
import 'package:pets_next_door_flutter/features/pet/repository/pet_repository_impl.dart';
import 'package:pets_next_door_flutter/features/pet/usecases/get_breeds_use_case.dart';

final class PetDependencyInjection extends FeatureDependencyInjection {
@override
void dataSources() {
GetIt.I.registerLazySingleton<PetRemoteDataSource>(
PetRemoteDataSourceImpl.new,
);
}

@override
void repositories() {
GetIt.I.registerLazySingleton<PetRepository>(
() => PetRepositoryImpl(
petRemoteDataSource: petRemoteDataSource,
),
);
}

@override
void useCases() {
GetIt.I
..registerFactory<GetBreedsUseCase>(
() => GetBreedsUseCase(
petRepository: petRepository,
),
);
}
}
6 changes: 6 additions & 0 deletions lib/core/enums/pet_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ enum PetType {
dog(displayName: '강아지', code: 'dog');

const PetType({required this.displayName, required this.code});

final String displayName;
final String code;

factory PetType.getByCode(String code) {
return PetType.values
.firstWhere((value) => value.code == code, orElse: () => PetType.cat);
}
}
File renamed without changes.
17 changes: 17 additions & 0 deletions lib/features/pet/api/pet_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:dio/dio.dart' hide Headers;
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_response.dart';
import 'package:retrofit/http.dart';

part 'pet_api.g.dart';

@RestApi()
abstract class PetAPI {
factory PetAPI(Dio dio, {String baseUrl}) = _PetAPI;

@GET("/breeds")
@Headers({"requiresToken": false})
Future<BreedsPaginationResponse> getBreed(
@Queries() BreedsPaginationRequest breedsPaginationRequest,
);
}
80 changes: 80 additions & 0 deletions lib/features/pet/api/pet_api.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions lib/features/pet/data/remote/pet_remote_data_source.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_response.dart';

abstract interface class PetRemoteDataSource {
Future<BreedsPaginationResponse> getBreeds({
required BreedsPaginationRequest breedsPaginationRequest,
});
}
20 changes: 20 additions & 0 deletions lib/features/pet/data/remote/pet_remote_data_source_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:pets_next_door_flutter/app/env/flavors.dart';
import 'package:pets_next_door_flutter/core/network_handling/app_dio.dart';
import 'package:pets_next_door_flutter/features/pet/api/pet_api.dart';
import 'package:pets_next_door_flutter/features/pet/data/remote/pet_remote_data_source.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_response.dart';

final class PetRemoteDataSourceImpl implements PetRemoteDataSource {
final PetAPI _petAPI = PetAPI(
AppDio.instance,
baseUrl: Flavor.apiUrl,
);

@override
Future<BreedsPaginationResponse> getBreeds({
required BreedsPaginationRequest breedsPaginationRequest,
}) {
return _petAPI.getBreed(breedsPaginationRequest);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:pets_next_door_flutter/core/enums/pet_type.dart';
import 'package:pets_next_door_flutter/features/pet/domain/pagination_request.dart';
import 'package:pets_next_door_flutter/core/pagination/pagination_request.dart';

/// Metadata used when fetching movies with the paginated search API.
class BreedsPaginationRequest implements PaginationRequest {
Expand Down
17 changes: 11 additions & 6 deletions lib/features/pet/domain/breeds_pagination_response.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
import 'package:pets_next_door_flutter/core/enums/pet_type.dart';
import 'package:pets_next_door_flutter/core/pagination/pagination_response.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breed.dart';
import 'package:pets_next_door_flutter/features/pet/domain/pagination_response.dart';

/// Metadata used when fetching movies with the paginated search API.
class BreedsPaginationResponse implements PaginationResponse<Breed> {
BreedsPaginationResponse({
required this.page,
required this.size,
required this.petType,
required this.items,
});

BreedsPaginationResponse.fromJson(
Map<String, dynamic> json,
) : page = json['page'] as int,
size = json['size'] as int,
items = (json['items'] as List<dynamic>)
.map((e) => Breed.fromJson(e))
.toList();

@override
final int page;

Expand All @@ -19,20 +27,17 @@ class BreedsPaginationResponse implements PaginationResponse<Breed> {
@override
final List<Breed> items;

final PetType petType;

@override
bool operator ==(Object other) {
if (identical(this, other)) return true;

return other is BreedsPaginationResponse &&
other.petType == petType &&
other.page == page &&
other.size == size;
}

@override
int get hashCode => petType.hashCode ^ page.hashCode ^ size.hashCode;
int get hashCode => page.hashCode ^ size.hashCode;

@override
Map<String, dynamic> toJson() {
Expand Down
12 changes: 12 additions & 0 deletions lib/features/pet/pet.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:pets_next_door_flutter/app/di/locator.dart';
import 'package:pets_next_door_flutter/features/pet/data/remote/pet_remote_data_source.dart';
import 'package:pets_next_door_flutter/features/pet/repository/pet_repository.dart';
import 'package:pets_next_door_flutter/features/pet/usecases/get_breeds_use_case.dart';

// export 'data/remote/pet_remote_data_source.dart';
// export 'repository/pet_repository.dart';
// export 'usecases/get_breeds_use_case.dart';

final petRemoteDataSource = locator<PetRemoteDataSource>();
final petRepository = locator<PetRepository>();
final getBreedsUseCase = locator<GetBreedsUseCase>();
9 changes: 9 additions & 0 deletions lib/features/pet/repository/pet_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import 'package:pets_next_door_flutter/core/utils/result.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breed.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';

abstract interface class PetRepository {
Future<Result<List<Breed>>> getBreeds({
required BreedsPaginationRequest breedsPaginationRequest,
});
}
23 changes: 23 additions & 0 deletions lib/features/pet/repository/pet_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:pets_next_door_flutter/core/utils/result.dart';
import 'package:pets_next_door_flutter/features/pet/data/remote/pet_remote_data_source.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breed.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';
import 'package:pets_next_door_flutter/features/pet/repository/pet_repository.dart';

final class PetRepositoryImpl implements PetRepository {
const PetRepositoryImpl({
required PetRemoteDataSource petRemoteDataSource,
}) : _petRemoteDataSource = petRemoteDataSource;

final PetRemoteDataSource _petRemoteDataSource;

@override
Future<Result<List<Breed>>> getBreeds({required BreedsPaginationRequest breedsPaginationRequest}) async {
try {
final breedsData = await _petRemoteDataSource.getBreeds(breedsPaginationRequest: breedsPaginationRequest);
return Result.success(breedsData.items);
} on Exception catch (e) {
return Result.failure(e);
}
}
}
18 changes: 18 additions & 0 deletions lib/features/pet/usecases/get_breeds_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:pets_next_door_flutter/core/utils/result.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breed.dart';
import 'package:pets_next_door_flutter/features/pet/domain/breeds_pagination_request.dart';
import 'package:pets_next_door_flutter/features/pet/repository/pet_repository.dart';

final class GetBreedsUseCase {
const GetBreedsUseCase({
required PetRepository petRepository,
}) : _petRepository = petRepository;

final PetRepository _petRepository;

Future<Result<List<Breed>>> call({
required BreedsPaginationRequest breedsPaginationRequest,
}) async {
return _petRepository.getBreeds(breedsPaginationRequest: breedsPaginationRequest);
}
}
Loading

0 comments on commit 8a7bab6

Please sign in to comment.