server: implement channels
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user