Files
2026-06-06 18:52:20 +03:00

86 lines
1.9 KiB
Go

package postgres
import (
"context"
"database/sql"
"errors"
"github.com/google/uuid"
"github.com/lib/pq"
"m8sh.su/d/jules/database"
)
type Chats struct {
conn *sql.DB
}
func (c *Chats) Attach(ctx context.Context, userID uuid.UUID, platform, identifier string) error {
_, err := c.conn.ExecContext(ctx, `
INSERT INTO chats (user_id, platform, identifier)
VALUES ($1, $2, $3)
`, userID, platform, identifier)
if err != nil {
if pqErr, ok := errors.AsType[*pq.Error](err); ok && pqErr.Code == "23505" {
return database.ErrAlreadyExists
}
return err
}
return nil
}
func (c *Chats) GetUserID(ctx context.Context, platform, identifier string) (uuid.UUID, error) {
var userID uuid.UUID
err := c.conn.QueryRowContext(ctx, `
SELECT user_id
FROM chats
WHERE platform = $1 AND identifier = $2
`, platform, identifier).Scan(&userID)
if errors.Is(err, sql.ErrNoRows) {
return uuid.Nil, database.ErrNotFound
}
if err != nil {
return uuid.Nil, err
}
return userID, nil
}
func (c *Chats) List(ctx context.Context, userID uuid.UUID) ([]database.Chat, error) {
rows, err := c.conn.QueryContext(ctx, `
SELECT user_id, platform, identifier
FROM chats
WHERE user_id = $1
`, userID)
if err != nil {
return nil, err
}
defer rows.Close()
var chats []database.Chat
for rows.Next() {
var chat database.Chat
if err = rows.Scan(&chat.UserID, &chat.Platform, &chat.Identifier); err != nil {
return nil, err
}
chats = append(chats, chat)
}
if err = rows.Err(); err != nil {
return nil, err
}
return chats, nil
}
func (c *Chats) Detach(ctx context.Context, userID uuid.UUID, platform string) error {
result, err := c.conn.ExecContext(ctx, `
DELETE FROM chats
WHERE user_id = $1 AND platform = $2
`, userID, platform)
if err != nil {
return err
}
rows, _ := result.RowsAffected()
if rows == 0 {
return database.ErrNotFound
}
return nil
}