Skip to content

Commit fedba56

Browse files
committed
🐛 fix: Duplicate Insertion #11
1 parent be66bf5 commit fedba56

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

db/books.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,9 @@ VALUES ($1, $2, $3, $4);
66
SELECT id, isbn, title, description, embedding
77
FROM books
88
ORDER BY embedding <=> $1
9-
LIMIT 5;
9+
LIMIT 5;
10+
11+
-- name: GetBookByISBN :one
12+
SELECT id, isbn
13+
FROM books
14+
WHERE isbn = $1;

internal/repository/books.sql.go

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/service/book_service.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package service
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"log/slog"
78
"math"
89
"semantic-search/internal/embed"
910
"semantic-search/internal/repository"
1011

12+
"github.com/jackc/pgx/v5"
1113
"github.com/jackc/pgx/v5/pgtype"
1214
"github.com/pgvector/pgvector-go"
1315
)
@@ -28,6 +30,16 @@ type BookWithSimilarity struct {
2830

2931
// AddBook embeds the book description and stores it in the database.
3032
func (s *BookService) AddBook(ctx context.Context, isbn, title, desc string) error {
33+
34+
// Check Book already exists
35+
_, err := s.Repository.GetBookByISBN(ctx, pgtype.Text{String: isbn, Valid: true})
36+
if err != nil && !errors.Is(err, pgx.ErrNoRows) {
37+
return fmt.Errorf("failed to check existing ISBN: %w", err)
38+
}
39+
if err == nil {
40+
return fmt.Errorf("book with isbn %s already exists", isbn)
41+
}
42+
3143
vector, err := s.Embedder.Embed(ctx, desc)
3244
if err != nil {
3345
return fmt.Errorf("embedding failed: %w", err)

0 commit comments

Comments
 (0)