diff --git a/backend/pom.xml b/backend/pom.xml
new file mode 100644
index 0000000..8c62560
--- /dev/null
+++ b/backend/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.3.0
+
+
+ com.rit
+ ems
+ 0.0.1-SNAPSHOT
+ ems
+ Event Management System Backend
+
+ 17
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
diff --git a/backend/src/main/java/com/rit/ems/EmsApplication.java b/backend/src/main/java/com/rit/ems/EmsApplication.java
new file mode 100644
index 0000000..65dac05
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/EmsApplication.java
@@ -0,0 +1,11 @@
+package com.rit.ems;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class EmsApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(EmsApplication.class, args);
+ }
+}
diff --git a/backend/src/main/java/com/rit/ems/config/CorsConfig.java b/backend/src/main/java/com/rit/ems/config/CorsConfig.java
new file mode 100644
index 0000000..0c4527d
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/config/CorsConfig.java
@@ -0,0 +1,23 @@
+package com.rit.ems.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CorsConfig {
+ @Bean
+ public WebMvcConfigurer corsConfigurer() {
+ return new WebMvcConfigurer() {
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOriginPatterns("*")
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
+ .allowedHeaders("*")
+ .allowCredentials(true);
+ }
+ };
+ }
+}
diff --git a/backend/src/main/java/com/rit/ems/config/DataSeeder.java b/backend/src/main/java/com/rit/ems/config/DataSeeder.java
new file mode 100644
index 0000000..ce275bc
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/config/DataSeeder.java
@@ -0,0 +1,110 @@
+package com.rit.ems.config;
+
+import com.rit.ems.model.*;
+import com.rit.ems.repository.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+@Component
+public class DataSeeder implements CommandLineRunner {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Autowired
+ private ClassMappingRepository classMappingRepository;
+
+ @Autowired
+ private VenueRepository venueRepository;
+
+ @Autowired
+ private InstitutionalEventRepository institutionalEventRepository;
+
+ @Override
+ public void run(String... args) throws Exception {
+ seedUsers();
+ seedClasses();
+ seedVenues();
+ seedInstitutionalEvents();
+ }
+
+ private void seedUsers() {
+ if (userRepository.count() == 0) {
+ System.out.println("[DataSeeder] Seeding default users...");
+ List defaultUsers = Arrays.asList(
+ new User(1L, "admin@rit.edu", "admin123", "System Administrator", "ADMIN", "ADMIN", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(2L, "faculty@rit.edu", "faculty123", "Dr. Faculty Member", "FACULTY", "CSE", false, false, true, 0, "CSE", "3rd Year", "A", "3rd Year", "A", null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(3L, "hod@rit.edu", "hod123", "Prof. Head of Dept", "HOD", "AI&ML", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(4L, "principal@rit.edu", "principal123", "Dr. College Principal", "PRINCIPAL", "ADMIN", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(5L, "placement@rit.edu", "placement123", "Placement Coordinator", "PLACEMENT", "Placement Department", false, true, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(6L, "admin2@rit.edu", "admin123", "Secondary Admin", "ADMIN", "ADMIN", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(7L, "principal2@rit.edu", "principal123", "Vice Principal", "PRINCIPAL", "ADMIN", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(8L, "hod_cse@rit.edu", "hod123", "CSE HOD", "HOD", "CSE", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>()),
+ new User(9L, "faculty2@rit.edu", "faculty123", "Assistant Professor CSE", "FACULTY", "CSE", false, false, false, 0, null, null, null, null, null, null, "", "Male", "Rajalakshmi Institute of Technology", new ArrayList<>())
+ );
+ userRepository.saveAll(defaultUsers);
+ }
+ }
+
+ private void seedClasses() {
+ if (classMappingRepository.count() == 0) {
+ System.out.println("[DataSeeder] Seeding default classes...");
+ List defaultClasses = Arrays.asList(
+ new ClassMapping(1L, "RIT", "CSE", "3rd Year", Arrays.asList("A", "B"), "Ready"),
+ new ClassMapping(2L, "RIT", "AI&ML", "3rd Year", Collections.singletonList("A"), "Ready"),
+ new ClassMapping(3L, "RIT", "ECE", "2nd Year", Arrays.asList("A", "B", "C"), "Ready")
+ );
+ classMappingRepository.saveAll(defaultClasses);
+ }
+ }
+
+ private void seedVenues() {
+ if (venueRepository.count() == 0) {
+ System.out.println("[DataSeeder] Seeding default venues...");
+ List defaultVenues = Arrays.asList(
+ new Venue("v-1", "GB 4th floor auditorium", 500),
+ new Venue("v-2", "Wozniak Auditorium", 180),
+ new Venue("v-3", "C6-02 Indoor Theatre", 180),
+ new Venue("v-4", "H Block Guest Lecture Theatre", 60),
+ new Venue("v-5", "Steve Jobs Computer Centre 1", 120),
+ new Venue("v-6", "Steve Jobs Computer Centre 2", 120)
+ );
+ venueRepository.saveAll(defaultVenues);
+ }
+ }
+
+ private void seedInstitutionalEvents() {
+ if (institutionalEventRepository.count() == 0) {
+ System.out.println("[DataSeeder] Seeding institutional events...");
+ List defaultEvents = Arrays.asList(
+ new InstitutionalEvent("ie-1", "New Year & Christmas Celebration", "January", "EVEN"),
+ new InstitutionalEvent("ie-2", "Republic Day Celebration", "January", "EVEN"),
+ new InstitutionalEvent("ie-3", "Pongal Celebration", "January", "EVEN"),
+ new InstitutionalEvent("ie-4", "Yatra Banner Release", "January", "EVEN"),
+ new InstitutionalEvent("ie-5", "Yatra Ethnic Day", "February", "EVEN"),
+ new InstitutionalEvent("ie-6", "Yatra", "February", "EVEN"),
+ new InstitutionalEvent("ie-7", "International Womens Day", "March", "EVEN"),
+ new InstitutionalEvent("ie-8", "Ugathi", "March", "EVEN"),
+ new InstitutionalEvent("ie-9", "Tamil New Year", "April", "EVEN"),
+ new InstitutionalEvent("ie-10", "Techritz", "July", "ODD"),
+ new InstitutionalEvent("ie-11", "Independence Day", "August", "ODD"),
+ new InstitutionalEvent("ie-12", "AI Horizon Week", "August", "ODD"),
+ new InstitutionalEvent("ie-13", "Initiation Day", "September", "ODD"),
+ new InstitutionalEvent("ie-14", "Onam Celebration", "September", "ODD"),
+ new InstitutionalEvent("ie-15", "Teachers Day", "September", "ODD"),
+ new InstitutionalEvent("ie-16", "Engineers Day", "September", "ODD"),
+ new InstitutionalEvent("ie-17", "SDG Golu", "September", "ODD"),
+ new InstitutionalEvent("ie-18", "Ayutha Puja", "October", "ODD"),
+ new InstitutionalEvent("ie-19", "Tech Fest IIT Bombay", "October", "ODD"),
+ new InstitutionalEvent("ie-20", "EDI Conclave - FICCI Flow", "November", "ODD")
+ );
+ institutionalEventRepository.saveAll(defaultEvents);
+ }
+ }
+}
diff --git a/backend/src/main/java/com/rit/ems/controller/AdminController.java b/backend/src/main/java/com/rit/ems/controller/AdminController.java
new file mode 100644
index 0000000..df130f3
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/controller/AdminController.java
@@ -0,0 +1,102 @@
+package com.rit.ems.controller;
+
+import com.rit.ems.model.User;
+import com.rit.ems.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Random;
+
+@RestController
+@RequestMapping("/api/admin/users")
+public class AdminController {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @GetMapping
+ public List getAllUsers() {
+ return userRepository.findAll();
+ }
+
+ @PostMapping
+ public ResponseEntity> createUser(@RequestBody User userPayload) {
+ Optional existing = userRepository.findByEmailIgnoreCase(userPayload.getEmail());
+ String role = userPayload.getRole() != null ? userPayload.getRole() : "FACULTY";
+ String department = userPayload.getDepartment() != null ? userPayload.getDepartment() :
+ ((role.equals("HOD") || role.equals("FACULTY")) ? "H&S Dept" : "");
+
+ if (existing.isPresent()) {
+ User existingUser = existing.get();
+ if ("STUDENT".equals(existingUser.getRole())) {
+ // Promote existing student to faculty/staff
+ existingUser.setRole(role);
+ existingUser.setDepartment(department);
+ existingUser.setFullName(userPayload.getFullName());
+ if (userPayload.getAssignedClubs() != null) {
+ existingUser.setAssignedClubs(userPayload.getAssignedClubs());
+ }
+ userRepository.save(existingUser);
+ return ResponseEntity.ok(existingUser);
+ } else {
+ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("message", "User with this email already exists"));
+ }
+ }
+
+ userPayload.setId(System.currentTimeMillis() + new Random().nextInt(1000));
+ userPayload.setEmail(userPayload.getEmail().trim().toLowerCase());
+ userPayload.setFullName(userPayload.getFullName().trim());
+ userPayload.setRole(role);
+ userPayload.setDepartment(department);
+ if (userPayload.getAssignedClubs() == null) {
+ userPayload.setAssignedClubs(new java.util.ArrayList<>());
+ }
+
+ userRepository.save(userPayload);
+ return ResponseEntity.ok(userPayload);
+ }
+
+ @PutMapping("/{id}")
+ public ResponseEntity> updateUser(@PathVariable Long id, @RequestBody Map payload) {
+ Optional userOpt = userRepository.findById(id);
+ if (userOpt.isEmpty()) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("message", "User not found"));
+ }
+
+ User user = userOpt.get();
+ if (payload.containsKey("fullName")) user.setFullName((String) payload.get("fullName"));
+ if (payload.containsKey("email")) user.setEmail(((String) payload.get("email")).trim().toLowerCase());
+ if (payload.containsKey("role")) user.setRole((String) payload.get("role"));
+ if (payload.containsKey("department")) user.setDepartment((String) payload.get("department"));
+ if (payload.containsKey("isClubCoordinator")) user.setIsClubCoordinator((Boolean) payload.get("isClubCoordinator"));
+ if (payload.containsKey("isPlacementStaff")) user.setIsPlacementStaff((Boolean) payload.get("isPlacementStaff"));
+ if (payload.containsKey("isClassIncharge")) user.setIsClassIncharge((Boolean) payload.get("isClassIncharge"));
+ if (payload.containsKey("classStrength")) user.setClassStrength(Integer.parseInt(payload.get("classStrength").toString()));
+ if (payload.containsKey("inchargeClass")) user.setInchargeClass((String) payload.get("inchargeClass"));
+ if (payload.containsKey("inchargeBatch")) user.setInchargeBatch((String) payload.get("inchargeBatch"));
+ if (payload.containsKey("inchargeSection")) user.setInchargeSection((String) payload.get("inchargeSection"));
+ if (payload.containsKey("year")) user.setYear((String) payload.get("year"));
+ if (payload.containsKey("section")) user.setSection((String) payload.get("section"));
+ if (payload.containsKey("regNo")) user.setRegNo((String) payload.get("regNo"));
+ if (payload.containsKey("phone")) user.setPhone((String) payload.get("phone"));
+ if (payload.containsKey("gender")) user.setGender((String) payload.get("gender"));
+ if (payload.containsKey("collegeName")) user.setCollegeName((String) payload.get("collegeName"));
+ if (payload.containsKey("assignedClubs")) {
+ user.setAssignedClubs((List) payload.get("assignedClubs"));
+ }
+
+ userRepository.save(user);
+ return ResponseEntity.ok(user);
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity> deleteUser(@PathVariable Long id) {
+ userRepository.deleteById(id);
+ return ResponseEntity.ok(Map.of("message", "User deleted successfully"));
+ }
+}
diff --git a/backend/src/main/java/com/rit/ems/controller/AnnouncementController.java b/backend/src/main/java/com/rit/ems/controller/AnnouncementController.java
new file mode 100644
index 0000000..1c37ae7
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/controller/AnnouncementController.java
@@ -0,0 +1,47 @@
+package com.rit.ems.controller;
+
+import com.rit.ems.model.Announcement;
+import com.rit.ems.repository.AnnouncementRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+@RestController
+@RequestMapping("/api/announcements")
+public class AnnouncementController {
+
+ @Autowired
+ private AnnouncementRepository announcementRepository;
+
+ @GetMapping
+ public List getAllAnnouncements() {
+ List list = announcementRepository.findAll();
+ list.sort((a, b) -> {
+ String ta = a.getTimestamp() != null ? a.getTimestamp() : "";
+ String tb = b.getTimestamp() != null ? b.getTimestamp() : "";
+ return tb.compareTo(ta); // Descending order
+ });
+ return list;
+ }
+
+ @PostMapping
+ public ResponseEntity> createAnnouncement(@RequestBody Announcement ann) {
+ if (ann.getId() == null) {
+ ann.setId(String.valueOf(System.currentTimeMillis() + new Random().nextInt(1000)));
+ }
+ ann.setTimestamp(Instant.now().toString());
+ announcementRepository.save(ann);
+ return ResponseEntity.ok(ann);
+ }
+
+ @DeleteMapping("/{id}")
+ public ResponseEntity> deleteAnnouncement(@PathVariable String id) {
+ announcementRepository.deleteById(id);
+ return ResponseEntity.ok(Map.of("message", "Announcement deleted successfully"));
+ }
+}
diff --git a/backend/src/main/java/com/rit/ems/controller/AttendanceController.java b/backend/src/main/java/com/rit/ems/controller/AttendanceController.java
new file mode 100644
index 0000000..cad2233
--- /dev/null
+++ b/backend/src/main/java/com/rit/ems/controller/AttendanceController.java
@@ -0,0 +1,72 @@
+package com.rit.ems.controller;
+
+import com.rit.ems.model.Attendance;
+import com.rit.ems.repository.AttendanceRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/attendance")
+public class AttendanceController {
+
+ @Autowired
+ private AttendanceRepository attendanceRepository;
+
+ @GetMapping
+ public List getAttendance(@RequestParam(required = false) String registrationId,
+ @RequestParam(required = false) Long eventId) {
+ if (registrationId != null) {
+ return attendanceRepository.findByRegistrationId(registrationId);
+ }
+ if (eventId != null) {
+ return attendanceRepository.findByEventId(eventId);
+ }
+ return attendanceRepository.findAll();
+ }
+
+ @PostMapping
+ public ResponseEntity> saveAttendance(@RequestBody Object payload) {
+ List