Pair Programming: ระบบบริหารจัดการ Course เรียน Online

ความเป็นมา

นักศึกษาได้รับมอบหมายให้พัฒนาระบบบริหารจัดการ Course เรียน Online โดยต้องเชื่อมต่อกับฐานข้อมูล PostgreSQL ระบบนี้จะช่วยให้ผู้ใช้สามารถสร้าง ค้นหา อัพเดต และลบ Course เรียนได้

ข้อกำหนด

  1. เขียนโค้ดในภาษา Go เชื่อมต่อกับ PostgreSQL
  2. ใช้ Prepared Statements หรือ Parameterized Queries เพื่อป้องกัน SQL Injection
  3. กำหนดการตั้งค่า Connection Pooling อย่างเหมาะสม
  4. ใช้ Context with Timeout สำหรับการเรียกใช้งาน Database
  5. ออกแบบโครงสร้างโค้ดโดยใช้หลักการ Interface

ส่วนที่ต้องพัฒนา

  • สร้าง Interface CourseDatabase
type CourseDatabase interface {
    GetCourse(ctx context.Context, id int) (*Course, error)
    GetAllCourses(ctx context.Context) ([]*Course, error)
    CreateCourse(ctx context.Context, course *Course) (int, error)
    UpdateCourse(ctx context.Context, id int, course *Course) error
    DeleteCourse(ctx context.Context, id int) error
    Close() error
}
  • สร้าง Struct Course
type Course struct {
    ID          int
    Title       string
    Description string
    Price       float64
    Instructor  string
    CreatedAt   time.Time
    UpdatedAt   time.Time
}
  • สร้าง Struct PostgresCourseDatabase ที่ implement CourseDatabase interface
  • สร้าง Function NewPostgresCourseDatabase

Function นี้จะรับ Connection String และสร้าง PostgresCourseDatabase ที่มีการตั้งค่า Connection Pooling

  • พัฒนาการทำงานของฟังก์ชัน CRUD ทั้งหมด
- GetCourse สำหรับค้นหา Course ตาม ID
- GetAllCourses สำหรับดึงข้อมูล Course ทั้งหมด
- CreateCourse สำหรับสร้าง Course ใหม่และคืนค่า ID
- UpdateCourse สำหรับอัพเดตข้อมูล Course
- DeleteCourse สำหรับลบ Course
  • เขียน Main Function เพื่อทดสอบการทำงาน

โครงสร้างฐานข้อมูล

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    instructor VARCHAR(255) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- สร้าง function สำหรับอัพเดท updated_at โดยอัตโนมัติ
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$ language 'plpgsql';

-- สร้าง trigger เพื่อเรียกใช้ function update_modified_column
CREATE TRIGGER update_courses_modtime
BEFORE UPDATE ON courses
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();

ตัวอย่างโค้ดเริ่มต้น

package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"
    "time"
    
    _ "github.com/lib/pq"
)

// Course โครงสร้างข้อมูลของคอร์สเรียน
type Course struct {
    ID          int
    Title       string
    Description string
    Price       float64
    Instructor  string
    CreatedAt   time.Time
    UpdatedAt   time.Time
}

// CourseDatabase interface สำหรับการทำงานกับฐานข้อมูลคอร์สเรียน
type CourseDatabase interface {
    GetCourse(ctx context.Context, id int) (*Course, error)
    GetAllCourses(ctx context.Context) ([]*Course, error)
    CreateCourse(ctx context.Context, course *Course) (int, error)
    UpdateCourse(ctx context.Context, id int, course *Course) error
    DeleteCourse(ctx context.Context, id int) error
    Close() error
}

// PostgresCourseDatabase implements CourseDatabase interface โดยใช้ PostgreSQL
type PostgresCourseDatabase struct {
    db *sql.DB
}

// NewPostgresCourseDatabase สร้าง PostgresCourseDatabase instance ใหม่
func NewPostgresCourseDatabase(connStr string) (*PostgresCourseDatabase, error) {
    // TODO เขียนโค้ดเชื่อมต่อกับฐานข้อมูลและตั้งค่า connection pooling
    return nil, nil
}

// GetCourse ดึงข้อมูลคอร์สตาม ID
func (pdb *PostgresCourseDatabase) GetCourse(ctx context.Context, id int) (*Course, error) {
    // TODO เขียนโค้ดดึงข้อมูลคอร์สจากฐานข้อมูล
    return nil, nil
}

// GetAllCourses ดึงข้อมูลคอร์สทั้งหมด
func (pdb *PostgresCourseDatabase) GetAllCourses(ctx context.Context) ([]*Course, error) {
    // TODO เขียนโค้ดดึงข้อมูลคอร์สทั้งหมดจากฐานข้อมูล
    return nil, nil
}

// CreateCourse สร้างคอร์สใหม่
func (pdb *PostgresCourseDatabase) CreateCourse(ctx context.Context, course *Course) (int, error) {
    // TODO เขียนโค้ดเพิ่มคอร์สใหม่ลงฐานข้อมูล และคืนค่า ID ที่สร้างขึ้น
    return 0, nil
}

// UpdateCourse อัพเดตข้อมูลคอร์ส
func (pdb *PostgresCourseDatabase) UpdateCourse(ctx context.Context, id int, course *Course) error {
    // TODO เขียนโค้ดอัพเดตข้อมูลคอร์สในฐานข้อมูล
    return nil
}

// DeleteCourse ลบคอร์สตาม ID
func (pdb *PostgresCourseDatabase) DeleteCourse(ctx context.Context, id int) error {
    // TODO เขียนโค้ดลบคอร์สจากฐานข้อมูล
    return nil
}

// Close ปิดการเชื่อมต่อกับฐานข้อมูล
func (pdb *PostgresCourseDatabase) Close() error {
    // TODO เขียนโค้ดปิดการเชื่อมต่อกับฐานข้อมูล
    return nil
}

func main() {
    // ทดสอบการทำงานของ CourseDatabase
    // TODO เขียนโค้ดทดสอบการเรียกใช้งานฟังก์ชันทั้งหมด
}

เกณฑ์การประเมิน

  1. ความถูกต้องของการเชื่อมต่อกับฐานข้อมูล
  2. การใช้ Prepared Statements/Parameterized Queries เพื่อป้องกัน SQL Injection
  3. การตั้งค่า Connection Pooling ที่เหมาะสม
  4. การใช้ Context with Timeout อย่างถูกต้อง
  5. การเขียนโค้ดที่สอดคล้องกับ Interface ที่กำหนด
  6. ความสมบูรณ์ของการทำงานตาม requirements