package repository import ( "context" "database/sql" "encoding/json" "fmt" "erp-mvp/core-service/internal/models" "github.com/google/uuid" ) type OrganizationRepository interface { Create(ctx context.Context, org *models.Organization) error GetByID(ctx context.Context, id uuid.UUID) (*models.Organization, error) Update(ctx context.Context, org *models.Organization) error } type organizationRepository struct { db *sql.DB } func NewOrganizationRepository(db *sql.DB) OrganizationRepository { return &organizationRepository{db: db} } func (r *organizationRepository) Create(ctx context.Context, org *models.Organization) error { query := ` INSERT INTO organizations (id, name, type, settings, created_at) VALUES ($1, $2, $3, $4, $5) ` // Конвертируем JSON в строку settingsJSON, err := json.Marshal(org.Settings) if err != nil { return fmt.Errorf("failed to marshal settings: %w", err) } _, err = r.db.ExecContext(ctx, query, org.ID, org.Name, org.Type, string(settingsJSON), org.CreatedAt) if err != nil { return fmt.Errorf("failed to create organization: %w", err) } return nil } func (r *organizationRepository) GetByID(ctx context.Context, id uuid.UUID) (*models.Organization, error) { query := ` SELECT id, name, type, settings, created_at FROM organizations WHERE id = $1 ` var settingsJSON []byte org := &models.Organization{} err := r.db.QueryRowContext(ctx, query, id).Scan( &org.ID, &org.Name, &org.Type, &settingsJSON, &org.CreatedAt, ) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("organization not found") } return nil, fmt.Errorf("failed to get organization: %w", err) } // Конвертируем JSON строку в map if len(settingsJSON) > 0 { err = json.Unmarshal(settingsJSON, &org.Settings) if err != nil { return nil, fmt.Errorf("failed to unmarshal settings: %w", err) } } else { org.Settings = make(models.JSON) } return org, nil } func (r *organizationRepository) Update(ctx context.Context, org *models.Organization) error { query := ` UPDATE organizations SET name = $2, type = $3, settings = $4 WHERE id = $1 ` // Конвертируем JSON в строку settingsJSON, err := json.Marshal(org.Settings) if err != nil { return fmt.Errorf("failed to marshal settings: %w", err) } result, err := r.db.ExecContext(ctx, query, org.ID, org.Name, org.Type, string(settingsJSON)) if err != nil { return fmt.Errorf("failed to update organization: %w", err) } rowsAffected, err := result.RowsAffected() if err != nil { return fmt.Errorf("failed to get rows affected: %w", err) } if rowsAffected == 0 { return fmt.Errorf("organization not found") } return nil }