Skip to content

Commit

Permalink
feat: chat message with image upload done
Browse files Browse the repository at this point in the history
  • Loading branch information
MikkyBoy357 committed Aug 2, 2024
1 parent e127a46 commit 4d2669d
Show file tree
Hide file tree
Showing 24 changed files with 112 additions and 54 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ build/
.dart_frog

# Test related files
coverage/
coverage/

# Firebase related files
firebase_options.json
8 changes: 0 additions & 8 deletions .idea/libraries/Dart_Packages.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/common/models/messaging/chat_message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ChatMessage {
id: json['_id'] as ObjectId,
chatId: json['chatId'] as ObjectId,
senderId: json['senderId'] as ObjectId,
msgTimestamp: json['msgTimestamp'] as DateTime,
msgTimestamp: DateTime.parse(json['msgTimestamp'].toString()),
message: json['message'] as String,
messageType: MessageType.values.firstWhere(
(e) => e.name == json['messageType'],
Expand Down
2 changes: 2 additions & 0 deletions lib/config/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ class Config {
static const String jwtSecret = 'HackThePlanet';
static const String mongoDBUrl =
'mongodb+srv://mikkyboy:mikkyboy@tutorial.sbvct.mongodb.net/cats?retryWrites=true&w=majority';

static const String firebaseOptionsDir = 'firebase_options.json';
}
12 changes: 7 additions & 5 deletions lib/data/repositories/file_upload/file_upload.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dart:typed_data';

import 'package:cats_backend/services/services.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:firebase_dart/firebase_dart.dart';

class FileUpload {
static Future<UploadedFile?> getFirstFileFromFormData(
Expand All @@ -22,7 +22,6 @@ class FileUpload {
required UploadedFile uploadedFile,
}) async {
// Upload file to cloud storage
final storage = FirebaseStorage.instance;

// Filename is the same as the original filename with
// a timestamp to avoid conflicts
Expand All @@ -41,9 +40,12 @@ class FileUpload {
print('====> Upload complete (${ref.fullPath})');
});

await snapshot.ref.getDownloadURL().then((value) {
print('====> Download URL: $value');
});
try {
final downloadUrl = await snapshot.ref.getDownloadURL();
return downloadUrl;
} catch (e) {
print('====> Error getting download URL: $e <====');
}

return null;
}
Expand Down
2 changes: 1 addition & 1 deletion lib/data/request_handlers/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class ChatRequestHandlerImpl implements ChatRequestHandler {
required ObjectId senderId,
required FormData? formData,
}) async {
late final String? downloadUrl;
String? downloadUrl;
print('===> POST <==> Chat:');

/// Validate form data
Expand Down
3 changes: 1 addition & 2 deletions lib/helpers/authentication_validation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ Middleware authenticationValidator({
),
authenticator: (context, token) async {
try {
final mongoService = await context.read<Future<MongoService>>();
final db = mongoService.database;
final db = mongoDbService.database;
final jwtClaim = verifyJwtHS256Signature(
token,
Config.jwtSecret,
Expand Down
2 changes: 0 additions & 2 deletions lib/helpers/mongoInitialization.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import 'package:cats_backend/services/services.dart';
import 'package:dart_frog/dart_frog.dart';

Middleware mongoinitialization() {
final mongoDbService = MongoService();

return provider<Future<MongoService>>(
(_) async {
if (!mongoDbService.isInitialized) {
Expand Down
40 changes: 40 additions & 0 deletions lib/services/firebase_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'dart:convert';
import 'dart:io';

import 'package:cats_backend/config/config.dart';
import 'package:firebase_dart/firebase_dart.dart';

late FirebaseApp app;
late FirebaseStorage storage;

late FirebaseOptions firebaseOptions;

class FirebaseService {
static Future<void> initializeFirebase() async {
try {
// read firebase_options file as Map
final file = File(Config.firebaseOptionsDir);
print('File Path: ${file.path}');
final content = file.readAsStringSync();
final data = jsonDecode(content) as Map<String, dynamic>;
firebaseOptions = FirebaseOptions.fromMap(data);
} catch (e) {
print('====> Error reading Firebase Options: $e <====');
}

print('====> Initializing Firebase... <====');
try {
FirebaseDart.setup();
app = await Firebase.initializeApp(
options: firebaseOptions,
);

print('====> Firebase App initialized Successfully <====');

storage = FirebaseStorage.instanceFor(app: app);
print('==================> Connected to Firebase ✅ <==================');
} catch (e) {
print('====> Error initializing Firebase: $e <====');
}
}
}
14 changes: 13 additions & 1 deletion lib/services/mongo_service.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:cats_backend/config/config.dart';
import 'package:mongo_dart/mongo_dart.dart';

final mongoDbService = MongoService();

class MongoService {
MongoService();

Expand All @@ -18,15 +20,25 @@ class MongoService {
if (!_initialized) {
_database = await Db.create(Config.mongoDBUrl);
_initialized = true;

await open();
}
print('==================> Connected to MongoDB <==================');
print('==================> Connected to MongoDB <==================');
}

Future<void> open() async {
if (_database!.state == State.open) {
print('========> ⚠️ MongoDB is already OPEN <========');
return;
}
await _database!.open();
}

Future<void> close() async {
if (_database!.state == State.closed) {
print('========> ⚠️ MongoDB is already CLOSED <========');
return;
}
await _database!.close();
print('******************> Closed MongodB Connection <******************');
}
Expand Down
1 change: 1 addition & 0 deletions lib/services/services.dart
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export 'firebase_service.dart';
export 'mongo_service.dart';
25 changes: 25 additions & 0 deletions main.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'dart:io';

import 'package:cats_backend/services/services.dart';
import 'package:dart_frog/dart_frog.dart';

Future<void> init(InternetAddress ip, int port) async {
// Any code initialized within this method will only run on server start,any
// hot reloads afterwards will not trigger this method until a hot restart.

print('Init -> IP: $ip, Port: $port');

// Initialize the MongoDB service
await mongoDbService.initializeMongo();

// Initialize the firebase
await FirebaseService.initializeFirebase();
}

Future<HttpServer> run(Handler handler, InternetAddress ip, int port) {
// 1. Execute any custom code prior to starting the server...

// 2. Use the provided `handler`, `ip`, and `port` to create a
// custom `HttpServer`. Or use the Dart Frog serve method to do that for you.
return serve(handler, ip, port);
}
1 change: 0 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ dependencies:
crypto: ^3.0.3
dart_frog: ^1.0.0
dart_frog_auth: ^1.1.0
dartz:
firebase_dart: ^1.1.4
jaguar_jwt: ^3.0.0
mongo_dart: ^0.10.3
Expand Down
4 changes: 1 addition & 3 deletions routes/api/auth/login/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ import 'package:cats_backend/util/issue_token.dart';
import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context) async {
final mongoService = await context.read<Future<MongoService>>();

final userRepository = UserRepository(
database: mongoService.database,
database: mongoDbService.database,
);

try {
Expand Down
12 changes: 5 additions & 7 deletions routes/api/auth/signup/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@ import 'package:dart_frog/dart_frog.dart';
Future<Response> onRequest(RequestContext context) async {
try {
final request = context.request;
final mongoService = await context.read<Future<MongoService>>();

if (request.method == HttpMethod.post) {
await mongoService.open();
await mongoDbService.open();

final requestBody = await request.body();
final requestData = jsonDecode(requestBody) as Map<String, dynamic>;
Expand All @@ -22,7 +21,7 @@ Future<Response> onRequest(RequestContext context) async {
requestData['password'] as String,
);

final userCollection = mongoService.database.collection('users');
final userCollection = mongoDbService.database.collection('users');
final foundUser = await userCollection.findOne({
'email': email,
});
Expand Down Expand Up @@ -71,16 +70,15 @@ Future<Response> onRequest(RequestContext context) async {
statusCode: 404,
body: {
'status': 404,
'message': 'Invalid request',
'message': 'Unsupported request method: ${request.method}',
},
);
}
} catch (e) {
return Response.json(
statusCode: 500,
statusCode: 400,
body: {
'status': 500,
'message': 'Server error. Something went wrong',
'message': 'Check the request body and try again',
'error': e.toString(),
},
);
Expand Down
5 changes: 2 additions & 3 deletions routes/api/buss/[username].dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context, String username) async {
print('======= username =======> $username');
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -17,7 +16,7 @@ Future<Response> onRequest(RequestContext context, String username) async {

final saint = authValidationResponse.user!;

final userRepository = UserRepository(database: mongoService.database);
final userRepository = UserRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;

Expand All @@ -33,7 +32,7 @@ Future<Response> onRequest(RequestContext context, String username) async {
);
}

final bussRepository = BussRepository(database: mongoService.database);
final bussRepository = BussRepository(database: mongoDbService.database);
final bussHandler = BussRequestHandlerImpl(bussRepository: bussRepository);

return switch (method) {
Expand Down
3 changes: 1 addition & 2 deletions routes/api/cats/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import 'package:cats_backend/services/mongo_service.dart';
import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context) async {
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -14,7 +13,7 @@ Future<Response> onRequest(RequestContext context) async {
);
}

final catRepository = CatRepository(database: mongoService.database);
final catRepository = CatRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;
final queryParams = request.uri.queryParameters;
Expand Down
3 changes: 1 addition & 2 deletions routes/api/chats/[chatId]/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import 'package:mongo_dart/mongo_dart.dart';

Future<Response> onRequest(RequestContext context, String id) async {
print('======= chatId =======> $id');
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -24,7 +23,7 @@ Future<Response> onRequest(RequestContext context, String id) async {
return Response.json(body: 'Error: Cannot Parse Invalid Chat ID.');
}

final chatRepository = ChatRepository(database: mongoService.database);
final chatRepository = ChatRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;
final queryParams = request.uri.queryParameters;
Expand Down
3 changes: 1 addition & 2 deletions routes/api/chats/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'package:cats_backend/services/mongo_service.dart';
import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context) async {
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -17,7 +16,7 @@ Future<Response> onRequest(RequestContext context) async {

final saint = authValidationResponse.user!;

final chatRepository = ChatRepository(database: mongoService.database);
final chatRepository = ChatRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;
final queryParams = request.uri.queryParameters;
Expand Down
5 changes: 2 additions & 3 deletions routes/api/users/[username]/chat/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context, String username) async {
print('======= username =======> $username');
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -19,7 +18,7 @@ Future<Response> onRequest(RequestContext context, String username) async {

final saint = authValidationResponse.user!;

final userRepository = UserRepository(database: mongoService.database);
final userRepository = UserRepository(database: mongoDbService.database);

final passedUser = await userRepository.getQuery(
UserQuery.username,
Expand All @@ -33,7 +32,7 @@ Future<Response> onRequest(RequestContext context, String username) async {
);
}

final chatRepository = ChatRepository(database: mongoService.database);
final chatRepository = ChatRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;
final queryParams = request.uri.queryParameters;
Expand Down
3 changes: 1 addition & 2 deletions routes/api/users/[username]/follow/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:dart_frog/dart_frog.dart';

Future<Response> onRequest(RequestContext context, String username) async {
print('======= username =======> $username');
final mongoService = await context.read<Future<MongoService>>();
final authValidationResponse = context.read<AuthValidationResponse>();

if (!authValidationResponse.isValid) {
Expand All @@ -18,7 +17,7 @@ Future<Response> onRequest(RequestContext context, String username) async {

final saint = authValidationResponse.user!;

final userRepository = UserRepository(database: mongoService.database);
final userRepository = UserRepository(database: mongoDbService.database);
final request = context.request;
final method = request.method;
final queryParams = request.uri.queryParameters;
Expand Down
Loading

0 comments on commit 4d2669d

Please sign in to comment.