mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender-pwa.git
synced 2025-08-03 18:29:16 +02:00
feat:#16 added uuid and fixed some pointer logic
This commit is contained in:
52
backend/migrations/1698017941_updated_events.go
Normal file
52
backend/migrations/1698017941_updated_events.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package migrations
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/pocketbase/pocketbase/daos"
|
||||||
|
m "github.com/pocketbase/pocketbase/migrations"
|
||||||
|
"github.com/pocketbase/pocketbase/models/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
m.Register(func(db dbx.Builder) error {
|
||||||
|
dao := daos.New(db)
|
||||||
|
|
||||||
|
collection, err := dao.FindCollectionByNameOrId("7her4515qsmrxe8")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// add
|
||||||
|
new_uuid := &schema.SchemaField{}
|
||||||
|
json.Unmarshal([]byte(`{
|
||||||
|
"system": false,
|
||||||
|
"id": "0kahthzr",
|
||||||
|
"name": "uuid",
|
||||||
|
"type": "text",
|
||||||
|
"required": false,
|
||||||
|
"unique": false,
|
||||||
|
"options": {
|
||||||
|
"min": null,
|
||||||
|
"max": null,
|
||||||
|
"pattern": ""
|
||||||
|
}
|
||||||
|
}`), new_uuid)
|
||||||
|
collection.Schema.AddField(new_uuid)
|
||||||
|
|
||||||
|
return dao.SaveCollection(collection)
|
||||||
|
}, func(db dbx.Builder) error {
|
||||||
|
dao := daos.New(db)
|
||||||
|
|
||||||
|
collection, err := dao.FindCollectionByNameOrId("7her4515qsmrxe8")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove
|
||||||
|
collection.Schema.RemoveField("0kahthzr")
|
||||||
|
|
||||||
|
return dao.SaveCollection(collection)
|
||||||
|
})
|
||||||
|
}
|
@@ -5,7 +5,7 @@ import "github.com/pocketbase/pocketbase/models"
|
|||||||
type Events []*Event
|
type Events []*Event
|
||||||
|
|
||||||
type Event struct {
|
type Event struct {
|
||||||
UUID string `db:"UUID" json:"uuid"`
|
UUID string `db:"uuid" json:"uuid"`
|
||||||
Day string `db:"Day" json:"day"`
|
Day string `db:"Day" json:"day"`
|
||||||
Week string `db:"Week" json:"week"`
|
Week string `db:"Week" json:"week"`
|
||||||
Start string `db:"Start" json:"start"`
|
Start string `db:"Start" json:"start"`
|
||||||
@@ -24,3 +24,9 @@ type Event struct {
|
|||||||
func (m *Event) TableName() string {
|
func (m *Event) TableName() string {
|
||||||
return "events"
|
return "events"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetCourse func to set the course and returns the event
|
||||||
|
func (m *Event) SetCourse(course string) Event {
|
||||||
|
m.Course = course
|
||||||
|
return *m
|
||||||
|
}
|
||||||
|
@@ -6,51 +6,59 @@ import (
|
|||||||
"htwkalender/model"
|
"htwkalender/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) (model.Events, error) {
|
func SaveEvents(seminarGroup []model.SeminarGroup, app *pocketbase.PocketBase) ([]model.Event, error) {
|
||||||
var toBeSavedEvents []struct {
|
var toBeSavedEvents []model.Event
|
||||||
model.Event
|
var savedRecords []model.Event
|
||||||
string
|
|
||||||
}
|
|
||||||
var savedRecords model.Events
|
|
||||||
// check if event is already in database and add to toBeSavedEvents if not
|
// check if event is already in database and add to toBeSavedEvents if not
|
||||||
for _, seminarGroup := range seminarGroup {
|
for _, seminarGroup := range seminarGroup {
|
||||||
for _, event := range seminarGroup.Events {
|
for _, event := range seminarGroup.Events {
|
||||||
|
event = event.SetCourse(seminarGroup.Course)
|
||||||
dbGroup, err := findEventByDayWeekStartEndNameCourse(event, seminarGroup.Course, app)
|
dbGroup, err := findEventByDayWeekStartEndNameCourse(event, seminarGroup.Course, app)
|
||||||
|
|
||||||
if dbGroup == nil && err.Error() == "sql: no rows in result set" {
|
if dbGroup.UUID != "" && err.Error() == "sql: no rows in result set" && !containsEvent(toBeSavedEvents, event) {
|
||||||
toBeSavedEvents = append(toBeSavedEvents, struct {
|
toBeSavedEvents = append(toBeSavedEvents, event)
|
||||||
model.Event
|
|
||||||
string
|
|
||||||
}{event, seminarGroup.Course})
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// create record for each event that's not already in the database
|
// create record for each event that's not already in the database
|
||||||
for _, event := range toBeSavedEvents {
|
for _, event := range toBeSavedEvents {
|
||||||
|
event.MarkAsNew()
|
||||||
// auto mapping for event fields to record fields
|
// auto mapping for event fields to record fields
|
||||||
err := app.Dao().Save(&event)
|
err := app.Dao().Save(&event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else {
|
} else {
|
||||||
savedRecords = append(savedRecords, &event.Event)
|
savedRecords = append(savedRecords, event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return savedRecords, nil
|
return savedRecords, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func containsEvent(events []model.Event, event model.Event) bool {
|
||||||
|
for _, e := range events {
|
||||||
|
if e.Day == event.Day &&
|
||||||
|
e.Week == event.Week &&
|
||||||
|
e.Start == event.Start &&
|
||||||
|
e.End == event.End &&
|
||||||
|
e.Name == event.Name &&
|
||||||
|
e.Course == event.Course &&
|
||||||
|
e.Prof == event.Prof &&
|
||||||
|
e.Rooms == event.Rooms &&
|
||||||
|
e.EventType == event.EventType {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func findEventByDayWeekStartEndNameCourse(event model.Event, course string, app *pocketbase.PocketBase) (*model.Event, error) {
|
func findEventByDayWeekStartEndNameCourse(event model.Event, course string, app *pocketbase.PocketBase) (*model.Event, error) {
|
||||||
err := app.Dao().DB().Select("*").From("events").Where(
|
err := app.Dao().DB().Select("*").From("events").Where(
|
||||||
dbx.NewExp("Day = {:day} AND Week = {:week} AND Start = {:start} AND End = {:end} AND Name = {:name} AND course = {:course} AND Prof = {:prof} AND Rooms = {:rooms} AND EventType = {:eventType}",
|
dbx.NewExp("Day = {:day} AND Week = {:week} AND Start = {:start} AND End = {:end} AND Name = {:name} AND course = {:course} AND Prof = {:prof} AND Rooms = {:rooms} AND EventType = {:eventType}",
|
||||||
dbx.Params{"day": event.Day, "week": event.Week, "start": event.Start, "end": event.End, "name": event.Name, "course": course, "prof": event.Prof, "rooms": event.Rooms, "eventType": event.EventType}),
|
dbx.Params{"day": event.Day, "week": event.Week, "start": event.Start, "end": event.End, "name": event.Name, "course": course, "prof": event.Prof, "rooms": event.Rooms, "eventType": event.EventType}),
|
||||||
).One(&event)
|
).One(&event)
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &event, err
|
return &event, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ package fetch
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
"github.com/pocketbase/pocketbase"
|
"github.com/pocketbase/pocketbase"
|
||||||
"github.com/pocketbase/pocketbase/apis"
|
"github.com/pocketbase/pocketbase/apis"
|
||||||
@@ -97,6 +98,7 @@ func parseSeminarGroup(result string) model.SeminarGroup {
|
|||||||
semesterString := findFirstSpanWithClass(table, "header-0-2-0").FirstChild.Data
|
semesterString := findFirstSpanWithClass(table, "header-0-2-0").FirstChild.Data
|
||||||
semester, year := extractSemesterAndYear(semesterString)
|
semester, year := extractSemesterAndYear(semesterString)
|
||||||
events = convertWeeksToDates(events, semester, year)
|
events = convertWeeksToDates(events, semester, year)
|
||||||
|
events = generateUUIDs(events)
|
||||||
var seminarGroup = model.SeminarGroup{
|
var seminarGroup = model.SeminarGroup{
|
||||||
University: findFirstSpanWithClass(table, "header-1-0-0").FirstChild.Data,
|
University: findFirstSpanWithClass(table, "header-1-0-0").FirstChild.Data,
|
||||||
Course: findFirstSpanWithClass(table, "header-2-0-1").FirstChild.Data,
|
Course: findFirstSpanWithClass(table, "header-2-0-1").FirstChild.Data,
|
||||||
@@ -105,6 +107,16 @@ func parseSeminarGroup(result string) model.SeminarGroup {
|
|||||||
return seminarGroup
|
return seminarGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func generateUUIDs(events []model.Event) []model.Event {
|
||||||
|
for i, event := range events {
|
||||||
|
// generate a hash value from the event name, course and semester
|
||||||
|
hash := uuid.NewSHA1(uuid.NameSpaceOID, []byte(event.Name+event.Course+event.Semester))
|
||||||
|
events[i].UUID = hash.String()
|
||||||
|
}
|
||||||
|
return events
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func convertWeeksToDates(events []model.Event, semester string, year string) []model.Event {
|
func convertWeeksToDates(events []model.Event, semester string, year string) []model.Event {
|
||||||
var newEvents []model.Event
|
var newEvents []model.Event
|
||||||
eventYear, _ := strconv.Atoi(year)
|
eventYear, _ := strconv.Atoi(year)
|
||||||
|
Reference in New Issue
Block a user