fix:#46 added delete groups

This commit is contained in:
Elmar Kresse
2024-07-05 12:27:23 +02:00
parent aa7703d926
commit a5a8c2a58d
2 changed files with 47 additions and 65 deletions

View File

@@ -20,60 +20,46 @@ import (
"github.com/pocketbase/dbx" "github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/models" "github.com/pocketbase/pocketbase/models"
"htwkalender/data-manager/model"
"log/slog" "log/slog"
) )
func SaveGroups(seminarGroup []model.SeminarGroup, collection *models.Collection, app *pocketbase.PocketBase) ([]*models.Record, error) { type SeminarGroup struct {
var savedRecords []*models.Record University string `db:"university" json:"university"`
var tobeSavedGroups []model.SeminarGroup GroupShortcut string `db:"shortcut" json:"shortcut"`
var insertRecords []*models.Record GroupId string `db:"groupId" json:"groupId"`
Course string `db:"course" json:"course"`
for _, group := range seminarGroup { Faculty string `db:"faculty" json:"faculty"`
dbGroup, err := FindGroupByCourseAndSemester(group.Course, group.Semester, app) FacultyId string `db:"facultyId" json:"facultyId"`
Semester string `db:"semester" json:"semester"`
if dbGroup == nil && err.Error() == "sql: no rows in result set" { models.BaseModel
tobeSavedGroups = append(tobeSavedGroups, group)
} else if err != nil {
return nil, err
}
} }
// create record for each group that's not already in the database func (s *SeminarGroup) TableName() string {
for _, group := range tobeSavedGroups { return "groups"
record := models.NewRecord(collection)
record.Set("university", group.University)
record.Set("shortcut", group.GroupShortcut)
record.Set("groupId", group.GroupId)
record.Set("course", group.Course)
record.Set("faculty", group.Faculty)
record.Set("facultyId", group.FacultyId)
record.Set("semester", group.Semester)
insertRecords = append(insertRecords, record)
} }
// save all records type SeminarGroups []*SeminarGroup
for _, record := range insertRecords {
if record != nil {
err := app.Dao().SaveRecord(record)
if err == nil {
savedRecords = append(savedRecords, record)
} else {
return nil, err
}
}
}
return savedRecords, nil func SaveGroups(seminarGroups SeminarGroups, app *pocketbase.PocketBase) (SeminarGroups, error) {
}
func FindGroupByCourseAndSemester(course string, semester string, app *pocketbase.PocketBase) (*model.SeminarGroup, error) { // delete all groups from the database
var group model.SeminarGroup execute, err := app.Dao().DB().Delete("groups", dbx.NewExp("1 = 1")).Execute()
err := app.Dao().DB().Select("*").From("groups").Where(dbx.NewExp("course = {:course} AND semester = {:semester}", dbx.Params{"course": course, "semester": semester})).One(&group)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &group, nil rowCount, _ := execute.RowsAffected()
savedGroups := SeminarGroups{}
for _, group := range seminarGroups {
saveErr := app.Dao().Save(group)
if saveErr != nil {
return nil, saveErr
}
savedGroups = append(savedGroups, group)
}
slog.Info("Saved all groups to the database", "insert", len(savedGroups), "deleted", rowCount)
return savedGroups, nil
} }
func GetAllCourses(app *pocketbase.PocketBase) []string { func GetAllCourses(app *pocketbase.PocketBase) []string {

View File

@@ -20,7 +20,6 @@ import (
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"github.com/pocketbase/pocketbase" "github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/models"
"htwkalender/data-manager/model" "htwkalender/data-manager/model"
"htwkalender/data-manager/service/db" "htwkalender/data-manager/service/db"
"htwkalender/data-manager/service/functions" "htwkalender/data-manager/service/functions"
@@ -58,8 +57,8 @@ func getSeminarHTML(semester string) (string, error) {
} }
func FetchSeminarGroups(app *pocketbase.PocketBase) ([]*models.Record, error) { func FetchSeminarGroups(app *pocketbase.PocketBase) (db.SeminarGroups, error) {
var groups []model.SeminarGroup var groups db.SeminarGroups
semesterString := functions.CalculateSemesterList(time.RealClock{}) semesterString := functions.CalculateSemesterList(time.RealClock{})
var results [2]string var results [2]string
@@ -77,26 +76,23 @@ func FetchSeminarGroups(app *pocketbase.PocketBase) ([]*models.Record, error) {
// filter duplicates // filter duplicates
groups = removeDuplicates(groups) groups = removeDuplicates(groups)
collection, dbError := db.FindCollection(app, "groups") insertedGroups, dbError := db.SaveGroups(groups, app)
if dbError != nil { if dbError != nil {
slog.Error("Error while searching collection groups", "error", dbError) slog.Error("FetchSeminarGroups", "error", dbError)
return nil, err
}
var insertedGroups []*models.Record
insertedGroups, dbError = db.SaveGroups(groups, collection, app)
if dbError != nil {
slog.Error("Error while saving groups", "error", dbError)
return nil, err return nil, err
} }
return insertedGroups, nil return insertedGroups, nil
} }
func removeDuplicates(groups []model.SeminarGroup) []model.SeminarGroup { func removeDuplicates(groups db.SeminarGroups) db.SeminarGroups {
var uniqueGroups []model.SeminarGroup uniqueGroups := make(db.SeminarGroups, 0, len(groups))
seen := make(map[string]struct{}) // Use an empty struct to minimize memory usage
for _, group := range groups { for _, group := range groups {
if !contains(uniqueGroups, group) { key := group.Course + group.Semester
if _, exists := seen[key]; !exists {
seen[key] = struct{}{}
uniqueGroups = append(uniqueGroups, group) uniqueGroups = append(uniqueGroups, group)
} }
} }
@@ -112,7 +108,7 @@ func contains(groups []model.SeminarGroup, group model.SeminarGroup) bool {
return false return false
} }
func parseSeminarGroups(result string, semester string) []model.SeminarGroup { func parseSeminarGroups(result string, semester string) db.SeminarGroups {
var studium model.Studium var studium model.Studium
err := xml.Unmarshal([]byte(result), &studium) err := xml.Unmarshal([]byte(result), &studium)
@@ -120,11 +116,11 @@ func parseSeminarGroups(result string, semester string) []model.SeminarGroup {
return nil return nil
} }
var seminarGroups []model.SeminarGroup var seminarGroups db.SeminarGroups
for _, faculty := range studium.Faculty { for _, faculty := range studium.Faculty {
for _, Studiengang := range faculty.Studiengang { for _, Studiengang := range faculty.Studiengang {
for _, Studienrichtung := range Studiengang.Semgrp { for _, Studienrichtung := range Studiengang.Semgrp {
seminarGroup := model.SeminarGroup{ seminarGroup := db.SeminarGroup{
University: "HTWK-Leipzig", University: "HTWK-Leipzig",
GroupShortcut: Studiengang.Name, GroupShortcut: Studiengang.Name,
GroupId: Studiengang.ID, GroupId: Studiengang.ID,
@@ -133,7 +129,7 @@ func parseSeminarGroups(result string, semester string) []model.SeminarGroup {
FacultyId: faculty.ID, FacultyId: faculty.ID,
Semester: semester, Semester: semester,
} }
seminarGroups = append(seminarGroups, seminarGroup) seminarGroups = append(seminarGroups, &seminarGroup)
} }
} }
} }