package store import "context" func (s *Store) InsertBookmark(ctx context.Context, userID, libID int64, bookPath string, locator []byte, percent float64, note string) (int64, error) { var id int64 err := s.p.QueryRow(ctx, `INSERT INTO bookmarks (user_id, library_id, book_path, locator, percent, note) VALUES ($1,$2,$3,$4,$5,$6) RETURNING id`, userID, libID, bookPath, locator, percent, note).Scan(&id) return id, err } func (s *Store) ListBookmarks(ctx context.Context, userID, libID int64, bookPath string) ([]Bookmark, error) { rows, err := s.p.Query(ctx, `SELECT id, library_id, book_path, locator, percent, note, created_at FROM bookmarks WHERE user_id=$1 AND library_id=$2 AND book_path=$3 ORDER BY percent ASC, id ASC`, userID, libID, bookPath) if err != nil { return nil, err } defer rows.Close() var out []Bookmark for rows.Next() { var b Bookmark if err := rows.Scan(&b.ID, &b.LibraryID, &b.BookPath, &b.Locator, &b.Percent, &b.Note, &b.CreatedAt); err != nil { return nil, err } out = append(out, b) } return out, rows.Err() } func (s *Store) UpdateBookmarkNote(ctx context.Context, userID, id int64, note string) (bool, error) { res, err := s.p.Exec(ctx, `UPDATE bookmarks SET note=$3 WHERE id=$1 AND user_id=$2`, id, userID, note) if err != nil { return false, err } return res.RowsAffected() > 0, nil } func (s *Store) DeleteBookmark(ctx context.Context, userID, id int64) (bool, error) { res, err := s.p.Exec(ctx, `DELETE FROM bookmarks WHERE id=$1 AND user_id=$2`, id, userID) if err != nil { return false, err } return res.RowsAffected() > 0, nil }