# Yimaru Backend Yimaru Backend is the server-side application that powers the Yimaru online learning system. It manages courses, lessons, quizzes, student progress, instructor content, and administrative operations for institutions and users on the platform. ## Table of Contents - [Installation](#installation) - [Environment Configuration](#environment-configuration) - [Running the Application](#running-the-application) - [Database Management](#database-management) - [Testing and Code Quality](#testing-and-code-quality) - [API Documentation](#api-documentation) - [Project Structure](#project-structure) - [Core Services Overview](#core-services-overview) - [Roles and Access Control](#roles-and-access-control) - [Code Organization Guidelines](#code-organization-guidelines) - [Further Details](#further-details) --- ## Installation Before running the application, ensure you have the following installed: - [Go](https://golang.org/doc/install) (1.20+ recommended) - [Docker](https://www.docker.com/) - [Air](https://github.com/cosmtrek/air) — for live reloading during development - [SQLC](https://sqlc.dev) - [Migrate](https://github.com/golang-migrate/migrate) - [Swag](https://github.com/swaggo/swag) Clone the repository: ```bash git clone https://github.com/your-org/Yimaru-backend.git cd Yimaru-backend ├── cmd/ │ └── main.go # Application entry point ├── internal/ │ ├── config/ # Configuration and environment loading │ │ └── config.go │ ├── domain/ # Domain models, constants, and roles │ │ ├── course.go # Course and lesson structures │ │ └── roles.go # Role definitions (e.g., RoleAdmin, RoleInstructor) │ ├── repository/ # Database interaction layer │ │ ├── course.go # Course-related queries │ │ ├── lesson.go # Lesson-related database functions │ │ ├── user.go # User repository methods │ │ └── ... # Other repository files │ ├── services/ # Business logic and core services │ │ ├── course/ │ │ │ └── service.go # Course management logic │ │ └── quiz/ │ │ ├── service.go # Quiz management and evaluation logic │ │ └── eval.go # Evaluation logic for student progress │ └── web_server/ # HTTP handlers, routes, middleware, and cron jobs │ ├── cron.go # Scheduled background tasks │ └── handlers/ │ ├── course_handler.go # Course-related API endpoints │ ├── user_handler.go # User-related endpoints │ └── ... # Additional handlers ├── db/ │ └── migrations/ # SQL migration files ├── docs/ │ ├── swagger/ # Swagger/OpenAPI documentation files │ └── docs.go # Swaggo-generated docs ├── gen/ │ └── db/ # SQLC-generated Go code for database access ├── makefile # Development and operations commands ├── .env # Environment configuration file └── README.md # Project documentation 1. Course Category (Top-Level Classification) Table: course_categories Purpose: Logical grouping of courses (e.g., Learning English, Other Courses). Key Fields: id – Primary identifier name – Category name is_active – Soft enable/disable created_at – Audit timestamp Relationships: One Course Category → Many Courses Course Category └── Courses[] 2. Course Table: courses Purpose: Represents a full course offering under a category. Key Fields: category_id – FK → course_categories.id title, description is_active Relationships: Belongs to one Course Category Has many Sub-courses Course Category └── Course └── Sub-courses[] 3. Sub-course Table: sub_courses Purpose: A learning unit within a course representing different skill levels (e.g., Beginner, Intermediate, Advanced). Key Fields: course_id – FK → courses.id title, description thumbnail display_order level – BEGINNER | INTERMEDIATE | ADVANCED is_active Relationships: Belongs to one Course Has many Sub-course Videos Has many Practices Course └── Sub-course ├── Sub-course Videos[] └── Practices[] 4. Sub-course Video Table: sub_course_videos Purpose: Video learning content attached to a sub-course. Key Fields: sub_course_id – FK → sub_courses.id title, description video_url duration, resolution Publishing controls: is_published publish_date visibility instructor_id thumbnail display_order is_active Relationships: Belongs to one Sub-course Sub-course └── Sub-course Video 5. Practice Table: practices Purpose: Exercises or assessments that belong to a sub-course. Key Fields: sub_course_id – FK → sub_courses.id title, description banner_image persona is_active Relationships: Belongs to one Sub-course One Practice → Many Practice Questions Sub-course └── Practice └── Practice Questions[] 6. Practice Question Table: practice_questions Purpose: Individual questions within a practice session. Key Fields: practice_id – FK → practices.id question Voice support: question_voice_prompt sample_answer_voice_prompt sample_answer tips type – MCQ | TRUE_FALSE | SHORT Relationships: Belongs to one Practice Practice └── Practice Question Complete Hierarchical Flow (Compact View) Course Category └── Course └── Sub-course (with levels: BEGINNER, INTERMEDIATE, ADVANCED) ├── Sub-course Video └── Practice └── Practice Question Architectural Observations Simple three-level hierarchy: Category → Course → Sub-course Level is now a property of sub-course, not a separate entity Cascade deletes ensure referential integrity Schema is well-suited for: LMS platforms Progressive learning apps Video + assessment-based education systems