98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
|
|
"smart-search-back/internal/model"
|
|
errs "smart-search-back/pkg/errors"
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
type supplierRepository struct {
|
|
pool *pgxpool.Pool
|
|
qb sq.StatementBuilderType
|
|
}
|
|
|
|
func NewSupplierRepository(pool *pgxpool.Pool) SupplierRepository {
|
|
return &supplierRepository{
|
|
pool: pool,
|
|
qb: sq.StatementBuilder.PlaceholderFormat(sq.Dollar),
|
|
}
|
|
}
|
|
|
|
func (r *supplierRepository) BulkInsert(ctx context.Context, requestID uuid.UUID, suppliers []*model.Supplier) error {
|
|
if len(suppliers) == 0 {
|
|
return nil
|
|
}
|
|
|
|
query := r.qb.Insert("suppliers").Columns(
|
|
"request_id", "name", "email", "phone", "adress", "url",
|
|
)
|
|
|
|
for _, s := range suppliers {
|
|
query = query.Values(requestID, s.Name, s.Email, s.Phone, s.Address, s.URL)
|
|
}
|
|
|
|
sqlQuery, args, err := query.ToSql()
|
|
if err != nil {
|
|
return errs.NewInternalError(errs.DatabaseError, "failed to build query", err)
|
|
}
|
|
|
|
_, err = r.pool.Exec(ctx, sqlQuery, args...)
|
|
if err != nil {
|
|
return errs.NewInternalError(errs.DatabaseError, "failed to bulk insert suppliers", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *supplierRepository) GetByRequestID(ctx context.Context, requestID uuid.UUID) ([]*model.Supplier, error) {
|
|
query := r.qb.Select(
|
|
"id", "request_id", "name", "email", "phone", "adress", "url", "created_at",
|
|
).From("suppliers").Where(sq.Eq{"request_id": requestID}).OrderBy("id")
|
|
|
|
sqlQuery, args, err := query.ToSql()
|
|
if err != nil {
|
|
return nil, errs.NewInternalError(errs.DatabaseError, "failed to build query", err)
|
|
}
|
|
|
|
rows, err := r.pool.Query(ctx, sqlQuery, args...)
|
|
if err != nil {
|
|
return nil, errs.NewInternalError(errs.DatabaseError, "failed to get suppliers", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
var suppliers []*model.Supplier
|
|
for rows.Next() {
|
|
s := &model.Supplier{}
|
|
err := rows.Scan(
|
|
&s.ID, &s.RequestID, &s.Name, &s.Email, &s.Phone, &s.Address, &s.URL, &s.CreatedAt,
|
|
)
|
|
if err != nil {
|
|
return nil, errs.NewInternalError(errs.DatabaseError, "failed to scan supplier", err)
|
|
}
|
|
suppliers = append(suppliers, s)
|
|
}
|
|
|
|
return suppliers, nil
|
|
}
|
|
|
|
func (r *supplierRepository) DeleteByRequestID(ctx context.Context, requestID uuid.UUID) error {
|
|
query := r.qb.Delete("suppliers").Where(sq.Eq{"request_id": requestID})
|
|
|
|
sqlQuery, args, err := query.ToSql()
|
|
if err != nil {
|
|
return errs.NewInternalError(errs.DatabaseError, "failed to build query", err)
|
|
}
|
|
|
|
_, err = r.pool.Exec(ctx, sqlQuery, args...)
|
|
if err != nil {
|
|
return errs.NewInternalError(errs.DatabaseError, "failed to delete suppliers", err)
|
|
}
|
|
|
|
return nil
|
|
}
|