forked from vieter-v/vieter
				
			feat(api): add search query to targets
							parent
							
								
									60d5fb77e0
								
							
						
					
					
						commit
						f8f611f5c5
					
				| 
						 | 
				
			
			@ -40,6 +40,12 @@ pub fn cmd() cli.Command {
 | 
			
		|||
						description: 'Only return targets that publish to this repo.'
 | 
			
		||||
						flag: cli.FlagType.string
 | 
			
		||||
					},
 | 
			
		||||
					cli.Flag{
 | 
			
		||||
						name: 'query'
 | 
			
		||||
						abbrev: 'q'
 | 
			
		||||
						description: 'Search string to filter targets by.'
 | 
			
		||||
						flag: cli.FlagType.string
 | 
			
		||||
					},
 | 
			
		||||
				]
 | 
			
		||||
				execute: fn (cmd cli.Command) ! {
 | 
			
		||||
					config_file := cmd.flags.get_string('config-file')!
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +68,11 @@ pub fn cmd() cli.Command {
 | 
			
		|||
						filter.repo = repo
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					query := cmd.flags.get_string('query')!
 | 
			
		||||
					if query != '' {
 | 
			
		||||
						filter.query = query
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					raw := cmd.flags.get_bool('raw')!
 | 
			
		||||
 | 
			
		||||
					list(conf, filter, raw)!
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,24 +1,55 @@
 | 
			
		|||
module db
 | 
			
		||||
 | 
			
		||||
import models { Target, TargetArch, TargetFilter }
 | 
			
		||||
import math
 | 
			
		||||
 | 
			
		||||
// get_targets returns all targets in the database.
 | 
			
		||||
pub fn (db &VieterDb) get_targets(filter TargetFilter) []Target {
 | 
			
		||||
	// This seems to currently be blocked by a bug in the ORM, I'll have to ask
 | 
			
		||||
	// around.
 | 
			
		||||
	if filter.repo != '' {
 | 
			
		||||
		res := sql db.conn {
 | 
			
		||||
			select from Target where repo == filter.repo order by id limit filter.limit offset filter.offset
 | 
			
		||||
	window_size := 32
 | 
			
		||||
 | 
			
		||||
	mut out := []Target{}
 | 
			
		||||
	mut targets := []Target{cap: window_size}
 | 
			
		||||
 | 
			
		||||
	mut offset := 0
 | 
			
		||||
	mut filtered_offset := u64(0)
 | 
			
		||||
 | 
			
		||||
	for out.len < filter.limit {
 | 
			
		||||
		targets = sql db.conn {
 | 
			
		||||
			select from Target order by id limit window_size offset offset
 | 
			
		||||
		}
 | 
			
		||||
		offset += targets.len
 | 
			
		||||
 | 
			
		||||
		if targets.len == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return res
 | 
			
		||||
		if filter.repo != '' {
 | 
			
		||||
			targets = targets.filter(it.repo == filter.repo)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if filter.query != '' {
 | 
			
		||||
			targets = targets.filter(it.url.contains(filter.query) || it.path.contains(filter.query)
 | 
			
		||||
				|| it.branch.contains(filter.query))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if filtered_offset > filter.offset {
 | 
			
		||||
			end_index := math.min(filter.limit - u64(out.len), u64(targets.len))
 | 
			
		||||
 | 
			
		||||
			out << targets[0..end_index]
 | 
			
		||||
		}
 | 
			
		||||
		// We start counting targets in the middle of the current window
 | 
			
		||||
		else if filtered_offset + u64(targets.len) > filter.offset {
 | 
			
		||||
			start_index := filter.offset - filtered_offset
 | 
			
		||||
			end_index := start_index +
 | 
			
		||||
				math.min(filter.limit - u64(out.len), u64(targets.len) - start_index)
 | 
			
		||||
 | 
			
		||||
			out << targets[start_index..end_index]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		filtered_offset += u64(targets.len)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	res := sql db.conn {
 | 
			
		||||
		select from Target order by id limit filter.limit offset filter.offset
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// get_target tries to return a specific target.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,4 +73,5 @@ pub mut:
 | 
			
		|||
	limit  u64 = 25
 | 
			
		||||
	offset u64
 | 
			
		||||
	repo   string
 | 
			
		||||
	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))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
['/api/v1/targets/search'; auth; get; markused]
 | 
			
		||||
fn (mut app App) v1_search_targets()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,5 +12,5 @@ address = "http://localhost:8000"
 | 
			
		|||
api_update_frequency = 2
 | 
			
		||||
image_rebuild_frequency = 1
 | 
			
		||||
max_concurrent_builds = 3
 | 
			
		||||
max_log_age = 64
 | 
			
		||||
# max_log_age = 64
 | 
			
		||||
collect_metrics = true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue