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
Showing
with 137 additions and 69 deletions
import 'package:api/converter/payment/db_converter.dart';
import 'package:api/payment/model/payment.dart';
import 'package:api/payment/model/team_payment.dart';
import 'package:api/model/payment/payment.dart';
import 'package:api/model/payment/team.dart';
import 'package:lib/lib.dart';
extension TeamPaymentDbConverter on TeamPayment {
......
import 'package:api/converter/payment/request_response_converter.dart';
import 'package:api/payment/model/payment.dart';
import 'package:api/payment/model/team_payment.dart';
import 'package:api/model/payment/payment.dart';
import 'package:api/model/payment/team.dart';
import 'package:lib/lib.dart';
extension TeamPaymentRequestResponseConverter on TeamPayment {
......@@ -18,7 +18,7 @@ extension TeamPaymentRequestResponseConverter on TeamPayment {
id: getOptionalMapItem(RequestResponseVariables.idFieldName, map),
teamId: getRequiredMapItem(teamIdRequestResponseFieldName, map),
amount: getRequiredMapItem(PaymentRequestResponseConverter.amountRequestResponseFieldName, map),
createdAt: DateTime.parse(getRequiredMapItem(PaymentRequestResponseConverter.timeAddedRequestResponseFieldName, map)),
createdAt: DateTime.parse(getRequiredMapItem(PaymentRequestResponseConverter.createdAtRequestResponseFieldName, map)),
paidBy: getRequiredMapItem(PaymentRequestResponseConverter.paidByRequestResponseFieldName, map),
);
}
......
import 'package:api/converter/payment/db_converter.dart';
import 'package:api/payment/model/payment.dart';
import 'package:api/payment/model/user_to_user_payment.dart';
import 'package:api/model/payment/payment.dart';
import 'package:api/model/payment/user_to_user.dart';
import 'package:lib/lib.dart';
extension UserToUserPaymentDbConverter on UserToUserPayment {
......
import 'package:api/converter/payment/request_response_converter.dart';
import 'package:api/model/payment/payment.dart';
import 'package:api/model/payment/user_to_user.dart';
import 'package:lib/lib.dart';
extension UserToUserPaymentRequestResponseConverter on UserToUserPayment {
static const String paidToRequestResponseFieldName = "paidTo";
Map<String, dynamic> toResponseData() {
return {
paidToRequestResponseFieldName: paidTo,
...(this as Payment).toResponseData()
};
}
static UserToUserPayment fromRequest(Map<String, dynamic> map) {
return UserToUserPayment(
id: getOptionalMapItem(RequestResponseVariables.idFieldName, map),
amount: getRequiredMapItem(PaymentRequestResponseConverter.amountRequestResponseFieldName, map),
createdAt: DateTime.parse(getRequiredMapItem(PaymentRequestResponseConverter.createdAtRequestResponseFieldName, map)),
paidBy: getRequiredMapItem(PaymentRequestResponseConverter.paidByRequestResponseFieldName, map),
paidTo: getRequiredMapItem(paidToRequestResponseFieldName, map)
);
}
}
import 'package:lib/lib.dart';
import 'package:api/point/point.dart';
import 'package:api/model/point.dart';
extension PointDbConverter on Point {
static const String latitudeDbFieldName = "latitude";
......
import 'package:lib/lib.dart';
import 'package:api/point/point.dart';
import 'package:api/model/point.dart';
extension PointRequestResponseConverter on Point {
static const String latitudeRequestResponseFieldName = "latitude";
......
import 'package:lib/lib.dart';
import 'package:api/route/route.dart';
import 'package:api/model/route.dart';
import 'package:api/converter/point/db_converter.dart';
extension RouteDbConverter on Route {
......
import 'package:lib/lib.dart';
import 'package:api/converter/point/request_response_converter.dart';
import 'package:api/route/route.dart';
import 'package:api/model/route.dart';
extension RouteRequestResponseConverter on Route {
static const String userIdRequestResponseFieldName = "userId";
......
import 'package:api/team/team.dart';
import 'package:api/model/team.dart';
extension TeamRequestResponseConverter on Team {
static const String teamIdResponseFieldName = "teamId";
......@@ -6,8 +6,8 @@ extension TeamRequestResponseConverter on Team {
Map<String, dynamic> toResponseData() {
return {
teamIdResponseFieldName: teamId,
teamNameResponseFieldName: teamName,
teamIdResponseFieldName: id,
teamNameResponseFieldName: name,
};
}
}
import 'package:lib/lib.dart';
import 'package:api/user/user.dart';
import 'package:api/model/user.dart';
extension UserRequestResponseConverter on User {
static const String emailRequestResponseFieldName = "email";
......
import 'package:lib/lib.dart';
import 'package:api/calendar_event/calendar_event.dart';
import 'package:api/model/calendar_event.dart';
class CalendarEventDatabase extends BaseDatabase<CalendarEvent, CalendarEvent> {
@override
......
import 'package:api/payment/model/driven_distance_distributed_payment.dart';
import 'package:api/model/payment/driven_distance_distributed.dart';
import 'package:lib/lib.dart';
class DrivenDistanceDistributedPaymentDatabase extends BaseDatabase<DrivenDistanceDistributedPayment, DrivenDistanceDistributedPayment> {
......
import 'package:api/payment/model/equally_distributed_payment.dart';
import 'package:api/model/payment/equally_distributed.dart';
import 'package:lib/lib.dart';
class EquallyDistributedPaymentDatabase extends BaseDatabase<EquallyDistributedPayment, EquallyDistributedPayment> {
......
import 'package:api/payment/model/user_to_user_payment.dart';
import 'package:api/model/payment/user_to_user.dart';
import 'package:lib/lib.dart';
class UserToUserPaymentDatabase extends BaseDatabase<UserToUserPayment, UserToUserPayment> {
......
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/lib.dart';
import 'package:api/converter/point/db_converter.dart';
import 'package:api/point/point.dart';
import 'package:api/model/point.dart';
class PointDatabase extends BaseDatabase<Point, Point> {
@override
......
import 'package:lib/lib.dart';
import 'package:api/point/point.dart';
import 'package:api/point/point_database.dart';
import 'package:api/route/route.dart';
import 'package:api/model/point.dart';
import 'package:api/database/point.dart';
import 'package:api/model/route.dart';
class RouteDatabase extends BaseDatabase<Route, Route> {
final PointDatabase pointDatabase;
......
import 'dart:async';
import 'dart:io';
import 'package:api/calendar_event/calendar_event_api_endpoint.dart';
import 'package:api/calendar_event/calendar_event_database.dart';
import 'package:api/api_endpoint/calendar_event.dart';
import 'package:api/api_endpoint/payment/driven_distance_distributed.dart';
import 'package:api/api_endpoint/payment/equally_distributed.dart';
import 'package:api/api_endpoint/payment/user_to_user.dart';
import 'package:api/converter/payment/user_to_user_payment.dart/request_response_converter.dart';
import 'package:api/database/calendar_event.dart';
import 'package:api/converter/calendar_event/db_converter.dart';
import 'package:api/converter/calendar_event/request_response_converter.dart';
import 'package:api/converter/debt/request_response_converter.dart';
......@@ -16,25 +20,27 @@ import 'package:api/converter/route/db_converter.dart';
import 'package:api/converter/route/request_response_converter.dart';
import 'package:api/converter/team/request_response_converter.dart';
import 'package:api/converter/user/request_response_converter.dart';
import 'package:api/debt/debt_api_endpoint.dart';
import 'package:api/debt/debt_service.dart';
import 'package:api/payment/database/driven_distance_distributed_payment.dart';
import 'package:api/payment/database/equally_distributed_payment.dart';
import 'package:api/payment/database/user_to_user_payment.dart';
import 'package:api/payment/model/driven_distance_distributed_payment.dart';
import 'package:api/payment/model/equally_distributed_payment.dart';
import 'package:api/payment/model/user_to_user_payment.dart';
import 'package:api/requesting_user/requesting_user_details.dart';
import 'package:api/team/team_api_endpoint.dart';
import 'package:api/team/team_service.dart';
import 'package:api/api_endpoint/debt.dart';
import 'package:api/model/team.dart';
import 'package:api/model/user.dart';
import 'package:api/service/debt.dart';
import 'package:api/database/payment/driven_distance_distributed.dart';
import 'package:api/database/payment/equally_distributed.dart';
import 'package:api/database/payment/user_to_user.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/api_endpoint/team.dart';
import 'package:api/service/membership_service.dart';
import 'package:api/service/team_service.dart';
import 'package:lib/lib.dart';
import 'package:api/point/point_api_endpoint.dart';
import 'package:api/point/point_database.dart';
import 'package:api/route/route_api_endpoint.dart';
import 'package:api/route/route_database.dart';
import 'package:api/schedule/schedule_api_endpoint.dart';
import 'package:api/user/user_api_endpoint.dart';
import 'package:api/user/user_service.dart';
import 'package:api/api_endpoint/point.dart';
import 'package:api/database/point.dart';
import 'package:api/api_endpoint/route.dart';
import 'package:api/database/route.dart';
import 'package:api/api_endpoint/schedule.dart';
import 'package:api/api_endpoint/user.dart';
import 'package:api/service/user_service.dart';
const String scheduleApiPath = "/";
const String pointApiPath = "/point";
......@@ -44,6 +50,7 @@ const String teamApiEndpoint = "/team";
const String userApiPath = "/user";
const String drivenDistanceDistributedPaymentApiEndpoint = "/payment/team/drivendistance";
const String equallyDistributedPaymentApiEndpoint = "/payment/team/equal";
const String userToUserPaymentApiEndpoint = "/payment/user";
const String debtApiEndpoint = "/debt";
Future<dynamic> main(final context) async {
......@@ -103,13 +110,15 @@ Future<dynamic> main(final context) async {
);
var teamService = TeamService(host: host, projectId: projectId, apiKey: apiKey);
var userService = UserService(host: host, projectId: projectId, apiKey: apiKey);
var membershipService = MembershipService(host: host, projectId: projectId, apiKey: apiKey, teamService: teamService, userService: userService);
var debtService = DebtService(
getMembershipsByTeamId: membershipService.getTeamMemberships,
getRouteById: routeDatabase.get,
getTeamById: teamService.getTeam,
getUserToUserPayments: (userId) => getUserToUserPayments(userId, userToUserPaymentDatabase),
getEquallyDistributedPayments: (userId) => getEquallyDistributedPayments(userId, teamService, equallyDistributedPaymentDatabase),
getDrivenDistanceDistributedPayments: (userId) => getDrivenDistanceDistributedPayments(userId, teamService, drivenDistanceDistributedPaymentDatabase),
getEquallyDistributedPayments: (userId) => getEquallyDistributedPayments(userId, membershipService, equallyDistributedPaymentDatabase),
getDrivenDistanceDistributedPayments: (userId) => getDrivenDistanceDistributedPayments(userId, membershipService, drivenDistanceDistributedPaymentDatabase),
);
ApiEndpoint apiEndpoint;
......@@ -127,69 +136,92 @@ Future<dynamic> main(final context) async {
break;
case routeApiPath:
var requestingUser = await getRequestingUser(context, teamService);
var requestingUser = await getRequestingUser(context, userService);
var requestingUserTeams = await getUserTeams(requestingUser.id, membershipService).toList();
apiEndpoint = RouteApiEndpoint(
database: routeDatabase,
requestingUser: requestingUser,
itemFromRequest: (m) => RouteRequestResponseConverter.fromRequest(m, requestingUser.userId),
requestingUserTeams: requestingUserTeams,
itemFromRequest: (m) => RouteRequestResponseConverter.fromRequest(m, requestingUser.id),
itemToResponse: (r) => r.toResponseData(),
);
break;
case teamApiEndpoint:
var requestingUser = await getRequestingUser(context, teamService);
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = TeamApiEndpoint(
teamService: teamService,
requestingUser: requestingUser,
getTeamsOfUser: (user) => getUserTeams(user.id, membershipService),
itemToResponse: (e) => e.toResponseData(),
);
break;
case calendarEventApiPath:
var requestingUser = await getRequestingUser(context, teamService);
var requestingUser = await getRequestingUser(context, userService);
var requestingUserTeams = await getUserTeams(requestingUser.id, membershipService).toList();
apiEndpoint = CalendarEventApiEndpoint(
database: calendarEventDatabase,
itemFromRequest: (m) => CalendarEventRequestResponseConverter.fromRequest(m, requestingUser.userId),
itemFromRequest: (m) => CalendarEventRequestResponseConverter.fromRequest(m, requestingUser.id),
itemToResponse: (ce) => ce.toResponseData(),
requestingUser: requestingUser
requestingUser: requestingUser,
requestingUserTeams: requestingUserTeams,
);
break;
case userApiPath:
var requestingUser = await getRequestingUser(context, teamService);
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = UserApiEndpoint(
userService: UserService(host: host, projectId: projectId, apiKey: apiKey),
teamService: teamService,
requestingUser: requestingUser,
getTeamsOfUser: (user) => getUserTeams(user.id, membershipService),
getUserFromId: userService.getUser,
itemToResponse: (e) => e.toResponseData(),
);
break;
case drivenDistanceDistributedPaymentApiEndpoint:
apiEndpoint = DbApiEndpoint<DrivenDistanceDistributedPayment, DrivenDistanceDistributedPayment>( // TODO
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = DrivenDistanceDistributedPaymentApiEndpoint(
database: drivenDistanceDistributedPaymentDatabase,
itemFromRequest: DrivenDistanceDistributedPaymentRequestResponseConverter.fromRequest,
itemToResponse: (e) => e.toResponseData(),
requestingUser: requestingUser,
requestingUserTeams: await getUserTeams(requestingUser.id, membershipService).toList(),
getRouteFromId: routeDatabase.get
);
break;
case equallyDistributedPaymentApiEndpoint:
apiEndpoint = DbApiEndpoint<EquallyDistributedPayment, EquallyDistributedPayment>( // TODO
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = EquallyDistributedApiEndpoint(
database: equallyDistributedPaymentDatabase,
itemFromRequest: EquallyDistributedPaymentRequestResponseConverter.fromResponse,
requestingUser: requestingUser,
requestingUserTeams: await getUserTeams(requestingUser.id, membershipService).toList(),
itemFromRequest: EquallyDistributedPaymentRequestResponseConverter.fromRequest,
itemToResponse: (e) => e.toResponseData(),
);
break;
case userToUserPaymentApiEndpoint:
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = UserToUserPaymentApiEndpoint(
database: userToUserPaymentDatabase,
requestingUser: requestingUser,
itemFromRequest: UserToUserPaymentRequestResponseConverter.fromRequest,
itemToResponse: (e) => e.toResponseData(),
);
break;
case debtApiEndpoint:
var requestingUser = await getRequestingUser(context, teamService);
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = DebtApiEndpoint(
debtService: debtService,
itemToResponse: (e) => e.toResponseData(),
requestingUser: requestingUser,
);
break;
default:
throw HttpException("Path $requestPath not found", uri: Uri.parse(context.req.url));
......@@ -199,24 +231,25 @@ Future<dynamic> main(final context) async {
return requestHandler.handleRequest(context);
}
Future<RequestingUserDetails> getRequestingUser(final context, TeamService teamService) async {
Future<User> getRequestingUser(final context, UserService userService) async {
final userId = AppwriteVariables.userId(context);
return RequestingUserDetails(
userId: userId,
teamIds: await teamService.getTeamsOfUser(userId).map((e) => e.teamId).toList(),
);
return userService.getUser(userId);
}
Stream<Team> getUserTeams(String userId, MembershipService membershipService) {
return membershipService.getUserMemberships(userId).map((e) => e.team);
}
Stream<UserToUserPayment> getUserToUserPayments(String userId, UserToUserPaymentDatabase userToUserPaymentDatabase) {
return userToUserPaymentDatabase.getAll().where((e) => e.paidBy == userId || e.paidTo == userId);
}
Stream<EquallyDistributedPayment> getEquallyDistributedPayments(String userId, TeamService teamService, EquallyDistributedPaymentDatabase equallyDistributedPaymentDatabase) async* {
var userTeamIds = await teamService.getTeamsOfUser(userId).map((e) => e.teamId).toList();
Stream<EquallyDistributedPayment> getEquallyDistributedPayments(String userId, MembershipService membershipService, EquallyDistributedPaymentDatabase equallyDistributedPaymentDatabase) async* {
var userTeamIds = await membershipService.getUserMemberships(userId).map((e) => e.team.id).toList();
yield* equallyDistributedPaymentDatabase.getAll().where((e) => userTeamIds.contains(e.teamId)); // Would be nice with queries, but appwrite does not support nested queries
}
Stream<DrivenDistanceDistributedPayment> getDrivenDistanceDistributedPayments(String userId, TeamService teamService, DrivenDistanceDistributedPaymentDatabase drivenDistanceDistributedPaymentDatabase) async* {
var userTeamIds = await teamService.getTeamsOfUser(userId).map((e) => e.teamId).toList();
Stream<DrivenDistanceDistributedPayment> getDrivenDistanceDistributedPayments(String userId, MembershipService membershipService, DrivenDistanceDistributedPaymentDatabase drivenDistanceDistributedPaymentDatabase) async* {
var userTeamIds = await membershipService.getUserMemberships(userId).map((e) => e.team.id).toList();
yield* drivenDistanceDistributedPaymentDatabase.getAll().where((e) => userTeamIds.contains(e.teamId)); // Would be nice with queries, but appwrite does not support nested queries
}
import 'package:api/model/team.dart';
import 'package:api/model/user.dart';
class Membership {
final User user;
final Team team;
final DateTime joinedAt;
Membership({required this.user, required this.team, required this.joinedAt});
}