diff --git a/lib/data/community/data_source/community_data_source.dart b/lib/data/community/data_source/community_data_source.dart new file mode 100644 index 0000000..9bb383f --- /dev/null +++ b/lib/data/community/data_source/community_data_source.dart @@ -0,0 +1,21 @@ +import 'package:jusicool_ios/data/community/dto/remote/request/edit_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_comment_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_detail_response_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_response_dto.dart'; + +abstract class CommunityDataSource { + Future> fetchCommunity(String market); + + Future writeCommunityPost(String markte, WriteCommunityPostRequestDto body); + + Future fetchCommunityDetail(String market, int boardId); + + Future writeComment(String market, int boardId, WriteCommunityCommentRequestDto body); + + Future editPost(String market, int boardId, EditCommunityPostRequestDto body); + + Future likePost(String markte, int boardId); + + Future deletePost(String market, int boardId); +} \ No newline at end of file diff --git a/lib/data/community/data_source/community_data_source_impl.dart b/lib/data/community/data_source/community_data_source_impl.dart new file mode 100644 index 0000000..e736530 --- /dev/null +++ b/lib/data/community/data_source/community_data_source_impl.dart @@ -0,0 +1,50 @@ +import 'package:jusicool_ios/data/community/data_source/community_data_source.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/edit_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_comment_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_detail_response_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_response_dto.dart'; +import 'package:jusicool_ios/data/community/service/community_api.dart'; + +class CommunityDataSourceImpl extends CommunityDataSource { + + final CommunityApi _communityApi; + + CommunityDataSourceImpl(this._communityApi); + + + @override + Future> fetchCommunity(String market) async { + return await _communityApi.fetchCommunity(market); + } + + @override + Future writeCommunityPost(String markte, WriteCommunityPostRequestDto body) async { + return await _communityApi.writeCommunityPost(markte, body); + } + + @override + Future fetchCommunityDetail(String market, int boardId) async { + return await _communityApi.getCommunityPost(market, boardId); + } + + @override + Future writeComment(String market, int boardId, WriteCommunityCommentRequestDto body) async { + return await _communityApi.writeComment(market, boardId, body); + } + + @override + Future editPost(String market, int boardId, EditCommunityPostRequestDto body) async { + return await _communityApi.editPost(market, boardId, body); + } + + @override + Future likePost(String markte, int boardId) async { + return await _communityApi.likePost(markte, boardId); + } + + @override + Future deletePost(String market, int boardId) async { + return await _communityApi.deletePost(market, boardId); + } +} \ No newline at end of file diff --git a/lib/data/community/dto/remote/request/edit_community_post_request_dto.dart b/lib/data/community/dto/remote/request/edit_community_post_request_dto.dart new file mode 100644 index 0000000..5311f86 --- /dev/null +++ b/lib/data/community/dto/remote/request/edit_community_post_request_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'edit_community_post_request_dto.g.dart'; +part 'edit_community_post_request_dto.freezed.dart'; + +@freezed +abstract class EditCommunityPostRequestDto with _$EditCommunityPostRequestDto { + factory EditCommunityPostRequestDto({ + required String title, + required String content, + }) = _EditCommunityPostRequestDto; + + factory EditCommunityPostRequestDto.fromJson(Map json) => + _$EditCommunityPostRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/community/dto/remote/request/write_community_comment_request_dto.dart b/lib/data/community/dto/remote/request/write_community_comment_request_dto.dart new file mode 100644 index 0000000..9dcc577 --- /dev/null +++ b/lib/data/community/dto/remote/request/write_community_comment_request_dto.dart @@ -0,0 +1,14 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'write_community_comment_request_dto.g.dart'; +part 'write_community_comment_request_dto.freezed.dart'; + +@freezed +abstract class WriteCommunityCommentRequestDto with _$WriteCommunityCommentRequestDto { + factory WriteCommunityCommentRequestDto({ + required String comment, + }) = _WriteCommunityPostRequestDto; + + factory WriteCommunityCommentRequestDto.fromJson(Map json) => + _$WriteCommunityCommentRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/community/dto/remote/request/write_community_post_request_dto.dart b/lib/data/community/dto/remote/request/write_community_post_request_dto.dart new file mode 100644 index 0000000..7fa5161 --- /dev/null +++ b/lib/data/community/dto/remote/request/write_community_post_request_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'write_community_post_request_dto.g.dart'; +part 'write_community_post_request_dto.freezed.dart'; + +@freezed +abstract class WriteCommunityPostRequestDto with _$WriteCommunityPostRequestDto { + factory WriteCommunityPostRequestDto({ + required String title, + required String content, + }) = _WriteCommunityPostRequestDto; + + factory WriteCommunityPostRequestDto.fromJson(Map json) => + _$WriteCommunityPostRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/community/dto/remote/response/community_post_detail_response_dto.dart b/lib/data/community/dto/remote/response/community_post_detail_response_dto.dart new file mode 100644 index 0000000..f810f3c --- /dev/null +++ b/lib/data/community/dto/remote/response/community_post_detail_response_dto.dart @@ -0,0 +1,32 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'community_post_detail_response_dto.g.dart'; +part 'community_post_detail_response_dto.freezed.dart'; + +@freezed +abstract class CommunityPostDetailResponseDto with _$CommunityPostDetailResponseDto { + factory CommunityPostDetailResponseDto({ + required int id, + required String email, + required String market, + required String title, + required String content, + required List comment, + @JsonKey(name: 'like_count') required int likeCount, + }) = _CommunityPostDetailResponseDto; + + factory CommunityPostDetailResponseDto.fromJson(Map json) => + _$CommunityPostDetailResponseDtoFromJson(json); +} + +@freezed +abstract class CommentDto with _$CommentDto { + factory CommentDto({ + required int id, + required String email, + required String comment, + }) = _CommentDto; + + factory CommentDto.fromJson(Map json) => + _$CommentDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/community/dto/remote/response/community_post_response_dto.dart b/lib/data/community/dto/remote/response/community_post_response_dto.dart new file mode 100644 index 0000000..afe052a --- /dev/null +++ b/lib/data/community/dto/remote/response/community_post_response_dto.dart @@ -0,0 +1,21 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'community_post_response_dto.g.dart'; +part 'community_post_response_dto.freezed.dart'; + +@freezed +abstract class CommunityPostResponseDto with _$CommunityPostResponseDto { + factory CommunityPostResponseDto({ + required int id, + required String email, + required String market, + required String title, + required String content, + @JsonKey(name: 'comment_count') required int commentCount, + @JsonKey(name: 'like_count') required int likeCount, + @JsonKey(name: 'is_liked') required bool isLiked, + }) = _CommunityPostResponseDto; + + factory CommunityPostResponseDto.fromJson(Map json) => + _$CommunityPostResponseDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/community/mapper/remote/response/comment_response_mapper.dart b/lib/data/community/mapper/remote/response/comment_response_mapper.dart new file mode 100644 index 0000000..335aec9 --- /dev/null +++ b/lib/data/community/mapper/remote/response/comment_response_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_detail_response_dto.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; + +class CommentResponseMapper { + static CommentDto toDto(CommentEntity entity) => + CommentDto(id: entity.id, email: entity.email, comment: entity.comment); + static CommentEntity toEntity(CommentDto dto) => + CommentEntity(id: dto.id, email: dto.email, comment: dto.comment); +} \ No newline at end of file diff --git a/lib/data/community/mapper/remote/response/community_post_detail_response_mapper.dart b/lib/data/community/mapper/remote/response/community_post_detail_response_mapper.dart new file mode 100644 index 0000000..896373e --- /dev/null +++ b/lib/data/community/mapper/remote/response/community_post_detail_response_mapper.dart @@ -0,0 +1,27 @@ +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_detail_response_dto.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; +import 'package:jusicool_ios/data/community/mapper/remote/response/comment_response_mapper.dart'; + +class CommunityPostDetailResponseMapper { + static CommunityPostDetailResponseDto toDto(CommunityPostDetailEntity entity) => + CommunityPostDetailResponseDto( + id: entity.id, + email: entity.email, + market: entity.market, + title: entity.title, + content: entity.content, + comment: entity.comment.map((e) => CommentResponseMapper.toDto(e)).toList(), + likeCount: entity.likeCount, + ); + + static CommunityPostDetailEntity toEntity(CommunityPostDetailResponseDto dto) => + CommunityPostDetailEntity( + id: dto.id, + email: dto.email, + market: dto.market, + title: dto.title, + content: dto.content, + comment: dto.comment.map((e) => CommentResponseMapper.toEntity(e)).toList(), + likeCount: dto.likeCount, + ); +} \ No newline at end of file diff --git a/lib/data/community/mapper/remote/response/community_post_response_mapper.dart b/lib/data/community/mapper/remote/response/community_post_response_mapper.dart new file mode 100644 index 0000000..d5756a8 --- /dev/null +++ b/lib/data/community/mapper/remote/response/community_post_response_mapper.dart @@ -0,0 +1,27 @@ +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_response_dto.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_entity.dart'; + +class CommunityPostResponseMapper { + static CommunityPostResponseDto toDto(CommunityPostEntity entity) => + CommunityPostResponseDto( + id: entity.id, + email: entity.email, + market: entity.market, + title: entity.title, + content: entity.content, + commentCount: entity.commentCount, + likeCount: entity.likeCount, + isLiked: entity.isLiked, + ); + static CommunityPostEntity toEntity(CommunityPostResponseDto dto) => + CommunityPostEntity( + id: dto.id, + email: dto.email, + market: dto.market, + title: dto.title, + content: dto.content, + commentCount: dto.commentCount, + likeCount: dto.likeCount, + isLiked: dto.isLiked, + ); +} \ No newline at end of file diff --git a/lib/data/community/repositories/community_repository_impl.dart b/lib/data/community/repositories/community_repository_impl.dart new file mode 100644 index 0000000..56181c3 --- /dev/null +++ b/lib/data/community/repositories/community_repository_impl.dart @@ -0,0 +1,57 @@ +import 'package:jusicool_ios/data/community/data_source/community_data_source_impl.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/edit_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_comment_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/mapper/remote/response/community_post_detail_response_mapper.dart'; +import 'package:jusicool_ios/data/community/mapper/remote/response/community_post_response_mapper.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_entity.dart'; +import 'package:jusicool_ios/domain/community/repositories/community_repository.dart'; + +class CommunityRepositoryImpl extends CommunityRepository { + + final CommunityDataSourceImpl _communityDataSourceImpl; + + CommunityRepositoryImpl(this._communityDataSourceImpl); + + @override + Future> fetchCommunity(String market) async { + final response = await _communityDataSourceImpl.fetchCommunity(market); + return response.map((e) => CommunityPostResponseMapper.toEntity(e)).toList(); + } + + @override + Future writeCommunityPost(String market, String title, String content) async { + final body = WriteCommunityPostRequestDto(title: title, content: content); + await _communityDataSourceImpl.writeCommunityPost(market, body); + } + + @override + Future> fetchCommunityDetail(String market, int boardId) async { + final response = await _communityDataSourceImpl.fetchCommunityDetail(market, boardId); + return [CommunityPostDetailResponseMapper.toEntity(response)]; + } + + @override + Future writeComment(String market, int boardId, String comment) async { + final body = WriteCommunityCommentRequestDto(comment: comment); + await _communityDataSourceImpl.writeComment(market, boardId, body); + } + + @override + Future editPost(String market, int boardId, String title, String content) async { + final body = EditCommunityPostRequestDto(title: title, content: content); + await _communityDataSourceImpl.editPost(market, boardId, body); + } + + @override + Future likePost(String market, int boardId) async { + await _communityDataSourceImpl.likePost(market, boardId); + } + + @override + Future deletePost(String market, int boardId) async { + await _communityDataSourceImpl.deletePost(market, boardId); + } + +} \ No newline at end of file diff --git a/lib/data/community/service/community_api.dart b/lib/data/community/service/community_api.dart new file mode 100644 index 0000000..5e6abbc --- /dev/null +++ b/lib/data/community/service/community_api.dart @@ -0,0 +1,59 @@ +import 'package:dio/dio.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/edit_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_comment_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/request/write_community_post_request_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_detail_response_dto.dart'; +import 'package:jusicool_ios/data/community/dto/remote/response/community_post_response_dto.dart'; +import 'package:retrofit/http.dart'; + +part 'community_api.g.dart'; + +@RestApi() +abstract class CommunityApi { + + factory CommunityApi(Dio dio,{String baseUrl}) = _CommunityApi; + + @GET('/community/{market}') + Future> fetchCommunity( + @Path('market') String market + ); + + @POST('/community/{market}') + Future writeCommunityPost( + @Path('market') String market, + @Body() WriteCommunityPostRequestDto body + ); + + @GET('/community/{market}/{board_id}') + Future getCommunityPost( + @Path('market') String market, + @Path('board_id') int boardId, + ); + + @POST('/community/{market}/{board_id}') + Future writeComment( + @Path('market') String market, + @Path('board_id') int boardId, + @Body() WriteCommunityCommentRequestDto body, + ); + + @PUT('/community/{market}/{board_id}') + Future editPost( + @Path('market') String market, + @Path('board_id') int boardId, + @Body() EditCommunityPostRequestDto body + ); + + @PATCH('/community/{market}/{board_id}') + Future likePost( + @Path('market') String market, + @Path('board_id') int boardId, + ); + + @DELETE('/community/{market}/{board_id}') + Future deletePost( + @Path('market') String market, + @Path('board_id') int boardId, + ); + +} \ No newline at end of file diff --git a/lib/data/exchange/data_sources/exchange_data_source.dart b/lib/data/exchange/data_sources/exchange_data_source.dart new file mode 100644 index 0000000..ef14e52 --- /dev/null +++ b/lib/data/exchange/data_sources/exchange_data_source.dart @@ -0,0 +1,7 @@ +import 'package:jusicool_ios/data/exchange/dto/remote/request/exchange_request_dto.dart'; + +abstract class ExchangeDataSource { + Future exchangeKRW(ExchangeRequestDto body); + + Future exchangeUSD(ExchangeRequestDto body); +} \ No newline at end of file diff --git a/lib/data/exchange/data_sources/exchange_data_source_impl.dart b/lib/data/exchange/data_sources/exchange_data_source_impl.dart new file mode 100644 index 0000000..7cc2d8c --- /dev/null +++ b/lib/data/exchange/data_sources/exchange_data_source_impl.dart @@ -0,0 +1,21 @@ +import 'package:jusicool_ios/data/exchange/data_sources/exchange_data_source.dart'; +import 'package:jusicool_ios/data/exchange/dto/remote/request/exchange_request_dto.dart'; +import 'package:jusicool_ios/data/exchange/service/exchange_api.dart'; + +class ExchangeDataSourceImpl extends ExchangeDataSource { + + final ExchangeApi _exchangeApi; + + ExchangeDataSourceImpl(this._exchangeApi); + + @override + Future exchangeKRW(ExchangeRequestDto body) async { + return await _exchangeApi.exchangeKRW(body); + } + + @override + Future exchangeUSD(ExchangeRequestDto body) async { + return await _exchangeApi.exchangeUSD(body); + } + +} \ No newline at end of file diff --git a/lib/data/exchange/dto/local/request/.gitkeep b/lib/data/exchange/dto/local/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/exchange/dto/local/response/.gitkeep b/lib/data/exchange/dto/local/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/exchange/dto/remote/request/exchange_request_dto.dart b/lib/data/exchange/dto/remote/request/exchange_request_dto.dart new file mode 100644 index 0000000..7f560ba --- /dev/null +++ b/lib/data/exchange/dto/remote/request/exchange_request_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'exchange_request_dto.g.dart'; + +part 'exchange_request_dto.freezed.dart'; + +@freezed +abstract class ExchangeRequestDto with _$ExchangeRequestDto { + factory ExchangeRequestDto({ + required int amount + }) = _ExchangeRequestDto; + + factory ExchangeRequestDto.fromJson(Map json) => + _$ExchangeRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/exchange/mappers/remote/request/exchange_request_mapper.dart b/lib/data/exchange/mappers/remote/request/exchange_request_mapper.dart new file mode 100644 index 0000000..37dde00 --- /dev/null +++ b/lib/data/exchange/mappers/remote/request/exchange_request_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/exchange/dto/remote/request/exchange_request_dto.dart'; +import 'package:jusicool_ios/domain/exchange/entities/exchange_entity.dart'; + +class ExchangeRequestMapper { + static ExchangeRequestDto toDto(ExchangeEntity entity) => + ExchangeRequestDto(amount: entity.amount); + static ExchangeEntity toEntity(ExchangeRequestDto dto) => + ExchangeEntity(amount: dto.amount); +} \ No newline at end of file diff --git a/lib/data/exchange/repositories/exchange_repository_impl.dart b/lib/data/exchange/repositories/exchange_repository_impl.dart new file mode 100644 index 0000000..010ec42 --- /dev/null +++ b/lib/data/exchange/repositories/exchange_repository_impl.dart @@ -0,0 +1,24 @@ +import 'package:jusicool_ios/data/exchange/data_sources/exchange_data_source.dart'; +import 'package:jusicool_ios/data/exchange/dto/remote/request/exchange_request_dto.dart'; +import 'package:jusicool_ios/data/exchange/mappers/remote/request/exchange_request_mapper.dart'; +import 'package:jusicool_ios/domain/exchange/entities/exchange_entity.dart'; +import 'package:jusicool_ios/domain/exchange/repositories/exchange_repository.dart'; + +class ExchangeRepositoryImpl extends ExchangeRepository { + final ExchangeDataSource _exchangeDataSource; + + ExchangeRepositoryImpl(this._exchangeDataSource); + + @override + Future exchangeKRW(ExchangeEntity body) async { + final ExchangeRequestDto request = ExchangeRequestMapper.toDto(body); + return await _exchangeDataSource.exchangeKRW(request); + } + + @override + Future exchangeUSD(ExchangeEntity body) async { + final ExchangeRequestDto request = ExchangeRequestMapper.toDto(body); + return await _exchangeDataSource.exchangeUSD(request); + } + +} \ No newline at end of file diff --git a/lib/data/exchange/service/exchange_api.dart b/lib/data/exchange/service/exchange_api.dart new file mode 100644 index 0000000..19314db --- /dev/null +++ b/lib/data/exchange/service/exchange_api.dart @@ -0,0 +1,17 @@ +import 'package:dio/dio.dart'; +import 'package:jusicool_ios/data/exchange/dto/remote/request/exchange_request_dto.dart'; +import 'package:retrofit/http.dart'; + +part 'exchange_api.g.dart'; + +@RestApi() +abstract class ExchangeApi { + + factory ExchangeApi(Dio dio, {String baseUrl}) = _ExchangeApi; + + @POST('/exchange/KRW') + Future exchangeKRW(@Body() ExchangeRequestDto body); + + @POST('/exchange/USD') + Future exchangeUSD(@Body() ExchangeRequestDto body); +} \ No newline at end of file diff --git a/lib/data/holding/data_source/holding_data_source.dart b/lib/data/holding/data_source/holding_data_source.dart new file mode 100644 index 0000000..af6a8d9 --- /dev/null +++ b/lib/data/holding/data_source/holding_data_source.dart @@ -0,0 +1,5 @@ +import 'package:jusicool_ios/data/holding/dto/remote/response/my_holding_response_dto.dart'; + +abstract class HoldingDataSource { + Future fetchMyHolding(); +} \ No newline at end of file diff --git a/lib/data/holding/data_source/holding_data_source_impl.dart b/lib/data/holding/data_source/holding_data_source_impl.dart new file mode 100644 index 0000000..6917dd7 --- /dev/null +++ b/lib/data/holding/data_source/holding_data_source_impl.dart @@ -0,0 +1,15 @@ +import 'package:jusicool_ios/data/holding/data_source/holding_data_source.dart'; +import 'package:jusicool_ios/data/holding/dto/remote/response/my_holding_response_dto.dart'; +import 'package:jusicool_ios/data/holding/service/holding_api.dart'; + +class HoldingDataSourceImpl extends HoldingDataSource { + + final HoldingApi _holdingApi; + + HoldingDataSourceImpl(this._holdingApi); + + @override + Future fetchMyHolding() async { + return await _holdingApi.fetchMyHolding(); + } +} \ No newline at end of file diff --git a/lib/data/holding/dto/remote/response/my_holding_response_dto.dart b/lib/data/holding/dto/remote/response/my_holding_response_dto.dart new file mode 100644 index 0000000..682ed9b --- /dev/null +++ b/lib/data/holding/dto/remote/response/my_holding_response_dto.dart @@ -0,0 +1,31 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'my_holding_response_dto.g.dart'; +part 'my_holding_response_dto.freezed.dart'; + +@freezed +abstract class MyHoldingResponseDto with _$MyHoldingResponseDto { + factory MyHoldingResponseDto({ + required int id, + required MyMarketDto market, + required int quantity, + required int price, + }) = _MyHoldingResponseDto; + + factory MyHoldingResponseDto.fromJson(Map json) => + _$MyHoldingResponseDtoFromJson(json); +} + +@freezed +abstract class MyMarketDto with _$MyMarketDto { + factory MyMarketDto({ + required int id, + @JsonKey(name: 'korean_name') required String koreanName, + @JsonKey(name: 'english_name') required String englishName, + required String market, + required String type, + }) = _MyMarketDto; + + factory MyMarketDto.fromJson(Map json) => + _$MyMarketDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/holding/mappers/remote/response/my_holding_response_mapper.dart b/lib/data/holding/mappers/remote/response/my_holding_response_mapper.dart new file mode 100644 index 0000000..84e9166 --- /dev/null +++ b/lib/data/holding/mappers/remote/response/my_holding_response_mapper.dart @@ -0,0 +1,31 @@ +import 'package:jusicool_ios/data/holding/dto/remote/response/my_holding_response_dto.dart'; +import 'package:jusicool_ios/domain/holding/entities/my_holding_entity.dart'; + +class MyHoldingResponseMapper { + static MyHoldingResponseDto toDto(MyHoldingEntity entity) => + MyHoldingResponseDto( + id: entity.id, + market: entity.market.map((e) => MyMarketDto( + id: e.id, + koreanName: e.koreanName, + englishName: e.englishName, + market: e.market, + type: e.type, + )), + quantity: entity.quantity, + price: entity.price, + ); + static MyHoldingEntity toEntity(MyHoldingResponseDto dto) => + MyHoldingEntity( + id: dto.id, + market: dto.market.map((e) => MarketEntity( + id: e.id, + koreanName: e.koreanName, + englishName: e.englishName, + market: e.market, + type: e.type, + )), + quantity: dto.quantity, + price: dto.price, + ); +} \ No newline at end of file diff --git a/lib/data/holding/repositories/holding_repository_impl.dart b/lib/data/holding/repositories/holding_repository_impl.dart new file mode 100644 index 0000000..d552769 --- /dev/null +++ b/lib/data/holding/repositories/holding_repository_impl.dart @@ -0,0 +1,17 @@ +import 'package:jusicool_ios/data/holding/data_source/holding_data_source.dart'; +import 'package:jusicool_ios/data/holding/mappers/remote/response/my_holding_response_mapper.dart'; +import 'package:jusicool_ios/domain/holding/entities/my_holding_entity.dart'; +import 'package:jusicool_ios/domain/holding/repositories/holding_repository.dart'; + +class HoldingRepositoryImpl extends HoldingRepository { + + final HoldingDataSource _holdingDataSource; + HoldingRepositoryImpl(this._holdingDataSource); + + @override + Future fetchMyholding() async { + final response = await _holdingDataSource.fetchMyHolding(); + return MyHoldingResponseMapper.toEntity(response); + } + +} \ No newline at end of file diff --git a/lib/data/holding/service/holding_api.dart b/lib/data/holding/service/holding_api.dart new file mode 100644 index 0000000..7bf5487 --- /dev/null +++ b/lib/data/holding/service/holding_api.dart @@ -0,0 +1,15 @@ +import 'package:dio/dio.dart'; +import 'package:jusicool_ios/data/holding/dto/remote/response/my_holding_response_dto.dart'; +import 'package:retrofit/http.dart'; + +part 'holding_api.g.dart'; + +@RestApi() +abstract class HoldingApi { + + factory HoldingApi(Dio dio,{String baseUrl}) = _HoldingApi; + + @GET('/holding/my') + Future fetchMyHolding(); + +} \ No newline at end of file diff --git a/lib/data/market/data_source/market_data_source.dart b/lib/data/market/data_source/market_data_source.dart new file mode 100644 index 0000000..72abc39 --- /dev/null +++ b/lib/data/market/data_source/market_data_source.dart @@ -0,0 +1,8 @@ +import 'package:jusicool_ios/data/market/dto/remote/response/market_response_dto.dart'; +import 'package:jusicool_ios/data/market/dto/remote/request/market_request_dto.dart'; + +abstract class MarketDataSource { + Future> fetchMarkets(MarketRequestDto request); + Future> searchMarkets(String query); + Future prediction(String marketCode); +} \ No newline at end of file diff --git a/lib/data/market/data_source/market_data_source_impl.dart b/lib/data/market/data_source/market_data_source_impl.dart new file mode 100644 index 0000000..f65da39 --- /dev/null +++ b/lib/data/market/data_source/market_data_source_impl.dart @@ -0,0 +1,24 @@ +import 'package:jusicool_ios/data/market/data_source/market_data_source.dart'; +import 'package:jusicool_ios/data/market/dto/remote/response/market_response_dto.dart'; +import 'package:jusicool_ios/data/market/dto/remote/request/market_request_dto.dart'; +import 'package:jusicool_ios/data/market/service/market_api.dart'; + +class MarketDataSourceImpl extends MarketDataSource { + final MarketApi _api; + MarketDataSourceImpl(this._api); + + @override + Future> fetchMarkets(MarketRequestDto request) async { + return await _api.fetchMarkets(request); + } + + @override + Future> searchMarkets(String query) async { + return await _api.searchMarkets(query); + } + + @override + Future prediction(String marketCode) async { + return await _api.prediction(marketCode); + } +} \ No newline at end of file diff --git a/lib/data/market/dto/remote/request/market_request_dto.dart b/lib/data/market/dto/remote/request/market_request_dto.dart new file mode 100644 index 0000000..8fa69d9 --- /dev/null +++ b/lib/data/market/dto/remote/request/market_request_dto.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'market_request_dto.freezed.dart'; +part 'market_request_dto.g.dart'; + +@freezed +abstract class MarketRequestDto with _$MarketRequestDto { + const factory MarketRequestDto({ + required String type, + }) = _MarketRequestDto; + + factory MarketRequestDto.fromJson(Map json) => _$MarketRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/market/dto/remote/request/market_search_request_dto.dart b/lib/data/market/dto/remote/request/market_search_request_dto.dart new file mode 100644 index 0000000..71670e3 --- /dev/null +++ b/lib/data/market/dto/remote/request/market_search_request_dto.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'market_search_request_dto.freezed.dart'; +part 'market_search_request_dto.g.dart'; + +@freezed +abstract class MarketSearchRequestDto with _$MarketSearchRequestDto { + const factory MarketSearchRequestDto({ + required String query, + }) = _MarketSearchRequestDto; + + factory MarketSearchRequestDto.fromJson(Map json) => _$MarketSearchRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/market/dto/remote/response/market_response_dto.dart b/lib/data/market/dto/remote/response/market_response_dto.dart new file mode 100644 index 0000000..e0eb9ea --- /dev/null +++ b/lib/data/market/dto/remote/response/market_response_dto.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'market_response_dto.freezed.dart'; +part 'market_response_dto.g.dart'; + +@freezed +abstract class MarketResponseDto with _$MarketResponseDto { + const factory MarketResponseDto({ + required int id, + @JsonKey(name: 'korean_name') required String koreanName, + @JsonKey(name: 'english_name') required String englishName, + required String market, + @JsonKey(name: 'market_type') required String marketType, + }) = _MarketResponseDto; + + factory MarketResponseDto.fromJson(Map json) => _$MarketResponseDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/market/mapper/remote/response/market_response_mapper.dart b/lib/data/market/mapper/remote/response/market_response_mapper.dart new file mode 100644 index 0000000..95908dd --- /dev/null +++ b/lib/data/market/mapper/remote/response/market_response_mapper.dart @@ -0,0 +1,24 @@ +import 'package:jusicool_ios/data/market/dto/remote/response/market_response_dto.dart'; +import 'package:jusicool_ios/domain/market/entities/market_entity.dart'; +import 'package:jusicool_ios/domain/enum/share/market/market_type.dart'; + +class MarketResponseMapper { + static MarketEntity toEntity(MarketResponseDto dto) => MarketEntity( + id: dto.id, + koreanName: dto.koreanName, + englishName: dto.englishName, + market: dto.market, + marketType: _marketTypeFromString(dto.marketType), + ); +} + +MarketType _marketTypeFromString(String value) { + switch (value) { + case 'CRYPTO': + return MarketType.crypto(); + case 'STOCK': + return MarketType.stock(); + default: + throw Exception('Unknown MarketType: $value'); + } +} \ No newline at end of file diff --git a/lib/data/market/repositories/market_repository_impl.dart b/lib/data/market/repositories/market_repository_impl.dart new file mode 100644 index 0000000..14657f6 --- /dev/null +++ b/lib/data/market/repositories/market_repository_impl.dart @@ -0,0 +1,28 @@ +import 'package:jusicool_ios/domain/market/entities/market_entity.dart'; +import 'package:jusicool_ios/domain/market/repositories/market_repository.dart'; +import 'package:jusicool_ios/data/market/data_source/market_data_source.dart'; +import 'package:jusicool_ios/data/market/dto/remote/request/market_request_dto.dart'; +import 'package:jusicool_ios/data/market/mapper/remote/response/market_response_mapper.dart'; + +class MarketRepositoryImpl extends MarketRepository { + final MarketDataSource _dataSource; + MarketRepositoryImpl(this._dataSource); + + @override + Future> fetchMarkets(String type) async { + final request = MarketRequestDto(type: type); + final response = await _dataSource.fetchMarkets(request); + return response.map((e) => MarketResponseMapper.toEntity(e)).toList(); + } + + @override + Future> searchMarkets(String query) async { + final response = await _dataSource.searchMarkets(query); + return response.map((e) => MarketResponseMapper.toEntity(e)).toList(); + } + + @override + Future prediction(String marketCode) async { + return await _dataSource.prediction(marketCode); + } +} \ No newline at end of file diff --git a/lib/data/market/service/market_api.dart b/lib/data/market/service/market_api.dart new file mode 100644 index 0000000..4717968 --- /dev/null +++ b/lib/data/market/service/market_api.dart @@ -0,0 +1,23 @@ +import 'package:dio/dio.dart'; +import 'package:retrofit/http.dart'; +import 'package:jusicool_ios/data/market/dto/remote/response/market_response_dto.dart'; +import 'package:jusicool_ios/data/market/dto/remote/request/market_request_dto.dart'; +import 'package:jusicool_ios/data/market/dto/remote/request/market_search_request_dto.dart'; + +part 'market_api.g.dart'; + +@RestApi() +abstract class MarketApi { + factory MarketApi(Dio dio, {String baseUrl}) = _MarketApi; + + @GET('/market/list') + Future> fetchMarkets(@Body() MarketRequestDto request); + + @GET('/market/search') + Future> searchMarkets(@Query('query') String query); + + @GET('/market/{marketCode}') + Future prediction( + @Path('marketCode') String marketCode, + ); +} \ No newline at end of file diff --git a/lib/data/order/data_sources/order_data_source.dart b/lib/data/order/data_sources/order_data_source.dart new file mode 100644 index 0000000..ff4639e --- /dev/null +++ b/lib/data/order/data_sources/order_data_source.dart @@ -0,0 +1,23 @@ +import 'package:jusicool_ios/data/order/dto/remote/request/my_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/reserve_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_rate_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/my_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/order_response_dto.dart'; + +abstract class OrderDataSource { + Future> fetchMyOrder(MyOrderRequestDto body); + + Future fetchMonthOrder(); + + Future fetchMonthRate(); + + Future buyOrder(OrderRequestDto body, String marketCode); + + Future sellOrder(OrderRequestDto body, String marketCode); + + Future reserveBuyOrder(ReserveOrderRequestDto body, String marketCode); + + Future reserveSellOrder(ReserveOrderRequestDto body, String marketCode); +} \ No newline at end of file diff --git a/lib/data/order/data_sources/order_data_source_impl.dart b/lib/data/order/data_sources/order_data_source_impl.dart new file mode 100644 index 0000000..dd5b321 --- /dev/null +++ b/lib/data/order/data_sources/order_data_source_impl.dart @@ -0,0 +1,53 @@ +import 'package:jusicool_ios/data/order/data_sources/order_data_source.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/my_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/reserve_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_rate_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/my_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/order_response_dto.dart'; +import 'package:jusicool_ios/data/order/service/order_api.dart'; + +class OrderDataSourceImpl extends OrderDataSource { + + final OrderApi _orderApi; + + OrderDataSourceImpl(this._orderApi); + + @override + Future> fetchMyOrder(MyOrderRequestDto body) async { + return await _orderApi.fetchMyOrder(body.query.type.toString()); + } + + @override + Future fetchMonthOrder() async { + return await _orderApi.fetchMonthOrder(); + } + + @override + Future fetchMonthRate() async { + return await _orderApi.fetchMonthRate(); + } + + + @override + Future buyOrder(OrderRequestDto body, String marketCode) async { + return await _orderApi.buyOrder(marketCode, body); + } + + @override + Future sellOrder(OrderRequestDto body, String marketCode) async { + return await _orderApi.sellOrder(marketCode, body); + } + + @override + Future reserveBuyOrder(ReserveOrderRequestDto body, String marketCode) async { + return await _orderApi.reserveBuyOrder(marketCode, body); + } + + @override + Future reserveSellOrder(ReserveOrderRequestDto body, String marketCode) async { + return await _orderApi.reserveSellOrder(marketCode, body); + } + +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/request/my_order_query_type_request_dto.dart b/lib/data/order/dto/remote/request/my_order_query_type_request_dto.dart new file mode 100644 index 0000000..5a1dffb --- /dev/null +++ b/lib/data/order/dto/remote/request/my_order_query_type_request_dto.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:jusicool_ios/domain/enum/share/order/status_type.dart'; + +part 'my_order_query_type_request_dto.g.dart'; + +part 'my_order_query_type_request_dto.freezed.dart'; + +@freezed +abstract class MyOrderQueryTypeRequestDto with _$MyOrderQueryTypeRequestDto { + const factory MyOrderQueryTypeRequestDto({ + required StatusType type, + }) = _MyOrderQueryTypeRequestDto; + + factory MyOrderQueryTypeRequestDto.fromJson(Map json) => + _$MyOrderQueryTypeRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/request/my_order_request_dto.dart b/lib/data/order/dto/remote/request/my_order_request_dto.dart new file mode 100644 index 0000000..6bcd7ae --- /dev/null +++ b/lib/data/order/dto/remote/request/my_order_request_dto.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/my_order_query_type_request_dto.dart'; + +part 'my_order_request_dto.g.dart'; + +part 'my_order_request_dto.freezed.dart'; + +@freezed +abstract class MyOrderRequestDto with _$MyOrderRequestDto { + factory MyOrderRequestDto({ + required MyOrderQueryTypeRequestDto query, + }) = _MyOrderRequestDto; + + factory MyOrderRequestDto.fromJson(Map json) => + _$MyOrderRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/request/order_request_dto.dart b/lib/data/order/dto/remote/request/order_request_dto.dart new file mode 100644 index 0000000..65735fc --- /dev/null +++ b/lib/data/order/dto/remote/request/order_request_dto.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'order_request_dto.g.dart'; + +part 'order_request_dto.freezed.dart'; + + +@freezed +abstract class OrderRequestDto with _$OrderRequestDto { + factory OrderRequestDto({ + required double quantity, + }) = _SignInRequestDto; + + factory OrderRequestDto.fromJson(Map json) => + _$OrderRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/request/reserve_order_request_dto.dart b/lib/data/order/dto/remote/request/reserve_order_request_dto.dart new file mode 100644 index 0000000..a328440 --- /dev/null +++ b/lib/data/order/dto/remote/request/reserve_order_request_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'reserve_order_request_dto.g.dart'; +part 'reserve_order_request_dto.freezed.dart'; + +@freezed +abstract class ReserveOrderRequestDto with _$ReserveOrderRequestDto { + factory ReserveOrderRequestDto({ + required int quantity, + required int price, + }) = _ReserveOrderRequestDto; + + factory ReserveOrderRequestDto.fromJson(Map json) => + _$ReserveOrderRequestDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/response/month_order_response_dto.dart b/lib/data/order/dto/remote/response/month_order_response_dto.dart new file mode 100644 index 0000000..a4357d0 --- /dev/null +++ b/lib/data/order/dto/remote/response/month_order_response_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'month_order_response_dto.g.dart'; +part 'month_order_response_dto.freezed.dart'; + +@freezed +abstract class MonthOrderResponseDto with _$MonthOrderResponseDto { + factory MonthOrderResponseDto({ + required double rate, + @JsonKey(name: 'order_count') required int orderCount + }) = _MonthOrderResponseDto; + + factory MonthOrderResponseDto.fromJson(Map json) => + _$MonthOrderResponseDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/response/month_rate_response_dto.dart b/lib/data/order/dto/remote/response/month_rate_response_dto.dart new file mode 100644 index 0000000..5da6b7a --- /dev/null +++ b/lib/data/order/dto/remote/response/month_rate_response_dto.dart @@ -0,0 +1,29 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'month_rate_response_dto.g.dart'; +part 'month_rate_response_dto.freezed.dart'; + +@freezed +abstract class MonthRateResponseDto with _$MonthRateResponseDto { + factory MonthRateResponseDto({ + @JsonKey(name: 'monthly_rate') required double monthlyRate, + required List markets, + }) = _MonthRateResponseDto; + + factory MonthRateResponseDto.fromJson(Map json) => + _$MonthRateResponseDtoFromJson(json); +} + +@freezed +abstract class MarketDto with _$MarketDto { + factory MarketDto({ + required String market, + @JsonKey(name: 'korean_name') required String koreanName, + required double rate, + required int proceed, + required DateTime day, + }) = _Market; + + factory MarketDto.fromJson(Map json) => + _$MarketFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/response/my_order_response_dto.dart b/lib/data/order/dto/remote/response/my_order_response_dto.dart new file mode 100644 index 0000000..cc50966 --- /dev/null +++ b/lib/data/order/dto/remote/response/my_order_response_dto.dart @@ -0,0 +1,25 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:jusicool_ios/domain/enum/share/order/my_order_status_type.dart'; +import 'package:jusicool_ios/domain/enum/share/order/order_type.dart'; +import 'package:jusicool_ios/domain/enum/share/order/reserve_type.dart'; + +part 'my_order_response_dto.g.dart'; + +part 'my_order_response_dto.freezed.dart'; + +@freezed +abstract class MyOrderResponseDto with _$MyOrderResponseDto { + factory MyOrderResponseDto({ + required int id, + required String market, + @JsonKey(name: 'order_type') required OrderType orderType, + @JsonKey(name: 'reserve_type') required ReserveType reserveType, + required int quantity, + @JsonKey(name: 'execute_price') int? executePrice, + @JsonKey(name: 'reserve_price') int? reservePrice, + required MyOrderStatusType status + }) = _MyOrderResponseDto; + + factory MyOrderResponseDto.fromJson(Map json) => + _$MyOrderResponseDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/dto/remote/response/order_response_dto.dart b/lib/data/order/dto/remote/response/order_response_dto.dart new file mode 100644 index 0000000..c3bde0f --- /dev/null +++ b/lib/data/order/dto/remote/response/order_response_dto.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'order_response_dto.g.dart'; + +part 'order_response_dto.freezed.dart'; + +@freezed +abstract class OrderResponseDto with _$OrderResponseDto { + factory OrderResponseDto({ + required int price, + }) = _OrderResponseDto; + + factory OrderResponseDto.fromJson(Map json) => + _$OrderResponseDtoFromJson(json); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/request/order_request_mapper.dart b/lib/data/order/mapper/remote/request/order_request_mapper.dart new file mode 100644 index 0000000..48ea14c --- /dev/null +++ b/lib/data/order/mapper/remote/request/order_request_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/order/dto/remote/request/order_request_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/order_request_entity.dart'; + +class OrderRequestMapper { + static OrderRequestDto toDto(OrderRequestEntity entity) => + OrderRequestDto(quantity: entity.quantity); + static OrderRequestEntity toEntity(OrderRequestDto dto) => + OrderRequestEntity(quantity: dto.quantity); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/request/reserve_order_mapper.dart b/lib/data/order/mapper/remote/request/reserve_order_mapper.dart new file mode 100644 index 0000000..7098540 --- /dev/null +++ b/lib/data/order/mapper/remote/request/reserve_order_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/order/dto/remote/request/reserve_order_request_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/reserve_order_entity.dart'; + +class ReserveOrderMapper { + static ReserveOrderRequestDto toDto(ReserveOrderEntity entity) => + ReserveOrderRequestDto(quantity: entity.quantity, price: entity.price); + static ReserveOrderEntity toEntity(ReserveOrderRequestDto dto) => + ReserveOrderEntity(quantity: dto.quantity, price: dto.price); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/response/month_order_response_mapper.dart b/lib/data/order/mapper/remote/response/month_order_response_mapper.dart new file mode 100644 index 0000000..565c974 --- /dev/null +++ b/lib/data/order/mapper/remote/response/month_order_response_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/order/dto/remote/response/month_order_response_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/month_order_entity.dart'; + +class MonthOrderResponseMapper { + static MonthOrderResponseDto toDto(MonthOrderEntity entity) => + MonthOrderResponseDto(rate: entity.rate, orderCount: entity.orderCount); + static MonthOrderEntity toEntity(MonthOrderResponseDto dto) => + MonthOrderEntity(rate: dto.rate, orderCount: dto.orderCount); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/response/month_rate_response_mapper.dart b/lib/data/order/mapper/remote/response/month_rate_response_mapper.dart new file mode 100644 index 0000000..5f1c6ad --- /dev/null +++ b/lib/data/order/mapper/remote/response/month_rate_response_mapper.dart @@ -0,0 +1,26 @@ +import 'package:jusicool_ios/data/order/dto/remote/response/month_rate_response_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/month_rate_entity.dart'; +class MonthRateResponseMapper { + static MonthRateResponseDto toDto(MonthRateEntity entity) => + MonthRateResponseDto( + monthlyRate: entity.monthlyRate, + markets: entity.markets.map((e) => MarketDto( + market: e.market, + koreanName: e.koreanName, + rate: e.rate, + proceed: e.proceed, + day: e.day, + )).toList(), + ); + static MonthRateEntity toEntity(MonthRateResponseDto dto) => + MonthRateEntity( + monthlyRate: dto.monthlyRate, + markets: dto.markets.map((e) => MarketEntity( + market: e.market, + koreanName: e.koreanName, + rate: e.rate, + proceed: e.proceed, + day: e.day, + )).toList(), + ); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/response/my_order_response_mapper.dart b/lib/data/order/mapper/remote/response/my_order_response_mapper.dart new file mode 100644 index 0000000..2065e1c --- /dev/null +++ b/lib/data/order/mapper/remote/response/my_order_response_mapper.dart @@ -0,0 +1,24 @@ +import 'package:jusicool_ios/data/order/dto/remote/response/my_order_response_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/my_order_entity.dart'; + +class MyOrderResponseMapper { + static MyOrderResponseDto toDto(MyOrderEntity entity) => + MyOrderResponseDto( + id: entity.id, + market: entity.market, + orderType: entity.orderType, + reserveType: entity.reserveType, + quantity: entity.quantity, + status: entity.status, + ); + + static MyOrderEntity toEntity(MyOrderResponseDto dto) => + MyOrderEntity( + id: dto.id, + market: dto.market, + orderType: dto.orderType, + reserveType: dto.reserveType, + quantity: dto.quantity, + status: dto.status, + ); +} \ No newline at end of file diff --git a/lib/data/order/mapper/remote/response/order_response_mapper.dart b/lib/data/order/mapper/remote/response/order_response_mapper.dart new file mode 100644 index 0000000..93c8dd9 --- /dev/null +++ b/lib/data/order/mapper/remote/response/order_response_mapper.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/data/order/dto/remote/response/order_response_dto.dart'; +import 'package:jusicool_ios/domain/order/entities/order_response_entity.dart'; + +class OrderResponseMapper { + static OrderResponseDto toDto(OrderResponseEntity entity) => + OrderResponseDto(price: entity.price); + static OrderResponseEntity toEntity(OrderResponseDto dto) => + OrderResponseEntity(price: dto.price); +} \ No newline at end of file diff --git a/lib/data/order/repositories/order_repository_impl.dart b/lib/data/order/repositories/order_repository_impl.dart new file mode 100644 index 0000000..42d694c --- /dev/null +++ b/lib/data/order/repositories/order_repository_impl.dart @@ -0,0 +1,74 @@ +import 'package:jusicool_ios/data/order/data_sources/order_data_source.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/reserve_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/order_response_dto.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/request/order_request_mapper.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/request/reserve_order_mapper.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/response/month_order_response_mapper.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/response/month_rate_response_mapper.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/response/my_order_response_mapper.dart'; +import 'package:jusicool_ios/domain/enum/share/order/status_type.dart'; +import 'package:jusicool_ios/domain/order/entities/month_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/month_rate_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/my_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_request_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_response_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/reserve_order_entity.dart'; +import 'package:jusicool_ios/domain/order/repositories/order_repository.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/my_order_query_type_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/my_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/mapper/remote/response/order_response_mapper.dart'; + +class OrderRepositoryImpl extends OrderRepository { + final OrderDataSource _orderDataSource; + + OrderRepositoryImpl(this._orderDataSource); + + @override + Future> fetchMyorders(StatusType type) async { + final requestDto = MyOrderRequestDto( + query: MyOrderQueryTypeRequestDto(type: type), + ); + final response = await _orderDataSource.fetchMyOrder(requestDto); + return response.map((e) => MyOrderResponseMapper.toEntity(e)).toList(); + } + + @override + Future fetchMonthOrder() async { + final response = await _orderDataSource.fetchMonthOrder(); + return MonthOrderResponseMapper.toEntity(response); + } + + @override + Future fetchMonthRate() async { + final response = await _orderDataSource.fetchMonthRate(); + return MonthRateResponseMapper.toEntity(response); + } + + @override + Future buyOrder(OrderRequestEntity body, String marketCode) async { + final requestDto = OrderRequestMapper.toDto(body); + final response = await _orderDataSource.buyOrder(requestDto, marketCode); + return OrderResponseMapper.toEntity(response); + } + + @override + Future sellOrder(OrderRequestEntity body, String marketCode) async { + final OrderRequestDto requestDto = OrderRequestMapper.toDto(body); + final OrderResponseDto response = await _orderDataSource.buyOrder(requestDto, marketCode); + return OrderResponseMapper.toEntity(response); + } + + @override + Future reserveBuyOrder(ReserveOrderEntity body, String marketCode) async { + final ReserveOrderRequestDto request = ReserveOrderMapper.toDto(body); + return await _orderDataSource.reserveBuyOrder(request, marketCode); + } + + @override + Future reserveSellOrder(ReserveOrderEntity body, String marketCode) async { + final ReserveOrderRequestDto request = ReserveOrderMapper.toDto(body); + return await _orderDataSource.reserveBuyOrder(request, marketCode); + } + +} \ No newline at end of file diff --git a/lib/data/order/service/order_api.dart b/lib/data/order/service/order_api.dart new file mode 100644 index 0000000..63d1d78 --- /dev/null +++ b/lib/data/order/service/order_api.dart @@ -0,0 +1,51 @@ +import 'package:dio/dio.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/request/reserve_order_request_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/month_rate_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/my_order_response_dto.dart'; +import 'package:jusicool_ios/data/order/dto/remote/response/order_response_dto.dart'; +import 'package:retrofit/http.dart'; + +part 'order_api.g.dart'; + +@RestApi() +abstract class OrderApi { + + factory OrderApi(Dio dio,{String baseUrl}) = _OrderApi; + + @GET('/order/my') + Future> fetchMyOrder( + @Query('type') String type + ); + + @GET('/order/month') + Future fetchMonthOrder(); + + @GET('/order/month/rate') + Future fetchMonthRate(); + + @POST('order/buy/{marketCode}') + Future buyOrder( + @Path('marketCode') String marketCode, + @Body() OrderRequestDto body, + ); + + @POST('order/sell/{marketCode}') + Future sellOrder( + @Path('marketCode') String marketCode, + @Body() OrderRequestDto body, + ); + + @POST('order/buy/reserve/{marketCode}') + Future reserveBuyOrder( + @Path('marketCode') String marketCode, + @Body() ReserveOrderRequestDto body, + ); + + @POST('order/sell/reserve/{marketCode}') + Future reserveSellOrder( + @Path('marketCode') String marketCode, + @Body() ReserveOrderRequestDto body, + ); +} \ No newline at end of file diff --git a/lib/domain/community/enitites/community_post_detail_entity.dart b/lib/domain/community/enitites/community_post_detail_entity.dart new file mode 100644 index 0000000..a5e3056 --- /dev/null +++ b/lib/domain/community/enitites/community_post_detail_entity.dart @@ -0,0 +1,25 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'community_post_detail_entity.freezed.dart'; + +@freezed +abstract class CommunityPostDetailEntity with _$CommunityPostDetailEntity { + factory CommunityPostDetailEntity({ + required int id, + required String email, + required String market, + required String title, + required String content, + required List comment, + required int likeCount, + }) = _CommunityPostDetailEntity; +} + +@freezed +abstract class CommentEntity with _$CommentEntity { + factory CommentEntity({ + required int id, + required String email, + required String comment, + }) = _CommentEntity; +} \ No newline at end of file diff --git a/lib/domain/community/enitites/community_post_entity.dart b/lib/domain/community/enitites/community_post_entity.dart new file mode 100644 index 0000000..37db287 --- /dev/null +++ b/lib/domain/community/enitites/community_post_entity.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'community_post_entity.freezed.dart'; + +@freezed +abstract class CommunityPostEntity with _$CommunityPostEntity { + factory CommunityPostEntity({ + required int id, + required String email, + required String market, + required String title, + required String content, + required int commentCount, + required int likeCount, + required bool isLiked, + }) = _CommunityPostEntity; +} \ No newline at end of file diff --git a/lib/domain/community/repositories/community_repository.dart b/lib/domain/community/repositories/community_repository.dart new file mode 100644 index 0000000..0a533ff --- /dev/null +++ b/lib/domain/community/repositories/community_repository.dart @@ -0,0 +1,18 @@ +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_entity.dart'; + +abstract class CommunityRepository { + Future> fetchCommunity(String market); + + Future writeCommunityPost(String market, String title, String content); + + Future> fetchCommunityDetail(String market, int boardId); + + Future writeComment(String market, int boardId, String comment); + + Future editPost(String market, int boardId, String title, String content); + + Future likePost(String market, int boardId); + + Future deletePost(String market, int boardId); +} \ No newline at end of file diff --git a/lib/domain/community/usecase/community_usecase.dart b/lib/domain/community/usecase/community_usecase.dart new file mode 100644 index 0000000..d6fe6b8 --- /dev/null +++ b/lib/domain/community/usecase/community_usecase.dart @@ -0,0 +1,18 @@ +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_entity.dart'; + +abstract class CommunityUsecase { + Future> fetchCommunity(String market); + + Future writeCommunityPost(String market,String title, String content); + + Future> fetchCommunityDetail(String market, int boardId); + + Future writeComment(String market, int boardId, String comment); + + Future editPost(String market, int boardId, String title, String content); + + Future likePost(String market, int boardId); + + Future deletePost(String market, int boardId); +} \ No newline at end of file diff --git a/lib/domain/community/usecase/community_usecase_impl.dart b/lib/domain/community/usecase/community_usecase_impl.dart new file mode 100644 index 0000000..b4f1254 --- /dev/null +++ b/lib/domain/community/usecase/community_usecase_impl.dart @@ -0,0 +1,47 @@ +import 'package:jusicool_ios/domain/community/enitites/community_post_detail_entity.dart'; +import 'package:jusicool_ios/domain/community/enitites/community_post_entity.dart'; +import 'package:jusicool_ios/domain/community/repositories/community_repository.dart'; +import 'package:jusicool_ios/domain/community/usecase/community_usecase.dart'; + +class CommunityUsecaseImpl extends CommunityUsecase { + + final CommunityRepository _repository; + + CommunityUsecaseImpl(this._repository); + + @override + Future> fetchCommunity(String market) async { + return await _repository.fetchCommunity(market); + } + + @override + Future writeCommunityPost(String market,String title,String content) async { + return await _repository.writeCommunityPost(market,title,content); + } + + @override + Future> fetchCommunityDetail(String market, int boardId) async { + return await _repository.fetchCommunityDetail(market, boardId); + } + + @override + Future editPost(String market, int boardId, String title, String content) async { + return await _repository.editPost(market, boardId, title, content); + } + + @override + Future likePost(String market, int boardId) async { + return await _repository.likePost(market, boardId); + } + + @override + Future writeComment(String market, int boardId, String comment) async { + return await _repository.writeComment(market, boardId, comment); + } + + @override + Future deletePost(String market, int boardId) async { + return await _repository.deletePost(market, boardId); + } + +} \ No newline at end of file diff --git a/lib/domain/enum/share/market/market_type.dart b/lib/domain/enum/share/market/market_type.dart new file mode 100644 index 0000000..197dd68 --- /dev/null +++ b/lib/domain/enum/share/market/market_type.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'market_type.g.dart'; +part 'market_type.freezed.dart'; + +@freezed +abstract class MarketType with _$MarketType { + const factory MarketType.crypto() = _Crypto; + const factory MarketType.stock() = _Stock; + + factory MarketType.fromJson(Map json) => + _$MarketTypeFromJson(json); +} \ No newline at end of file diff --git a/lib/domain/enum/share/order/my_order_status_type.dart b/lib/domain/enum/share/order/my_order_status_type.dart new file mode 100644 index 0000000..f137b33 --- /dev/null +++ b/lib/domain/enum/share/order/my_order_status_type.dart @@ -0,0 +1,15 @@ + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'my_order_status_type.g.dart'; +part 'my_order_status_type.freezed.dart'; + +@freezed +abstract class MyOrderStatusType with _$MyOrderStatusType { + const factory MyOrderStatusType.completed() = _Completed; + const factory MyOrderStatusType.pending() = _Pending; + const factory MyOrderStatusType.canceled() = _canceled; + + factory MyOrderStatusType.fromJson(Map json) => + _$MyOrderStatusTypeFromJson(json); +} \ No newline at end of file diff --git a/lib/domain/enum/share/order/order_type.dart b/lib/domain/enum/share/order/order_type.dart new file mode 100644 index 0000000..8839556 --- /dev/null +++ b/lib/domain/enum/share/order/order_type.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'order_type.g.dart'; +part 'order_type.freezed.dart'; + +@freezed +abstract class OrderType with _$OrderType { + const factory OrderType.sell() = _Sell; + const factory OrderType.buy() = _Buy; + + factory OrderType.fromJson(Map json) => + _$OrderTypeFromJson(json); +} \ No newline at end of file diff --git a/lib/domain/enum/share/order/reserve_type.dart b/lib/domain/enum/share/order/reserve_type.dart new file mode 100644 index 0000000..aa3fc6d --- /dev/null +++ b/lib/domain/enum/share/order/reserve_type.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'reserve_type.g.dart'; +part 'reserve_type.freezed.dart'; + +@freezed +abstract class ReserveType with _$ReserveType { + const factory ReserveType.immediate() = _Immediate; + const factory ReserveType.reserve() = _Reserve; + + factory ReserveType.fromJson(Map json) => + _$ReserveTypeFromJson(json); +} \ No newline at end of file diff --git a/lib/domain/enum/share/order/status_type.dart b/lib/domain/enum/share/order/status_type.dart new file mode 100644 index 0000000..8aff9f6 --- /dev/null +++ b/lib/domain/enum/share/order/status_type.dart @@ -0,0 +1,13 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'status_type.freezed.dart'; +part 'status_type.g.dart'; + +@freezed +abstract class StatusType with _$StatusType { + const factory StatusType.reserve() = _Reserve; + const factory StatusType.completed() = _Completed; + + factory StatusType.fromJson(Map json) => + _$StatusTypeFromJson(json); +} diff --git a/lib/domain/exchange/entities/exchange_entity.dart b/lib/domain/exchange/entities/exchange_entity.dart new file mode 100644 index 0000000..2a95629 --- /dev/null +++ b/lib/domain/exchange/entities/exchange_entity.dart @@ -0,0 +1,9 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'exchange_entity.freezed.dart'; + +@freezed +abstract class ExchangeEntity with _$ExchangeEntity { + factory ExchangeEntity({required int amount}) = + _ExchangeEntity; +} diff --git a/lib/domain/exchange/repositories/exchange_repository.dart b/lib/domain/exchange/repositories/exchange_repository.dart new file mode 100644 index 0000000..05bc139 --- /dev/null +++ b/lib/domain/exchange/repositories/exchange_repository.dart @@ -0,0 +1,7 @@ +import 'package:jusicool_ios/domain/exchange/entities/exchange_entity.dart'; + +abstract class ExchangeRepository { + Future exchangeKRW(ExchangeEntity exchange); + + Future exchangeUSD(ExchangeEntity exchange); +} \ No newline at end of file diff --git a/lib/domain/exchange/usecase/exchange_usecase.dart b/lib/domain/exchange/usecase/exchange_usecase.dart new file mode 100644 index 0000000..b45713b --- /dev/null +++ b/lib/domain/exchange/usecase/exchange_usecase.dart @@ -0,0 +1,7 @@ +import 'package:jusicool_ios/domain/exchange/entities/exchange_entity.dart'; + +abstract class ExchangeUsecase { + Future exchangeKRW(ExchangeEntity exchange); + + Future exchangeUSD(ExchangeEntity exchange); +} \ No newline at end of file diff --git a/lib/domain/exchange/usecase/exchange_usercase_impl.dart b/lib/domain/exchange/usecase/exchange_usercase_impl.dart new file mode 100644 index 0000000..bcb7b00 --- /dev/null +++ b/lib/domain/exchange/usecase/exchange_usercase_impl.dart @@ -0,0 +1,20 @@ +import 'package:jusicool_ios/domain/exchange/entities/exchange_entity.dart'; +import 'package:jusicool_ios/domain/exchange/repositories/exchange_repository.dart'; +import 'package:jusicool_ios/domain/exchange/usecase/exchange_usecase.dart'; + +class ExchangeUsercaseImpl extends ExchangeUsecase { + + final ExchangeRepository _repository; + + ExchangeUsercaseImpl(this._repository); + + @override + Future exchangeKRW(ExchangeEntity entity) async { + await _repository.exchangeKRW(entity); + } + + @override + Future exchangeUSD(ExchangeEntity entity) async { + await _repository.exchangeUSD(entity); + } +} \ No newline at end of file diff --git a/lib/domain/holding/entities/my_holding_entity.dart b/lib/domain/holding/entities/my_holding_entity.dart new file mode 100644 index 0000000..8a14bf4 --- /dev/null +++ b/lib/domain/holding/entities/my_holding_entity.dart @@ -0,0 +1,24 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'my_holding_entity.freezed.dart'; + +@freezed +abstract class MyHoldingEntity with _$MyHoldingEntity { + const factory MyHoldingEntity({ + required int id, + required MarketEntity market, + required int quantity, + required int price, + }) = _MyHoldingEntity; +} + +@freezed +abstract class MarketEntity with _$MarketEntity { + const factory MarketEntity({ + required int id, + required String koreanName, + required String englishName, + required String market, + required String type, + }) = _MarketEntity; +} diff --git a/lib/domain/holding/repositories/holding_repository.dart b/lib/domain/holding/repositories/holding_repository.dart new file mode 100644 index 0000000..e07875d --- /dev/null +++ b/lib/domain/holding/repositories/holding_repository.dart @@ -0,0 +1,5 @@ +import 'package:jusicool_ios/domain/holding/entities/my_holding_entity.dart'; + +abstract class HoldingRepository { + Future fetchMyholding(); +} \ No newline at end of file diff --git a/lib/domain/holding/usecase/holding_usecase.dart b/lib/domain/holding/usecase/holding_usecase.dart new file mode 100644 index 0000000..9f5e83c --- /dev/null +++ b/lib/domain/holding/usecase/holding_usecase.dart @@ -0,0 +1,5 @@ +import 'package:jusicool_ios/domain/holding/entities/my_holding_entity.dart'; + +abstract class HoldingUsecase { + Future fetchMyholding(); +} \ No newline at end of file diff --git a/lib/domain/holding/usecase/holding_usecase_impl.dart b/lib/domain/holding/usecase/holding_usecase_impl.dart new file mode 100644 index 0000000..bdfa95e --- /dev/null +++ b/lib/domain/holding/usecase/holding_usecase_impl.dart @@ -0,0 +1,16 @@ +import 'package:jusicool_ios/domain/holding/entities/my_holding_entity.dart'; +import 'package:jusicool_ios/domain/holding/repositories/holding_repository.dart'; +import 'package:jusicool_ios/domain/holding/usecase/holding_usecase.dart'; + +class HoldingUsecaseImpl extends HoldingUsecase { + + final HoldingRepository _repository; + + HoldingUsecaseImpl(this._repository); + + @override + Future fetchMyholding() async { + return await _repository.fetchMyholding(); + } + +} \ No newline at end of file diff --git a/lib/domain/market/entities/market_entity.dart b/lib/domain/market/entities/market_entity.dart new file mode 100644 index 0000000..f93bcd7 --- /dev/null +++ b/lib/domain/market/entities/market_entity.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:jusicool_ios/domain/enum/share/market/market_type.dart'; + +part 'market_entity.freezed.dart'; + +@freezed +abstract class MarketEntity with _$MarketEntity { + const factory MarketEntity({ + required int id, + required String koreanName, + required String englishName, + required String market, + required MarketType marketType, + }) = _MarketEntity; +} \ No newline at end of file diff --git a/lib/domain/market/repositories/market_repository.dart b/lib/domain/market/repositories/market_repository.dart new file mode 100644 index 0000000..75b9846 --- /dev/null +++ b/lib/domain/market/repositories/market_repository.dart @@ -0,0 +1,7 @@ +import 'package:jusicool_ios/domain/market/entities/market_entity.dart'; + +abstract class MarketRepository { + Future> fetchMarkets(String type); + Future> searchMarkets(String query); + Future prediction(String marketCode); +} \ No newline at end of file diff --git a/lib/domain/market/usecase/market_usecase.dart b/lib/domain/market/usecase/market_usecase.dart new file mode 100644 index 0000000..291783f --- /dev/null +++ b/lib/domain/market/usecase/market_usecase.dart @@ -0,0 +1,9 @@ +import 'package:jusicool_ios/domain/market/entities/market_entity.dart'; + +abstract class MarketUsecase { + Future> fetchMarkets(String type); + + Future> searchMarkets(String query); + + Future prediction(String marketCode); +} \ No newline at end of file diff --git a/lib/domain/market/usecase/market_usecase_impl.dart b/lib/domain/market/usecase/market_usecase_impl.dart new file mode 100644 index 0000000..a5a8922 --- /dev/null +++ b/lib/domain/market/usecase/market_usecase_impl.dart @@ -0,0 +1,23 @@ +import 'package:jusicool_ios/domain/market/entities/market_entity.dart'; +import 'package:jusicool_ios/domain/market/repositories/market_repository.dart'; +import 'package:jusicool_ios/domain/market/usecase/market_usecase.dart'; + +class MarketUsecaseImpl extends MarketUsecase { + final MarketRepository _repository; + MarketUsecaseImpl(this._repository); + + @override + Future> fetchMarkets(String type) async { + return await _repository.fetchMarkets(type); + } + + @override + Future> searchMarkets(String query) async { + return await _repository.searchMarkets(query); + } + + @override + Future prediction(String marketCode) async { + return await _repository.prediction(marketCode); + } +} \ No newline at end of file diff --git a/lib/domain/order/entities/month_order_entity.dart b/lib/domain/order/entities/month_order_entity.dart new file mode 100644 index 0000000..efb71b4 --- /dev/null +++ b/lib/domain/order/entities/month_order_entity.dart @@ -0,0 +1,11 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'month_order_entity.freezed.dart'; + +@freezed +abstract class MonthOrderEntity with _$MonthOrderEntity { + factory MonthOrderEntity({ + required double rate, + required int orderCount, + }) = _MonthOrderEntity; +} \ No newline at end of file diff --git a/lib/domain/order/entities/month_rate_entity.dart b/lib/domain/order/entities/month_rate_entity.dart new file mode 100644 index 0000000..13e4469 --- /dev/null +++ b/lib/domain/order/entities/month_rate_entity.dart @@ -0,0 +1,22 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'month_rate_entity.freezed.dart'; + +@freezed +abstract class MonthRateEntity with _$MonthRateEntity { + factory MonthRateEntity({ + required double monthlyRate, + required List markets, + }) = _MonthRateEntity; +} + +@freezed +abstract class MarketEntity with _$MarketEntity { + factory MarketEntity({ + required String market, + required String koreanName, + required double rate, + required int proceed, + required DateTime day, + }) = _MarketEntity; +} \ No newline at end of file diff --git a/lib/domain/order/entities/my_order_entity.dart b/lib/domain/order/entities/my_order_entity.dart new file mode 100644 index 0000000..25be0aa --- /dev/null +++ b/lib/domain/order/entities/my_order_entity.dart @@ -0,0 +1,20 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:jusicool_ios/domain/enum/share/order/my_order_status_type.dart'; +import 'package:jusicool_ios/domain/enum/share/order/order_type.dart'; +import 'package:jusicool_ios/domain/enum/share/order/reserve_type.dart'; + +part 'my_order_entity.freezed.dart'; + +@freezed +abstract class MyOrderEntity with _$MyOrderEntity { + factory MyOrderEntity({ + required int id, + required String market, + required OrderType orderType, + required ReserveType reserveType, + required int quantity, + int? executePrice, + int? reservePrice, + required MyOrderStatusType status, + }) = _MyOrderEntity; +} \ No newline at end of file diff --git a/lib/domain/order/entities/order_request_entity.dart b/lib/domain/order/entities/order_request_entity.dart new file mode 100644 index 0000000..146039f --- /dev/null +++ b/lib/domain/order/entities/order_request_entity.dart @@ -0,0 +1,10 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'order_request_entity.freezed.dart'; + +@freezed +abstract class OrderRequestEntity with _$OrderRequestEntity { + factory OrderRequestEntity({ + required double quantity, + }) = _OrderEntity; +} \ No newline at end of file diff --git a/lib/domain/order/entities/order_response_entity.dart b/lib/domain/order/entities/order_response_entity.dart new file mode 100644 index 0000000..9e77014 --- /dev/null +++ b/lib/domain/order/entities/order_response_entity.dart @@ -0,0 +1,10 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'order_response_entity.freezed.dart'; + +@freezed +abstract class OrderResponseEntity with _$OrderResponseEntity { + factory OrderResponseEntity({ + required int price, + }) = _OrderEntity; +} \ No newline at end of file diff --git a/lib/domain/order/entities/reserve_order_entity.dart b/lib/domain/order/entities/reserve_order_entity.dart new file mode 100644 index 0000000..d98e79f --- /dev/null +++ b/lib/domain/order/entities/reserve_order_entity.dart @@ -0,0 +1,11 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'reserve_order_entity.freezed.dart'; + +@freezed +abstract class ReserveOrderEntity with _$ReserveOrderEntity { + factory ReserveOrderEntity({ + required int quantity, + required int price, + }) = _ReserveOrderEntity; +} \ No newline at end of file diff --git a/lib/domain/order/repositories/order_repository.dart b/lib/domain/order/repositories/order_repository.dart new file mode 100644 index 0000000..ef03a2e --- /dev/null +++ b/lib/domain/order/repositories/order_repository.dart @@ -0,0 +1,23 @@ +import 'package:jusicool_ios/domain/enum/share/order/status_type.dart'; +import 'package:jusicool_ios/domain/order/entities/month_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/month_rate_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/my_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_request_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_response_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/reserve_order_entity.dart'; + +abstract class OrderRepository { + Future> fetchMyorders(StatusType type); + + Future fetchMonthOrder(); + + Future fetchMonthRate(); + + Future buyOrder(OrderRequestEntity quantity, String marketCode); + + Future sellOrder(OrderRequestEntity quantity, String marketCode); + + Future reserveBuyOrder(ReserveOrderEntity body, String marketCode); + + Future reserveSellOrder(ReserveOrderEntity body, String marketCode); +} \ No newline at end of file diff --git a/lib/domain/order/usecase/order_usecase.dart b/lib/domain/order/usecase/order_usecase.dart new file mode 100644 index 0000000..1b13cdd --- /dev/null +++ b/lib/domain/order/usecase/order_usecase.dart @@ -0,0 +1,23 @@ +import 'package:jusicool_ios/domain/enum/share/order/status_type.dart'; +import 'package:jusicool_ios/domain/order/entities/month_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/month_rate_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/my_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_request_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_response_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/reserve_order_entity.dart'; + +abstract class OrderUsecase { + Future> fetchMyorders(StatusType type); + + Future fetchMonthOrder(); + + Future fetchMonthRate(); + + Future buyOrder(OrderRequestEntity quantity, String marketCode); + + Future sellOrder(OrderRequestEntity quantity, String marketCode); + + Future reserveBuyOrder(ReserveOrderEntity body, String marketCode); + + Future reserveSellOrder(ReserveOrderEntity body, String marketCode); +} \ No newline at end of file diff --git a/lib/domain/order/usecase/order_usecase_impl.dart b/lib/domain/order/usecase/order_usecase_impl.dart new file mode 100644 index 0000000..c6d7bc5 --- /dev/null +++ b/lib/domain/order/usecase/order_usecase_impl.dart @@ -0,0 +1,51 @@ +import 'package:jusicool_ios/domain/enum/share/order/status_type.dart'; +import 'package:jusicool_ios/domain/order/entities/month_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/month_rate_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/my_order_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_request_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/order_response_entity.dart'; +import 'package:jusicool_ios/domain/order/entities/reserve_order_entity.dart'; +import 'package:jusicool_ios/domain/order/repositories/order_repository.dart'; +import 'package:jusicool_ios/domain/order/usecase/order_usecase.dart'; + +class OrderUsecaseImpl extends OrderUsecase { + + final OrderRepository _repository; + + OrderUsecaseImpl(this._repository); + + @override + Future fetchMonthOrder() async { + return await _repository.fetchMonthOrder(); + } + + @override + Future fetchMonthRate() async { + return await _repository.fetchMonthRate(); + } + + @override + Future> fetchMyorders(StatusType type) async { + return await _repository.fetchMyorders(type); + } + + @override + Future buyOrder(OrderRequestEntity quantity, String marketCode) async { + return await _repository.buyOrder(quantity, marketCode); + } + + @override + Future sellOrder(OrderRequestEntity quantity, String marketCode) async { + return await _repository.sellOrder(quantity, marketCode); + } + + @override + Future reserveBuyOrder(ReserveOrderEntity body, String marketCode) async { + return await _repository.reserveBuyOrder(body, marketCode); + } + + @override + Future reserveSellOrder(ReserveOrderEntity body, String marketCode) async { + return await _repository.reserveSellOrder(body, marketCode); + } +} \ No newline at end of file diff --git a/lib/domain/sign_in/entity/sign_in_entity.dart b/lib/domain/sign_in/entity/sign_in_entity.dart index e544e9f..e56713b 100644 --- a/lib/domain/sign_in/entity/sign_in_entity.dart +++ b/lib/domain/sign_in/entity/sign_in_entity.dart @@ -2,13 +2,8 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'sign_in_entity.freezed.dart'; -part 'sign_in_entity.g.dart'; - @freezed abstract class SignInEntity with _$SignInEntity { factory SignInEntity({required String email, required String password}) = _SignInEntity; - - factory SignInEntity.fromJson(Map json) => - _$SignInEntityFromJson(json); } diff --git a/lib/domain/sign_up/entity/sign_up_email_entity.dart b/lib/domain/sign_up/entity/sign_up_email_entity.dart index 38ebbd9..bcef4e1 100644 --- a/lib/domain/sign_up/entity/sign_up_email_entity.dart +++ b/lib/domain/sign_up/entity/sign_up_email_entity.dart @@ -2,15 +2,10 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'sign_up_email_entity.freezed.dart'; -part 'sign_up_email_entity.g.dart'; - @freezed abstract class SignUpEmailEntity with _$SignUpEmailEntity { const factory SignUpEmailEntity({ required String email, required String verifyCode, }) = _SignUpEmailEntity; - - factory SignUpEmailEntity.fromJson(Map json) => - _$SignUpEmailEntityFromJson(json); } diff --git a/lib/domain/sign_up/entity/sign_up_entity.dart b/lib/domain/sign_up/entity/sign_up_entity.dart index b65a9aa..f9d8038 100644 --- a/lib/domain/sign_up/entity/sign_up_entity.dart +++ b/lib/domain/sign_up/entity/sign_up_entity.dart @@ -2,8 +2,6 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'sign_up_entity.freezed.dart'; -part 'sign_up_entity.g.dart'; - @freezed abstract class SignUpEntity with _$SignUpEntity { const factory SignUpEntity({ @@ -12,7 +10,4 @@ abstract class SignUpEntity with _$SignUpEntity { required String name, required String school, }) = _SignUpEntity; - - factory SignUpEntity.fromJson(Map json) => - _$SignUpEntityFromJson(json); } diff --git a/lib/domain/sign_up/entity/sign_up_search_school_entity.dart b/lib/domain/sign_up/entity/sign_up_search_school_entity.dart index 45ed788..2c965ac 100644 --- a/lib/domain/sign_up/entity/sign_up_search_school_entity.dart +++ b/lib/domain/sign_up/entity/sign_up_search_school_entity.dart @@ -2,18 +2,12 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'sign_up_search_school_entity.freezed.dart'; -part 'sign_up_search_school_entity.g.dart'; - @freezed abstract class SignUpSearchSchoolResponseEntity with _$SignUpSearchSchoolResponseEntity { const factory SignUpSearchSchoolResponseEntity({ @JsonKey(name: 'schoolInfo') required List schoolInfo, }) = _SignUpSearchSchoolResponseEntity; - - factory SignUpSearchSchoolResponseEntity.fromJson( - Map json, - ) => _$SignUpSearchSchoolResponseEntityFromJson(json); } @freezed @@ -22,9 +16,6 @@ abstract class SchoolInfoEntity with _$SchoolInfoEntity { List? head, List? row, }) = _SchoolInfoEntity; - - factory SchoolInfoEntity.fromJson(Map json) => - _$SchoolInfoEntityFromJson(json); } @freezed @@ -33,7 +24,4 @@ abstract class SchoolRowEntity with _$SchoolRowEntity { @JsonKey(name: 'SCHUL_NM') required String schoolName, @JsonKey(name: 'ORG_RDNMA') required String schoolAddress, }) = _SchoolRowEntity; - - factory SchoolRowEntity.fromJson(Map json) => - _$SchoolRowEntityFromJson(json); }