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 (5)
Showing
with 316 additions and 17 deletions
import 'package:lib/lib.dart';
import 'package:point/calendar_event/calendar_event_database.dart';
import 'package:point/calendar_event/models/calendar_event_db_model.dart';
import 'package:point/calendar_event/models/calendar_event_response.dart';
class CalendarEventApiEndpoint extends DbApiEndpoint<CalendarEventDbModel, CalendarEventResponse> {
static const String path = "/calendar";
CalendarEventApiEndpoint({required super.requestingUser, required String host, required String projectId, required String apiKey, required Future<User> Function(String) getUser}) :
super(
database: CalendarEventDatabase(host: host, projectId: projectId, apiKey: apiKey, getUser: getUser),
itemGenerator: (m) => CalendarEventDbModel.fromRequest(m, requestingUser.userId),
);
}
import 'package:lib/lib.dart';
import 'package:point/calendar_event/models/calendar_event_db_model.dart';
import 'package:point/calendar_event/models/calendar_event_response.dart';
class CalendarEventDatabase extends BaseDatabase<CalendarEventDbModel, CalendarEventResponse> {
@override
String get collectionId => "6619bc4edf8000989821";
@override
String get databaseId => "65fddef523b653ce0952";
CalendarEventDatabase({required super.host, required super.projectId, required super.apiKey, required Future<User> Function(String) getUser}) :
super(
itemFromDbMap: (m) async => CalendarEventResponse.fromDbData(m, await getUser(m[CalendarEventDbModel.userIdDbFieldName])),
);
@override
Future<DbResponse<CalendarEventResponse>> create(DbRequest<CalendarEventDbModel> request) {
if(!request.requestingUser.teamIds.contains(request.item.teamId)) {
throw UnauthorizedException();
}
return super.create(request);
}
@override
Future<DbResponse<CalendarEventResponse>> get(DbRequest<String> request) async {
var response = await super.get(request);
if(!request.requestingUser.teamIds.contains(response.item.teamId)) {
throw UnauthorizedException();
}
return response;
}
@override
Stream<DbResponse<CalendarEventResponse>> getFromQueries(DbRequest<Iterable<String>> request) async* {
await for(var queryResult in super.getFromQueries(request)) {
if(request.requestingUser.teamIds.contains(queryResult.item.teamId)) {
yield queryResult;
}
}
}
@override
Stream<DbResponse<CalendarEventResponse>> getAll(DbRequest request) async* {
await for(var response in super.getAll(request)) {
if(request.requestingUser.teamIds.contains(response.item.teamId)) {
yield response;
}
}
}
@override
Future<DbResponse<CalendarEventResponse>> update(DbRequest<CalendarEventDbModel> request) async {
var eventId = request.item.id;
if (eventId == null) {
throw RequiredArgumentMissing(RequestResponseVariables.idFieldName);
}
var response = await get(DbRequest(item: eventId, requestingUser: request.requestingUser));
if (response.item.user.id != request.requestingUser.userId) {
throw UnauthorizedException();
}
return super.update(request);
}
@override
Future<DbResponse<CalendarEventResponse>> delete(DbRequest<String> request) async {
var response = await get(request);
if(response.item.user.id != request.requestingUser.userId) {
throw UnauthorizedException();
}
return super.delete(request);
}
}
import 'package:lib/lib.dart';
class CalendarEvent {
static const teamIdDbFieldName = "teamId";
static const titleDbFieldName = "title";
static const descriptionDbFieldName = "description";
static const startDbFieldName = "start";
static const endDbFieldName = "end";
static const userIdRequestResponseFieldName = "userId";
static const teamIdRequestResponseFieldName = "teamId";
static const titleRequestResponseFieldName = "title";
static const descriptionRequestResponseFieldName = "description";
static const startRequestResponseFieldName = "start";
static const endRequestResponseFieldName = "end";
final String? _id;
final String _teamId;
final String _title;
final String? _description;
final DateTime _start;
final DateTime _end;
String? get id => _id;
Permissions? get permissions => null;
String get teamId => _teamId;
String get title => _title;
String? get description => _description;
DateTime get start => _start;
DateTime get end => _end;
CalendarEvent({String? id, required String teamId, required String title, String? description, required DateTime start, required DateTime end}) :
_id = id,
_teamId = teamId,
_title = title,
_description = description,
_start = start,
_end = end;
}
import 'package:lib/lib.dart';
import 'package:point/calendar_event/models/calendar_event.dart';
class CalendarEventDbModel extends CalendarEvent implements DbModel {
static const userIdDbFieldName = "userId";
final String _userId;
String get userId => _userId;
CalendarEventDbModel({ required String userId, super.id, required super.teamId, required super.title, super.description, required super.start, required super.end}) :
_userId = userId;
@override
Map<String, dynamic> toDbData() {
return {
userIdDbFieldName: userId,
CalendarEvent.teamIdDbFieldName: teamId,
CalendarEvent.titleDbFieldName: title,
CalendarEvent.descriptionDbFieldName: description,
CalendarEvent.startDbFieldName: start.toIso8601String(),
CalendarEvent.endDbFieldName: end.toIso8601String(),
};
}
factory CalendarEventDbModel.fromRequest(Map<String, dynamic> map, String userId) {
return CalendarEventDbModel(
id: getOptionalMapItem(RequestResponseVariables.idFieldName, map),
userId: userId,
teamId: getRequiredMapItem(CalendarEvent.teamIdRequestResponseFieldName, map),
title: getRequiredMapItem(CalendarEvent.titleRequestResponseFieldName, map),
description: getOptionalMapItem(CalendarEvent.descriptionRequestResponseFieldName, map),
start: DateTime.parse(getRequiredMapItem(CalendarEvent.startRequestResponseFieldName, map)),
end: DateTime.parse(getRequiredMapItem(CalendarEvent.endRequestResponseFieldName, map)),
);
}
}
import 'package:lib/lib.dart';
import 'package:point/calendar_event/models/calendar_event.dart';
class CalendarEventResponse extends CalendarEvent implements ResponseModel {
static const String userRequestResponseFieldName = 'user';
final User _user;
User get user => _user;
CalendarEventResponse({required User user, super.id, required super.teamId, required super.title, super.description, required super.start, required super.end}) :
_user = user;
@override
Map<String, dynamic> toResponseData() {
return {
RequestResponseVariables.idFieldName: id,
userRequestResponseFieldName: user.toResponseData(),
CalendarEvent.teamIdRequestResponseFieldName: teamId,
CalendarEvent.titleRequestResponseFieldName: title,
CalendarEvent.descriptionRequestResponseFieldName: description,
CalendarEvent.startRequestResponseFieldName: start.toIso8601String(),
CalendarEvent.endRequestResponseFieldName: end.toIso8601String(),
};
}
factory CalendarEventResponse.fromDbData(Map<String, dynamic> map, User user) {
return CalendarEventResponse(
id: getOptionalMapItem(DatabaseVariables.idColumnName, map),
user: user,
teamId: getRequiredMapItem(CalendarEvent.teamIdDbFieldName, map),
title: getRequiredMapItem(CalendarEvent. titleDbFieldName, map),
description: getOptionalMapItem(CalendarEvent.descriptionDbFieldName, map),
start: DateTime.parse(getRequiredMapItem(CalendarEvent.startDbFieldName, map)),
end: DateTime.parse(getRequiredMapItem(CalendarEvent.endDbFieldName, map)),
);
}
}
import 'dart:async';
import 'dart:io';
import 'package:point/calendar_event/calendar_event_api_endpoint.dart';
import 'package:point/membership/membership_api_endpoint.dart';
import 'package:point/membership/membership_service.dart';
import 'package:point/point/point_api_endpoint.dart';
......@@ -35,6 +36,12 @@ Future<dynamic> main(final context) async {
var membershipService = getMembershipService(context, host, projectId, apiKey);
apiEndpoint = MembershipApiEndpoint(membershipService: membershipService);
case CalendarEventApiEndpoint.path:
var membershipService = getMembershipService(context, host, projectId, apiKey);
var requestingUser = await getRequestingUser(context, membershipService);
var userHelper = UserHelper(host: host, projectId: projectId, apiKey: apiKey);
apiEndpoint = CalendarEventApiEndpoint(requestingUser: requestingUser, host: host, projectId: projectId, apiKey: apiKey, getUser: userHelper.userFromId);
default:
throw HttpException("Path $requestPath not found", uri: Uri.parse(context.req.url));
}
......
import 'dart:convert';
import 'package:lib/lib.dart';
import 'package:point/membership/membership_service.dart';
import 'package:point/membership/team.dart';
class MembershipApiEndpoint extends ApiEndpoint {
class MembershipApiEndpoint extends ApiEndpoint<Team> {
static const String path = "/membership";
MembershipService _membershipService;
final MembershipService _membershipService;
MembershipApiEndpoint({required MembershipService membershipService}) :
_membershipService = membershipService;
......@@ -19,8 +18,8 @@ class MembershipApiEndpoint extends ApiEndpoint {
@override
Future<Map<String, dynamic>> handleGet(context) async {
var memberships = await _membershipService.getMemberships().toList();
var response = memberships.map((e) => e.toResponse()).toList();
return context.res.send(jsonEncode(response));
return listResponse(context, memberships);
}
@override
......
......@@ -3,7 +3,7 @@ import 'package:lib/lib.dart';
import 'package:point/membership/team.dart';
class MembershipService extends ClientFunction {
String _userId;
final String _userId;
MembershipService({required super.host, required super.projectId, required super.apiKey, required String userId}) :
_userId = userId;
......
class Team {
import 'package:lib/lib.dart';
class Team implements ResponseModel {
static const String teamIdResponseFieldName = "teamId";
static const String teamNameResponseFieldName = "teamName";
......@@ -11,8 +13,9 @@ class Team {
Team({required String teamId, required String teamName}) :
_teamId = teamId,
_teamName = teamName;
Map<String, dynamic> toResponse() {
@override
Map<String, dynamic> toResponseData() {
return {
teamIdResponseFieldName: teamId,
teamNameResponseFieldName: teamName,
......
......@@ -33,7 +33,7 @@ class RouteDatabase extends BaseDatabase<Route, Route> {
id: request.item.id,
points: points,
userId: request.item.userId,
teamId: request.item.userId
teamId: request.item.teamId,
),
requestingUser: request.requestingUser,
);
......
......@@ -21,3 +21,5 @@ export 'src/interface/api_endpoint.dart';
export 'src/db_api_endpoint.dart';
export 'src/exceptions/db_action_forbidden.dart';
export 'src/interface/response_model.dart';
export 'src/models/user.dart';
export 'src/utils/user_helper.dart';
......@@ -9,7 +9,7 @@ import 'package:lib/src/user_details.dart';
import 'package:lib/src/utils/map_helper.dart';
import 'package:lib/src/utils/variables.dart';
class DbApiEndpoint<T extends DbModel, T1 extends ResponseModel> extends ApiEndpoint {
class DbApiEndpoint<T extends DbModel, T1 extends ResponseModel> extends ApiEndpoint<T1> {
final BaseDatabase<T, T1> database;
final T Function(Map<String, dynamic>) itemGenerator;
final UserDetails requestingUser;
......@@ -25,9 +25,20 @@ class DbApiEndpoint<T extends DbModel, T1 extends ResponseModel> extends ApiEndp
@override
Future<Map<String, dynamic>> handleGet(context) async {
var id = _idRequestFromContext(context);
var response = await database.get(id);
return context.res.json(response.item.toResponseData());
if(_hasBodyKey(context, RequestResponseVariables.idFieldName)) {
var id = _idRequestFromContext(context);
var response = await database.get(id);
return context.res.json(response.item.toResponseData());
}
else if(_hasBodyKey(context, RequestResponseVariables.queriesFieldName)) {
var queryRequest = _queryRequestFromContext(context);
var response = await database.getFromQueries(queryRequest).toList();
return listResponse(context, response.map((e) => e.item).toList());
}
else {
var response = await database.getAll(DbRequest(item: null, requestingUser: requestingUser)).toList();
return listResponse(context, response.map((e) => e.item).toList());
}
}
@override
......@@ -53,4 +64,15 @@ class DbApiEndpoint<T extends DbModel, T1 extends ResponseModel> extends ApiEndp
var id = getRequiredMapItem<String>(RequestResponseVariables.idFieldName, map);
return DbRequest(item: id, requestingUser: requestingUser);
}
}
\ No newline at end of file
DbRequest<Iterable<String>> _queryRequestFromContext(final context) {
var map = jsonDecode(context.req.body);
var requestedQueries = getRequiredMapItem<Iterable<String>>(RequestResponseVariables.queriesFieldName, map);
return DbRequest(item: requestedQueries, requestingUser: requestingUser);
}
bool _hasBodyKey(final context, String key) {
var map = jsonDecode(context.req.body) as Map<String, dynamic>;
return map.containsKey(key);
}
}
abstract class ApiEndpoint {
import 'dart:convert';
import 'package:lib/src/interface/response_model.dart';
abstract class ApiEndpoint<T extends ResponseModel> {
Future<Map<String, dynamic>> handleGet(final context);
Future<Map<String, dynamic>> handlePost(final context);
Future<Map<String, dynamic>> handlePut(final context);
Future<Map<String, dynamic>> handleDelete(final context);
Map<String, dynamic> listResponse(final context, List<T> response) {
return context.res.send(
jsonEncode(response.map((e) => e.toResponseData()).toList())
);
}
}
import 'package:lib/src/utils/variables.dart';
class User {
static const String emailRequestResponseFieldName = "email";
static const String nameRequestResponseFieldName = "name";
final String _id;
final String _email;
final String _name;
String get id => _id;
String get email => _email;
String get name => _name;
User({required String id, required String email, required String name}) :
_id = id,
_email = email,
_name = name;
Map<String, dynamic> toResponseData() {
return {
RequestResponseVariables.idFieldName: id,
emailRequestResponseFieldName: email,
nameRequestResponseFieldName: name,
};
}
}
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:lib/src/interface/client_function.dart';
import 'package:lib/src/models/user.dart';
class UserHelper extends ClientFunction {
late final Users _users;
UserHelper({required super.host, required super.projectId, required super.apiKey}) {
_users = Users(client);
}
Future<User> userFromId(String id) async {
var user = await _users.get(userId: id);
return User(
id: user.$id,
email: user.email,
name: user.name,
);
}
}
......@@ -17,4 +17,5 @@ class DatabaseVariables {
class RequestResponseVariables {
static String get idFieldName => "id";
static String get queriesFieldName => "queries";
}