Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • car-app/appwrite-functions
1 result
Show changes
import 'package:api/model/interface/point.dart';
class PointResponse implements Point {
@override
final String id;
@override
final num latitude;
@override
final num longitude;
PointResponse({required this.id, required this.latitude, required this.longitude});
}
import 'package:api/model/interface/route.dart';
class RouteResponse implements Route {
@override
final Iterable<String> pointIds;
@override
final String userId;
@override
final String? teamId;
@override
final DateTime startTime;
@override
final DateTime endTime;
@override
final String id;
RouteResponse({required this.id, required this.pointIds, required this.userId, this.teamId, required this.startTime, required this.endTime});
}
import 'package:api/model/debt.dart';
import 'package:api/model/interface/payment/user_to_user.dart';
import 'package:api/model/interface/route.dart';
import 'package:api/model/membership.dart';
import 'package:api/model/payment/driven_distance_distributed.dart';
import 'package:api/model/payment/equally_distributed.dart';
import 'package:api/model/payment/user_to_user.dart';
import 'package:api/service/distance_calculator.dart';
import 'package:api/model/route.dart';
import 'package:api/model/interface/payment/driven_distance_distributed.dart';
import 'package:api/model/response/payment/equally_distributed.dart';
class DebtService {
final Stream<Membership> Function(String) getMembershipsByTeamId;
final Future<Route> Function(String) getRouteById;
final Stream<UserToUserPayment> Function(String) getUserToUserPayments;
final Stream<EquallyDistributedPayment> Function(String) getEquallyDistributedPayments;
final Stream<EquallyDistributedPaymentResponse> Function(String) getEquallyDistributedPayments;
final Stream<DrivenDistanceDistributedPayment> Function(String) getDrivenDistanceDistributedPayments;
final Future<num> Function(Route) getDistance;
DebtService({
required this.getMembershipsByTeamId,
......@@ -19,6 +19,7 @@ class DebtService {
required this.getUserToUserPayments,
required this.getEquallyDistributedPayments,
required this.getDrivenDistanceDistributedPayments,
required this.getDistance,
});
Stream<Debt> getDebt(String userId) async* {
......@@ -39,7 +40,7 @@ class DebtService {
}
}
Stream<Debt> calculateEquallyDistributedPaymentDebt(EquallyDistributedPayment payment) async* {
Stream<Debt> calculateEquallyDistributedPaymentDebt(EquallyDistributedPaymentResponse payment) async* {
var teamMemberships = getMembershipsByTeamId(payment.teamId);
var teamMemberIds = await teamMemberships.where((element) => element.joinedAt.compareTo(payment.createdAt) <= 0).map((e) => e.user.id).toList();
......@@ -57,7 +58,7 @@ class DebtService {
var distancePerUser = <String, num>{};
await for (var route in paymentRoutes) {
distancePerUser[route.userId] = (distancePerUser[route.userId] ?? 0) + route.distance;
distancePerUser[route.userId] = (distancePerUser[route.userId] ?? 0) + await getDistance(route);
}
var fullDistance = distancePerUser.values.reduce((value, element) => value + element);
......
import 'package:latlong2/latlong.dart' as latlong;
import 'package:api/model/route.dart';
import 'package:api/model/interface/point.dart';
import 'package:api/model/interface/route.dart';
import 'package:latlong2/latlong.dart';
// TODO: as service
class DistanceService {
final Future<Point> Function(String) getPointById;
extension Distance on Route {
double get distance {
var distanceConverter = latlong.Distance();
DistanceService({required this.getPointById});
Future<num> calculateDistance(Route route) async {
var points = Stream.fromFutures(route.pointIds.map((e) => getPointById(e)));
var distanceConverter = Distance();
double distance = 0;
latlong.LatLng? lastPoint;
for (var point in points) {
var currentPoint = latlong.LatLng(point.latitude.toDouble(), point.longitude.toDouble());
LatLng? lastPoint;
await for (var point in points) {
var currentPoint = LatLng(point.latitude.toDouble(), point.longitude.toDouble());
if (lastPoint != null) {
distance += distanceConverter(lastPoint, currentPoint);
}
......
......@@ -6,7 +6,7 @@ import 'package:api/service/user_service.dart';
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/lib.dart';
class MembershipService extends ClientFunction {
class MembershipService extends AppwriteClient {
final UserService userService;
final TeamService teamService;
......
......@@ -4,7 +4,7 @@ import 'package:api/model/team.dart';
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/lib.dart';
class TeamService extends ClientFunction {
class TeamService extends AppwriteClient {
late final Teams _teams;
TeamService({required super.host, required super.projectId, required super.apiKey}) {
......
......@@ -2,7 +2,7 @@ import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/lib.dart';
import 'package:api/model/user.dart';
class UserService extends ClientFunction {
class UserService extends AppwriteClient {
late final Users _users;
UserService({required super.host, required super.projectId, required super.apiKey}) {
......
......@@ -3,7 +3,7 @@
/// More dartdocs go here.
library;
export 'src/interface/client_function.dart';
export 'src/utils/appwrite_client.dart';
export 'src/base_database.dart';
export 'src/utils/variables.dart';
export 'src/utils/request_handler.dart';
......@@ -19,3 +19,4 @@ export 'src/db_api_endpoint.dart';
export 'src/exceptions/db_action_forbidden.dart';
export 'src/converter/list_response/list_to_response_converter.dart';
export 'src/checked_db_api_endpoint.dart';
export 'src/utils/api_helper.dart';
......@@ -3,13 +3,15 @@ import 'dart:async';
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:dart_appwrite/models.dart' as appwrite_models;
import 'package:lib/src/exceptions/id_null.dart';
import 'package:lib/src/interface/client_function.dart';
import 'package:lib/src/utils/appwrite_client.dart';
import 'package:lib/src/interface/db_model.dart';
abstract class BaseDatabase<T extends DbModel, T1> extends ClientFunction {
abstract class BaseDatabase<T extends DbModel, T1> extends AppwriteClient {
static const String itemDataField = "data";
final Map<String, dynamic> Function(T) itemToDbMap;
final T1 Function(Map<String, dynamic>) itemFromDbMap;
late final Databases databases;
String get databaseId;
......
......@@ -5,7 +5,7 @@ import 'package:lib/src/base_database.dart';
import 'package:lib/src/converter/list_response/list_to_response_converter.dart';
import 'package:lib/src/interface/api_endpoint.dart';
import 'package:lib/src/interface/db_model.dart';
import 'package:lib/src/utils/map_helper.dart';
import 'package:lib/src/utils/api_helper.dart';
import 'package:lib/src/utils/variables.dart';
class DbApiEndpoint<T extends DbModel, T1> extends ApiEndpoint {
......@@ -24,12 +24,12 @@ class DbApiEndpoint<T extends DbModel, T1> extends ApiEndpoint {
@override
Future<Map<String, dynamic>> handleGet(context) async {
if(hasBodyKey(context, RequestResponseVariables.idFieldName)) {
if(ApiHelper.hasBodyField(context, RequestResponseVariables.idFieldName)) {
var id = idFromContext(context);
var item = await getFromId(id);
return context.res.json(itemToResponse(item));
}
else if(hasBodyKey(context, RequestResponseVariables.queriesFieldName)) {
else if(ApiHelper.hasBodyField(context, RequestResponseVariables.queriesFieldName)) {
var queryRequest = queryRequestFromContext(context);
var items = await getFromQueries(queryRequest).toList();
return listResponse(context, items, itemToResponse);
......@@ -83,21 +83,10 @@ class DbApiEndpoint<T extends DbModel, T1> extends ApiEndpoint {
}
String idFromContext(final context) {
var map = jsonDecode(context.req.body);
return getRequiredMapItem<String>(RequestResponseVariables.idFieldName, map);
return ApiHelper.fieldFromRequestBody(context, RequestResponseVariables.idFieldName);
}
Iterable<String> queryRequestFromContext(final context) {
var map = jsonDecode(context.req.body);
return getRequiredMapItem<Iterable<String>>(RequestResponseVariables.queriesFieldName, map);
}
bool hasBodyKey(final context, String key) {
try {
var map = jsonDecode(context.req.body) as Map<String, dynamic>;
return map.containsKey(key);
} on FormatException catch(_) {
return false;
}
return ApiHelper.fieldFromRequestBody(context, RequestResponseVariables.queriesFieldName);
}
}
import 'dart:convert';
import 'package:lib/src/utils/map_helper.dart';
abstract class ApiHelper {
static T fieldFromRequestBody<T>(final context, String fieldName) {
var map = jsonDecode(context.req.body);
return getRequiredMapItem<T>(fieldName, map);
}
static bool hasBodyField(final context, String key) {
try {
var map = jsonDecode(context.req.body) as Map<String, dynamic>;
return map.containsKey(key);
} on FormatException catch(_) {
return false;
}
}
}
import 'package:dart_appwrite/dart_appwrite.dart';
abstract class ClientFunction {
class AppwriteClient {
final Client client;
ClientFunction({required String host, required String projectId, required String apiKey}) :
AppwriteClient({required String host, required String projectId, required String apiKey}) :
client = Client(endPoint: host)
.setProject(projectId)
.setKey(apiKey)
......