diff --git a/internal/database/subject.go b/internal/database/subject.go index 8d85e33..a33fb48 100644 --- a/internal/database/subject.go +++ b/internal/database/subject.go @@ -7,18 +7,20 @@ import ( ) type Subject struct { - ID string `gorm:"type:uuid;primaryKey"` - Name string `gorm:"not null"` - Year int `gorm:"not null"` - Semester string `gorm:"not null"` - Credit int `gorm:"not null"` - SyllabusID string `gorm:"not null;uniqueIndex"` - Syllabus *Syllabus `gorm:"foreignKey:SyllabusID"` - Faculties []SubjectFaculty `gorm:"foreignKey:SubjectID"` - EligibleAttributes []SubjectEligibleAttribute `gorm:"foreignKey:SubjectID"` - Requirements []SubjectRequirement `gorm:"foreignKey:SubjectID"` - CreatedAt time.Time - UpdatedAt time.Time + ID string `gorm:"type:uuid;primaryKey"` + Name string `gorm:"not null"` + Year int `gorm:"not null"` + Semester string `gorm:"not null"` + Credit int `gorm:"not null"` + Classification string `gorm:"not null"` + CulturalSubjectCategory string `gorm:"not null"` + SyllabusID string `gorm:"not null;uniqueIndex"` + Syllabus *Syllabus `gorm:"foreignKey:SyllabusID"` + Faculties []SubjectFaculty `gorm:"foreignKey:SubjectID"` + EligibleAttributes []SubjectEligibleAttribute `gorm:"foreignKey:SubjectID"` + Requirements []SubjectRequirement `gorm:"foreignKey:SubjectID"` + CreatedAt time.Time + UpdatedAt time.Time } type SubjectFaculty struct { @@ -72,15 +74,17 @@ func SubjectToDomain(m Subject) domain.Subject { } return domain.Subject{ - ID: m.ID, - Name: m.Name, - Faculties: faculties, - Year: m.Year, - Semester: domain.CourseSemester(m.Semester), - Credit: m.Credit, - EligibleAttributes: eligible, - Requirements: requirements, - SyllabusID: m.SyllabusID, + ID: m.ID, + Name: m.Name, + Faculties: faculties, + Year: m.Year, + Semester: domain.CourseSemester(m.Semester), + Credit: m.Credit, + Classification: domain.SubjectClassification(m.Classification), + CulturalSubjectCategory: domain.CulturalSubjectCategory(m.CulturalSubjectCategory), + EligibleAttributes: eligible, + Requirements: requirements, + SyllabusID: m.SyllabusID, } } @@ -114,14 +118,16 @@ func SubjectFromDomain(d domain.Subject) Subject { } return Subject{ - ID: d.ID, - Name: d.Name, - Year: d.Year, - Semester: string(d.Semester), - Credit: d.Credit, - SyllabusID: d.SyllabusID, - Faculties: faculties, - EligibleAttributes: eligible, - Requirements: requirements, + ID: d.ID, + Name: d.Name, + Year: d.Year, + Semester: string(d.Semester), + Credit: d.Credit, + Classification: string(d.Classification), + CulturalSubjectCategory: string(d.CulturalSubjectCategory), + SyllabusID: d.SyllabusID, + Faculties: faculties, + EligibleAttributes: eligible, + Requirements: requirements, } } diff --git a/internal/domain/subject.go b/internal/domain/subject.go index 104ab7a..4f002dd 100644 --- a/internal/domain/subject.go +++ b/internal/domain/subject.go @@ -16,15 +16,17 @@ type SubjectRequirement struct { } type Subject struct { - ID string - Name string - Faculties []SubjectFaculty - Year int - Semester CourseSemester - Credit int - EligibleAttributes []SubjectTargetClass - Requirements []SubjectRequirement - SyllabusID string + ID string + Name string + Faculties []SubjectFaculty + Year int + Semester CourseSemester + Credit int + Classification SubjectClassification + CulturalSubjectCategory CulturalSubjectCategory + EligibleAttributes []SubjectTargetClass + Requirements []SubjectRequirement + SyllabusID string } type SubjectListFilter struct { diff --git a/internal/repository/subject.go b/internal/repository/subject.go index 85bc8f8..96ad119 100644 --- a/internal/repository/subject.go +++ b/internal/repository/subject.go @@ -62,8 +62,12 @@ func (r *SubjectRepository) List(ctx context.Context, filter domain.SubjectListF ctxDB.Model(&database.SubjectRequirement{}).Select("subject_id").Where("requirement_type IN ?", filter.RequirementType), ) } - // TODO: Classification フィルタの実装(syllabi テーブルの classifications カラムを JOIN して絞り込む) - // TODO: CulturalSubjectCategory フィルタの実装 + if len(filter.Classification) > 0 { + query = query.Where("classification IN ?", filter.Classification) + } + if len(filter.CulturalSubjectCategory) > 0 { + query = query.Where("cultural_subject_category IN ?", filter.CulturalSubjectCategory) + } var records []database.Subject if err := query.Find(&records).Error; err != nil { @@ -116,7 +120,7 @@ func (r *SubjectRepository) Upsert(ctx context.Context, subject domain.Subject) if err := tx.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "syllabus_id"}}, DoUpdates: clause.AssignmentColumns([]string{ - "name", "year", "semester", "credit", "updated_at", + "name", "year", "semester", "credit", "classification", "cultural_subject_category", "updated_at", }), }).Omit("Faculties", "EligibleAttributes", "Requirements").Create(&record).Error; err != nil { return err