]> git.ipfire.org Git - pbs.git/commitdiff
repo: Add simple API operations
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 18 Aug 2023 15:27:31 +0000 (15:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 18 Aug 2023 15:27:31 +0000 (15:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/repository.py
src/buildservice/users.py
src/web/__init__.py
src/web/base.py
src/web/repos.py

index b3c24a179abf000c70bfee11a8eaad42804d7c8e..df4c5c6c6708f27b37f8a99f58523a24130f984e 100644 (file)
@@ -134,10 +134,30 @@ class Repository(base.DataObject):
 
                return NotImplemented
 
+       def to_json(self):
+               ret = {
+                       "name"        : self.name,
+                       "slug"        : self.slug,
+                       "description" : self.description,
+                       "created_at"  : self.created_at.isoformat(),
+
+                       # Distribution
+                       "distro"      : self.distro.slug,
+               }
+
+               if self.owner:
+                       ret["owner"] = self.owner.to_json()
+
+               return ret
+
        @lazy_property
        def distro(self):
                return self.backend.distros.get_by_id(self.data.distro_id)
 
+       @property
+       def created_at(self):
+               return self.data.created_at
+
        # Repo Types
 
        def is_user(self):
index c262ec83f9b460c67dba1cb977622fc178e4be57..49dcf95509b7cf3ea3b83bf6eed1fe5aaaf30103 100644 (file)
@@ -473,6 +473,11 @@ class User(base.DataObject):
 
                return NotImplemented
 
+       def to_json(self):
+               return {
+                       "name"     : self.name,
+               }
+
        @property
        def name(self):
                return self.data.name
index d92ffe72c6c1fb7fe4c6a342f7fff99cbd13b02c..4da396ba22ce24f6d521e9f89bf0cabd544d8440 100644 (file)
@@ -245,6 +245,10 @@ class Application(tornado.web.Application):
                        # Log
                        (r"/log", handlers.LogHandler),
 
+                       # Repositories
+                       (r"/api/v1/repos/([\w\d\-]+)", repos.APIv1IndexHandler),
+                       (r"/api/v1/repos/([\w\d\-]+)/([\w\d\-]+)", repos.APIv1ShowHandler),
+
                        # Uploads
                        (r"/api/v1/uploads", uploads.APIv1IndexHandler),
                        (r"/api/v1/uploads/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})",
index b7c96d96c1fec9025c6904dd145092b58df8a46b..dbfc74b28ab55a0c15de786d088b26f01219325e 100644 (file)
@@ -52,6 +52,7 @@ class KerberosAuthMixin(object):
                # Set status to 401
                self.set_status(401)
 
+       @functools.cache
        def get_authenticated_user(self):
                auth_header = self.request.headers.get("Authorization", None)
 
index 8fbb4e387cf0cb77a07a59d20f5643588e1143bd..fb3de8976fd1fd539d4173d070865761c7431559 100644 (file)
@@ -25,6 +25,80 @@ import tornado.web
 from . import base
 from . import ui_modules
 
+class APIv1IndexHandler(base.APIMixin, base.BaseHandler):
+       # Allow users to create builds
+       allow_users = True
+
+       @tornado.web.authenticated
+       async def get(self, distro_slug):
+               with self.db.transaction():
+                       # Fetch distro
+                       distro = self.backend.distros.get_by_slug(distro_slug)
+                       if not distro:
+                               raise tornado.web.HTTPError(404, "Could not find distro '%s'" % distro_slug)
+
+                       # Fetch all repositories
+                       try:
+                               repos = self.current_user.repos[distro]
+                       except KeyError:
+                               repos = []
+
+               self.finish({
+                       "repos" : [repo.to_json() for repo in repos],
+               })
+
+       @tornado.web.authenticated
+       async def post(self, distro_slug):
+               with self.db.transaction():
+                       # Fetch distro
+                       distro = self.backend.distros.get_by_slug(distro_slug)
+                       if not distro:
+                               raise tornado.web.HTTPError(404, "Could not find distro '%s'" % distro_slug)
+
+                       # Fetch name
+                       name = self.get_argument("name")
+
+                       # Create a new repository
+                       repo = await self.backend.repos.create(distro=distro,
+                               name=name, owner=self.current_user)
+
+                       # Set description
+                       repo.description = self.get_argument("description", None)
+
+               # Return the result
+               self.finish(repo.to_json())
+
+
+class APIv1ShowHandler(base.APIMixin, base.BaseHandler):
+       def _get_repo(self, distro_slug, repo_slug):
+               # Fetch distro
+               self.distro = self.backend.distros.get_by_slug(distro_slug)
+               if not self.distro:
+                       raise tornado.web.HTTPError(404, "Could not find distro '%s'" % distro_slug)
+
+               # Fetch repository
+               self.repo = self.current_users.get_repo(self.distro, repo_slug)
+               if not self.repo:
+                       raise tornado.web.HTTPError(404, "Could not find repository '%s" % repo_slug)
+
+       @tornado.web.authenticated
+       async def get(self, distro_slug, name):
+               with self.db.transaction():
+                       repo = self._get_repo(distro_slug, name)
+
+               self.finish(repo.to_json())
+
+       @tornado.web.authenticated
+       async def delete(self, distro_slug, name):
+               with self.db.transaction():
+                       repo = self._get_repo(distro_slug, name)
+
+                       # XXX check permissions
+
+                       # Delete the repository
+                       await self.repo.delete(self.current_user)
+
+
 class BaseHandler(base.BaseHandler):
        def _get_repo(self, distro_slug, repo_slug, user_slug=None):
                user = None