package repository import ( "context" "bugulma/backend/internal/domain" "gorm.io/gorm" ) // ServiceRepository implements domain.ServiceRepository with GORM type ServiceRepository struct { *BaseRepository[domain.Service] } // NewServiceRepository creates a new GORM-based service repository func NewServiceRepository(db *gorm.DB) domain.ServiceRepository { return &ServiceRepository{ BaseRepository: NewBaseRepository[domain.Service](db), } } // GetByOrganization retrieves services by organization ID func (r *ServiceRepository) GetByOrganization(ctx context.Context, organizationID string) ([]*domain.Service, error) { return r.FindWhereWithContext(ctx, "organization_id = ?", organizationID) } // GetByType retrieves services by type func (r *ServiceRepository) GetByType(ctx context.Context, serviceType domain.ServiceType) ([]*domain.Service, error) { return r.FindWhereWithContext(ctx, "type = ?", serviceType) } // GetByDomain retrieves services by domain (case-insensitive partial match) func (r *ServiceRepository) GetByDomain(ctx context.Context, domainName string) ([]*domain.Service, error) { return r.FindWhereWithContext(ctx, "domain ILIKE ?", "%"+domainName+"%") } // SearchByDescription searches services by description or domain func (r *ServiceRepository) SearchByDescription(ctx context.Context, description string) ([]*domain.Service, error) { return r.FindWhereWithContext(ctx, "description ILIKE ? OR domain ILIKE ?", "%"+description+"%", "%"+description+"%") } // GetByServiceArea retrieves services by service area radius (basic implementation) func (r *ServiceRepository) GetByServiceArea(ctx context.Context, lat, lng, radiusKm float64) ([]*domain.Service, error) { // Basic implementation - in production, this would use geospatial queries // For now, return services with service area >= requested radius return r.FindWhereWithContext(ctx, "service_area_km >= ?", radiusKm) }