refactor: separated GitRepo types into own module

feat: added more query params for GitRepo API
This commit is contained in:
Jef Roosens 2022-05-19 07:54:33 +02:00
parent 5e81dadce3
commit 6bd5b7cb48
Signed by untrusted user: Jef Roosens
GPG key ID: B580B976584B5F30
12 changed files with 114 additions and 122 deletions

View file

@ -1,6 +1,7 @@
module db
import sqlite
import models
struct VieterDb {
conn sqlite.DB

View file

@ -1,26 +0,0 @@
module db
[params]
pub struct GitRepoFilter {
pub mut:
limit u64 = 25
offset u64
repo string
}
pub fn filter_from_params<T>(params map[string]string) ?T {
mut o := GitRepoFilter{}
$for field in T.fields {
if field.name in params {
val := params[field.name]
$if field.typ is string {
o.$(field.name) = val
} $else $if field.typ is u64 {
o.$(field.name) = val.u64()
}
}
}
return o
}

View file

@ -1,84 +1,9 @@
module db
pub struct GitRepoArch {
pub:
id int [primary; sql: serial]
repo_id int [nonull]
value string [nonull]
}
// str returns a string representation.
pub fn (gra &GitRepoArch) str() string {
return gra.value
}
pub struct GitRepo {
pub mut:
id int [optional; primary; sql: serial]
// URL of the Git repository
url string [nonull]
// Branch of the Git repository to use
branch string [nonull]
// Which repo the builder should publish packages to
repo string [nonull]
// Cron schedule describing how frequently to build the repo.
schedule string [optional]
// On which architectures the package is allowed to be built. In reality,
// this controls which builders will periodically build the image.
arch []GitRepoArch [fkey: 'repo_id']
}
// str returns a string representation.
pub fn (gr &GitRepo) str() string {
mut parts := [
'id: $gr.id',
'url: $gr.url',
'branch: $gr.branch',
'repo: $gr.repo',
'schedule: $gr.schedule',
'arch: ${gr.arch.map(it.value).join(', ')}',
]
str := parts.join('\n')
return str
}
// patch_from_params patches a GitRepo from a map[string]string, usually
// provided from a web.App's params
pub fn (mut r GitRepo) patch_from_params(params map[string]string) {
$for field in GitRepo.fields {
if field.name in params {
$if field.typ is string {
r.$(field.name) = params[field.name]
// This specific type check is needed for the compiler to ensure
// our types are correct
} $else $if field.typ is []GitRepoArch {
r.$(field.name) = params[field.name].split(',').map(GitRepoArch{ value: it })
}
}
}
}
// git_repo_from_params creates a GitRepo from a map[string]string, usually
// provided from a web.App's params
pub fn git_repo_from_params(params map[string]string) ?GitRepo {
mut repo := GitRepo{}
// If we're creating a new GitRepo, we want all fields to be present before
// "patching".
$for field in GitRepo.fields {
if field.name !in params && !field.attrs.contains('optional') {
return error('Missing parameter: ${field.name}.')
}
}
repo.patch_from_params(params)
return repo
}
import models { GitRepo, GitRepoArch, GitRepoFilter }
// get_git_repos returns all GitRepo's in the database.
pub fn (db &VieterDb) get_git_repos(filter GitRepoFilter) []GitRepo {
println(filter)
// This seems to currently be blocked by a bug in the ORM, I'll have to ask
// around.
if filter.repo != '' {