add service
This commit is contained in:
97
internal/repository/supplier.go
Normal file
97
internal/repository/supplier.go
Normal file
@@ -0,0 +1,97 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user