flamingo.me/flamingo-commerce/v3@v3.11.0/search/interfaces/graphql/searchdto/facets.go (about)

     1  package searchdto
     2  
     3  import searchdomain "flamingo.me/flamingo-commerce/v3/search/domain"
     4  
     5  // CommerceSearchFacet interface for facets
     6  type CommerceSearchFacet interface {
     7  	Name() string
     8  	Label() string
     9  	Position() int
    10  	// Items() []CommerceSearchFacetItem
    11  	HasSelectedItem() bool
    12  }
    13  
    14  // CommerceSearchFacetItem interface for facet items
    15  type CommerceSearchFacetItem interface {
    16  	Label() string
    17  	Value() string
    18  	Selected() bool
    19  	Count() int
    20  }
    21  
    22  // WrapListFacet wraps the list facet into the graphql dto
    23  func WrapListFacet(facet searchdomain.Facet) *CommerceSearchListFacet {
    24  	items := make([]*CommerceSearchListFacetItem, len(facet.Items))
    25  	for i, item := range facet.Items {
    26  		items[i] = &CommerceSearchListFacetItem{
    27  			label:    item.Label,
    28  			value:    item.Value,
    29  			selected: item.Selected,
    30  			count:    int(item.Count),
    31  		}
    32  	}
    33  
    34  	return &CommerceSearchListFacet{
    35  		name:     facet.Name,
    36  		label:    facet.Label,
    37  		position: facet.Position,
    38  		items:    items,
    39  	}
    40  }
    41  
    42  // CommerceSearchListFacet dto for list facets
    43  type CommerceSearchListFacet struct {
    44  	name     string
    45  	label    string
    46  	position int
    47  	items    []*CommerceSearchListFacetItem
    48  }
    49  
    50  // Name getter
    51  func (c *CommerceSearchListFacet) Name() string {
    52  	return c.name
    53  }
    54  
    55  // Label getter
    56  func (c *CommerceSearchListFacet) Label() string {
    57  	return c.label
    58  }
    59  
    60  // Position getter
    61  func (c *CommerceSearchListFacet) Position() int {
    62  	return c.position
    63  }
    64  
    65  // Items getter
    66  func (c *CommerceSearchListFacet) Items() []*CommerceSearchListFacetItem {
    67  	return c.items
    68  }
    69  
    70  // HasSelectedItem getter
    71  func (c *CommerceSearchListFacet) HasSelectedItem() bool {
    72  	for _, item := range c.items {
    73  		if item.selected {
    74  			return true
    75  		}
    76  	}
    77  	return false
    78  }
    79  
    80  // CommerceSearchListFacetItem dto for list facet items
    81  type CommerceSearchListFacetItem struct {
    82  	label    string
    83  	value    string
    84  	selected bool
    85  	count    int
    86  }
    87  
    88  // Label getter
    89  func (c *CommerceSearchListFacetItem) Label() string {
    90  	return c.label
    91  }
    92  
    93  // Value getter
    94  func (c *CommerceSearchListFacetItem) Value() string {
    95  	return c.value
    96  }
    97  
    98  // Selected getter
    99  func (c *CommerceSearchListFacetItem) Selected() bool {
   100  	return c.selected
   101  }
   102  
   103  // Count getter
   104  func (c *CommerceSearchListFacetItem) Count() int {
   105  	return c.count
   106  }
   107  
   108  func mapTreeFacetItems(facetItems []*searchdomain.FacetItem) []*CommerceSearchTreeFacetItem {
   109  	items := make([]*CommerceSearchTreeFacetItem, len(facetItems))
   110  	for i, item := range facetItems {
   111  		items[i] = &CommerceSearchTreeFacetItem{
   112  			label:    item.Label,
   113  			value:    item.Value,
   114  			selected: item.Selected,
   115  			count:    int(item.Count),
   116  			active:   item.Active,
   117  			items:    mapTreeFacetItems(item.Items),
   118  		}
   119  	}
   120  	return items
   121  }
   122  
   123  // WrapTreeFacet wraps the tree facet into the graphql dto
   124  func WrapTreeFacet(facet searchdomain.Facet) *CommerceSearchTreeFacet {
   125  	return &CommerceSearchTreeFacet{
   126  		name:     facet.Name,
   127  		label:    facet.Label,
   128  		position: facet.Position,
   129  		items:    mapTreeFacetItems(facet.Items),
   130  	}
   131  }
   132  
   133  // CommerceSearchTreeFacet dto for tree facets
   134  type CommerceSearchTreeFacet struct {
   135  	name     string
   136  	label    string
   137  	position int
   138  	items    []*CommerceSearchTreeFacetItem
   139  }
   140  
   141  // Name getter
   142  func (c *CommerceSearchTreeFacet) Name() string {
   143  	return c.name
   144  }
   145  
   146  // Label getter
   147  func (c *CommerceSearchTreeFacet) Label() string {
   148  	return c.label
   149  }
   150  
   151  // Position getter
   152  func (c *CommerceSearchTreeFacet) Position() int {
   153  	return c.position
   154  }
   155  
   156  // Items getter
   157  func (c *CommerceSearchTreeFacet) Items() []*CommerceSearchTreeFacetItem {
   158  	return c.items
   159  }
   160  
   161  func hasSelectedItem(items []*CommerceSearchTreeFacetItem) bool {
   162  	for _, item := range items {
   163  		if item.selected || hasSelectedItem(item.items) {
   164  			return true
   165  		}
   166  	}
   167  	return false
   168  }
   169  
   170  // HasSelectedItem getter
   171  func (c *CommerceSearchTreeFacet) HasSelectedItem() bool {
   172  	return hasSelectedItem(c.items)
   173  }
   174  
   175  // CommerceSearchTreeFacetItem dto for tree facet items
   176  type CommerceSearchTreeFacetItem struct {
   177  	label    string
   178  	value    string
   179  	selected bool
   180  	count    int
   181  	active   bool
   182  	items    []*CommerceSearchTreeFacetItem
   183  }
   184  
   185  // Label getter
   186  func (c *CommerceSearchTreeFacetItem) Label() string {
   187  	return c.label
   188  }
   189  
   190  // Value getter
   191  func (c *CommerceSearchTreeFacetItem) Value() string {
   192  	return c.value
   193  }
   194  
   195  // Selected getter
   196  func (c *CommerceSearchTreeFacetItem) Selected() bool {
   197  	return c.selected
   198  }
   199  
   200  // Count getter
   201  func (c *CommerceSearchTreeFacetItem) Count() int {
   202  	return c.count
   203  }
   204  
   205  // Active getter
   206  func (c *CommerceSearchTreeFacetItem) Active() bool {
   207  	return c.active
   208  }
   209  
   210  // Items getter
   211  func (c *CommerceSearchTreeFacetItem) Items() []*CommerceSearchTreeFacetItem {
   212  	return c.items
   213  }
   214  
   215  // WrapRangeFacet wraps the range facet into the graphql dto
   216  func WrapRangeFacet(facet searchdomain.Facet) *CommerceSearchRangeFacet {
   217  	items := make([]*CommerceSearchRangeFacetItem, len(facet.Items))
   218  	for i, item := range facet.Items {
   219  		items[i] = &CommerceSearchRangeFacetItem{
   220  			label:       item.Label,
   221  			value:       item.Value,
   222  			selected:    item.Selected,
   223  			count:       int(item.Count),
   224  			min:         int(item.Min),
   225  			max:         int(item.Max),
   226  			selectedMin: int(item.SelectedMin),
   227  			selectedMax: int(item.SelectedMax),
   228  		}
   229  	}
   230  
   231  	return &CommerceSearchRangeFacet{
   232  		name:     facet.Name,
   233  		label:    facet.Label,
   234  		position: facet.Position,
   235  		items:    items,
   236  	}
   237  }
   238  
   239  // CommerceSearchRangeFacet dto for range facets
   240  type CommerceSearchRangeFacet struct {
   241  	name     string
   242  	label    string
   243  	position int
   244  	items    []*CommerceSearchRangeFacetItem
   245  }
   246  
   247  // Name getter
   248  func (c *CommerceSearchRangeFacet) Name() string {
   249  	return c.name
   250  }
   251  
   252  // Label getter
   253  func (c *CommerceSearchRangeFacet) Label() string {
   254  	return c.label
   255  }
   256  
   257  // Position getter
   258  func (c *CommerceSearchRangeFacet) Position() int {
   259  	return c.position
   260  }
   261  
   262  // Items getter
   263  func (c *CommerceSearchRangeFacet) Items() []*CommerceSearchRangeFacetItem {
   264  	return c.items
   265  }
   266  
   267  // HasSelectedItem getter
   268  func (c *CommerceSearchRangeFacet) HasSelectedItem() bool {
   269  	for _, item := range c.items {
   270  		if item.selected {
   271  			return true
   272  		}
   273  	}
   274  	return false
   275  }
   276  
   277  // CommerceSearchRangeFacetItem dto for range facet items
   278  type CommerceSearchRangeFacetItem struct {
   279  	label       string
   280  	value       string
   281  	selected    bool
   282  	count       int
   283  	min         int
   284  	max         int
   285  	selectedMin int
   286  	selectedMax int
   287  }
   288  
   289  // Label getter
   290  func (c *CommerceSearchRangeFacetItem) Label() string {
   291  	return c.label
   292  }
   293  
   294  // Value getter
   295  func (c *CommerceSearchRangeFacetItem) Value() string {
   296  	return c.value
   297  }
   298  
   299  // Selected getter
   300  func (c *CommerceSearchRangeFacetItem) Selected() bool {
   301  	return c.selected
   302  }
   303  
   304  // Count getter
   305  func (c *CommerceSearchRangeFacetItem) Count() int {
   306  	return c.count
   307  }
   308  
   309  // Min getter
   310  func (c *CommerceSearchRangeFacetItem) Min() int {
   311  	return c.min
   312  }
   313  
   314  // Max getter
   315  func (c *CommerceSearchRangeFacetItem) Max() int {
   316  	return c.max
   317  }
   318  
   319  // SelectedMin getter
   320  func (c *CommerceSearchRangeFacetItem) SelectedMin() int {
   321  	return c.selectedMin
   322  }
   323  
   324  // SelectedMax getter
   325  func (c *CommerceSearchRangeFacetItem) SelectedMax() int {
   326  	return c.selectedMax
   327  }