Hi, I'm Abdulfetah Suudi

Software Engineer based in Ethiopia with 4 years of experience specializing in TypeScript, Next.js, React, TanStack, Node.js, PostgreSQL, and Golang. I build full-stack applications—from greenfield development and prototyping to debugging production issues, maintaining legacy codebases, and architecting systems.

Continuous Education Platform

Continuous Education Platform

Completed

ProblemThe Problem

The existing process for managing student registration, course communication, and instructor payments is manual and fragmented. Students must pay fees at a bank and then physically submit receipts and documents to the registrar’s office, causing administrative delays and errors. Course resources and announcements are scattered across unofficial channels like Telegram, leading to confusion. Instructors are paid manually at the end of each semester without a reliable way to track student payments, resulting in delayed and inaccurate salary processing. The platform solves these issues by providing an integrated online experience for registration, payment, centralized course communication, and automated salary administration.

Tech StackTech Stack

Next.jsTypeScriptPostgreSQLChapa PaymentImagekitResend

ArchitectureSystem Architecture

The system follows a modern web architecture with a Next.js application serving both frontend and backend (via server actions and API routes). External services handle file storage (Cloudinary) and payment processing. The database (PostgreSQL) stores all business data.

System Architecture - 1

Sequence DiagramSequence Diagram

See all →

The following diagrams illustrate the core user workflows across all roles in the system. Each diagram captures a specific interaction between actors and the system, showing the sequence of messages exchanged.

Sequence Diagram - 1

Complaint handling workflow: users (students/instructors) create complaints with a title and exchange messages with coordinators. Coordinators see all complaints ordered by creation, with solved ones at the bottom. Either party can mark a complaint as solved, updating its status.

DatabaseEntity Relationship Diagram

The database schema is centered around academic structure: colleges, departments, batches, students, instructors, courses, semesters, and the many relationships that enable enrollment, payments, assignments, exams, and communication.

Entity Relationship Diagram - 1

DeploymentDeployment Diagram

The system is deployed as a standard three‑tier web application, with the Next.js app serving both client and server logic, connected to a relational database and external cloud services.

Deployment Diagram - 1

ChallengesChallenges

Building the Continuous Education Platform came with significant technical challenges due to its complex academic hierarchy, multi-role access control, and integration with external services.

ProblemSolution
Manual registration requiring bank visits and paper receiptsIntegrated online payment gateway; students upload documents and pay via mobile
Fragmented communication via Telegram and student repsCentralized course panels with real‑time chat and resource sharing
Instructor salary delays due to untracked student paymentsAutomatic tracking of student payments; salary generation at semester end based on enrollment data
Deadline enforcement for assignmentsDual validation: client‑side disable and server‑side check on every submission
File uploads to multiple servicesSingle upload to Cloudinary via server actions; metadata stored in database
Coordinating complaints across multiple coordinatorsDedicated complaint panel with routing to appropriate coordinator
Managing different user roles (student, instructor, registrar, finance, coordinator, dean, head, admin)Role‑based access control implemented in NextAuth and middleware
Complex academic hierarchy (college, department, batch, semester, course)Prisma schema with proper relations and unique constraints
Preventing double‑assignment of heads/deansDatabase constraints and validation in server actions
Exam timing and auto‑gradingServer‑side time checks; automatic score calculation based on correct options
Bulk salary paymentsGrouping by instructor; integration with payment gateway; transaction logging

SecuritySecurity Considerations

Comprehensive security measures to protect user data, prevent attacks, and ensure secure transactions across all roles and operations.

AreaMeasure
AuthenticationNextAuth with multiple providers; secure session management
AuthorizationRole‑based access control (RBAC) on all API routes and server actions
HTTPSAll communication encrypted in transit
Input validationServer‑side validation for all user inputs; Prisma schema enforces data integrity
File upload securityFile type and size validation; Cloudinary virus scanning (optional)
Payment securityPayment Gateway handles sensitive data; no PCI scope on platform
Deadline checksBoth client and server validate submission deadlines and exam time windows
SQL injection preventionPrisma ORM with parameterized queries
Data encryptionPasswords hashed (via NextAuth); database encryption at rest (cloud provider)
Unique constraintsDatabase enforces unique emails, transaction IDs, course codes, etc.
Suspension mechanismUser accounts can be suspended; suspended users cannot perform actions
Audit loggingTimestamps on all major actions (createdAt, paidAt, submittedTime)

PerformancePerformance & Scalability

Strategies and implementations to ensure the platform handles load efficiently and scales with growing users.

AreaMeasure
Database indexingIndexes on frequently queried fields (e.g., email, transactionId, composite keys) as seen in Prisma models
File offloadingCloudinary handles file storage and optimization, reducing server load
Server‑side rendering (SSR)Next.js SSR for initial page loads, improving perceived performance
CachingIn‑memory caching for reference data (e.g., department list) with React Query or SWR
Asynchronous processingWebhooks for payment confirmations; background jobs for salary calculation
Horizontal scalingNext.js app stateless; can be scaled horizontally behind a load balancer
Database connection poolingManaged by Prisma and connection pooler (e.g., PgBouncer)
CDNCloudinary provides global CDN for file delivery
Optimized queriesSelective fetching of data; avoiding N+1 queries via Prisma include
PaginationFor large lists (e.g., students, complaints) to reduce payload size
Lazy loadingFrontend components load data only when needed (e.g., modal dialogs)

No sponsors yet. Be the first!

Become a Sponsor