Files
memberDB/handlers/events.go
2025-10-17 15:41:13 +02:00

171 lines
4.0 KiB
Go

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
}