server: implement channels

This commit is contained in:
2026-05-24 00:32:15 +00:00
parent bd6c0bf211
commit 35cda247f2
4 changed files with 248 additions and 0 deletions
+75
View File
@@ -12,6 +12,7 @@ import (
var ErrUserNotFound = errors.New("db: user not found")
var ErrSessionNotFound = errors.New("db: session not found")
var ErrChannelNotFound = errors.New("db: channel not found")
func dbGetUser(id string) (*User, error) {
query := `SELECT id, name, password FROM users WHERE id = $1`
@@ -131,3 +132,77 @@ func dbDeleteSession(jwtToken string) error {
slog.Debug("db: session deleted")
return nil
}
func dbAddChannel(channel *Channel) error {
query := `INSERT INTO channels (id, name, created, type, location, notes) VALUES ($1, $2, $3, $4, $5, $6)`
_, err := db.Pool.Exec(context.Background(), query, channel.ID, channel.Name, channel.Created, channel.Type, channel.Location, channel.Notes)
if err != nil {
slog.Error("db: failed to add channel", "channel", err, "channelid", channel.ID, "channelname", channel.Name)
return fmt.Errorf("failed to add channel")
}
slog.Debug("db: channel added", "channelid", channel.ID, "channelname", channel.Name)
return nil
}
func dbGetChannel(id string) (*Channel, error) {
query := `SELECT id, name, created, type, location, notes FROM channels WHERE id = $1`
var channel Channel
err := db.Pool.QueryRow(context.Background(), query, id).Scan(&channel.ID, &channel.Name, &channel.Created, &channel.Type, &channel.Location, &channel.Notes)
if errors.Is(err, pgx.ErrNoRows) {
slog.Debug("db: channel not found", "channelid", id)
return nil, ErrChannelNotFound
} else if err != nil {
slog.Error("db: failed to query channel", "error", err)
return nil, fmt.Errorf("failed to query channel")
}
slog.Debug("db: channel found", "channelid", channel.ID, "channelname", channel.Name)
return &channel, nil
}
func dbGetAllChannels() ([]*Channel, error) {
query := `SELECT id, name, created, type, location, notes FROM channels`
rows, err := db.Pool.Query(context.Background(), query)
if err != nil {
slog.Error("db: failed to query channels", "error", err)
return nil, fmt.Errorf("failed to query channels")
}
defer rows.Close()
var channels []*Channel
for rows.Next() {
channel := &Channel{}
if err := rows.Scan(&channel.ID, &channel.Name, &channel.Created, &channel.Type, &channel.Location, &channel.Notes); err != nil {
slog.Error("db: failed to scan channel", "error", err)
return nil, fmt.Errorf("failed to scan channel")
}
channels = append(channels, channel)
}
if err := rows.Err(); err != nil {
slog.Error("db: row iteration error", "error", err)
return nil, fmt.Errorf("failed to iterate channels")
}
if len(channels) == 0 {
slog.Debug("db: no channels found")
return nil, ErrChannelNotFound
}
slog.Debug("db: channel list returned")
return channels, nil
}
func dbDeleteChannel(id string) error {
query := `DELETE FROM channels WHERE id = $1`
tag, err := db.Pool.Exec(context.Background(), query, id)
if err != nil {
slog.Error("db: failed to delete channel", "error", err)
return fmt.Errorf("failed to delete channel")
}
if tag.RowsAffected() == 0 {
return ErrChannelNotFound
}
slog.Debug("db: channel deleted")
return nil
}