package handlers import ( "encoding/json" "errors" "fmt" "slices" "strings" "time" "gitea.tecamino.com/paadi/memberDB/models" ) func (dh *DatabaseHandler) CreateNewEventTable() error { createTableSQL := ` CREATE TABLE IF NOT EXISTS events ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, date TEXT UNIQUE NOT NULL, attendees TEXT NOT NULL, count INTEGER NOT NULL );` _, err := dh.database.Exec(createTableSQL) if err != nil { return fmt.Errorf("failed to create table: %w", err) } return nil } func (dh *DatabaseHandler) StartNewEvent(name string) error { _, err := dh.database.Exec("INSERT INTO events (name, date, attendees, count) VALUES (?, ?, ?, ?)", name, time.Now().Format("2006-01-02 15:04:05"), "[]", 0) return err } func (dh *DatabaseHandler) GetEvent(id int) (attendees []models.Event, err error) { var args any query := `SELECT id, name, date, attendees, count FROM events` if id > 0 { query += ` WHERE id = ?` args = id } rows, err := dh.database.Query(query, args) if err != nil { return } defer rows.Close() for rows.Next() { var id, count int var name, date, attendance string if err = rows.Scan(&id, &name, &date, &attendance, &count); err != nil { return } var a []models.Person if err := json.Unmarshal([]byte(attendance), &a); err != nil { return attendees, err } attendees = append(attendees, models.Event{ Id: id, Name: name, Date: date, Attendees: a, Count: count, }) } return attendees, nil } func (dh *DatabaseHandler) DeleteEvent(ids ...int) error { if len(ids) == 0 { return errors.New("no ids given to be deleted") } placeholders := make([]string, len(ids)) args := make([]any, len(ids)) for i, id := range ids { placeholders[i] = "?" args[i] = id } query := fmt.Sprintf("DELETE FROM events WHERE id IN (%s)", strings.Join(placeholders, ",")) _, err := dh.database.Exec(query, args...) return err } func (dh *DatabaseHandler) AddAttendeesToEvent(event models.Event) error { //get event from database by id row := dh.database.QueryRow(`SELECT attendees FROM events WHERE id = ?`, event.Id) var attendeesString string if err := row.Scan(&attendeesString); err != nil { return err } fmt.Println(attendeesString) var attendees []models.Person err := json.Unmarshal([]byte(attendeesString), &attendees) if err != nil { return err } next: for _, newAttendee := range event.Attendees { for _, attendee := range attendees { if attendee.FirstName == newAttendee.FirstName && attendee.LastName == newAttendee.LastName { continue next } } attendees = append(attendees, newAttendee) } attendeesByte, err := json.Marshal(attendees) if err != nil { return err } count := len(attendees) _, err = dh.database.Exec("UPDATE events SET attendees= ? count= ? WHERE id= ?", string(attendeesByte), event.Id, count) if err != nil { return err } return nil } func (dh *DatabaseHandler) DeleteAttendeesFromEvent(event models.Event) error { //get event from database by id row := dh.database.QueryRow(`SELECT attendees FROM events WHERE id = ?`, event.Id) var attendeesString string if err := row.Scan(&attendeesString); err != nil { return err } fmt.Println(attendeesString) var attendees []models.Person err := json.Unmarshal([]byte(attendeesString), &attendees) if err != nil { return err } for _, newAttendee := range event.Attendees { for i, attendee := range attendees { if attendee.FirstName == newAttendee.FirstName && attendee.LastName == newAttendee.LastName { attendees = slices.Delete(attendees, i, i+1) } } } attendeesByte, err := json.Marshal(attendees) if err != nil { return err } count := len(attendees) _, err = dh.database.Exec("UPDATE events SET attendees= ? count= ? WHERE id= ?", string(attendeesByte), event.Id, count) if err != nil { return err } return nil }