Skip to content

Commit

Permalink
WIP: 돌봄급구 페이지네이션 작업 진행중....
Browse files Browse the repository at this point in the history
  • Loading branch information
Yellowtoast committed Feb 5, 2024
1 parent dbe5eb6 commit 1a5164e
Show file tree
Hide file tree
Showing 46 changed files with 1,373 additions and 178 deletions.
2 changes: 2 additions & 0 deletions lib/app/di/app_binding.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
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/sos_post_di.dart';
import 'package:pets_next_door_flutter/app/di/modules/user_di.dart';

final class AppBinder {
Expand All @@ -18,6 +19,7 @@ final class AppBinder {
UserDependencyInjection(),
MediaDependencyInjection(),
PetDependencyInjection(),
SosPostDependencyInjection(),
]) {
di.init();
}
Expand Down
36 changes: 36 additions & 0 deletions lib/app/di/modules/sos_post_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/sos/data/remote/sos_post_remote_data_source.dart';
import 'package:pets_next_door_flutter/features/sos/data/remote/sos_post_remote_data_source_impl.dart';
import 'package:pets_next_door_flutter/features/sos/repositories/sos_post_repository.dart';
import 'package:pets_next_door_flutter/features/sos/repositories/sos_post_repository_impl.dart';
import 'package:pets_next_door_flutter/features/sos/sos.dart';
import 'package:pets_next_door_flutter/features/sos/usecases/get_sos_post_use_case.dart';

final class SosPostDependencyInjection extends FeatureDependencyInjection {
@override
void dataSources() {
GetIt.I.registerLazySingleton<SosPostRemoteDataSource>(
SosPostRemoteDataSourceImpl.new,
);
}

@override
void repositories() {
GetIt.I.registerLazySingleton<SosPostRepository>(
() => SosPostRepositoryImpl(
sosPostRemoteDataSource,
),
);
}

@override
void useCases() {
GetIt.I
..registerFactory<GetSosPostsUseCase>(
() => GetSosPostsUseCase(
sosPostRepository: sosPostRepository,
),
);
}
}
8 changes: 8 additions & 0 deletions lib/core/helper/date_time_extension.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:intl/intl.dart';

extension DateTimeExt on DateTime {
/// 년도.월.일 형식의 String으로 반환
String get formatyyMMdd {
return DateFormat('yy.MM.dd').format(this);
}
}
7 changes: 7 additions & 0 deletions lib/features/media/api/media_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ abstract class MediaAPI {
factory MediaAPI(Dio dio, {String baseUrl}) = _MediaAPI;

Future<MediaImageDto> uploadImage(File file, String imageFormat);
Future<MediaImageDto> getImage(int imageId);
}

class _MediaAPI implements MediaAPI {
Expand All @@ -21,6 +22,12 @@ class _MediaAPI implements MediaAPI {

String? baseUrl;

@override
Future<MediaImageDto> getImage(int imageId) {
// TODO: implement getImage
throw UnimplementedError();
}

@override
Future<MediaImageDto> uploadImage(File file, String imageFormat) async {
const _extra = <String, dynamic>{};
Expand Down
2 changes: 2 additions & 0 deletions lib/features/media/data/remote/media_remote_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@ import 'package:pets_next_door_flutter/features/media/data/dto/media_image_dto.d

abstract interface class MediaRemoteDataSource {
Future<MediaImageDto> uploadImage(File imageFile, ImageFormat imageFormat);

Future<MediaImageDto> getImage(int imageId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ final class MediaRemoteDataSourceImpl implements MediaRemoteDataSource {
Future<MediaImageDto> uploadImage(File imageFile, ImageFormat imageFormat) {
return _api.uploadImage(imageFile, imageFormat.name);
}

@override
Future<MediaImageDto> getImage(int imageId) {
return _api.getImage(imageId);
}
}
2 changes: 2 additions & 0 deletions lib/features/media/repositories/media_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ import 'package:pets_next_door_flutter/features/media/entities/media_image_entit
abstract interface class MediaRepository {
Future<Result<MediaImageEntity>> uploadImage(File image,
{required ImageFormat imageFormat});

Future<Result<MediaImageEntity>> getImage({required int imageId});
}
10 changes: 10 additions & 0 deletions lib/features/media/repositories/media_repository_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,14 @@ final class MediaRepositoryImpl implements MediaRepository {
return Result.failure(e);
}
}

@override
Future<Result<MediaImageEntity>> getImage({required int imageId}) async {
try {
final uploadedImage = await _dataSource.getImage(imageId);
return Result.success(MediaImageEntity.fromDto(dto: uploadedImage));
} on Exception catch (e) {
return Result.failure(e);
}
}
}
35 changes: 35 additions & 0 deletions lib/features/pet/data/dto/pet_data_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// ignore_for_file: invalid_annotation_target

import 'package:freezed_annotation/freezed_annotation.dart';

part 'pet_data_dto.g.dart';

/// api 통신을 통해 가져오는 유저 데이터 모델
@JsonSerializable()
class PetDataDto {
final int id;
@JsonKey(name: 'birth_date')
final String birthDate;
final String breed;
final String name;
final bool neutered;
@JsonKey(name: 'pet_type')
final String petType;
final String sex;
@JsonKey(name: 'weight_in_kg')
final int weightKg;

PetDataDto({
required this.id,
required this.birthDate,
required this.breed,
required this.name,
required this.neutered,
required this.petType,
required this.sex,
required this.weightKg,
});

factory PetDataDto.fromJson(Map<String, dynamic> json) =>
_$PetDataDtoFromJson(json);
}
30 changes: 30 additions & 0 deletions lib/features/pet/data/dto/pet_data_dto.g.dart

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

1 change: 0 additions & 1 deletion lib/features/pet/domain/breeds_pagination_response.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
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';

Expand Down
20 changes: 20 additions & 0 deletions lib/features/pet/entities/pet_data_entity.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:pets_next_door_flutter/features/pet/data/dto/pet_data_dto.dart';

part 'pet_data_entity.freezed.dart';

@freezed
class PetDataEntity with _$PetDataEntity {
const PetDataEntity._();
const factory PetDataEntity({
required int code,
required String iconImgUrl,
required String text,
}) = _PetDataEntity;

factory PetDataEntity.fromDto(PetDataDto dto) => PetDataEntity(
code: dto.id,
iconImgUrl: '',
text: dto.name,
);
}
17 changes: 17 additions & 0 deletions lib/features/sos/api/sos_post_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/sos/data/dto/sos_pagination_request_dto.dart';
import 'package:pets_next_door_flutter/features/sos/data/dto/sos_pagination_response_dto.dart';
import 'package:retrofit/http.dart';

part 'sos_post_api.g.dart';

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

@GET("/posts/sos")
@Headers({"requiresToken": false})
Future<SosPostPaginationResponseDto> getSosPosts(
@Queries() SosPostPaginationRequestDto sosPostsRequest,
);
}
80 changes: 80 additions & 0 deletions lib/features/sos/api/sos_post_api.g.dart

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

19 changes: 19 additions & 0 deletions lib/features/sos/data/dto/sos_condition_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// ignore_for_file: invalid_annotation_target

import 'package:freezed_annotation/freezed_annotation.dart';

part 'sos_condition_dto.g.dart';

/// 급구의 돌봄조건 dto
@JsonSerializable()
class SosConditionDto {
final int id;
final String name;

SosConditionDto({required this.id, required this.name});

factory SosConditionDto.fromJson(Map<String, dynamic> json) =>
_$SosConditionDtoFromJson(json);

Map<String, dynamic> toJson() => _$SosConditionDtoToJson(this);
}
19 changes: 19 additions & 0 deletions lib/features/sos/data/dto/sos_condition_dto.g.dart

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

27 changes: 27 additions & 0 deletions lib/features/sos/data/dto/sos_pagination_request_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:pets_next_door_flutter/core/enums/sort_type_filter.enum.dart';
import 'package:pets_next_door_flutter/core/pagination/pagination_request.dart';

/// Metadata used when fetching movies with the paginated search API.
class SosPostPaginationRequestDto implements PaginationRequest {
SosPostPaginationRequestDto({
required this.page,
required this.size,
required this.sortType,
});
@override
final int page;

@override
final int size;

final SortTypeFilter sortType;

@override
Map<String, dynamic> toJson() {
return {
'page': page,
'size': size,
'sort_by': sortType.code,
};
}
}
Loading

0 comments on commit 1a5164e

Please sign in to comment.