Event-Manager is a robust service designed to streamline the management of university events and associated paperwork. Built with Spring Boot, Go, and Flutter, the application provides a comprehensive API for event creation, attendance tracking, and resource management. This project demonstrates my capabilities in both technical implementation and team leadership (led a team of 5 developers to accomplish this).
The following entity relationships were extracted from the class diagram:
Instead of typical role-based access, I implemented a more flexible system using staff members’ ClassCode as an authorization parameter. This allows for granular permission control based on department, year, and section hierarchies.
The ClassCodeService
implements comparison logic to determine if a user has access to specific resources:
@Service
@Slf4j
public class ClassCodeService {
private List<String> departments;
private List<String> years;
private List<String> sections;
public ClassCodeService(){
this.departments = new ArrayList<>(Arrays.asList("CSE", "ECE", "EEE", "AIDS"));
this.years = new ArrayList<>(Arrays.asList("I", "II", "III", "IV", "V"));
this.sections = new ArrayList<>(Arrays.asList("A", "B", "C"));
}
public boolean compareCodes(String target, String given){
if(target.length() < given.length())
return false;
if(given.charAt(0) == 'I' && target.charAt(0) == 'I'){
String[] targetArray = target.split(" ");
StringBuilder targetWithoutYear = new StringBuilder();
String[] givenArray = given.split(" ");
StringBuilder givenWithoutYear = new StringBuilder();
if(!targetArray[0].equals(givenArray[0]))
return false;
for(int i = 1; i < targetArray.length; i++)
targetWithoutYear.append(targetArray[i]);
for(int i = 1; i < givenArray.length; i++)
givenWithoutYear.append(givenArray[i]);
return targetWithoutYear.toString().contains(givenWithoutYear.toString());
}
return target.contains(given);
}
}
For attendance tracking across 7 periods per day, I implemented a bit manipulation approach instead of storing 7 separate boolean values. This significantly reduces storage requirements while maintaining all functionality.
@Getter
@Slf4j
public class PeriodSet {
private static final int BINARY_SIZE = 7; // 7 bits
private static final int SIZE = 127; // 7 bits
private int value;
// Implementation methods
// ...
}
Traditional approach: 8 bytes × 7 periods × 4,000 students × 250 days = 56,000,000 bytes (≈ 56 MB)
Optimized approach: 1 byte × 7 periods × 4,000 students × 250 days = 7,000,000 bytes (≈ 7 MB)
This optimization represents a 87.5% reduction in storage requirements for attendance data, while maintaining all functionality and offering better performance.
The codebase leverages modern Java features like Streams and Optional APIs for cleaner, more maintainable code:
public Set<Teacher> findByClassCode(String classCode){
List<Teacher> teacherSet = teacherRepository.findAll();
return teacherSet.stream()
.filter(teacher -> classCodeService.compareCodes(teacher.getClassCode(), classCode))
.collect(Collectors.toSet());
}
public List<Event> findEvents(String teacherId){
String teacherClassCode = teacherRepository.findById(teacherId)
.orElse(new Teacher())
.getClassCode();
return eventService.findAll().stream()
.filter(event ->
classCodeService.compareCodes(event.getClassCode(), teacherClassCode) &&
(event.getEndDate().compareTo(new Date()) >= 0)
)
.collect(Collectors.toList());
}
This application solved a real-world problem I faced during my university years. Many paper-based and redundant processes could be easily automated, so I took the initiative to create this solution. The application was in active use at the university for several months, significantly reducing administrative overhead and improving event organization efficiency. Eventually, the university transitioned to a third-party solution when the core development team (including myself) became unavailable for further maintenance and assistance.