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
Commits on Source (3)
Showing
with 125 additions and 88 deletions
import 'package:api/converter/request_response/calendar_event.dart';
import 'package:api/model/interface/calendar_event.dart';
import 'package:api/model/request/calendar_event.dart';
import 'package:api/model/response/calendar_event.dart';
......@@ -23,10 +24,10 @@ class CalendarEventApiEndpoint extends CheckedDbApiEndpoint<CalendarEventRequest
CalendarEventApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
required this.requestingUser,
required this.requestingUserTeams,
super.itemFromRequest = CalendarEventRequestResponseConverter.fromRequest,
super.itemToResponse = CalendarEventRequestResponseConverter.toResponseData,
});
Future<bool> _createItemAllowed(CalendarEventRequest item) {
......
import 'package:api/converter/request_response/debt.dart';
import 'package:api/model/debt.dart';
import 'package:api/model/user.dart';
import 'package:api/service/debt.dart';
......@@ -6,9 +7,9 @@ import 'package:lib/lib.dart';
class DebtApiEndpoint extends ApiEndpoint {
final User requestingUser;
final DebtService debtService;
final Map<String, dynamic> Function(Debt) itemToResponse;
final Map<String, dynamic> Function(Debt) itemToResponse = DebtRequestResponseConverter.toResponseData;
DebtApiEndpoint({required this.requestingUser, required this.debtService, required this.itemToResponse});
DebtApiEndpoint({required this.requestingUser, required this.debtService});
@override
Future<Map<String, dynamic>> handleDelete(context) {
......
import 'package:api/converter/request_response/membership.dart';
import 'package:api/model/membership.dart';
import 'package:api/model/user.dart';
import 'package:lib/lib.dart';
class MembershipApiEndpoint extends ApiEndpoint {
static const String teamIdFieldName = "teamId";
static const String userIdFieldName = "userId";
final User requestingUser;
final Stream<Membership> Function(String) getMembershipsByUserId;
final Stream<Membership> Function(String) getMembershipsByTeamId;
final Map<String, dynamic> Function(Membership) itemToResponse = MembershipRequestResponseConverter.toResponseData;
MembershipApiEndpoint({
required this.requestingUser,
required this.getMembershipsByUserId,
required this.getMembershipsByTeamId,
});
@override
Future<Map<String, dynamic>> handleDelete(context) {
throw ApiActionForbiddenException("delete", "membership");
}
@override
Future<Map<String, dynamic>> handleGet(context) async {
Stream<Membership> memberships;
if(ApiHelper.hasBodyField(context, teamIdFieldName)) {
var requestingUserTeamIds = await getMembershipsByUserId(requestingUser.id).map((e) => e.team.id).toList();
var teamId = ApiHelper.fieldFromRequestBody<String>(context, teamIdFieldName);
memberships = getMembershipsByTeamId(teamId).where((e) => requestingUserTeamIds.contains(e.team.id));
}
else {
var userId = ApiHelper.fieldFromRequestBody<String>(context, userIdFieldName);
if(userId != requestingUser.id) {
throw UnauthorizedException();
}
memberships = getMembershipsByUserId(userId);
}
return listResponse(context, await memberships.toList(), itemToResponse);
}
@override
Future<Map<String, dynamic>> handlePost(context) {
throw ApiActionForbiddenException("post", "membership");
}
@override
Future<Map<String, dynamic>> handlePut(context) {
throw ApiActionForbiddenException("put", "membership");
}
}
import 'dart:async';
import 'package:api/converter/request_response/payment/driven_distance_distributed.dart';
import 'package:api/model/interface/payment/driven_distance_distributed.dart';
import 'package:api/model/request/payment/driven_distance_distributed.dart';
import 'package:api/model/response/payment/driven_distance_distributed.dart';
......@@ -27,11 +28,11 @@ class DrivenDistanceDistributedPaymentApiEndpoint extends CheckedDbApiEndpoint<D
DrivenDistanceDistributedPaymentApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
required this.requestingUser,
required this.requestingUserTeams,
required this.getRouteFromId,
super.itemFromRequest = DrivenDistanceDistributedPaymentRequestResponseConverter.fromRequest,
super.itemToResponse = DrivenDistanceDistributedPaymentRequestResponseConverter.toResponseData,
});
Future<bool> _createItemAllowed(DrivenDistanceDistributedPaymentRequest item) async {
......
import 'dart:async';
import 'package:api/converter/request_response/payment/equally_distributed.dart';
import 'package:api/model/interface/payment/equally_distributed.dart';
import 'package:api/model/request/payment/equally_distributed.dart';
import 'package:api/model/response/payment/equally_distributed.dart';
......@@ -25,10 +26,10 @@ class EquallyDistributedApiEndpoint extends CheckedDbApiEndpoint<EquallyDistribu
EquallyDistributedApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
required this.requestingUser,
required this.requestingUserTeams,
super.itemFromRequest = EquallyDistributedPaymentRequestResponseConverter.fromRequest,
super.itemToResponse = EquallyDistributedPaymentRequestResponseConverter.toResponseData,
});
Future<bool> _createItemAllowed(EquallyDistributedPaymentRequest item) {
......
import 'package:api/converter/request_response/payment/user_to_user.dart';
import 'package:api/model/interface/payment/user_to_user.dart';
import 'package:api/model/request/payment/user_to_user.dart';
import 'package:api/model/response/payment/user_to_user.dart';
......@@ -21,9 +22,9 @@ class UserToUserPaymentApiEndpoint extends CheckedDbApiEndpoint<UserToUserPaymen
UserToUserPaymentApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
required this.requestingUser,
super.itemFromRequest = UserToUserPaymentRequestResponseConverter.fromRequest,
super.itemToResponse = UserToUserPaymentRequestResponseConverter.toResponseData,
});
Future<bool> _createItemAllowed(UserToUserPaymentRequest item) {
......
import 'package:api/converter/request_response/point.dart';
import 'package:api/model/request/point.dart';
import 'package:api/model/response/point.dart';
import 'package:lib/lib.dart';
......@@ -5,8 +6,8 @@ import 'package:lib/lib.dart';
class PointApiEndpoint extends DbApiEndpoint<PointRequest, PointResponse> {
PointApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
super.itemFromRequest = PointRequestResponseConverter.fromRequest,
super.itemToResponse = PointRequestResponseConverter.toResponseData,
});
@override
......
import 'package:api/converter/request_response/route.dart';
import 'package:api/model/interface/route.dart';
import 'package:api/model/request/route.dart';
import 'package:api/model/response/route.dart';
......@@ -23,10 +24,10 @@ class RouteApiEndpoint extends CheckedDbApiEndpoint<RouteRequest, RouteResponse>
RouteApiEndpoint({
required super.database,
required super.itemFromRequest,
required super.itemToResponse,
required this.requestingUser,
required this.requestingUserTeams,
super.itemFromRequest = RouteRequestResponseConverter.fromRequest,
super.itemToResponse = RouteRequestResponseConverter.toResponseData,
});
Future<bool> _createItemAllowed(RouteRequest item) {
......
import 'package:api/converter/request_response/team.dart';
import 'package:api/model/team.dart';
import 'package:api/model/user.dart';
import 'package:lib/lib.dart';
......@@ -6,9 +7,9 @@ class TeamApiEndpoint extends ApiEndpoint {
final User requestingUser;
final Future<Team> Function(String) getTeamById;
final Future<bool> Function(User, Team) isUserInTeam;
final Map<String, dynamic> Function(Team) itemToResponse;
final Map<String, dynamic> Function(Team) itemToResponse = TeamRequestResponseConverter.toResponseData;
TeamApiEndpoint({required this.requestingUser, required this.getTeamById, required this.isUserInTeam, required this.itemToResponse});
TeamApiEndpoint({required this.requestingUser, required this.getTeamById, required this.isUserInTeam});
@override
Future<Map<String, dynamic>> handleDelete(context) {
......
import 'package:api/converter/request_response/user.dart';
import 'package:api/model/team.dart';
import 'package:api/model/user.dart';
import 'package:lib/lib.dart';
......@@ -6,9 +7,9 @@ class UserApiEndpoint extends ApiEndpoint {
final User requestingUser;
final Future<User> Function(String) getUserFromId;
final Stream<Team> Function(User) getTeamsOfUser;
final Map<String, dynamic> Function(User) itemToResponse;
final Map<String, dynamic> Function(User) itemToResponse = UserRequestResponseConverter.toResponseData;
UserApiEndpoint({required this.requestingUser, required this.getUserFromId, required this.getTeamsOfUser, required this.itemToResponse});
UserApiEndpoint({required this.requestingUser, required this.getUserFromId, required this.getTeamsOfUser});
@override
Future<Map<String, dynamic>> handleDelete(context) {
......
import 'package:api/model/membership.dart';
class MembershipRequestResponseConverter {
static const String userIdRequestResponseFieldName = "userId";
static const String teamIdRequestResponseFieldName = "teamId";
static Map<String, dynamic> toResponseData(Membership response) {
return {
userIdRequestResponseFieldName: response.user.id,
teamIdRequestResponseFieldName: response.team.id,
};
}
}
......@@ -2,13 +2,11 @@ import 'package:lib/lib.dart';
import 'package:api/model/user.dart';
class UserRequestResponseConverter {
static const String emailRequestResponseFieldName = "email";
static const String nameRequestResponseFieldName = "name";
static Map<String, dynamic> toResponseData(User response) {
return {
RequestResponseVariables.idFieldName: response.id,
emailRequestResponseFieldName: response.email,
nameRequestResponseFieldName: response.name,
};
}
......
import 'package:api/converter/db_converter/calendar_event.dart';
import 'package:api/model/request/calendar_event.dart';
import 'package:api/model/response/calendar_event.dart';
import 'package:lib/lib.dart';
......@@ -14,7 +15,7 @@ class CalendarEventDatabase extends BaseDatabase<CalendarEventRequest, CalendarE
required super.host,
required super.projectId,
required super.apiKey,
required super.itemToDbMap,
required super.itemFromDbMap,
super.itemToDbMap = CalendarEventDbConverter.toDbData,
super.itemFromDbMap = CalendarEventDbConverter.fromDbData,
});
}
import 'package:api/converter/db_converter/payment/driven_distance_distributed.dart';
import 'package:api/model/request/payment/driven_distance_distributed.dart';
import 'package:api/model/response/payment/driven_distance_distributed.dart';
import 'package:lib/lib.dart';
......@@ -14,7 +15,7 @@ class DrivenDistanceDistributedPaymentDatabase extends BaseDatabase<DrivenDistan
required super.host,
required super.projectId,
required super.apiKey,
required super.itemFromDbMap,
required super.itemToDbMap,
super.itemFromDbMap = DrivenDistanceDistributedPaymentDbConverter.fromDbData,
super.itemToDbMap = DrivenDistanceDistributedPaymentDbConverter.toDbData,
});
}
import 'package:api/converter/db_converter/payment/equally_distributed.dart';
import 'package:api/model/request/payment/equally_distributed.dart';
import 'package:api/model/response/payment/equally_distributed.dart';
import 'package:lib/lib.dart';
......@@ -13,7 +14,7 @@ class EquallyDistributedPaymentDatabase extends BaseDatabase<EquallyDistributedP
required super.host,
required super.projectId,
required super.apiKey,
required super.itemFromDbMap,
required super.itemToDbMap,
super.itemFromDbMap = EquallyDistributedPaymentDbConverter.fromDbData,
super.itemToDbMap = EquallyDistributedPaymentDbConverter.toDbData,
});
}
import 'package:api/converter/db_converter/payment/user_to_user.dart';
import 'package:api/model/request/payment/user_to_user.dart';
import 'package:api/model/response/payment/user_to_user.dart';
import 'package:lib/lib.dart';
......@@ -13,7 +14,7 @@ class UserToUserPaymentDatabase extends BaseDatabase<UserToUserPaymentRequest, U
required super.host,
required super.projectId,
required super.apiKey,
required super.itemFromDbMap,
required super.itemToDbMap,
super.itemFromDbMap = UserToUserPaymentDbConverter.fromDbData,
super.itemToDbMap = UserToUserPaymentDbConverter.toDbData,
});
}
import 'package:api/converter/db_converter/point.dart';
import 'package:api/model/request/point.dart';
import 'package:api/model/response/point.dart';
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/lib.dart';
class PointDatabase extends BaseDatabase<PointRequest, PointResponse> {
final String latitudeDbFieldName;
final String longitudeDbFieldName;
@override
final String databaseId = "65fddef523b653ce0952";
......@@ -17,17 +15,15 @@ class PointDatabase extends BaseDatabase<PointRequest, PointResponse> {
required super.host,
required super.projectId,
required super.apiKey,
required super.itemToDbMap,
required super.itemFromDbMap,
required this.latitudeDbFieldName,
required this.longitudeDbFieldName,
super.itemToDbMap = PointDbConverter.toDbData,
super.itemFromDbMap = PointDbConverter.fromDbData,
});
@override
Future<PointResponse> create(PointRequest item) async {
var queries = List.of([
Query.equal(latitudeDbFieldName, item.latitude),
Query.equal(longitudeDbFieldName, item.longitude),
Query.equal(PointDbConverter.latitudeDbFieldName, item.latitude),
Query.equal(PointDbConverter.longitudeDbFieldName, item.longitude),
]);
var equalItems = await getFromQueries(queries).toList();
......
import 'package:api/converter/db_converter/route.dart';
import 'package:api/model/request/route.dart';
import 'package:api/model/response/route.dart';
import 'package:lib/lib.dart';
import 'package:api/database/point.dart';
class RouteDatabase extends BaseDatabase<RouteRequest, RouteResponse> {
final PointDatabase pointDatabase;
@override
String get collectionId => "6600a7f577154a949b4c";
......@@ -16,8 +14,7 @@ class RouteDatabase extends BaseDatabase<RouteRequest, RouteResponse> {
required super.host,
required super.projectId,
required super.apiKey,
required this.pointDatabase,
required super.itemToDbMap,
required super.itemFromDbMap,
super.itemToDbMap = RouteDbConverter.toDbData,
super.itemFromDbMap = RouteDbConverter.fromDbData,
});
}
import 'dart:async';
import 'dart:io';
import 'package:api/api_endpoint/calendar_event.dart';
import 'package:api/api_endpoint/membership.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/db_converter/calendar_event.dart';
import 'package:api/converter/db_converter/payment/equally_distributed.dart';
import 'package:api/converter/db_converter/payment/user_to_user.dart';
import 'package:api/converter/db_converter/point.dart';
import 'package:api/converter/db_converter/route.dart';
import 'package:api/converter/request_response/calendar_event.dart';
import 'package:api/converter/request_response/debt.dart';
import 'package:api/converter/request_response/payment/driven_distance_distributed.dart';
import 'package:api/converter/request_response/payment/equally_distributed.dart';
import 'package:api/converter/request_response/payment/user_to_user.dart';
import 'package:api/converter/request_response/point.dart';
import 'package:api/converter/request_response/user.dart';
import 'package:api/converter/request_response/route.dart';
import 'package:api/converter/request_response/team.dart';
import 'package:api/database/calendar_event.dart';
import 'package:api/converter/db_converter/payment/driven_distance_distributed.dart';
import 'package:api/api_endpoint/debt.dart';
import 'package:api/model/response/payment/driven_distance_distributed.dart';
import 'package:api/model/response/payment/equally_distributed.dart';
......@@ -53,6 +39,7 @@ const String drivenDistanceDistributedPaymentApiEndpoint = "/payment/team/driven
const String equallyDistributedPaymentApiEndpoint = "/payment/team/equal";
const String userToUserPaymentApiEndpoint = "/payment/user";
const String debtApiEndpoint = "/debt";
const String membershipApiEndpoint = "/membership";
Future<dynamic> main(final context) async {
final host = "https://${context.req.host}/v1";
......@@ -64,27 +51,18 @@ Future<dynamic> main(final context) async {
host: host,
projectId: projectId,
apiKey: apiKey,
itemToDbMap: PointDbConverter.toDbData,
itemFromDbMap: PointDbConverter.fromDbData,
latitudeDbFieldName: PointDbConverter.latitudeDbFieldName,
longitudeDbFieldName: PointDbConverter.longitudeDbFieldName,
);
var routeDatabase = RouteDatabase(
host: host,
projectId: projectId,
apiKey: apiKey,
pointDatabase: pointDatabase,
itemToDbMap: RouteDbConverter.toDbData,
itemFromDbMap: RouteDbConverter.fromDbData,
);
var calendarEventDatabase = CalendarEventDatabase(
host: host,
projectId: projectId,
apiKey: apiKey,
itemToDbMap: CalendarEventDbConverter.toDbData,
itemFromDbMap: CalendarEventDbConverter.fromDbData,
);
var drivenDistanceDistributedPaymentDatabase = DrivenDistanceDistributedPaymentDatabase(
......@@ -92,24 +70,18 @@ Future<dynamic> main(final context) async {
projectId:
projectId,
apiKey: apiKey,
itemToDbMap: DrivenDistanceDistributedPaymentDbConverter.toDbData,
itemFromDbMap: DrivenDistanceDistributedPaymentDbConverter.fromDbData,
);
var equallyDistributedPaymentDatabase = EquallyDistributedPaymentDatabase(
host: host,
projectId: projectId,
apiKey: apiKey,
itemToDbMap: EquallyDistributedPaymentDbConverter.toDbData,
itemFromDbMap: EquallyDistributedPaymentDbConverter.fromDbData,
);
var userToUserPaymentDatabase = UserToUserPaymentDatabase(
host: host,
projectId: projectId,
apiKey: apiKey,
itemToDbMap: UserToUserPaymentDbConverter.toDbData,
itemFromDbMap: UserToUserPaymentDbConverter.fromDbData,
);
var teamService = TeamService(host: host, projectId: projectId, apiKey: apiKey);
......@@ -135,8 +107,6 @@ Future<dynamic> main(final context) async {
case pointApiPath:
apiEndpoint = PointApiEndpoint(
database: pointDatabase,
itemFromRequest: PointRequestResponseConverter.fromRequest,
itemToResponse: PointRequestResponseConverter.toResponseData,
);
break;
......@@ -148,8 +118,6 @@ Future<dynamic> main(final context) async {
database: routeDatabase,
requestingUser: requestingUser,
requestingUserTeams: requestingUserTeams,
itemFromRequest: RouteRequestResponseConverter.fromRequest,
itemToResponse: RouteRequestResponseConverter.toResponseData,
);
break;
......@@ -160,7 +128,6 @@ Future<dynamic> main(final context) async {
requestingUser: requestingUser,
getTeamById: teamService.getTeam,
isUserInTeam: (user, team) => isUserInTeam(user, team, membershipService),
itemToResponse: TeamRequestResponseConverter.toResponseData,
);
break;
......@@ -172,8 +139,6 @@ Future<dynamic> main(final context) async {
database: calendarEventDatabase,
requestingUser: requestingUser,
requestingUserTeams: requestingUserTeams,
itemFromRequest: CalendarEventRequestResponseConverter.fromRequest,
itemToResponse: CalendarEventRequestResponseConverter.toResponseData,
);
break;
......@@ -183,7 +148,6 @@ Future<dynamic> main(final context) async {
requestingUser: requestingUser,
getTeamsOfUser: (user) => getUserTeams(user.id, membershipService),
getUserFromId: userService.getUser,
itemToResponse: UserRequestResponseConverter.toResponseData,
);
break;
......@@ -194,8 +158,6 @@ Future<dynamic> main(final context) async {
requestingUser: requestingUser,
requestingUserTeams: await getUserTeams(requestingUser.id, membershipService).toList(),
getRouteFromId: routeDatabase.get,
itemFromRequest: DrivenDistanceDistributedPaymentRequestResponseConverter.fromRequest,
itemToResponse: DrivenDistanceDistributedPaymentRequestResponseConverter.toResponseData,
);
break;
......@@ -205,8 +167,6 @@ Future<dynamic> main(final context) async {
database: equallyDistributedPaymentDatabase,
requestingUser: requestingUser,
requestingUserTeams: await getUserTeams(requestingUser.id, membershipService).toList(),
itemFromRequest: EquallyDistributedPaymentRequestResponseConverter.fromRequest,
itemToResponse: EquallyDistributedPaymentRequestResponseConverter.toResponseData,
);
break;
......@@ -215,8 +175,6 @@ Future<dynamic> main(final context) async {
apiEndpoint = UserToUserPaymentApiEndpoint(
database: userToUserPaymentDatabase,
requestingUser: requestingUser,
itemFromRequest: UserToUserPaymentRequestResponseConverter.fromRequest,
itemToResponse: UserToUserPaymentRequestResponseConverter.toResponseData,
);
break;
......@@ -225,10 +183,17 @@ Future<dynamic> main(final context) async {
apiEndpoint = DebtApiEndpoint(
debtService: debtService,
requestingUser: requestingUser,
itemToResponse: DebtRequestResponseConverter.toResponseData,
);
break;
case membershipApiEndpoint:
var requestingUser = await getRequestingUser(context, userService);
apiEndpoint = MembershipApiEndpoint(
requestingUser: requestingUser,
getMembershipsByTeamId: membershipService.getTeamMemberships,
getMembershipsByUserId: membershipService.getUserMemberships,
);
default:
throw HttpException("Path $requestPath not found", uri: Uri.parse(context.req.url));
}
......