peridot/peridot/db/psql/repository.go

386 lines
9.4 KiB
Go

// Copyright (c) All respective contributors to the Peridot Project. All rights reserved.
// Copyright (c) 2021-2022 Rocky Enterprise Software Foundation, Inc. All rights reserved.
// Copyright (c) 2021-2022 Ctrl IQ, Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors
// may be used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package serverpsql
import (
"github.com/jmoiron/sqlx/types"
"github.com/lib/pq"
"peridot.resf.org/peridot/db/models"
)
func (a *Access) GetExternalRepositoriesForProject(projectId string) (ret models.ExternalRepositories, err error) {
err = a.query.Select(&ret, "select id, created_at, project_id, url, priority, module_hotfixes from external_repositories where project_id = $1 order by created_at desc", projectId)
if err != nil {
return nil, err
}
return ret, nil
}
func (a *Access) GetExternalRepository(projectId string, repoId string) (*models.ExternalRepository, error) {
var r models.ExternalRepository
err := a.query.Select(&r, "select id, created_at, project_id, url, priority, module_hotfixes from external_repositories where project_id = $1 and id = $2 order by created_at desc", projectId, repoId)
if err != nil {
return nil, err
}
return &r, nil
}
func (a *Access) DeleteExternalRepositoryForProject(projectId string, id string) error {
_, err := a.query.Exec("delete from external_repositories where project_id = $1 and id = $2", projectId, id)
return err
}
func (a *Access) CreateExternalRepositoryForProject(projectId string, repoURL string, priority *int32, moduleHotfixes bool) (*models.ExternalRepository, error) {
var ret models.ExternalRepository
err := a.query.Get(
&ret,
`
insert into external_repositories (project_id, url, priority)
values ($1, $2, $3, $4)
returning id, created_at, project_id, url, priority, module_hotfixes
`,
projectId,
repoURL,
priority,
moduleHotfixes,
)
if err != nil {
return nil, err
}
return &ret, nil
}
func (a *Access) FindRepositoriesForPackage(projectId string, pkg string, internalOnly bool) (ret models.Repositories, err error) {
err = a.query.Select(
&ret,
`
select
id,
created_at,
name,
project_id,
packages,
exclude_filter,
include_filter,
additional_multilib,
exclude_multilib_filter,
multilib,
glob_include_filter
from project_repos
where
project_id = $1
and ($2 = any(packages) or packages = '{}')
and internal_only = $3
order by created_at desc
`,
projectId,
pkg,
internalOnly,
)
if err != nil {
return nil, err
}
return ret, nil
}
func (a *Access) FindRepositoriesForProject(projectId string, id *string, internalOnly bool) (ret models.Repositories, err error) {
err = a.query.Select(
&ret,
`
select
id,
created_at,
name,
project_id,
packages,
exclude_filter,
include_filter,
additional_multilib,
exclude_multilib_filter,
multilib,
glob_include_filter
from project_repos
where
project_id = $1
and ($2 :: uuid is null or id = $2 :: uuid)
and internal_only = $3
order by created_at desc
`,
projectId,
id,
internalOnly,
)
if err != nil {
return nil, err
}
return ret, nil
}
func (a *Access) GetRepositoryRevision(revisionId string) (*models.RepositoryRevision, error) {
var ret models.RepositoryRevision
err := a.query.Get(
&ret,
`
select
id,
created_at,
project_repo_id,
arch,
repomd_xml,
primary_xml,
filelists_xml,
other_xml,
updateinfo_xml,
module_defaults_yaml,
modules_yaml,
groups_xml,
url_mappings
from project_repo_revisions
where
id = $1
`,
revisionId,
)
if err != nil {
return nil, err
}
return &ret, nil
}
func (a *Access) GetLatestActiveRepositoryRevision(repoId string, arch string) (*models.RepositoryRevision, error) {
var ret models.RepositoryRevision
err := a.query.Get(
&ret,
`
select
id,
created_at,
project_repo_id,
arch,
repomd_xml,
primary_xml,
filelists_xml,
other_xml,
updateinfo_xml,
module_defaults_yaml,
modules_yaml,
groups_xml,
url_mappings
from project_repo_revisions
where
project_repo_id = $1
and arch = $2
order by created_at desc
limit 1
`,
repoId,
arch,
)
if err != nil {
return nil, err
}
return &ret, nil
}
func (a *Access) GetLatestActiveRepositoryRevisionByProjectIdAndNameAndArch(projectId string, name string, arch string) (*models.RepositoryRevision, error) {
var ret models.RepositoryRevision
err := a.query.Get(
&ret,
`
select
prr.id,
prr.created_at,
prr.project_repo_id,
prr.arch,
prr.repomd_xml,
prr.primary_xml,
prr.filelists_xml,
prr.other_xml,
prr.updateinfo_xml,
prr.module_defaults_yaml,
prr.modules_yaml,
prr.groups_xml,
prr.url_mappings
from project_repo_revisions prr
inner join project_repos pr on pr.id = prr.project_repo_id
where
pr.project_id = $1
and pr.name = $2
and prr.arch = $3
order by prr.created_at desc
limit 1
`,
projectId,
name,
arch,
)
if err != nil {
return nil, err
}
return &ret, nil
}
func (a *Access) CreateRevisionForRepository(id string, repoId string, arch string, repomdXml string, primaryXml string, filelistsXml string, otherXml string, updateInfoXml string, moduleDefaultsYaml string, modulesYaml string, groupsXml string, urlMappings string) (*models.RepositoryRevision, error) {
revision := models.RepositoryRevision{
ProjectRepoId: repoId,
RepomdXml: repomdXml,
PrimaryXml: primaryXml,
FilelistsXml: filelistsXml,
OtherXml: otherXml,
UpdateinfoXml: updateInfoXml,
ModuleDefaultsYaml: moduleDefaultsYaml,
ModulesYaml: modulesYaml,
GroupsXml: groupsXml,
UrlMappings: types.JSONText(urlMappings),
}
err := a.query.Get(
&revision,
`
insert into project_repo_revisions (id, project_repo_id, arch, repomd_xml, primary_xml, filelists_xml, other_xml, updateinfo_xml, module_defaults_yaml, modules_yaml, groups_xml, url_mappings)
values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
returning id, created_at
`,
id,
repoId,
arch,
repomdXml,
primaryXml,
filelistsXml,
otherXml,
updateInfoXml,
moduleDefaultsYaml,
modulesYaml,
groupsXml,
urlMappings,
)
if err != nil {
return nil, err
}
return &revision, nil
}
func (a *Access) CreateRepositoryWithPackages(name string, projectId string, internalOnly bool, packages pq.StringArray) (*models.Repository, error) {
repository := models.Repository{
Name: name,
ProjectId: projectId,
InternalOnly: internalOnly,
Packages: packages,
}
err := a.query.Get(
&repository,
`
insert into project_repos (name, project_id, internal_only, packages)
values ($1, $2, $3, $4)
returning id, created_at
`,
name,
projectId,
internalOnly,
packages,
)
if err != nil {
return nil, err
}
return &repository, nil
}
func (a *Access) GetRepository(id *string, name *string, projectId *string) (*models.Repository, error) {
var r models.Repository
err := a.query.Get(
&r,
`
select
id,
created_at,
name,
project_id,
internal_only,
packages,
exclude_filter,
include_filter,
additional_multilib,
exclude_multilib_filter,
multilib,
glob_include_filter
from project_repos
where
(($2 :: text is null and id = $1 :: uuid) or name = $2 :: text)
and ($3 :: uuid is null or project_id = $3 :: uuid)
`,
id,
name,
projectId,
)
if err != nil {
return nil, err
}
return &r, nil
}
func (a *Access) SetRepositoryOptions(id string, packages pq.StringArray, excludeFilter pq.StringArray, includeFilter pq.StringArray, additionalMultilib pq.StringArray, excludeMultilibFilter pq.StringArray, multilib pq.StringArray, globIncludeFilter pq.StringArray) error {
_, err := a.query.Exec(
`
update project_repos
set
packages = $1,
exclude_filter = $2,
include_filter = $3,
additional_multilib = $4,
exclude_multilib_filter = $5,
multilib = $6,
glob_include_filter = $7
where id = $8
`,
packages,
excludeFilter,
includeFilter,
additionalMultilib,
excludeMultilibFilter,
multilib,
globIncludeFilter,
id,
)
return err
}