Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion lib/api/client/api_client.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import 'package:dio/dio.dart';
import 'package:elevate_tracking_app/api/models/requests/login_request.dart';
import 'package:elevate_tracking_app/api/models/responses/login_response.dart';
import 'package:elevate_tracking_app/api/models/responses/orders/driver_orders_response.dart';
import 'package:elevate_tracking_app/api/models/responses/orders/start_order_response.dart';
import 'package:injectable/injectable.dart';
import 'package:retrofit/retrofit.dart';

import '../../core/constants/end_points.dart';
import '../models/responses/orders/orders_response.dart';

part 'api_client.g.dart';

Expand All @@ -16,4 +19,13 @@ abstract class ApiClient {

@POST(EndPoints.login)
Future<LoginResponse> login(@Body() LoginRequest loginRequest);
}

@GET(EndPoints.orders)
Future<OrdersResponse> getOrders(@Query("page") int? page);

@GET(EndPoints.driverOrders)
Future<DriverOrdersResponse> getDriverOrders();

@PUT("${EndPoints.startOrder}/{orderId}")
Future<StartOrderResponse> startOrder(@Path("orderId") String orderId);
}
32 changes: 32 additions & 0 deletions lib/api/data_source/orders_remote_data_source_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:elevate_tracking_app/api/client/api_client.dart';
import 'package:elevate_tracking_app/api/mapper/orders_mapper.dart';
import 'package:elevate_tracking_app/core/api_result/api_result.dart';
import 'package:elevate_tracking_app/core/api_result/safe_api_call.dart';
import 'package:elevate_tracking_app/domain/entites/start_order_entity.dart';
import 'package:injectable/injectable.dart';

import '../../data/data_source/orders_remote_data_source.dart';
import '../../domain/entites/pending_orders_entity.dart';

@Injectable(as: OrdersRemoteDataSource)
class OrdersRemoteDataSourceImpl implements OrdersRemoteDataSource {
final ApiClient _apiClient;

OrdersRemoteDataSourceImpl(this._apiClient);

@override
Future<ApiResult<PendingOrdersEntity>> getOrders(int? page) {
return safeApiCall(
() => _apiClient.getOrders(page),
(response) => response.toEntity(),
);
}

@override
Future<ApiResult<StartOrderEntity>> startOrder(String orderId) {
return safeApiCall(
() => _apiClient.startOrder(orderId),
(response) => response.orders!.toEntity(),
);
}
}
183 changes: 183 additions & 0 deletions lib/api/mapper/orders_mapper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
import 'package:elevate_tracking_app/api/models/driver_order_dto.dart';
import 'package:elevate_tracking_app/domain/entites/driver_order_entity.dart';

import '../../domain/entites/meta_data_entity.dart';
import '../../domain/entites/order_entity.dart';
import '../../domain/entites/order_item_entity.dart';
import '../../domain/entites/pending_orders_entity.dart';
import '../../domain/entites/product_entity.dart';
import '../../domain/entites/shipping_address_entity.dart';
import '../../domain/entites/start_order_entity.dart';
import '../../domain/entites/start_order_items_entity.dart';
import '../../domain/entites/store_entity.dart';
import '../../domain/entites/user_entity.dart';
import '../models/meta_data_dto.dart';
import '../models/order_dto.dart';
import '../models/order_item_dto.dart';
import '../models/product_dto.dart';
import '../models/responses/orders/orders_response.dart';
import '../models/shipping_address_dto.dart';
import '../models/start_order_dto.dart';
import '../models/start_order_items_dto.dart';
import '../models/store_dto.dart';
import '../models/user_dto.dart';

extension DriverOrderMapper on DriverOrderDTO {
DriverOrderEntity toEntity() {
return DriverOrderEntity(
id: id,
driver: driver,
order: order?.toEntity(),
v: v,
createdAt: createdAt,
updatedAt: updatedAt,
store: store?.toEntity(),
);
}
}

extension OrderMapper on OrderDTO {
OrderEntity toEntity() {
return OrderEntity(
id: id,
user: user?.toEntity(),
orderItems: orderItems?.map((dto) => dto.toEntity()).toList(),
totalPrice: totalPrice,
shippingAddress: shippingAddress?.toEntity(),
paymentType: paymentType,
isPaid: isPaid,
isDelivered: isDelivered,
state: state,
createdAt: createdAt,
updatedAt: updatedAt,
orderNumber: orderNumber,
v: v,
store: store?.toEntity(),
);
}
}

extension OrderItemMapper on OrderItemDTO {
OrderItemEntity toEntity() {
return OrderItemEntity(
product: product?.toEntity(),
price: price,
quantity: quantity,
id: id,
);
}
}

extension ProductMapper on ProductDTO {
ProductEntity toEntity() {
return ProductEntity(
id: id,
title: title,
slug: slug,
description: description,
imgCover: imgCover,
images: images,
price: price,
priceAfterDiscount: priceAfterDiscount,
quantity: quantity,
category: category,
occasion: occasion,
createdAt: createdAt,
updatedAt: updatedAt,
v: v,
isSuperAdmin: isSuperAdmin,
sold: sold,
rateAvg: rateAvg,
rateCount: rateCount,
);
}
}

extension StoreMapper on StoreDTO {
StoreEntity toEntity() {
return StoreEntity(
name: name,
image: image,
address: address,
phoneNumber: phoneNumber,
latLong: latLong,
);
}
}

extension UserMapper on UserDTO {
UserEntity toEntity() {
return UserEntity(
id: id,
firstName: firstName,
lastName: lastName,
email: email,
gender: gender,
phone: phone,
photo: photo,
passwordChangedAt: passwordChangedAt,
);
}
}

extension StartOrderMapper on StartOrderDto {
StartOrderEntity toEntity() {
return StartOrderEntity(
id: id,
user: user,
orderItems: orderItems?.map((dto) => dto.toEntity()).toList(),
totalPrice: totalPrice,
paymentType: paymentType,
isPaid: isPaid,
isDelivered: isDelivered,
state: state,
createdAt: createdAt,
updatedAt: updatedAt,
orderNumber: orderNumber,
v: v,
);
}
}

extension StartOrderItemsMapper on StartOrderItemsDto {
StartOrderItemsEntity toEntity() {
return StartOrderItemsEntity(
product: product,
price: price,
quantity: quantity,
id: id,
);
}
}

extension ShippingAddressMapper on ShippingAddressDTO {
ShippingAddressEntity toEntity() {
return ShippingAddressEntity(
street: street,
city: city,
phone: phone,
lat: lat,
long: long,
);
}
}

extension MetaDataMapper on MetaDataDTO {
MetaDataEntity toEntity() {
return MetaDataEntity(
currentPage: currentPage,
totalPages: totalPages,
totalItems: totalItems,
limit: limit,
);
}
}

extension OrderResponseMapper on OrdersResponse {
PendingOrdersEntity toEntity() {
return PendingOrdersEntity(
metadata: metadata?.toEntity(),
orders: orders?.map((dto) => dto.toEntity()).toList(),
);
}
}
40 changes: 40 additions & 0 deletions lib/api/models/driver_order_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'package:elevate_tracking_app/api/models/order_dto.dart';
import 'package:elevate_tracking_app/api/models/store_dto.dart';
import 'package:json_annotation/json_annotation.dart';
part 'driver_order_dto.g.dart';

@JsonSerializable()
class DriverOrderDTO {
@JsonKey(name: "_id")
final String? id;
@JsonKey(name: "driver")
final String? driver;
@JsonKey(name: "order")
final OrderDTO? order;
@JsonKey(name: "__v")
final int? v;
@JsonKey(name: "createdAt")
final String? createdAt;
@JsonKey(name: "updatedAt")
final String? updatedAt;
@JsonKey(name: "store")
final StoreDTO? store;

DriverOrderDTO ({
this.id,
this.driver,
this.order,
this.v,
this.createdAt,
this.updatedAt,
this.store,
});

factory DriverOrderDTO.fromJson(Map<String, dynamic> json) {
return _$DriverOrderDTOFromJson(json);
}

Map<String, dynamic> toJson() {
return _$DriverOrderDTOToJson(this);
}
}
29 changes: 29 additions & 0 deletions lib/api/models/meta_data_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:json_annotation/json_annotation.dart';
part 'meta_data_dto.g.dart';

@JsonSerializable()
class MetaDataDTO {
@JsonKey(name: "currentPage")
final int? currentPage;
@JsonKey(name: "totalPages")
final int? totalPages;
@JsonKey(name: "totalItems")
final int? totalItems;
@JsonKey(name: "limit")
final int? limit;

MetaDataDTO ({
this.currentPage,
this.totalPages,
this.totalItems,
this.limit,
});

factory MetaDataDTO.fromJson(Map<String, dynamic> json) {
return _$MetaDataDTOFromJson(json);
}

Map<String, dynamic> toJson() {
return _$MetaDataDTOToJson(this);
}
}
64 changes: 64 additions & 0 deletions lib/api/models/order_dto.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import 'package:elevate_tracking_app/api/models/shipping_address_dto.dart';
import 'package:elevate_tracking_app/api/models/store_dto.dart';
import 'package:elevate_tracking_app/api/models/user_dto.dart';
import 'package:json_annotation/json_annotation.dart';

import 'order_item_dto.dart';
part 'order_dto.g.dart';

@JsonSerializable()
class OrderDTO {
@JsonKey(name: "_id")
final String? id;
@JsonKey(name: "user")
final UserDTO? user;
@JsonKey(name: "orderItems")
final List<OrderItemDTO>? orderItems;
@JsonKey(name: "totalPrice")
final int? totalPrice;
@JsonKey(name: "shippingAddress")
final ShippingAddressDTO? shippingAddress;
@JsonKey(name: "paymentType")
final String? paymentType;
@JsonKey(name: "isPaid")
final bool? isPaid;
@JsonKey(name: "isDelivered")
final bool? isDelivered;
@JsonKey(name: "state")
final String? state;
@JsonKey(name: "createdAt")
final String? createdAt;
@JsonKey(name: "updatedAt")
final String? updatedAt;
@JsonKey(name: "orderNumber")
final String? orderNumber;
@JsonKey(name: "__v")
final int? v;
@JsonKey(name: "store")
final StoreDTO? store;

OrderDTO ({
this.id,
this.user,
this.orderItems,
this.totalPrice,
this.shippingAddress,
this.paymentType,
this.isPaid,
this.isDelivered,
this.state,
this.createdAt,
this.updatedAt,
this.orderNumber,
this.v,
this.store,
});

factory OrderDTO.fromJson(Map<String, dynamic> json) {
return _$OrderDTOFromJson(json);
}

Map<String, dynamic> toJson() {
return _$OrderDTOToJson(this);
}
}
Loading
Loading