forked from vieter-v/vieter
WIP search targets
parent
8a0214babe
commit
656ff2614d
|
|
@ -1,6 +1,7 @@
|
||||||
module db
|
module db
|
||||||
|
|
||||||
import models { Target, TargetArch, TargetFilter }
|
import models { Target, TargetArch, TargetFilter, TargetSearchFilter }
|
||||||
|
import math
|
||||||
|
|
||||||
// get_targets returns all targets in the database.
|
// get_targets returns all targets in the database.
|
||||||
pub fn (db &VieterDb) get_targets(filter TargetFilter) []Target {
|
pub fn (db &VieterDb) get_targets(filter TargetFilter) []Target {
|
||||||
|
|
@ -104,3 +105,34 @@ pub fn (db &VieterDb) target_exists(target_id int) bool {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (db &VieterDb) search_targets(filter TargetSearchFilter) []Target {
|
||||||
|
out := []Target{}
|
||||||
|
|
||||||
|
mut seen := u64(0)
|
||||||
|
mut offset := 0
|
||||||
|
|
||||||
|
for out.len < filter.limit {
|
||||||
|
targets := sql db.conn {
|
||||||
|
select from Target order by id limit 25 offset offset
|
||||||
|
}
|
||||||
|
offset += targets.len
|
||||||
|
|
||||||
|
if targets.len == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
matched_targets := targets.filter(it.url.contains(filter.query)
|
||||||
|
|| it.path.contains(filter.query))
|
||||||
|
seen += u64(matched_targets.len)
|
||||||
|
|
||||||
|
if seen > filter.offset {
|
||||||
|
start_index := u64(matched_targets.len) - math.min(seen - filter.offset, matched_targets.len)
|
||||||
|
end_index := start_index + math.min(filter.limit - seen, u64(matched_targets.len) - start_index)
|
||||||
|
|
||||||
|
out << matched_targets[start_index..end_index]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,3 +74,11 @@ pub mut:
|
||||||
offset u64
|
offset u64
|
||||||
repo string
|
repo string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[params]
|
||||||
|
pub struct TargetSearchFilter {
|
||||||
|
pub mut:
|
||||||
|
limit u64 = 25
|
||||||
|
offset u64
|
||||||
|
query string
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,3 +81,6 @@ fn (mut app App) v1_patch_target(id int) web.Result {
|
||||||
|
|
||||||
return app.json(.ok, new_data_response(target))
|
return app.json(.ok, new_data_response(target))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
['/api/v1/targets/search'; auth; markused; get]
|
||||||
|
fn (mut app App) v1_search_targets()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue