import 'dart:convert'; import 'package:scientry_api/commons/models/user.dart'; import 'package:scientry_api/service/email_manager.dart'; import 'package:scientry_api/service/gsheets_manager.dart'; import 'package:scientry_api/service/jwt_manager.dart'; import 'package:shelf/shelf.dart'; class EmailVerificationHandler { GsheetsManager gsheetsManager = GsheetsManager(); EmailManager emailManager = EmailManager(); Future verifyEmail(Request request) async { try { // Extract the token from the query parameters final token = request.url.queryParameters['token']; if (token == null || token.isEmpty) { return Response.badRequest( body: jsonEncode({ "errorCode": -1, "errorMessage": "Missing or invalid token.", }), headers: {'Content-Type': 'application/json'}, ); } String? isVerified = JWTManager.verifyEmailVerificationToken(token); if (isVerified == null) { return Response.forbidden( jsonEncode({ "errorCode": -1, "errorMessage": "Invalid or expired token.", }), headers: {'Content-Type': 'application/json'}, ); } else if (isVerified.contains("@")) { UserModel? user = await gsheetsManager.getUserByField( field: "email", value: isVerified, ); if (user == null) { return Response.notFound( jsonEncode({"errorCode": -1, "errorMessage": "User not found."}), headers: {'Content-Type': 'application/json'}, ); } else if (user.isEmailVerified == true) { // If the user is already verified return Response.ok( jsonEncode({ "errorCode": 0, "errorMessage": "Email is already verified.", }), headers: {'Content-Type': 'application/json'}, ); } else { // Update the user's verification status final updatedUser = user.copyWith( isEmailVerified: true, updatedAt: DateTime.now().millisecondsSinceEpoch, ); print("UserData: ${updatedUser.toJson()}"); bool status = await gsheetsManager.addUpdateUser(updatedUser); if (!status) { return Response.internalServerError( body: jsonEncode({ "errorCode": -1, "errorMessage": "Failed to update user.", }), headers: {'Content-Type': 'application/json'}, ); } else { // Successfully verified the email return Response.ok( jsonEncode({ "errorCode": 0, "errorMessage": "Email verified successfully.", }), headers: {'Content-Type': 'application/json'}, ); } } } else { return Response.forbidden( jsonEncode({ "errorCode": -1, "errorMessage": "Invalid token format.", }), headers: {'Content-Type': 'application/json'}, ); } } catch (e) { return Response.internalServerError( body: jsonEncode({ "errorCode": -1, "errorMessage": "An error occurred: ${e.toString()}", }), headers: {'Content-Type': 'application/json'}, ); } } Future requestEmailVerification(Request request) async { try { final body = await request.readAsString(); final data = jsonDecode(body); String? email = data['email']; if (email == null || email.isEmpty) { return Response.badRequest( body: jsonEncode({ "errorCode": -1, "errorMessage": "Email is required.", }), headers: {'Content-Type': 'application/json'}, ); } UserModel? user = await gsheetsManager.getUserByField( field: "email", value: email, ); if (user == null) { return Response.notFound( jsonEncode({"errorCode": -1, "errorMessage": "User not found."}), headers: {'Content-Type': 'application/json'}, ); } else if (user.isEmailVerified == true) { return Response.ok( jsonEncode({ "errorCode": 0, "errorMessage": "Email is already verified.", }), headers: {'Content-Type': 'application/json'}, ); } else if (user.isDeleted == true) { return Response.notFound( jsonEncode({"errorCode": -1, "errorMessage": "User not found."}), headers: {'Content-Type': 'application/json'}, ); } else { bool status = await emailManager.sendVerificationEmail( name: user.name!, email: user.email!, ); if (!status) { return Response.internalServerError( body: jsonEncode({ "errorCode": -1, "errorMessage": "Failed to send verification email.", }), headers: {'Content-Type': 'application/json'}, ); } else { return Response.ok( jsonEncode({ "errorCode": 0, "errorMessage": "Verification email sent successfully.", }), headers: {'Content-Type': 'application/json'}, ); } } } catch (e) { return Response.internalServerError( body: jsonEncode({ "errorCode": -1, "errorMessage": "An error occurred: ${e.toString()}", }), headers: {'Content-Type': 'application/json'}, ); } } }