feat(schedule): add course table screens and navigation
Add complete schedule functionality including: - Schedule screen with weekly course table view - Course detail screen with transparent modal presentation - New ScheduleStack navigator integrated into main tab bar - Schedule service for API interactions - Type definitions for course entities Also includes bug fixes for group invite/request handlers to include required groupId parameter.
This commit is contained in:
66
internal/repository/schedule_repo.go
Normal file
66
internal/repository/schedule_repo.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"carrot_bbs/internal/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type ScheduleRepository interface {
|
||||
ListByUserID(userID string) ([]*model.ScheduleCourse, error)
|
||||
GetByID(id string) (*model.ScheduleCourse, error)
|
||||
Create(course *model.ScheduleCourse) error
|
||||
Update(course *model.ScheduleCourse) error
|
||||
DeleteByID(id string) error
|
||||
ExistsColorByUser(userID, color, excludeID string) (bool, error)
|
||||
}
|
||||
|
||||
type scheduleRepository struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewScheduleRepository(db *gorm.DB) ScheduleRepository {
|
||||
return &scheduleRepository{db: db}
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) ListByUserID(userID string) ([]*model.ScheduleCourse, error) {
|
||||
var courses []*model.ScheduleCourse
|
||||
err := r.db.
|
||||
Where("user_id = ?", userID).
|
||||
Order("day_of_week ASC, start_section ASC, created_at ASC").
|
||||
Find(&courses).Error
|
||||
return courses, err
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) Create(course *model.ScheduleCourse) error {
|
||||
return r.db.Create(course).Error
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) GetByID(id string) (*model.ScheduleCourse, error) {
|
||||
var course model.ScheduleCourse
|
||||
if err := r.db.Where("id = ?", id).First(&course).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &course, nil
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) Update(course *model.ScheduleCourse) error {
|
||||
return r.db.Save(course).Error
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) DeleteByID(id string) error {
|
||||
return r.db.Delete(&model.ScheduleCourse{}, "id = ?", id).Error
|
||||
}
|
||||
|
||||
func (r *scheduleRepository) ExistsColorByUser(userID, color, excludeID string) (bool, error) {
|
||||
var count int64
|
||||
query := r.db.Model(&model.ScheduleCourse{}).
|
||||
Where("user_id = ? AND LOWER(color) = LOWER(?)", userID, color)
|
||||
if excludeID != "" {
|
||||
query = query.Where("id <> ?", excludeID)
|
||||
}
|
||||
if err := query.Count(&count).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
return count > 0, nil
|
||||
}
|
||||
Reference in New Issue
Block a user