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.' | 						description: 'Only return targets that publish to this repo.' | ||||||
| 						flag: cli.FlagType.string | 						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) ! { | 				execute: fn (cmd cli.Command) ! { | ||||||
| 					config_file := cmd.flags.get_string('config-file')! | 					config_file := cmd.flags.get_string('config-file')! | ||||||
|  | @ -62,6 +68,11 @@ pub fn cmd() cli.Command { | ||||||
| 						filter.repo = repo | 						filter.repo = repo | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
|  | 					query := cmd.flags.get_string('query')! | ||||||
|  | 					if query != '' { | ||||||
|  | 						filter.query = query | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
| 					raw := cmd.flags.get_bool('raw')! | 					raw := cmd.flags.get_bool('raw')! | ||||||
| 
 | 
 | ||||||
| 					list(conf, filter, raw)! | 					list(conf, filter, raw)! | ||||||
|  |  | ||||||
|  | @ -1,24 +1,55 @@ | ||||||
| module db | module db | ||||||
| 
 | 
 | ||||||
| import models { Target, TargetArch, TargetFilter } | import models { Target, TargetArch, TargetFilter } | ||||||
|  | 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 { | ||||||
| 	// This seems to currently be blocked by a bug in the ORM, I'll have to ask | 	window_size := 32 | ||||||
| 	// around. | 
 | ||||||
| 	if filter.repo != '' { | 	mut out := []Target{} | ||||||
| 		res := sql db.conn { | 	mut targets := []Target{cap: window_size} | ||||||
| 			select from Target where repo == filter.repo order by id limit filter.limit offset filter.offset | 
 | ||||||
|  | 	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 { | 	return out | ||||||
| 		select from Target order by id limit filter.limit offset filter.offset |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return res |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // get_target tries to return a specific target. | // get_target tries to return a specific target. | ||||||
|  |  | ||||||
|  | @ -73,4 +73,5 @@ pub mut: | ||||||
| 	limit  u64 = 25 | 	limit  u64 = 25 | ||||||
| 	offset u64 | 	offset u64 | ||||||
| 	repo   string | 	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)) | 	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 | api_update_frequency = 2 | ||||||
| image_rebuild_frequency = 1 | image_rebuild_frequency = 1 | ||||||
| max_concurrent_builds = 3 | max_concurrent_builds = 3 | ||||||
| max_log_age = 64 | # max_log_age = 64 | ||||||
| collect_metrics = true | collect_metrics = true | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue