1use super::*;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum SearchDocumentKind {
5 Page,
6 Product,
7 Collection,
8 Event,
9 EventSlot,
10 Booking,
11 Media,
12 MembershipSubscription,
13 Custom,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub enum SearchFieldRole {
18 Title,
19 Summary,
20 Body,
21 Keyword,
22 Facet,
23 Metadata,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum SearchVisibility {
28 Public,
29 Authenticated,
30 Capability(Capability),
31}
32
33impl SearchVisibility {
34 pub fn allows(&self, capabilities: &[Capability]) -> bool {
35 match self {
36 Self::Public => true,
37 Self::Authenticated => !capabilities.is_empty(),
38 Self::Capability(capability) => capabilities.contains(capability),
39 }
40 }
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq)]
44pub enum SearchInvalidationTrigger {
45 Published,
46 Updated,
47 Unpublished,
48 Deleted,
49 ManualRebuild,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq)]
53pub enum SearchRebuildStrategy {
54 OnInvalidate,
55 Scheduled { interval: Duration },
56 ManualOnly,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq)]
60pub struct SearchFieldContribution {
61 pub id: String,
62 pub source_path: String,
63 pub role: SearchFieldRole,
64 pub stored: bool,
65 pub searchable: bool,
66}
67
68impl SearchFieldContribution {
69 pub fn new(
70 id: impl Into<String>,
71 source_path: impl Into<String>,
72 role: SearchFieldRole,
73 stored: bool,
74 searchable: bool,
75 ) -> Self {
76 Self {
77 id: id.into(),
78 source_path: source_path.into(),
79 role,
80 stored,
81 searchable,
82 }
83 }
84}
85
86#[derive(Debug, Clone, PartialEq, Eq)]
87pub struct SearchInvalidationRule {
88 pub trigger: SearchInvalidationTrigger,
89 pub reason: String,
90}
91
92impl SearchInvalidationRule {
93 pub fn new(trigger: SearchInvalidationTrigger, reason: impl Into<String>) -> Self {
94 Self {
95 trigger,
96 reason: reason.into(),
97 }
98 }
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
102pub struct SearchIndexContribution {
103 pub id: String,
104 pub document_kind: SearchDocumentKind,
105 pub visibility: SearchVisibility,
106 pub publication_required: bool,
107 pub fields: Vec<SearchFieldContribution>,
108 pub invalidation_rules: Vec<SearchInvalidationRule>,
109 pub rebuild_strategy: SearchRebuildStrategy,
110}
111
112impl SearchIndexContribution {
113 pub fn new(
114 id: impl Into<String>,
115 document_kind: SearchDocumentKind,
116 visibility: SearchVisibility,
117 publication_required: bool,
118 fields: Vec<SearchFieldContribution>,
119 invalidation_rules: Vec<SearchInvalidationRule>,
120 rebuild_strategy: SearchRebuildStrategy,
121 ) -> Self {
122 Self {
123 id: id.into(),
124 document_kind,
125 visibility,
126 publication_required,
127 fields,
128 invalidation_rules,
129 rebuild_strategy,
130 }
131 }
132}