Skip to content

Commit

Permalink
API connection, code refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
jumpiniasty committed Jul 4, 2023
1 parent 2ad005d commit 196d1b9
Show file tree
Hide file tree
Showing 28 changed files with 519 additions and 402 deletions.
34 changes: 25 additions & 9 deletions lib/controllers/auth_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';

import '../utils/ext.dart' show DateTimeConvert;

import '../utils/consts.dart';
Expand All @@ -25,7 +27,6 @@ class AuthController {
"password": passwordCtrl.text,
},
);

if (res.statusCode == 200) {
final loginArr = json.decode(res.body);
const storage = FlutterSecureStorage();
Expand All @@ -46,18 +47,33 @@ class AuthController {
static Future<bool> registerUser(CreateUser user) async {
final url = "$mainUrl/users/";

final res = await http.post(
final req = http.MultipartRequest(
"POST",
Uri.parse(url),
body: {
"username": user.username,
"email": user.email,
"first_name": user.firstName,
"last_name": user.lastName,
);
req.headers.addAll({"Content-Type": "multipart/form-data"});
req.fields.addAll(
{
"username": user.username!,
"email": user.email!,
"first_name": user.firstName!,
"last_name": user.lastName!,
"date_of_birth": user.dateOfBirth!.toYMD(),
"password": user.password,
"pfp": user.pfp!,
"password": user.password!,
},
);
if (user.pfp != null) {
req.files.add(
http.MultipartFile(
"pfp",
user.pfp!.readAsBytes().asStream(),
user.pfp!.lengthSync(),
filename: user.pfp!.path,
contentType: MediaType("image", "jpeg"),
),
);
}
final res = await req.send();
return res.statusCode == 201;
}
}
57 changes: 5 additions & 52 deletions lib/controllers/party_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import '../utils/consts.dart';
import '../models/party.dart';
import '../models/party_invitation.dart';
import '../models/friend.dart';
import '../utils/ext.dart' show StrConvert, LatLngConvert;
import '../utils/ext.dart' show LatLngConvert;

///Used by the regular user to join, leave, accept party requests and more
class PartyController {
Expand Down Expand Up @@ -57,56 +56,10 @@ class PartyController {
"Authorization": "Bearer $token",
},
);
final invitations = <PartyInvitation>[
for (final e in jsonDecode(res.body)["results"] as List)
PartyInvitation(
party: Party(
publicId: e["party"]["public_id"],
ownerPublicId: e["party"]["owner_public_id"],
owner: Friend(
publicId: e["party"]["owner"]["public_id"],
username: e["party"]["owner"]["username"],
firstName: e["party"]["owner"]["first_name"],
lastName: e["party"]["owner"]["last_name"],
dateOfBirth:
(e["party"]["owner"]["date_of_birth"] as String).toDateTime(),
pfp: e["party"]["owner"]["pfp"],
),
name: e["party"]["name"],
description: e["party"]["description"],
location: (e["party"]["location"] as String).toLatLng(),
distance: e["party"]["distance"],
image: e["party"]["image"],
privacyStatus: e["party"]["privacy_status"],
privacyStatusDisplay: e["party"]["privacy_status_display"],
startTime: DateTime.parse(e["party"]["start_time"]),
stopTime: DateTime.parse(e["party"]["stop_time"]),
participants: [
for (final p in e["party"]["participants"] as List)
Friend(
publicId: p["public_id"],
username: p["username"],
firstName: p["first_name"],
lastName: p["last_name"],
dateOfBirth: (p["date_of_birth"] as String).toDateTime(),
pfp: p["pfp"],
),
],
),
partyPublicId: e["party_public_id"],
receiverPublicId: e["receiver_public_id"],
createdAt: e["created_at"],
receiver: Friend(
publicId: e["receiver"]["public_id"],
username: e["receiver"]["username"],
firstName: e["receiver"]["first_name"],
lastName: e["receiver"]["last_name"],
dateOfBirth:
(e["receiver"]["date_of_birth"] as String).toDateTime(),
pfp: e["receiver"]["pfp"],
),
),
];
final invitations = <PartyInvitation>[];
for (final pi in jsonDecode(res.body)["results"]) {
invitations.add(PartyInvitation.fromMap(pi));
}
return invitations;
}

Expand Down
40 changes: 36 additions & 4 deletions lib/controllers/party_creator_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:http/http.dart' as http;
import '../utils/consts.dart' show mainUrl;
import '../models/party.dart';
import '../models/party_request.dart';
import '../utils/ext.dart' show LatLngConvert;

///Used by the party creator to control owned parties
class PartyCreatorController {
Expand All @@ -21,18 +22,49 @@ class PartyCreatorController {
},
);

final parties = <Party>[
for (final e in jsonDecode(res.body)["results"]) Party.fromMap(e),
];
final parties = <Party>[];
for (final e in jsonDecode(res.body)["results"]) {
parties.add(Party.fromMap(e));
}
return parties;
}

///Creates a party
static Future<void> createParty(Party party) async {}
static Future<bool> createParty(Party p) async {
final url = "$mainUrl/parties/";
final res = await http.post(
Uri.parse(url),
body: {
"owner": {},
"owner_public_id": p.ownerPublicId,
"name": p.name,
"privacy_status": p.privacyStatus,
"description": p.description,
"location": p.location!.toPOINT(),
"start_time": p.startTime.toIso8601String(),
"stop_time": p.stopTime.toIso8601String(),
},
);

return res.statusCode == 201;
}

///Retrieves a list of join requests to user's owned parties
static Future<List<PartyRequest>> joinRequests() async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: "access");
final url = "$mainUrl/parties/requests/";
final res = await http.get(
Uri.parse(url),
headers: {
"Authorization": "Bearer $token",
},
);

final requests = <PartyRequest>[];
for (final pr in jsonDecode(res.body)["results"]) {
requests.add(PartyRequest.fromMap(pr));
}
return requests;
}
}
20 changes: 12 additions & 8 deletions lib/controllers/search_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@ import '../models/party.dart';

///Used for searching parties and users
class SearchController {
///Retrieves user's data based on provided [publicId]
static Future<Friend> searchUser(String publicId) async {
///Retrieves user's data based on provided [username]
static Future<List<Friend>> searchUser(String username) async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: "access");

final url = "$mainUrl/users/$publicId";
final url = "$mainUrl/users/search?q=$username";
final res = await http.get(
Uri.parse(url),
headers: {
"Authorization": "Bearer $token",
},
);

return Friend.fromMap(jsonDecode(res.body));
final users = <Friend>[];
for (final u in jsonDecode(res.body)["results"]) {
users.add(Friend.fromMap(u));
}
return users;
}

static Future<List<Party>> seachPartiesByDistance(double meters) async {
Expand All @@ -35,9 +38,10 @@ class SearchController {
"Authorization": "Bearer $token",
},
);
final parties = <Party>[
for (final p in jsonDecode(res.body)) Party.fromMap(p),
];
final parties = <Party>[];
for (final p in jsonDecode(res.body)) {
parties.add(Party.fromMap(p));
}
return parties;
}
}
80 changes: 69 additions & 11 deletions lib/controllers/user_controller.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import 'dart:convert';
import 'package:drinkify/models/party_invitation.dart';
import 'dart:io';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';

import '../utils/consts.dart';
import '../utils/ext.dart' show DateTimeConvert;
import '../models/user.dart';
import '../models/friend_invitiation.dart';
import '../models/party_invitation.dart';

///Used for getting information about the user, updating, deleting and searching
class UserController {
Expand Down Expand Up @@ -53,36 +55,92 @@ class UserController {
final token = await storage.read(key: "access");
final url = "$mainUrl/users/";

final Map<String, dynamic> json = {
"first_name": user.firstName,
"last_name": user.lastName,
final Map<String, String> json = {
"first_name": user.firstName ?? "",
"last_name": user.lastName ?? "",
"date_of_birth": user.dateOfBirth!.toYMD(),
"password": user.password,
"password": user.password!,
};
json.removeWhere((k, v) {
return v == null && k != "password" && k != "date_of_birth";
return v.isEmpty && k != "password" && k != "date_of_birth";
});

final res = await http.patch(
final req = http.MultipartRequest(
"PATCH",
Uri.parse(url),
body: json,
headers: {
"Authorization": "Bearer $token",
},
);
req.fields.addAll(json);
req.headers.addAll({
"Content-Type": "multipart/form-data",
"Authorization": "Bearer $token",
});
if (user.pfp != null) {
req.files.add(
http.MultipartFile(
"pfp",
File(user.pfp!).readAsBytes().asStream(),
File(user.pfp!).lengthSync(),
filename: user.pfp!,
contentType: MediaType("image", "jpeg"),
),
);
}

final res = await req.send();
return res.statusCode == 200;
}

static Future<bool> sendFriendInvitation(FriendInvitation inv) async {
final url = "$mainUrl/friends/invitations/";
final res = await http.post(
Uri.parse(url),
body: {
"sender": {},
"receiver": {},
"receiver_public_id": inv.receiverPublicId,
"sender_public_id": inv.senderPublicId,
},
);

return res.statusCode == 201;
}

///Retrieves a list of friend invitaions
static Future<List<FriendInvitation>> friendInvitations() async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: "access");
final url = "$mainUrl/friends/invitations/";
final res = await http.get(
Uri.parse(url),
headers: {
"Authorization": "Bearer $token",
},
);

final invitations = <FriendInvitation>[];
for (final fi in jsonDecode(res.body)["results"]) {
invitations.add(FriendInvitation.fromMap(fi));
}

return invitations;
}

///Retrieves a list of party invitations
static Future<List<PartyInvitation>> partyInvitations() async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: "access");
final url = "$mainUrl/parties/invitations/";
final res = await http.get(
Uri.parse(url),
headers: {
"Authorization": "Bearer $token",
},
);
final invitations = <PartyInvitation>[];
for (final pi in jsonDecode(res.body)["results"]) {
invitations.add(PartyInvitation.fromMap(pi));
}

return invitations;
}
}
4 changes: 4 additions & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"friends": "Friends",
"inYourArea": "In your area",
"lookingForAParty": "Where partying tonight?",
"successFriendInvite": "Friend request sent",
"failureFriendInvite": "Could not send friend request",

"partiesProfile1": "Parties",
"friendsProfile": "Friends",
Expand Down Expand Up @@ -115,6 +117,8 @@
"partyDate": "Date",
"partyTime": "Time",
"noFriendsInvited": "No friends invited yet",
"createdSuccessfuly": "Party created successfuly",
"creationFailed": "Party creation failed",

"requiredField": "Field required",
"wrongDate": "Start date can't be set after end date"
Expand Down
4 changes: 4 additions & 0 deletions lib/l10n/app_pl.arb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"friends": "Znajomi",
"inYourArea": "W okolicy",
"lookingForAParty": "Gdzie szukasz imprezy?",
"successFriendInvite": "Wysłano zaproszenie",
"failureFriendInvite": "Nie udało się wysłać zaproszenia",

"partiesProfile1": "Imprez",
"friendsProfile": "Znajomych",
Expand Down Expand Up @@ -115,6 +117,8 @@
"partyDate": "Data",
"partyTime": "Godzina",
"noFriendsInvited": "Nikogo nie zaproszono",
"createdSuccessfuly": "Utworzono imprezę",
"creationFailed": "Nie utworzono imprezy",

"requiredField": "Pole wymagane",
"wrongDate": "Data rozpoczęcia ustawiona po końcu imprezy"
Expand Down
Loading

0 comments on commit 196d1b9

Please sign in to comment.