From 28c8f938151af41f9ef6111a5f926d9e86ebc12a Mon Sep 17 00:00:00 2001 From: vallyenfail Date: Tue, 20 Jan 2026 14:37:30 +0300 Subject: [PATCH] add service --- internal/repository/supplier.go | 17 +++++++++++++++- tests/repository_test.go | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/internal/repository/supplier.go b/internal/repository/supplier.go index 18b693c..1767387 100644 --- a/internal/repository/supplier.go +++ b/internal/repository/supplier.go @@ -44,15 +44,30 @@ func (r *supplierRepository) bulkInsertWithExecutor(ctx context.Context, exec DB query = query.Values(requestID, s.Name, s.Email, s.Phone, s.Address, s.URL) } + query = query.Suffix("RETURNING id") + sqlQuery, args, err := query.ToSql() if err != nil { return errs.NewInternalError(errs.DatabaseError, "failed to build query", err) } - _, err = exec.Exec(ctx, sqlQuery, args...) + rows, err := exec.Query(ctx, sqlQuery, args...) if err != nil { return errs.NewInternalError(errs.DatabaseError, "failed to bulk insert suppliers", err) } + defer rows.Close() + + i := 0 + for rows.Next() { + if i >= len(suppliers) { + break + } + if err := rows.Scan(&suppliers[i].ID); err != nil { + return errs.NewInternalError(errs.DatabaseError, "failed to scan supplier id", err) + } + suppliers[i].RequestID = requestID + i++ + } return nil } diff --git a/tests/repository_test.go b/tests/repository_test.go index 41e0509..7ad8029 100644 --- a/tests/repository_test.go +++ b/tests/repository_test.go @@ -243,6 +243,42 @@ func (s *IntegrationSuite) TestRepository_SupplierBulkInsertAndDelete() { s.Equal(0, len(found)) } +func (s *IntegrationSuite) TestRepository_SupplierBulkInsertReturnsIDs() { + supplierRepo := repository.NewSupplierRepository(s.pool) + requestRepo := repository.NewRequestRepository(s.pool) + ctx := context.Background() + + var userID int + err := s.pool.QueryRow(ctx, "SELECT id FROM users LIMIT 1").Scan(&userID) + s.Require().NoError(err) + + req := &model.Request{ + UserID: userID, + RequestTxt: "Test request for supplier IDs", + } + err = requestRepo.Create(ctx, req) + s.Require().NoError(err) + + suppliers := []*model.Supplier{ + {Name: "Supplier A", Email: "a@test.com", Phone: "+7111"}, + {Name: "Supplier B", Email: "b@test.com", Phone: "+7222"}, + {Name: "Supplier C", Email: "c@test.com", Phone: "+7333"}, + } + + err = supplierRepo.BulkInsert(ctx, req.ID, suppliers) + s.NoError(err) + + for i, sup := range suppliers { + s.NotZero(sup.ID, "Supplier %d should have non-zero ID after BulkInsert", i) + s.Equal(req.ID, sup.RequestID, "Supplier %d should have correct RequestID", i) + } + + s.NotEqual(suppliers[0].ID, suppliers[1].ID, "Suppliers should have different IDs") + s.NotEqual(suppliers[1].ID, suppliers[2].ID, "Suppliers should have different IDs") + + _ = supplierRepo.DeleteByRequestID(ctx, req.ID) +} + func (s *IntegrationSuite) TestRepository_TokenUsageCreate() { tokenRepo := repository.NewTokenUsageRepository(s.pool) requestRepo := repository.NewRequestRepository(s.pool)