mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-07-13 14:05:47 +00:00
add rebuild implementation to interface
This commit is contained in:
@ -76,5 +76,5 @@ class Rebuild(Handler):
|
||||
List[Package]: list of packages which were stored in database
|
||||
"""
|
||||
if from_database:
|
||||
return application.repository.packages()
|
||||
return [package for (package, _) in application.database.packages_get()]
|
||||
return [package for (package, _) in application.database.packages_get()]
|
||||
return application.repository.packages()
|
||||
|
@ -102,6 +102,15 @@ class Spawn(Thread, LazyLogging):
|
||||
kwargs["now"] = ""
|
||||
self.spawn_process("package-add", *packages, **kwargs)
|
||||
|
||||
def packages_rebuild(self, depends_on: str) -> None:
|
||||
"""
|
||||
rebuild packages which depend on the specified package
|
||||
|
||||
Args:
|
||||
depends_on(str): packages dependency
|
||||
"""
|
||||
self.spawn_process("repo-rebuild", **{"depends-on": depends_on})
|
||||
|
||||
def packages_remove(self, packages: Iterable[str]) -> None:
|
||||
"""
|
||||
remove packages
|
||||
|
@ -23,6 +23,7 @@ from pathlib import Path
|
||||
from ahriman.web.views.index import IndexView
|
||||
from ahriman.web.views.service.add import AddView
|
||||
from ahriman.web.views.service.pgp import PGPView
|
||||
from ahriman.web.views.service.rebuild import RebuildView
|
||||
from ahriman.web.views.service.remove import RemoveView
|
||||
from ahriman.web.views.service.request import RequestView
|
||||
from ahriman.web.views.service.search import SearchView
|
||||
@ -52,6 +53,8 @@ def setup_routes(application: Application, static_path: Path) -> None:
|
||||
* ``GET /api/v1/service/pgp`` fetch PGP key from the keyserver
|
||||
* ``POST /api/v1/service/pgp`` import PGP key from the keyserver
|
||||
|
||||
* ``POST /api/v1/service/rebuild`` rebuild packages based on their dependency list
|
||||
|
||||
* ``POST /api/v1/service/remove`` remove existing package from repository
|
||||
|
||||
* ``POST /api/v1/service/request`` request to add new packages to repository
|
||||
@ -92,6 +95,8 @@ def setup_routes(application: Application, static_path: Path) -> None:
|
||||
application.router.add_get("/api/v1/service/pgp", PGPView, allow_head=True)
|
||||
application.router.add_post("/api/v1/service/pgp", PGPView)
|
||||
|
||||
application.router.add_post("/api/v1/service/rebuild", RebuildView)
|
||||
|
||||
application.router.add_post("/api/v1/service/remove", RemoveView)
|
||||
|
||||
application.router.add_post("/api/v1/service/request", RequestView)
|
||||
|
75
src/ahriman/web/views/service/rebuild.py
Normal file
75
src/ahriman/web/views/service/rebuild.py
Normal file
@ -0,0 +1,75 @@
|
||||
#
|
||||
# Copyright (c) 2021-2022 ahriman team.
|
||||
#
|
||||
# This file is part of ahriman
|
||||
# (see https://github.com/arcan1s/ahriman).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from aiohttp.web import HTTPBadRequest, HTTPNoContent
|
||||
|
||||
from ahriman.models.user_access import UserAccess
|
||||
from ahriman.web.views.base import BaseView
|
||||
|
||||
|
||||
class RebuildView(BaseView):
|
||||
"""
|
||||
rebuild packages web view
|
||||
|
||||
Attributes:
|
||||
POST_PERMISSION(UserAccess): (class attribute) post permissions of self
|
||||
"""
|
||||
|
||||
POST_PERMISSION = UserAccess.Full
|
||||
|
||||
async def post(self) -> None:
|
||||
"""
|
||||
rebuild packages based on their dependency
|
||||
|
||||
JSON body must be supplied, the following model is used::
|
||||
|
||||
{
|
||||
"packages": ["ahriman"] # either list of packages or package name of dependency
|
||||
}
|
||||
|
||||
Raises:
|
||||
HTTPBadRequest: if bad data is supplied
|
||||
HTTPNoContent: in case of success response
|
||||
|
||||
Examples:
|
||||
Example of command by using curl::
|
||||
|
||||
$ curl -v -H 'Content-Type: application/json' 'http://example.com/api/v1/service/rebuild' -d '{"packages": ["python"]}'
|
||||
> POST /api/v1/service/rebuild HTTP/1.1
|
||||
> Host: example.com
|
||||
> User-Agent: curl/7.86.0
|
||||
> Accept: */*
|
||||
> Content-Type: application/json
|
||||
> Content-Length: 24
|
||||
>
|
||||
< HTTP/1.1 204 No Content
|
||||
< Date: Sun, 27 Nov 2022 00:22:26 GMT
|
||||
< Server: Python/3.10 aiohttp/3.8.3
|
||||
<
|
||||
"""
|
||||
try:
|
||||
data = await self.extract_data(["packages"])
|
||||
packages = self.get_non_empty(lambda key: [package for package in data[key] if package], "packages")
|
||||
depends_on = next(package for package in packages)
|
||||
except Exception as e:
|
||||
raise HTTPBadRequest(reason=str(e))
|
||||
|
||||
self.spawner.packages_rebuild(depends_on)
|
||||
|
||||
raise HTTPNoContent()
|
Reference in New Issue
Block a user