diff --git a/src/db/targets.v b/src/db/targets.v index 41e56df..c4efd7a 100644 --- a/src/db/targets.v +++ b/src/db/targets.v @@ -1,6 +1,7 @@ module db -import models { Target, TargetArch, TargetFilter } +import models { Target, TargetArch, TargetFilter, TargetSearchFilter } +import math // get_targets returns all targets in the database. 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 } + +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 +} diff --git a/src/models/targets.v b/src/models/targets.v index af3cb0d..6a35697 100644 --- a/src/models/targets.v +++ b/src/models/targets.v @@ -74,3 +74,11 @@ pub mut: offset u64 repo string } + +[params] +pub struct TargetSearchFilter { +pub mut: + limit u64 = 25 + offset u64 + query string +} diff --git a/src/server/api_targets.v b/src/server/api_targets.v index 4bb7d12..22b2de1 100644 --- a/src/server/api_targets.v +++ b/src/server/api_targets.v @@ -81,3 +81,6 @@ fn (mut app App) v1_patch_target(id int) web.Result { return app.json(.ok, new_data_response(target)) } + +['/api/v1/targets/search'; auth; markused; get] +fn (mut app App) v1_search_targets()