Screen events while finding them, so limits work properly

This commit is contained in:
Mike Dilger 2024-02-20 08:22:34 +13:00
parent cb4d897a7d
commit abcdf4df6d
2 changed files with 16 additions and 14 deletions

View File

@ -107,17 +107,16 @@ impl WebSocketService {
{ {
let mut events: Vec<Event> = Vec::new(); let mut events: Vec<Event> = Vec::new();
for filter in filters.iter() { for filter in filters.iter() {
let mut filter_events = GLOBALS let screen = |event: &Event| {
let event_flags = event_flags(event, &user);
screen_outgoing_event(event, event_flags, authorized_user)
};
let filter_events = GLOBALS
.store .store
.get() .get()
.unwrap() .unwrap()
.find_events(filter.as_filter()?)?; .find_events(filter.as_filter()?, screen)?;
for event in filter_events.drain(..) { events.extend(filter_events);
let event_flags = event_flags(&event, &user);
if screen_outgoing_event(&event, event_flags, authorized_user) {
events.push(event);
}
}
} }
// sort // sort

View File

@ -226,7 +226,10 @@ impl Store {
} }
/// Find all events that match the filter /// Find all events that match the filter
pub fn find_events(&self, filter: Filter) -> Result<Vec<Event>, Error> { pub fn find_events<F>(&self, filter: Filter, screen: F) -> Result<Vec<Event>, Error>
where
F: Fn(&Event) -> bool,
{
let mut output: Vec<Event> = Vec::new(); let mut output: Vec<Event> = Vec::new();
if filter.num_ids() > 0 { if filter.num_ids() > 0 {
@ -234,7 +237,7 @@ impl Store {
for id in filter.ids() { for id in filter.ids() {
if let Some(event) = self.get_event_by_id(id)? { if let Some(event) = self.get_event_by_id(id)? {
// and check each against the rest of the filter // and check each against the rest of the filter
if filter.event_matches(&event)? { if filter.event_matches(&event)? && screen(&event) {
output.push(event); output.push(event);
} }
} }
@ -268,7 +271,7 @@ impl Store {
let (_key, offset) = result?; let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? { if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter // check against the rest of the filter
if filter.event_matches(&event)? { if filter.event_matches(&event)? && screen(&event) {
output.push(event); output.push(event);
// If kind is replaceable (and not parameterized) // If kind is replaceable (and not parameterized)
// then don't take any more events for this author-kind // then don't take any more events for this author-kind
@ -317,7 +320,7 @@ impl Store {
let (_key, offset) = result?; let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? { if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter // check against the rest of the filter
if filter.event_matches(&event)? { if filter.event_matches(&event)? && screen(&event) {
output.push(event); output.push(event);
} }
} }
@ -360,7 +363,7 @@ impl Store {
let (_key, offset) = result?; let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? { if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter // check against the rest of the filter
if filter.event_matches(&event)? { if filter.event_matches(&event)? && screen(&event) {
output.push(event); output.push(event);
} }
} }
@ -383,7 +386,7 @@ impl Store {
for result in iter { for result in iter {
let (_key, offset) = result?; let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? { if let Some(event) = self.events.get_event_by_offset(offset)? {
if filter.event_matches(&event)? { if filter.event_matches(&event)? && screen(&event) {
output.push(event); output.push(event);
count += 1; count += 1;
if count >= filter.limit() { if count >= filter.limit() {