feat: init development branch with permanent access token and menu handlers

This commit is contained in:
RIT Services
2026-08-29 07:22:13 +00:00
parent 7d6d019b85
commit a0fbe836c4
11 changed files with 1014 additions and 36 deletions

View File

@@ -27,18 +27,21 @@ public class WebhookController {
private final GrievanceHandler grievanceHandler;
private final LoginHandler loginHandler;
private final ObjectMapper objectMapper;
private final com.rit.whatsapp.handler.FacultyMenuHandler facultyMenuHandler;
@Autowired
public WebhookController(WhatsAppMessageService messageService,
SessionService sessionService,
StudentMenuHandler studentMenuHandler,
GrievanceHandler grievanceHandler,
LoginHandler loginHandler) {
LoginHandler loginHandler,
com.rit.whatsapp.handler.FacultyMenuHandler facultyMenuHandler) {
this.messageService = messageService;
this.sessionService = sessionService;
this.studentMenuHandler = studentMenuHandler;
this.grievanceHandler = grievanceHandler;
this.loginHandler = loginHandler;
this.facultyMenuHandler = facultyMenuHandler;
this.objectMapper = new ObjectMapper();
}
@@ -88,13 +91,24 @@ public class WebhookController {
if ("text".equals(messageType) && messageNode.get("text").get("body").asText().trim().equalsIgnoreCase("reset")) {
sessionService.resetState(fromPhoneNumber);
if (isAuthenticated) {
studentMenuHandler.sendMainMenu(fromPhoneNumber);
if (sessionService.isFaculty(fromPhoneNumber)) {
facultyMenuHandler.sendMainMenu(fromPhoneNumber);
} else {
studentMenuHandler.sendMainMenu(fromPhoneNumber);
}
} else {
loginHandler.startLoginFlow(fromPhoneNumber);
}
return ResponseEntity.ok("EVENT_RECEIVED");
}
// Global erase command
if ("text".equals(messageType) && messageNode.get("text").get("body").asText().trim().equalsIgnoreCase("erase")) {
sessionService.deleteUser(fromPhoneNumber);
messageService.sendMessage(fromPhoneNumber, "Your IMS credentials have been deleted from our records. Type 'Hi' to start again.");
return ResponseEntity.ok("EVENT_RECEIVED");
}
// Route unauthenticated users strictly to Login Flow
if (!isAuthenticated) {
if ("text".equals(messageType)) {
@@ -117,7 +131,11 @@ public class WebhookController {
String mimeType = imageNode.has("mime_type") ? imageNode.get("mime_type").asText() : "image/jpeg";
grievanceHandler.handleImageInput(fromPhoneNumber, mediaId, mimeType);
} else {
studentMenuHandler.sendMainMenu(fromPhoneNumber);
if (sessionService.isFaculty(fromPhoneNumber)) {
facultyMenuHandler.sendMainMenu(fromPhoneNumber);
} else {
studentMenuHandler.sendMainMenu(fromPhoneNumber);
}
}
} else if ("interactive".equals(messageType)) {
JsonNode interactiveNode = messageNode.get("interactive");
@@ -170,9 +188,16 @@ public class WebhookController {
messageService.sendMessage(phoneNumber, "Please send a photo or type 'skip' / click 'Skip Image' button.");
}
break;
case AWAITING_ABSENTEES:
facultyMenuHandler.handleAbsenteesInput(phoneNumber, messageBody);
break;
case MAIN_MENU:
default:
studentMenuHandler.sendMainMenu(phoneNumber);
if (sessionService.isFaculty(phoneNumber)) {
facultyMenuHandler.sendMainMenu(phoneNumber);
} else {
studentMenuHandler.sendMainMenu(phoneNumber);
}
break;
}
}
@@ -188,16 +213,27 @@ public class WebhookController {
grievanceHandler.handleDeleteSelection(phoneNumber, selectedListId);
} else if (selectedListId.startsWith("student_")) {
studentMenuHandler.handleMenuSelection(phoneNumber, selectedListId);
} else if (selectedListId.startsWith("faculty_")) {
facultyMenuHandler.handleMenuSelection(phoneNumber, selectedListId);
} else if (selectedListId.startsWith("sem_")) {
studentMenuHandler.handleSemesterSelection(phoneNumber, selectedListId);
} else if (selectedListId.startsWith("receipt_") || selectedListId.startsWith("exam_") || selectedListId.startsWith("acad_") || selectedListId.startsWith("cons_")) {
studentMenuHandler.handleReceiptSelection(phoneNumber, selectedListId);
} else {
studentMenuHandler.sendMainMenu(phoneNumber);
if (sessionService.isFaculty(phoneNumber)) {
facultyMenuHandler.sendMainMenu(phoneNumber);
} else {
studentMenuHandler.sendMainMenu(phoneNumber);
}
}
}
private void handleInteractiveButtonSelection(String phoneNumber, String selectedButtonId, UserState currentState) {
if (selectedButtonId.startsWith("faculty_")) {
facultyMenuHandler.handleButtonSelection(phoneNumber, selectedButtonId);
return;
}
if ("student_logout".equals(selectedButtonId)) {
sessionService.logoutUser(phoneNumber);
messageService.sendMessage(phoneNumber, "You have been logged out successfully. Type 'Hi' to log in again.");
@@ -247,7 +283,11 @@ public class WebhookController {
if ("grv_skip_image".equals(selectedButtonId)) {
grievanceHandler.handleSkipImage(phoneNumber);
} else {
studentMenuHandler.sendMainMenu(phoneNumber);
if (sessionService.isFaculty(phoneNumber)) {
facultyMenuHandler.sendMainMenu(phoneNumber);
} else {
studentMenuHandler.sendMainMenu(phoneNumber);
}
}
}
}