From 7b8ce1df4cd650aaba5174ddd752d279062a34d2 Mon Sep 17 00:00:00 2001
From: Joseph Schorr <josephschorr@users.noreply.github.com>
Date: Wed, 19 Jul 2017 14:29:22 -0400
Subject: [PATCH] Change signing API to use a data model interface

---
 endpoints/api/signing.py                  |  5 ++---
 endpoints/api/signing_models_interface.py | 14 ++++++++++++++
 endpoints/api/signing_models_pre_oci.py   | 18 ++++++++++++++++++
 3 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100644 endpoints/api/signing_models_interface.py
 create mode 100644 endpoints/api/signing_models_pre_oci.py

diff --git a/endpoints/api/signing.py b/endpoints/api/signing.py
index aa426ff7c..eb2e942ec 100644
--- a/endpoints/api/signing.py
+++ b/endpoints/api/signing.py
@@ -4,10 +4,10 @@ import logging
 import features
 
 from app import tuf_metadata_api
-from data import model
 from endpoints.api import (require_repo_read, path_param,
                            RepositoryParamResource, resource, nickname, show_if,
                            disallow_for_app_repositories, NotFound)
+from endpoints.api.signing_models_pre_oci import pre_oci_model as model
 
 logger = logging.getLogger(__name__)
 
@@ -23,8 +23,7 @@ class RepositorySignatures(RepositoryParamResource):
   @disallow_for_app_repositories
   def get(self, namespace, repository):
     """ Fetches the list of signed tags for the repository. """
-    repo = model.repository.get_repository(namespace, repository)
-    if repo is None or not repo.trust_enabled:
+    if not model.is_trust_enabled(namespace, repository):
       raise NotFound()
 
     return {'delegations': tuf_metadata_api.get_all_tags_with_expiration(namespace, repository)}
diff --git a/endpoints/api/signing_models_interface.py b/endpoints/api/signing_models_interface.py
new file mode 100644
index 000000000..6e5ce4ca4
--- /dev/null
+++ b/endpoints/api/signing_models_interface.py
@@ -0,0 +1,14 @@
+from abc import ABCMeta, abstractmethod
+from six import add_metaclass
+
+@add_metaclass(ABCMeta)
+class SigningInterface(object):
+  """
+  Interface that represents all data store interactions required by the signing API endpoint.
+  """
+  @abstractmethod
+  def is_trust_enabled(self, namespace_name, repo_name):
+    """
+    Returns whether the repository with the given namespace name and repository name exists and
+    has trust enabled.
+    """
diff --git a/endpoints/api/signing_models_pre_oci.py b/endpoints/api/signing_models_pre_oci.py
new file mode 100644
index 000000000..03afb1104
--- /dev/null
+++ b/endpoints/api/signing_models_pre_oci.py
@@ -0,0 +1,18 @@
+from data import model
+from endpoints.api.signing_models_interface import SigningInterface
+
+
+class PreOCIModel(SigningInterface):
+  """
+  PreOCIModel implements the data model for signing using a database schema
+  before it was changed to support the OCI specification.
+  """
+  def is_trust_enabled(self, namespace_name, repo_name):
+    repo = model.repository.get_repository(namespace_name, repo_name)
+    if repo is None:
+      return False
+
+    return repo.trust_enabled
+
+
+pre_oci_model = PreOCIModel()